FIR数字滤波器的GUI设计


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


猜你喜欢

转载自blog.csdn.net/weixin_38327420/article/details/80776840