MATLAB 带通滤波器功能实现
该函数是用于实现带通滤波器功能的回调函数。其输入参数为默认的(~, eventdata, handles),其中handles包含了当前界面上所有控件的句柄和数据。该函数主要实现以下功能:
-
读取全局变量x、Fs、tl和x2的值,其中x为待滤波的信号,Fs为采样率,tl为时间轴,x2为滤波后的信号。
-
从界面上读取用户设置的带通滤波器的参数fp和fs,即通带和阻带边界频率。
-
根据用户选择的滤波器类型,使用不同的滤波器函数(如butter、fir1等)生成滤波器系数b和a,或者直接生成滤波器的冲激响应b2。
-
绘制滤波器的幅频特性图,如果用户选择了数字滤波器,还需将频率单位转换为Hz。
-
对输入信号进行滤波操作,得到输出信号x1。
-
绘制输入信号和输出信号的波形图和频谱图,其中频谱图需要进行傅里叶变换和频率轴的转换。
-
将滤波后的信号x1赋值给全局变量x2,以便后续处理。
以下是代码的详细解释:
function bandpass_pushbutton10_Callback(~, eventdata, handles)
% hObject handle to bandpass_pushbutton10 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global x;
global Fs;
global tl;
global x2;
x1=x;
% fp = [2000,3000];
% fs = [1800,3300];
% Wp = 2*fp/Fs;
% Ws = 2*fs/Fs;
% if(Wp >= 1)
% Wp = 0.99;
% end
% if(Ws >= 1)
% Ws = 0.99;
% end
fp = get(handles.edit3,'string');
fp = str2double(fp)*2;
fs = get(handles.edit4,'string');
fs = str2double(fs)*2;
if get(handles.radiobutton1,'value')
[n, Wn]=buttord(Wp,Ws, 2, 15);
[b, a]=butter(n, Wn,'bandpass');
axes(handles.axes3);
[h,w]=freqz(b,a);
plot(w/pi*Fs/2,abs(h));
x1=filter(b,a,x1);
elseif get(handles.radiobutton4,'value')
b2=fir1(30,[fp/Fs fs/Fs],boxcar(31));
axes(handles.axes3);
[h,w]=freqz(b2, 1,512);
plot(w/pi*Fs/2,20*log(abs(h)));
x1=fftfilt(b2,x1);
elseif get(handles.radiobutton5,'value')
b2=fir1(30,[fp/Fs fs/Fs], triang(31));
axes(handles.axes3);
[h,w]=freqz(b2, 1,512);
plot(w/pi*Fs/2,20*log(abs(h)));
x1=fftfilt(b2,x1);
elseif get(handles.radiobutton6,'value')
b2=fir1(30,[fp/Fs fs/Fs],hamming(31));
axes(handles.axes3);
[h,w]=freqz(b2, 1,512);
plot(w/pi*Fs/2,20*log(abs(h)));
x1=fftfilt(b2,x1);
elseif get(handles.radiobutton7,'value')
b2=fir1(30,[fp/Fs fs/Fs],hanning(31));
axes(handles.axes3);
[h,w]=freqz(b2, 1,512);
plot(w/pi*Fs/2,20*log(abs(h)));
x1=fftfilt(b2,x1);
elseif get(handles.radiobutton8,'value')
b2=fir1(30,[fp/Fs fs/Fs],blackman(31));
axes(handles.axes3);
[h,w]=freqz(b2, 1,512);
plot(w/pi*Fs/2,20*log(abs(h)));
x1=fftfilt(b2,x1);
elseif get(handles.radiobutton9,'value')
b2=fir1(30,[fp/Fs fs/Fs],kaiser(31));
axes(handles.axes3);
[h,w]=freqz(b2, 1,512);
plot(w/pi*Fs/2,20*log(abs(h)));
x1=fftfilt(b2,x1);
end;
axes(handles.axes5);
plot(tl,x1);
title('高通滤波器作用下的波形图');
xlabel('鏃堕棿/s');
N=length(x1);
df=Fs/N;
w=[0:df:df*(N-1)] - Fs/2; %棰戠巼灏哄害
X=fft(x1);
X=fftshift(X);
axes(handles.axes6);
plot(w,abs(X)/max(abs(X)));
axis([-10000,10000,0,1]);
title('婊ら櫎鍣0鍚庤闊抽璋?');
xlabel('棰戠巼/Hz');
grid on;
x2=x1;
该函数使用用户从界面上输入的通带和阻带频率以及选择的滤波器类型,对输入信号进行滤波操作,并绘制滤波器频率响应、滤波前后信号的波形图和频谱图。
代码说明:
- 首先,该函数从GUI界面中获取通带和阻带频率,并根据用户选择的滤波器类型生成滤波器系数。
- 然后,该函数使用生成的滤波器系数对输入信号进行滤波操作,并绘制滤波器频率响应和滤波前后信号的波形图和频谱图。
- 该函数使用MATLAB的内置函数,例如
buttord、butter、fir1、freqz、fft、fftshift等,来进行滤波器设计和信号处理。 - 该函数还使用了GUI界面中的控件,例如
edit3、edit4、radiobutton1、radiobutton4、radiobutton5、radiobutton6、radiobutton7、radiobutton8、radiobutton9等,来获取用户输入的参数和选择。 - 该函数将滤波后的信号存储在全局变量
x2中,以便后续处理。
该函数的优点:
- 该函数易于使用和修改,用户可以通过GUI界面方便地设置滤波器参数。
- 该函数可以根据用户选择的滤波器类型,使用不同的滤波器函数来进行滤波操作。
- 该函数提供了滤波器频率响应、滤波前后信号的波形图和频谱图的绘制功能,方便用户进行滤波结果的分析。
该函数的缺点:
- 该函数仅支持一些常见的滤波器类型,例如Butterworth滤波器和FIR滤波器。
- 该函数没有提供更高级的滤波器设计功能,例如自适应滤波器设计。
- 该函数的代码结构比较简单,没有对输入参数进行严格的校验,可能会导致程序错误。
改进建议:
- 可以增加更多的滤波器类型,例如Chebyshev滤波器、Elliptic滤波器等。
- 可以添加自适应滤波器设计功能。
- 可以对输入参数进行严格的校验,提高程序的鲁棒性。
- 可以使用更清晰简洁的代码结构,提高代码的可读性和可维护性。
原文地址: https://www.cveoy.top/t/topic/nKty 著作权归作者所有。请勿转载和采集!