查看: 3849|回复: 1

STM32F4 DSP库学习笔记-MATLAB设计FIR滤波器

[复制链接]
  • TA的每日心情
    开心
    2013-12-17 13:39
  • 签到天数: 48 天

    连续签到: 1 天

    [LV.5]常住居民I

    发表于 2017-4-1 10:58:26 | 显示全部楼层 |阅读模式
    分享到:
    MATLAB如何来设计滤波器,今天我们先来设计一些FIR滤波器。
    首先,我们打开MATLAB的help窗口,点击Help->product Help


    1.jpg


    这里有很多的工具箱,我们找到我们需要的Signal Processing Toolbox。
    这里包括了很多关于信号处理的东西,有基础的传输函数定义,已经各种滤波器设计的例子,当然还有很多很多设计滤波器使用函数的介绍,这些都有详细的介绍。

    首先还是介绍一下FIR滤波器,FIR滤波器中文意思就是有限冲击响应滤波器,是由差分方程描述的一类特殊离散时间系统。


    2.png


    功能就是把一段离散的输入序列经过这个系统变成另一端离散的输出序列。不同的运算方法就代表了不同的系统。

    MATLAB的help文档中,数字滤波器传递函数是这样描述的:


    3.png


    如果a(1)=1;a(2)=a(3)=...=a(m+1)=0;那么这传递函数就变成了FIR滤波器传递函数,n就代表了阶数。所以,我们设计一个滤波器就只需要知道b(1),b(2),,,,,,,,,b(n+1)就可以了。

    在针对FIR滤波器的设计中,MATLAB提供了如下的一些函数:


    4.png


    而且这些函数都给出了详细的介绍,只是全是英文的,大家也可以仔细看看。

    这里主要说一下这个fir1和fir2的使用


    fir1:
    共有如下几种函数形式:


    b = fir1(n,Wn)
    b = fir1(n,Wn,\'ftype\')
    b = fir1(n,Wn,window)
    b = fir1(n,Wn,\'ftype\',window)
    b = fir1(...,\'normalization\')


    具体内容可以看fir1下的函数介绍


    譬如运行下面语句


    b = fir1(20,0.2)


    会返回20阶,截止频率为0.2的FIR滤波器系数


    5.png


    接下来,在运行下面语句就可以看到幅度频特性和相频特性,还有就是要注意一点。比如这个w=0.2所对应的模拟域数字频率应该是0.1*Fs,因为从图中可以看出0.2是相对于数字域频率pi的。

    freqz(b,1)


    6.jpg


    如要设计一个50阶,截止频率是0.25*pi的FIR高通数字滤波器可以这样写:

    b = fir1(50,0.25,\'high\');
    freqz(b,1);


    运行结果如下


    6.png


    把字符high改为low就是设计低通滤波器了

    b = fir1(50,0.25,\'low\');
    freqz(b,1);


    运行结果如下:


    7.png


    也可以设计带通滤波器;

    b=fir1(40,[0.25,0.45])
    freqz(b,1);


    运行如下


    8.png


    设计带阻滤波器

    b=fir1(40,[0.25,0.45],\'stop\');
    freqz(b,1);


    运行如下


    9.png



    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)


    具体参数描述见help文档,
    还是通过举例子来说明使用方法:

    Help文档里的例子:


    f = [0 0.6 0.6 1];
    m = [1 1 0 0];
    b = fir2(30,f,m);
    [h,w] = freqz(b,1,128);
    plot(f,m,w/pi,abs(h));
    legend(\'Ideal\',\'fir2 Designed\')
    title(\'Comparison of Frequency Response Magnitudes\')


    运行结果如下:


    10.png


    可以看到Ideal是我们理想的低通滤波器曲线

    fir2 Designe是我们用fir2函数设计出来的。


    11.png


    现在我想我们应该会设计FIR滤波器了。

    下面就举个例子看看滤波器的效果吧。


    Fs=1000;%采样率=1k
    N=1024;
    n=0:N-1;
    f=n*Fs/N;
    t=0:1/Fs:1-1/Fs;%采样1s
    Signal=sin(2*pi*50*t);
    noise1=0.5*sin(2*pi*200*t);
    noise2=0.25*sin(2*pi*300*t);
    mix_signal=Signal+noise1+noise2;
    subplot(2,2,1);
    plot(t,mix_signal);
    xlabel(\'时间/t\');
    ylabel(\'振幅/v\');
    title(\'输入加噪信号\');
    grid on;
    subplot(2,2,2);
    Y=fft(mix_signal,N);
    plot(f,abs(Y));
    xlabel(\'频率/Hz\');
    ylabel(\'幅度\');
    title(\'输入加噪信号频谱\');
    b=fir1(40,0.25);
    [H,F]=freqz(b,1,512);
    subplot(2,2,4);
    plot(F/pi,abs(H));
    xlabel(\'*0.5Fs/Hz\');
    ylabel(\'幅度\');
    title(\'FIR滤波器幅频响应\');
    y2=filtfilt(b,1,mix_signal);%0.25*1000/2=125Hz
    y3=fft(y2,N);
    subplot(2,2,3);
    plot(f,abs(y3));
    xlabel(\'频率/Hz\');
    ylabel(\'幅度\');
    title(\'滤除噪声后信号频谱\');


    运行结果如下:


    12.png


    可以看到滤波器确实把200Hz和300Hz的噪声滤除了!


    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2021-7-30 11:40
  • 签到天数: 1792 天

    连续签到: 1 天

    [LV.Master]伴坛终老

    发表于 2017-4-1 17:01:29 | 显示全部楼层
    分析的很好,看看了,
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-4-25 21:08 , Processed in 0.134609 second(s), 21 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.