matlab进行FIR滤波器设计(一)

    在实际的应用中,有时需要使用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的结果,与最开始的结论想吻合。

猜你喜欢

转载自blog.csdn.net/leokingszx/article/details/80041910