完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
转dsp系列教程本章节讲解FIR滤波器的matlab设计。主要是函数fir1和fir2的使用。
36.1 窗函数 36.2 fir1函数 36.3 fir2函数 36.4 总结 36.1 窗函数 在数字信号处理中不可避免地要用到数据截取的问题。例如,在应用DFT的时候,数据x(n)总是有限长的,在滤波器设计中遇到了对理想滤波器抽样响应h(n)的截取问题,在功率谱估计中也要遇到对自相关函数的截取问题。总之,我们在实际工作中所能处理的离散序列总是有限长,把一个长序列变换成有限长的序列不可避免的要用到窗函数。因此,窗函数本身的研究及其应用是信号处理中的一个基本问题。 不同的窗函数对信号频谱的影响是不一样的,这主要是因为不同的窗函数,产生泄漏的大小不一样,频率分辨能力也不一样。信号的截断产生了能量泄漏,而用FFT算法计算频谱又产生了栅栏效应,从原理上讲这两种误差都是不能消除的,但是我们可以通过选择不同的窗函数对它们的影响进行抑制。(矩形窗主瓣窄,旁瓣大,频率识别精度最高,幅值识别精度最低;布莱克曼窗主瓣宽,旁瓣小,频率识别精度最低,但幅值识别精度最高)。 对于窗函数的选择,应考虑被分析信号的性质与处理要求。如果仅要求精确读出主瓣频率,而不考虑幅值精度,则可选用主瓣宽度比较窄而便于分辨的矩形窗,例如测量物体的自振频率等;如果分析窄带信号,且有较强的干扰噪声,则应选用旁瓣幅度小的窗函数,如汉宁窗、三角窗等;对于随时间按指数衰减的函数,可采用指数窗来提高信噪比。 l 矩形窗: 矩形窗属于时间变量的零次幂窗。矩形窗使用最多,习惯上不加窗就是使信号通过了矩形窗。这种窗的优点是主瓣比较集中,缺点是旁瓣较高,并有负旁瓣,导致变换中带进了高频干扰和泄漏,甚至出现负谱现象。 l 三角窗: 三角窗亦称费杰(Fejer)窗,是幂窗的一次方形式。与矩形窗比较,主瓣宽约等于矩形窗的两倍,但旁瓣小,而且无负旁瓣。 l 汉宁窗: 汉宁窗又称升余弦窗,汉宁窗可以看作是3个矩形时间窗的频谱之和,或者说是 3个 sinc(t)型函数之和,而括号中的两项相对于第一个谱窗向左、右各移动了 π/T,从而使旁瓣互相抵消,消去高频干扰和漏能。可以看出,汉宁窗主瓣加宽并降低,旁瓣则显著减小,从减小泄漏观点出发,汉宁窗优于矩形窗.但汉宁窗主瓣加宽,相当于分析带宽加宽,频率分辨力下降。 l 海明窗: 海明窗也是余弦窗的一种,又称改进的升余弦窗。海明窗与汉宁窗都是余弦窗,只是加权系数不同。海明窗加权的系数能使旁瓣达到更小。分析表明,海明窗的第一旁瓣衰减为一42dB.海明窗的频谱也是由3个矩形时窗的频谱合成,但其旁瓣衰减速度为20dB/(10oct),这比汉宁窗衰减速度慢。海明窗与汉宁窗都是很有用的窗函数。 |
|
相关推荐
|
|
l 高斯窗:
三角窗亦称费杰(Fejer)窗,是幂窗的一次方形式。与矩形窗比较,主瓣宽约等于矩形窗的两倍,但旁瓣小,而且无负旁瓣。 还有很多其它的窗口这里就不做介绍了,需更详细的了解的话,可以看matlab中help文档中的如下部分(这里只截图了一部分窗口)。 |
|
|
|
|
|
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)可得到低通滤波器。其中, 0Wn1, Wn=1相当于0.5。其语法格式为 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; |
|
|
|
|
|
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; |
|
|
|
|
|
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; |
|
|
|
|
|
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; |
|
|
|
|
|
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结果和信噪比来看,通过切比雪夫窗口做的滤波效果也是比较明显的。 |
|
|
|
|
|
36.3 fir2函数
36.3.1 fir2函数介绍 函数fir2用来设计有任意频率响应的各种加窗FIR滤波器。 语法: b = fir2(n,f,m) b = fir2(n,f,m,window) b = fir2(n,f,m,npt) b = fir2(n,f,m,npt,window) b = fir2(n,f,m,npt,lap) b = fir2(n,f,m,npt,lap,window) 参数n为滤波器的阶数。 参数f为频率点矢量,且f[0, 1], f=1对应于0.5fs。矢量f按升序排列,且第一个元素必须为0,最后一个必须为1,并可以包含重复的频率点。 参数m为幅度点矢量,在矢量m中包含了与f相对应的期望得到的滤波器幅度。 参数Window用来指导所使用的窗函数类型,其默认值为汉明窗。 参数npt用来指定fir2函数对频率响应进行内插的点数。 参数lap用来指定fir2函数在重复频率点附近插入的区域大小。 |
|
|
|
|
|
36.3.2 fir2设计低通滤波器
fir2函数是用来设计任意频率响应的各种加窗FIR滤波器,此函数使用也比较简单,但是要采样的频率点和幅值不好把握,关于这个函数我们仅提供一个低通滤波器的设计。 原始信号是由50Hz正弦波和200Hz的正弦波组成,将200Hz的正弦波当做噪声滤掉,下面通过函数fir2进行设计。其中频率点矢量和幅度点矢量配置如下: F = [0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 1]; A = [1 1 1 1 0 0 0 0 0 0]; Matlab运行的代码如下: 复制代码 %**************************************************************************************** % fir2设计低通滤波器 %*************************************************************************************** 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; F = [0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 1]; %表示要采样的点 A = [1 1 1 1 0 0 0 0 0 0]; %表示采样点的幅值 b = fir2(30, F, A); %30阶FIR低通滤波器 %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; |
|
|
|
|
|
飞凌嵌入式-ELFBOARD 解决PCB布线时无法捕捉到焊盘中心的问题
449 浏览 0 评论
Openharmony软件评估指南-米尔瑞芯微RK3568开发板
803 浏览 0 评论
STM32CUBEMX(7)--移植雅特力AT32F403AVGT(兼容STM32F103VGT6),DAC输出电压
1113 浏览 0 评论
【RA-Eco-RA0E1-32PIN-V1.0开发板试用】开发板简介与上电测试
1059 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-shell脚本编写之传参
590 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11053 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-9-11 16:12 , Processed in 1.068833 second(s), Total 100, Slave 82 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191