本帖最后由 硬汉Eric2013 于 2015-7-10 16:42 编辑
36.2 fir1函数36.2.1 fir1函数介绍 函数fir1用来设计标准频率响应的基于窗函数的FIR滤波器,可实现加窗线性相位FIR滤波器设计。 语法: b = fir1(n,Wn) b = fir1(n,Wn,'ftype') b = fir1(n,Wn,window) b = fir1(n,Wn,'ftype',window) b = fir1(...,'normalization') 其中,n:为了滤波器的阶数;Wn:为滤波器的截止频率;ftype:参数用来决定滤波器的类型,当ftype=high时,可设计高通滤波器,当ftype=stop时,可设计带阻滤波器。Window参数用来指导滤波器采用的窗函数类型。其默认值为汉明(Hamming)窗。 使用fir1函数可设计标准的低通,高通,带通和带阻滤波器。滤波器的系数包含在返回值b中,可表示为: b(z) = b(1) + b(2)z-1 + …… +b(n+1)z-n (1) 采用汉明窗设计低通FIR滤波器 使用b=fir1(n, Wn)可得到低通滤波器。其中,
。其语法格式为 b=fir1(n, Wn) (2) 采用汉明窗设计高通FIR滤波器 在b=fir1(n, Wn, 'ftype')中,当ftype=high时,可设计高通滤波器。其语法格式为 b=fir1(n, Wn, 'high') (3) 采用汉明窗设计带通FIR滤波器 在b=fir1(n, Wn)中,当Wn=[W1 W2]时,fir1函数可得到带通滤波器,其通带为W1 < W < W2 W1 和 W2分别为通带的下限频率和上限频率。其语法格式为 b=fir1(n, [W1 W2]) (4) 采用汉明窗设计带阻FIR滤波器 在b = fir1(n,Wn,'ftype')中,当ftype=stop,Wn=[W1 W2]时,fir1函数可得到带阻滤波器,其语法格式为 b=fir1(n, [W1 W2], 'stop') (5) 采用其他窗口函数设计FIR滤波器 使用Window参数,可以用其他窗口函数设计出各种加窗滤波器,Window参数可采用的窗口函数有Boxcar,Hamming,Bartlett,Blackman,Kasier和Chebwin等。其默认时为Hamming窗。例如,采用Bartlett窗设计带阻滤波器,其语法结构为 b=fir1(n, [W1 W2],'stop', Bartlett[n+1]) 注意:用fir1函数设计高通和带阻滤波器时,所使用的阶数n应为偶数,当输入的阶数n为奇数时,fir1函数会自动将阶数增加1形成偶数。 36.2.2 fir1设计低通滤波器实例 下面我们通过一个实例来讲解fir1的用法。原始信号是由50Hz正弦波和200Hz的正弦波组成,将200Hz的正弦波当做噪声滤掉,下面通过函数fir1设计一组低通滤波器系数,其阶数是30,截止频率为0.25(也就是125Hz)。Matlab运行代码如下:
- %****************************************************************************************
- % FIR低通滤波器设计
- %***************************************************************************************
- fs=1000; %设置采样频率 1k
- N=1024; %采样点数
- n=0:N-1;
- t=0:1/fs:1-1/fs; %时间序列
- f=n*fs/N; %频率序列
-
- Signal_Original=sin(2*pi*50*t); %信号50Hz正弦波
- Signal_Noise=sin(2*pi*200*t); %噪声200Hz正弦波
-
- Mix_Signal=Signal_Original+Signal_Noise; %将信号Signal_Original和Signal_Original合成一个信号进行采样
- subplot(221);
- plot(t, Mix_Signal); %绘制信号Mix_Signal的波形
- xlabel('时间');
- ylabel('幅值');
- title('原始信号');
- grid on;
-
- subplot(222);
- y=fft(Mix_Signal, N); %对信号 Mix_Signal做FFT
- plot(f,abs(y));
- xlabel('频率/Hz');
- ylabel('振幅');
- title('原始信号FFT');
- grid on;
-
- b = fir1(30, 0.25); %30阶FIR低通滤波器,截止频率125Hz
- %y2= filter(b, 1, x);
- y2=filtfilt(b,1,x); %经过FIR滤波器后得到的信号
- Ps=sum(Signal_Original.^2); %信号的总功率
- Pu=sum((y2-Signal_Original).^2); %剩余噪声的功率
- SNR=10*log10(Ps/Pu); %信噪比
-
- y3=fft(y2, N); %经过FIR滤波器后得到的信号做FFT
- subplot(223);
- plot(f,abs(y3));
- xlabel('频率/Hz');
- ylabel('振幅');
- title('滤波后信号FFT');
- grid on;
-
- [H,F]=freqz(b,1,512); %通过fir1设计的FIR系统的频率响应
- subplot(224);
- plot(F/pi,abs(H)); %绘制幅频响应
- xlabel('归一化频率');
- title(['Order=',int2str(30),' SNR=',num2str(SNR)]);
- grid on;
复制代码
Matlab的运行结果如下:
从运行结果的FFT和信噪比来看,滤波效果比较明显。 36.2.3 fir1设计高通滤波器实例 下面我们通过一个实例来讲解fir1的高通滤波器的用法。原始信号是由50Hz正弦波和200Hz的正弦波组成,将50Hz的正弦波当做噪声滤掉,下面通过函数fir1设计一组高通滤波器系数,其阶数是30,截止频率为0.25(也就是125Hz)。Matlab运行代码如下:
- %****************************************************************************************
- % FIR高通滤波器设计
- %***************************************************************************************
- fs=1000; %设置采样频率 1k
- N=1024; %采样点数
- n=0:N-1;
- t=0:1/fs:1-1/fs; %时间序列
- f=n*fs/N; %频率序列
-
- Signal_Original=sin(2*pi*200*t); %信号200Hz正弦波
- Signal_Noise=sin(2*pi*50*t); %噪声50Hz正弦波
-
- Mix_Signal=Signal_Original+Signal_Noise; %将信号Signal_Original和Signal_Original合成一个信号进行采样
- subplot(221);
- plot(t, Mix_Signal); %绘制信号Mix_Signal的波形
- xlabel('时间');
- ylabel('幅值');
- title('原始信号');
- grid on;
-
- subplot(222);
- y=fft(Mix_Signal, N); %对信号 Mix_Signal做FFT
- plot(f,abs(y));
- xlabel('频率/Hz');
- ylabel('振幅');
- title('原始信号FFT');
- grid on;
-
- b = fir1(30, 0.25, 'high'); %30阶FIR低通滤波器,截止频率125Hz
- %y2= filter(b, 1, x);
- y2=filtfilt(b,1,x); %经过FIR滤波器后得到的信号
- Ps=sum(Signal_Original.^2); %信号的总功率
- Pu=sum((y2-Signal_Original).^2); %剩余噪声的功率
- SNR=10*log10(Ps/Pu); %信噪比
-
- y3=fft(y2, N); %经过FIR滤波器后得到的信号做FFT
- subplot(223);
- plot(f,abs(y3));
- xlabel('频率/Hz');
- ylabel('振幅');
- title('滤波后信号FFT');
- grid on;
-
- [H,F]=freqz(b,1,512); %通过fir1设计的FIR系统的频率响应
- subplot(224);
- plot(F/pi,abs(H)); %绘制幅频响应
- xlabel('归一化频率');
- title(['Order=',int2str(30),' SNR=',num2str(SNR)]);
- grid on;
复制代码
Matlab的运行结果如下:
从运行结果的FFT和信噪比来看,滤波效果比较明显。 36.2.4 fir1设计带通滤波器实例 下面我们通过一个实例来讲解fir1的带通滤波器的用法。原始信号是由50Hz正弦波和200Hz的正弦波组成,设计通带为125Hz到300Hz,下面通过函数fir1设计一组带通滤波器系数,其阶数是30,通带为0.25 < W <0.6。Matlab运行代码如下:
- %****************************************************************************************
- % FIR带通滤波器设计
- %***************************************************************************************
- fs=1000; %设置采样频率 1k
- N=1024; %采样点数
- n=0:N-1;
- t=0:1/fs:1-1/fs; %时间序列
- f=n*fs/N; %频率序列
-
- Signal_Original=sin(2*pi*200*t); %信号200Hz正弦波
- Signal_Noise=sin(2*pi*50*t); %噪声50Hz正弦波
-
- Mix_Signal=Signal_Original+Signal_Noise; %将信号Signal_Original和Signal_Original合成一个信号进行采样
- subplot(221);
- plot(t, Mix_Signal); %绘制信号Mix_Signal的波形
- xlabel('时间');
- ylabel('幅值');
- title('原始信号');
- grid on;
-
- subplot(222);
- y=fft(Mix_Signal, N); %对信号 Mix_Signal做FFT
- plot(f,abs(y));
- xlabel('频率/Hz');
- ylabel('振幅');
- title('原始信号FFT');
- grid on;
-
- b = fir1(30, [0.25 0.6]); %30阶FIR低通滤波器,截止频率125Hz
- %y2= filter(b, 1, x);
- y2=filtfilt(b,1,x); %经过FIR滤波器后得到的信号
- Ps=sum(Signal_Original.^2); %信号的总功率
- Pu=sum((y2-Signal_Original).^2); %剩余噪声的功率
- SNR=10*log10(Ps/Pu); %信噪比
-
- y3=fft(y2, N); %经过FIR滤波器后得到的信号做FFT
- subplot(223);
- plot(f,abs(y3));
- xlabel('频率/Hz');
- ylabel('振幅');
- title('滤波后信号FFT');
- grid on;
-
- [H,F]=freqz(b,1,512); %通过fir1设计的FIR系统的频率响应
- subplot(224);
- plot(F/pi,abs(H)); %绘制幅频响应
- xlabel('归一化频率');
- title(['Order=',int2str(30),' SNR=',num2str(SNR)]);
- grid on;
复制代码
Matlab运行结果如下:
从运行结果的FFT和信噪比来看,滤波效果比较明显。 36.2.5 fir1设计带阻滤波器实例 下面我们通过一个实例来讲解fir1的带阻滤波器的用法。原始信号是由50Hz正弦波和200Hz的正弦波组成,设计阻带为125Hz到300Hz,下面通过函数fir1设计一组带阻滤波器系数,其阶数是30,阻带为0.25 < W <0.6。Matlab运行代码如下:
- %****************************************************************************************
- % FIR带阻滤波器设计
- %***************************************************************************************
- fs=1000; %设置采样频率 1k
- N=1024; %采样点数
- n=0:N-1;
- t=0:1/fs:1-1/fs; %时间序列
- f=n*fs/N; %频率序列
-
- Signal_Original=sin(2*pi*50*t); %信号50Hz正弦波
- Signal_Noise=sin(2*pi*200*t); %噪声200Hz正弦波
-
- Mix_Signal=Signal_Original+Signal_Noise; %将信号Signal_Original和Signal_Original合成一个信号进行采样
- subplot(221);
- plot(t, Mix_Signal); %绘制信号Mix_Signal的波形
- xlabel('时间');
- ylabel('幅值');
- title('原始信号');
- grid on;
-
- subplot(222);
- y=fft(Mix_Signal, N); %对信号 Mix_Signal做FFT
- plot(f,abs(y));
- xlabel('频率/Hz');
- ylabel('振幅');
- title('原始信号FFT');
- grid on;
-
- b = fir1(30, [0.25 0.6], 'stop'); %30阶FIR低通滤波器,截止频率125Hz
- %y2= filter(b, 1, x);
- y2=filtfilt(b,1,x); %经过FIR滤波器后得到的信号
- Ps=sum(Signal_Original.^2); %信号的总功率
- Pu=sum((y2-Signal_Original).^2); %剩余噪声的功率
- SNR=10*log10(Ps/Pu); %信噪比
-
- y3=fft(y2, N); %经过FIR滤波器后得到的信号做FFT
- subplot(223);
- plot(f,abs(y3));
- xlabel('频率/Hz');
- ylabel('振幅');
- title('滤波后信号FFT');
- grid on;
-
- [H,F]=freqz(b,1,512); %通过fir1设计的FIR系统的频率响应
- subplot(224);
- plot(F/pi,abs(H)); %绘制幅频响应
- xlabel('归一化频率');
- title(['Order=',int2str(30),' SNR=',num2str(SNR)]);
- grid on;
复制代码
Matlab运行结果如下:
从运行结果的FFT和信噪比来看,滤波效果比较明显。 36.2.6 切比雪夫窗口函数设计带通滤波器实例 下面我们通过一个实例来讲解fir1设计切比雪夫窗口的的带通滤波器。原始信号是由50Hz正弦波和200Hz的正弦波组成,设计通带为125Hz到300Hz,下面通过函数fir1设计一组带通滤波器系数,其阶数是30,通带为0.25 < W <0.6,并且具有25db波纹的切比雪夫窗。Matlab运行代码如下:
- %****************************************************************************************
- % 切比雪夫窗口函数设计带通滤波器
- %***************************************************************************************
- fs=1000; %设置采样频率 1k
- N=1024; %采样点数
- n=0:N-1;
- t=0:1/fs:1-1/fs; %时间序列
- f=n*fs/N; %频率序列
-
- Signal_Original=sin(2*pi*200*t); %信号200Hz正弦波
- Signal_Noise=sin(2*pi*50*t); %噪声50Hz正弦波
-
- Mix_Signal=Signal_Original+Signal_Noise; %将信号Signal_Original和Signal_Original合成一个信号进行采样
- subplot(221);
- plot(t, Mix_Signal); %绘制信号Mix_Signal的波形
- xlabel('时间');
- ylabel('幅值');
- title('原始信号');
- grid on;
-
- subplot(222);
- y=fft(Mix_Signal, N); %对信号 Mix_Signal做FFT
- plot(f,abs(y));
- xlabel('频率/Hz');
- ylabel('振幅');
- title('原始信号FFT');
- grid on;
-
- Window = chebwin(31, 25); %25db的切比雪夫窗
- b = fir1(30, [0.25 0.6], Window); %30阶FIR低通滤波器,截止频率125Hz
- %y2= filter(b, 1, x);
- y2=filtfilt(b,1,x); %经过FIR滤波器后得到的信号
- Ps=sum(Signal_Original.^2); %信号的总功率
- Pu=sum((y2-Signal_Original).^2); %剩余噪声的功率
- SNR=10*log10(Ps/Pu); %信噪比
-
- y3=fft(y2, N); %经过FIR滤波器后得到的信号做FFT
- subplot(223);
- plot(f,abs(y3));
- xlabel('频率/Hz');
- ylabel('振幅');
- title('滤波后信号FFT');
- grid on;
-
- [H,F]=freqz(b,1,512); %通过fir1设计的FIR系统的频率响应
- subplot(224);
- plot(F/pi,abs(H)); %绘制幅频响应
- xlabel('归一化频率');
- title(['Order=',int2str(30),' SNR=',num2str(SNR)]);
- grid on;
复制代码
Matlab运行结果如下:
通过归一化频率可以看出切比雪夫窗口是有一定纹波的。不过从FFT结果和信噪比来看,通过切比雪夫窗口做的滤波效果也是比较明显的。
|