在实际的应用中,有时需要使用FIR根据完成一些特定功能,比如近似一阶RC低通电路的响应,等等。如何确定FIR滤波器的系数呢?
http://www.360doc.com/content/17/0518/21/1832721_655109467.shtml 中有这么一段话:
FIR滤波器很简单,它实际上是一个全零点模型(MA滑动平均模型),滤波器系数只包含滑动平均的B,而自回归的A=1。滤波过程就是X和B的卷积,再联系滤波器的原理,容易知道,FIR滤波器的系数B就是滤波器的冲激响应h。
因此它的设计就简单了,只要设定滤波器的频率响应H,进行ifft后就得到冲激响应h,把h直接作为滤波器系数B对原信号滤波即可。
可有如下的例子:
%此函数是filter函数的标准示例,体现了使用滤波器进行波形处理的思路和写法。 %其功能是实现低通滤波。 clc;clear; Fs = 2048; % Sampling frequency T = 1/Fs; % Sampling period L = 1024; % Length of signal t = (0:L-1)*T; % Time vector f1 = 100; f2 = 700; S1 = sin(2*pi*f1*t)+sin(2*pi*f2*t); % figure(1);plot(1000*t(1:50),(S1(1:50))); figure(1);fft_test(1, Fs, 1024, S1);title('低通滤波前'); jieshu = 150; Window=boxcar(jieshu+1); Num1=fir1(jieshu,[0.001 0.3], Window); a= [1]; imp = [1; zeros(jieshu, 1)]; h1 = filter(Num1, a, imp); w = conv(S1,h1); %标记有***的是另外一种方法。事实上直接对原序列filter也行。 % w = filter(Num1,a, S1); %*** % S2 = w(jieshu/2:1024+jieshu/2); figure(2);fft_test(1, Fs, 1024, S2);title('低通滤波后'); % figure(2);fft_test(1, Fs, 1024, w);title('低通滤波后'); %***
Num1即为低通滤波的冲激响应。filter函数直接了当的一边实现了FIR滤波器,一边进行了滤波。
同时,
zzz = fft(Num1); plot(abs(zzz));
可得:
对Num1FFT可得如上的图,可见Num1确实是已知的频率响应的频谱的ifft的结果,与最开始的结论想吻合。