1回答

3收藏

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

STMCU STMCU 5286 人阅读 | 1 人回复 | 2017-04-01

MATLAB如何来设计滤波器,今天我们先来设计一些FIR滤波器。
首先,我们打开MATLAB的help窗口,点击Help->product Help




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

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




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

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




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

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




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

这里主要说一下这个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滤波器系数




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

freqz(b,1)




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

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


运行结果如下




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

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


运行结果如下:




也可以设计带通滤波器;

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


运行如下




设计带阻滤波器

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


运行如下





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\')


运行结果如下:




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

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




现在我想我们应该会设计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(\'滤除噪声后信号频谱\');


运行结果如下:




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


关注下面的标签,发现更多相似文章
分享到:
回复

使用道具 举报

回答|共 1 个

倒序浏览

沙发

stary666

发表于 2017-4-1 17:01:29 | 只看该作者

分析的很好,看看了,
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

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