1. 窗函数法设计FIR数字滤波器的GUI设计
程序清单:
function run_Callback(hObject,eventdata,handles)
fp1=str2double(get(handles.edit_fp1,'String'));
fs1=str2double(get(handles.edit_fs1,'String'));
fp2=str2double(get(handles.edit_fp2,'String'));
fs2=str2double(get(handles.edit_fs2,'String'));
Fs=100;%采样频率
global filter_value;
filter_value=get(handles.filter,'value');
switch filter_value %选择滤波器类型
case 1 %低通滤波器
wp1=2*pi*fp1/Fs; %将模拟通带截止频率转换为数字滤波器频率
ws1=2*pi*fs1/Fs; %将模拟阻带起始频率转换为数字滤波器频率
wn=(wp1+ws1)/2/pi; %标准化的截止频率响应
Bt=ws1-wp1;
if fs1<fp1
msgbox('错误:fs1应该大于fp1,请重新输入...','提示','error');
elseif fs1==fp1
msgbox('警告:存在问题,请检查!','提示','warn');
end
N=ceil(6.2*pi/Bt);%滤波器长度
M=N-1;
set(handles.text_M,'String',M);
windows_value=get(handles.windows,'value');
switch windows_value %窗函数选择
case 1 %使用boxcar窗函数
b1=fir1(M,wn,boxcar(N));
[H1,W1]=freqz(b1,1,512,2);
stem(handles.axes1,b1,'filled');
grid on;
plot(handles.axes2,W1,20*log10(abs(H1)));%绘频率响应图形
set(handles.text_title1,'String','低通FIR数字滤波器h(n)波形');
set(handles.text_x1,'String','n');set(handles.text_y1,'String','h(n)');
set(handles.text_title2,'String','低通boxcar窗的频率响应图形');
set(handles.text_x2,'String','频(Hz)');
set(handles.text_y2,'String','幅值');
case 2
window2=bartlett(N);
b2=fir1(M,wn,window2);
[H2,W2]=freqz(b2,1,512,2);
stem(handles.axes1,b2,'filled');
grid on;
plot(handles.axes2,W2,20*log10(abs(H2)));%绘频率响应图形
set(handles.text_title1,'String','低通FIR数字滤波器h(n)波形');
set(handles.text_x1,'String','n');set(handles.text_y1,'String','h(n)');
set(handles.text_title2,'String','低通bartlett窗的频率响应图形');
set(handles.text_x2,'String','频率(Hz)');
set(handles.text_y2,'String','幅值');
case 3
window3=hanning(N);
b3=fir1(N-1,wn,window3);
[H3,W3]=freqz(b3,1,512,2);
stem(handles.axes1,b3,'filled');
grid on;
plot(handles.axes2,W3,20*log10(abs(H3)));%绘频率响应图形
set(handles.text_title1,'String','低通FIR数字滤波器h(n)波形');
set(handles.text_x1,'String','n');set(handles.text_y1,'String','h(n)');
set(handles.text_title2,'String','低通hanning窗的频率响应图形');
set(handles.text_x2,'String','频率(Hz)');
set(handles.text_y2,'String','幅值');
case 4
window4=hamming(N);
b4=fir1(N-1,wn,window4);
[H4,W4]=freqz(b4,1,512,2);
stem(handles.axes1,b4,'filled');
plot(handles.axes2,W4,20*log10(abs(H4)));%绘频率响应图形
set(handles.text_title1,'String','低通FIR数字滤波器h(n)波形');
set(handles.text_x1,'String','n');set(handles.text_y1,'String','h(n)');
set(handles.text_title2,'String','低通hamming窗频率响应图形');
set(handles.text_x2,'String','频率(Hz)');
set(handles.text_y2,'String','幅值');
case 5
window5=blackman(N);
b5=fir1(N-1,wn,window5);
[H5,W5]=freqz(b5,1,512,2);
stem(handles.axes1,b5,'filled');
grid on;
plot(handles.axes2,W5,20*log10(abs(H5)));%绘频率响应图形
set(handles.text_title1,'String','低通FIR数字滤波器h(n)波形');
set(handles.text_x1,'String','n');set(handles.text_y1,'String','h(n)');
set(handles.text_title2,'String','低通blackman窗频率响应图形');
set(handles.text_x2,'String','频率(Hz)');
set(handles.text_y2,'String','幅值');
case 6
[n,Wn,beta,~]=kaiserord([fp1fs1],[1 0],[0.01 0.01],100);
window6=kaiser(n+1,beta);%使用kaiser窗函数
b6=fir1(n,Wn,window6 ,'noscale');
[H6,W6]=freqz(b6,1,512,2);
stem(handles.axes1,b6,'filled');
grid on;
plot(handles.axes2,W6,20*log10(abs(H6)));%绘频率响应图形
set(handles.text_title1,'String','低通FIR数字滤波器h(n)波形');
set(handles.text_x1,'String','n');
set(handles.text_y1,'String','h(n)');
set(handles.text_title2,'String','低通kaiser窗的频率响应图形');
set(handles.text_x2,'String','频率(Hz)');
set(handles.text_y2,'String','幅值');
end
case 2 %高通滤波器
ws1=2*pi*fs1/Fs;
wp1=2*pi*fp1/Fs;
wn=(wp1+ws1)/2/pi;
Bt=wp1-ws1;
N0=ceil(6.2*pi/Bt);
N=N0+mod(N0+1,2);
M=N-1;
set(handles.text_M,'String',M);
if fs1>fp1
msgbox('错误:输入数据有误,请重新输入...','提示','error');
elseif fs1==fp1
msgbox('警告:存在问题,请检查!','提示','warn');
end
windows_value=get(handles.windows,'value');
switch windows_value %窗函数选择
case 1 %使用boxcar窗函数
window1=boxcar(N);
b1=fir1(N-1,wn,'high',window1);
[H1,W1]=freqz(b1,1,512,2);
stem(handles.axes1,b1,'filled');
grid on;
plot(handles.axes2,W1,20*log10(abs(H1)));%绘频率响应图形
set(handles.text_title1,'String','高通FIR数字滤波器h(n)波形');
set(handles.text_x1,'String','n');
set(handles.text_y1,'String','h(n)');
set(handles.text_title2,'String','高通boxcar窗的频率响应图形');
set(handles.text_x2,'String','频率(Hz)');
set(handles.text_y2,'String','幅值');
case 2
window2=bartlett(N);
b2=fir1(N-1,wn,'high',window2);
[H2,W2]=freqz(b2,1,512,2);
stem(handles.axes1,b2,'filled');
grid on;
plot(handles.axes2,W2,20*log10(abs(H2)));%绘频率响应图形
set(handles.text_title1,'String','高通FIR数字滤波器h(n)波形');
set(handles.text_x1,'String','n');
set(handles.text_y1,'String','h(n)');
set(handles.text_title2,'String','高通bartlett窗的频率响应图形');
set(handles.text_x2,'String','频率(Hz)');
set(handles.text_y2,'String','幅值');
case 3
window3=hanning(N);
b3=fir1(N-1,wn,'high',window3);
[H3,W3]=freqz(b3,1,512,2);
stem(handles.axes1,b3,'filled');
grid on;
plot(handles.axes2,W3,20*log10(abs(H3)));%绘频率响应图形
set(handles.text_title1,'String','高通FIR数字滤波器h(n)波形');
set(handles.text_x1,'String','n');
set(handles.text_y1,'String','h(n)');
set(handles.text_title2,'String','高通hanning窗的频率响应图形');
set(handles.text_x2,'String','频率(Hz)');
set(handles.text_y2,'String','幅值');
case 4
window4=hamming(N);
b4=fir1(N-1,wn,'high',window4);
[H4,W4]=freqz(b4,1,512,2);
stem(handles.axes1,b4,'filled');
grid on;
plot(handles.axes2,W4,20*log10(abs(H4)));%绘频率响应图形
set(handles.text_title1,'String','高通FIR数字滤波器h(n)波形');
set(handles.text_x1,'String','n');
set(handles.text_y1,'String','h(n)');
set(handles.text_title2,'String','高通hamming窗频率响应图形');
set(handles.text_x2,'String','频率(Hz)');
set(handles.text_y2,'String','幅值');
case 5
window5=blackman(N);
b5=fir1(N-1,wn,'high',window5);
[H5,W5]=freqz(b5,1,512,2);
stem(handles.axes1,b5,'filled');
grid on;
plot(handles.axes2,W5,20*log10(abs(H5)));%绘频率响应图形
set(handles.text_title1,'String','高通FIR数字滤波器h(n)波形');
set(handles.text_x1,'String','n');
set(handles.text_y1,'String','h(n)');
set(handles.text_title2,'String','高通blackman窗频率响应图形');
set(handles.text_x2,'String','频率(Hz)');
set(handles.text_y2,'String','幅值');
case 6
[n,Wn,beta,~]=kaiserord([fs1fp1],[0 1],[0.01 0.01],100);
window6=kaiser(n+1,beta);%使用kaiser窗函数
b6=fir1(n,Wn,'high',window6 ,'noscale');
[H6,W6]=freqz(b6,1,512,2);
stem(handles.axes1,b6,'filled');
grid on;
plot(handles.axes2,W6,20*log10(abs(H6)));%绘频率响应图形
set(handles.text_title1,'String','高通FIR数字滤波器h(n)波形');
set(handles.text_x1,'String','n');
set(handles.text_y1,'String','h(n)');
set(handles.text_title2,'String','高通kaiser窗的频率响应图形');
set(handles.text_x2,'String','频率(Hz)');
set(handles.text_y2,'String','幅值');
end
case 3 %带通滤波器
wp1=2*pi*fp1/Fs;%将通带下限截止频率转换为数字滤波器频率
wp2=2*pi*fp2/Fs;%将通带上限截止频率转换为数字滤波器频率
ws1=2*pi*fs1/Fs;%将通带下限截止频率转换为数字滤波器频率
ws2=2*pi*fs2/Fs;%将通带上限截止频率转换为数字滤波器频率
Bt=wp1-ws1;
N=ceil(12*pi/Bt);
M=N-1;
set(handles.text_M,'String',M);
if (fs1>fp1 || fs1>fp2 || fs1>fs2 || fp1>fp2 || fp1>fs2|| fp2>fs2)
msgbox('错误:数据输入有误,请重新输入...','提示','error');
elseif (fs1==fp1 || fs1==fp2 ||fs1==fs2 || fs2==fp1 || fs2==fp2 ||fp1==fp2)
msgbox('警告:存在问题,请检查!','提示','warn');
end
wn=[(wp1+ws1)/2/pi,(wp2+ws2)/2/pi];
windows_value=get(handles.windows,'value');
switch windows_value %窗函数选择
case 1 %使用boxcar窗函数
window1=boxcar(N);
b1=fir1(N-1,wn,window1);
[H1,W1]=freqz(b1,1,512,2);
stem(handles.axes1,b1,'filled');
grid on;
plot(handles.axes2,W1,20*log10(abs(H1)));%绘频率响应图形
set(handles.text_title1,'String','带通FIR数字滤波器h(n)波形');
set(handles.text_x1,'String','n');
set(handles.text_y1,'String','h(n)');
set(handles.text_title2,'String','带通boxcar窗的频率响应图形');
set(handles.text_x2,'String','频率(Hz)');
set(handles.text_y2,'String','幅值');
case 2
window2=bartlett(N);
b2=fir1(N-1,wn,window2);
[H2,W2]=freqz(b2,1,512,2);
stem(handles.axes1,b2,'filled');
grid on;
plot(handles.axes2,W2,20*log10(abs(H2)));%绘频率响应图形
set(handles.text_title1,'String','带通FIR数字滤波器h(n)波形');
set(handles.text_x1,'String','n');
set(handles.text_y1,'String','h(n)');
set(handles.text_title2,'String','带通bartlett窗的频率响应图形');
set(handles.text_x2,'String','频率(Hz)');
set(handles.text_y2,'String','幅值');
case 3
window3=hanning(N);
b3=fir1(N-1,wn,window3);
[H3,W3]=freqz(b3,1,512,2);
stem(handles.axes1,b3,'filled');
grid on;
plot(handles.axes2,W3,20*log10(abs(H3)));%绘频率响应图形
set(handles.text_title1,'String','带通FIR数字滤波器h(n)波形');
set(handles.text_x1,'String','n');
set(handles.text_y1,'String','h(n)');
set(handles.text_title2,'String','带通hanning窗的频率响应图形');
set(handles.text_x2,'String','频率(Hz)');
set(handles.text_y2,'String','幅值');
case 4
window4=hamming(N);
b4=fir1(N-1,wn,window4);
[H4,W4]=freqz(b4,1,512,2);
stem(handles.axes1,b4,'filled');
grid on;
plot(handles.axes2,W4,20*log10(abs(H4)));%绘频率响应图形
set(handles.text_title1,'String','带通FIR数字滤波器h(n)波形');
set(handles.text_x1,'String','n');
set(handles.text_y1,'String','h(n)');
set(handles.text_title2,'String','带通hamming窗频率响应图形');
set(handles.text_x2,'String','频率(Hz)');
set(handles.text_y2,'String','幅值');
case 5
window5=blackman(N);
b5=fir1(N-1,wn,window5);
[H5,W5]=freqz(b5,1,512,2);
stem(handles.axes1,b5,'filled');
grid on;
plot(handles.axes2,W5,20*log10(abs(H5)));%绘频率响应图形
set(handles.text_title1,'String','带通FIR数字滤波器h(n)波形');
set(handles.text_x1,'String','n');
set(handles.text_y1,'String','h(n)');
set(handles.text_title2,'String','带通blackman窗频率响应图形');
set(handles.text_x2,'String','频率(Hz)');
set(handles.text_y2,'String','幅值');
case 6
[n,Wn,beta,~]=kaiserord([fs1fp1 fp2 fs2],
[0 1 0],[0.01 0.01 0.01],100);%求阶数n以及参数beta
window6=kaiser(n+1,beta);%使用kaiser窗函数
b6=fir1(n,Wn,window6,'noscale');
[H6,W6]=freqz(b6,1,512,2);
stem(handles.axes1,b6,'filled');
grid on;
plot(handles.axes2,W6,20*log10(abs(H6)));%绘频率响应图形
set(handles.text_title1,'String','带通FIR数字滤波器h(n)波形');
set(handles.text_x1,'String','n');
set(handles.text_y1,'String','h(n)');
set(handles.text_title2,'String','带通kaiser窗的频率响应图形');
set(handles.text_x2,'String','频率(Hz)');
set(handles.text_y2,'String','幅值');
end
case 4 %带阻滤波器
wp1=2*pi*fp1/Fs;%将通带下限截止频率转换为数字滤波器频率
wp2=2*pi*fp2/Fs;%将通带上限截止频率转换为数字滤波器频率
ws1=2*pi*fs1/Fs;%将通带下限截止频率转换为数字滤波器频率
ws2=2*pi*fs2/Fs;%将通带上限截止频率转换为数字滤波器频率
Bt=ws1-wp1;
N0=ceil(6.2*pi/Bt);
N=N0+mod(N0+1,2);
M=N-1;
wn=[(wp1+ws1)/2/pi,(wp2+ws2)/2/pi];
set(handles.text_M,'String',M);
if (fp1>fs1 || fp1>fs2 || fp1>fp2 || fs1>fs2 || fs1>fp2|| fs2>fp2)
msgbox('错误:数据输入有误,请重新输入...','提示','error');
elseif (fs1==fp1 || fs1==fp2 ||fs1==fs2 || fs2==fp1 || fs2==fp2 ||fp1==fp2)
msgbox('警告:存在问题,请检查!','提示','warn');
end
windows_value=get(handles.windows,'value');
switch windows_value %窗函数选择
case 1 %使用boxcar窗函数
window1=boxcar(N);
b1=fir1(N-1,wn,'stop',window1);
[H1,W1]=freqz(b1,1,512,2);
stem(handles.axes1,b1,'filled');
grid on;
plot(handles.axes2,W1,20*log10(abs(H1)));%绘频率响应图形
set(handles.text_title1,'String','带阻FIR数字滤波器h(n)波形');
set(handles.text_x1,'String','n');
set(handles.text_y1,'String','h(n)');
set(handles.text_title2,'String','带阻boxcar窗的频率响应图形');
set(handles.text_x2,'String','频率(Hz)');
set(handles.text_y2,'String','幅值');
case 2
window2=bartlett(N);
b2=fir1(N-1,wn,'stop',window2);
[H2,W2]=freqz(b2,1,512,2);
stem(handles.axes1,b2,'filled');
grid on;
plot(handles.axes2,W2,20*log10(abs(H2)));%绘频率响应图形
set(handles.text_title1,'String','带阻FIR数字滤波器h(n)波形');
set(handles.text_x1,'String','n');
set(handles.text_y1,'String','h(n)');
set(handles.text_title2,'String','带阻bartlett窗的频率响应图形');
set(handles.text_x2,'String','频率(Hz)');
set(handles.text_y2,'String','幅值');
case 3
window3=hanning(N);
b3=fir1(N-1,wn,'stop',window3);
[H3,W3]=freqz(b3,1,512,2);
stem(handles.axes1,b3,'filled');
grid on;
plot(handles.axes2,W3,20*log10(abs(H3)));%绘频率响应图形
set(handles.text_title1,'String','带阻FIR数字滤波器h(n)波形');
set(handles.text_x1,'String','n');
set(handles.text_y1,'String','h(n)');
set(handles.text_title2,'String','带阻hanning窗的频率响应图形');
set(handles.text_x2,'String','频率(Hz)');
set(handles.text_y2,'String','幅值');
case 4
window4=hamming(N);
b4=fir1(N-1,wn,'stop',window4);
[H4,W4]=freqz(b4,1,512,2);
stem(handles.axes1,b4,'filled');
grid on;
plot(handles.axes2,W4,20*log10(abs(H4)));%绘频率响应图形
set(handles.text_title1,'String','带阻FIR数字滤波器h(n)波形');
set(handles.text_x1,'String','n');
set(handles.text_y1,'String','h(n)');
set(handles.text_title2,'String','带阻hamming窗频率响应图形');
set(handles.text_x2,'String','频率(Hz)');
set(handles.text_y2,'String','幅值');
case 5
window5=blackman(N);
b5=fir1(N-1,wn,'stop',window5);
[H5,W5]=freqz(b5,1,512,2);
stem(handles.axes1,b5,'filled');
grid on;
plot(handles.axes2,W5,20*log10(abs(H5)));%绘频率响应图形
set(handles.text_title1,'String','带阻FIR数字滤波器h(n)波形');
set(handles.text_x1,'String','n');
set(handles.text_y1,'String','h(n)');
set(handles.text_title2,'String','带阻blackman窗频率响应图形');
set(handles.text_x2,'String','频率(Hz)');
set(handles.text_y2,'String','幅值');
case 6
[n,Wn,beta,~]=kaiserord([fp1fs1 fs2 fp2],
[1 0 1],[0.01 0.01 0.01],100);%求阶数n以及参数beta
window6=kaiser(n+1,beta);%使用kaiser窗函数
b6=fir1(n,Wn,'stop',window6,'noscale');
[H6,W6]=freqz(b6,1,512,100);
stem(handles.axes1,b6,'filled');
grid on;
plot(handles.axes2,W6,20*log10(abs(H6)));%绘频率响应图形
set(handles.text_title1,'String','带阻FIR数字滤波器h(n)波形');
set(handles.text_x1,'String','n');
set(handles.text_y1,'String','h(n)');
set(handles.text_title2,'String','带阻kaiser窗的频率响应图形');
set(handles.text_x2,'String','频率(Hz)');
set(handles.text_y2,'String','幅值');
end
end