求救,如何在matlab里从脉冲响应得到滤波结果?
目前,我在我在matlab里使用2RC滤波器对数字信号进行滤波。我现在遇到这么一个问题:我想知道的是:
(1):我现在只知道2RC滤波器的脉冲响应和幅度、相位响应,我想知道如何使用2RC滤波器进行数字滤波,
(2)更进一步的:怎么样在知道滤波器的脉冲响应和幅度、相位响应的情况下如何得到滤波结果。
哪位高手知道这些办法,希望能够不吝赐教。最好能给我点matlab的相关程序参考一下 原帖由 greenbug 于 2006-9-12 11:39 发表
(1):我现在只知道2RC滤波器的脉冲响应和幅度、相位响应,我想知道如何使用2RC滤波器进行数字滤波,
知道“2RC滤波器的脉冲响应和幅度、相位响应”, 是否是模拟滤波器的激冲响应和幅度、相位响应? 是的,是模拟的 你知道了滤波器的脉冲响应函数了,对吧?拿你的脉冲响应和输入数据做卷积就行了,这是时域的方法。原理上,如果你知道滤波器幅频特性和相频特性,你就知道了它的频率响应函数,你还可以在频域与输入相乘,然后IFFT获得时域结果。 我在这里介绍的方法是根据从模拟滤波器经激冲不变法,转换成数字滤波器的方法。一般在数字滤波器的设计中,使用激冲不变法时是先已知模拟滤波器的传递函数的系数,也就是在S函数中的系数,经转变得到Z函数中的系数,即IIR数字滤波器的系数。
为了要进行这样的转换,又要证明这种方法的正确性,我在这帖中先设一个模拟低通滤波器,求出它的传递函数和激冲响应,用模拟滤波器的传递函数经激冲不变法给出数字滤波器的传递函数,即笫I组数字滤波器系数。其程序为:
=butter(2,.2,'s');% 使用Butterworth低通滤波器
sys=tf(b,a);
fprintf('b=%5.6f %5.6f %5.6f\n',b);
fprintf('a=%5.6f %5.6f %5.6f\n',a);
= impulse(sys,);% 把滤波器系数转变成激冲响应
t_increment=t(2)-t(1); % 求出采样周期
fs=1/t_increment; % 求出采样频率
plot(t,y,'r','linewidth',2); hold on;% 作出模拟滤波器激冲响应曲线
fprintf('\nFs= %5.6f\n\n',fs);
=impinvar(b,a,fs); % 经激冲不变法求出数字滤波器系数
fprintf('bb=%5.6f %5.6f %5.6f\n',bb);
fprintf('aa=%5.6f %5.6f %5.6f\n',aa);
=impz(bb,aa,length(t),fs);
plot(t1,fs*y1); hold off;% 作出数字滤波器激冲响应曲线
grid on;
legend('analog','digital');
用激冲不变法求出的笫I组数字滤波器的系数是
bb=0.000000 0.002413 0.000000
aa=1.000000 -1.929318 0.931731
同时我们可以看到经激冲不变法得到的数字滤波器,它的激冲响应和模拟滤波器完全一致。 在本帖中还是利用激冲不变法,但是不是从模拟滤波器的传递函数来进行变换,而是从已知模拟滤波器的激冲响应来进行转换。因为激冲不变法的前提就是模拟滤波器和数字滤波器的激冲响应是“相同”的,它们在数值上只差一个常数。因此在已知模拟滤波器的激冲响应后,就能求出数字滤波器的激冲响应,再进一步求出数字滤波器的传递函数,就给出了IIR滤波器的系数。程序是
clear all; clc;
=butter(2,.2,'s');% 使用Butterworth低通滤波器
sys=tf(b,a);
fprintf('b=%5.6f %5.6f %5.6f\n',b);
fprintf('a=%5.6f %5.6f %5.6f\n',a);
= impulse(sys,);% 把滤波器系数转变成激冲响应
t_increment=t(2)-t(1); % 求出采样周期
fs=1/t_increment; % 求出采样频率
y1=y/fs; % 给出数字滤波器激冲响应
=prony(y1,2,2); % 从激冲响应求出数字滤波器系数
fprintf('bb=%5.6f %5.6f %5.6f\n',bb);
fprintf('aa=%5.6f %5.6f %5.6f\n',aa);
求出的笫II组数字滤波器系数:
bb=0.000000 0.002413 -0.000000
aa=1.000000 -1.929318 0.931731
我们可以看到这笫II组数字滤波器系数和笫I组系数完全一致。
有了IIR数字滤波器系数,也就不难进行数字滤波运算了。 非常非常感谢您的帮助 我也来学习下
页:
[1]