资源描述:
《matlab之经典数字滤波函数介绍》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、matlab之经典数字滤波函数介绍南京理工大学仪器科学与技术专业谭彩铭2010-3-121butter函数设计一个9阶高通Butterworth数字滤波器,截止频率为300HzFs=1000;[b,a]=butter(9,300/(Fs/2),'high')freqz(b,a,128,Fs)图1图2下面看一看freqz函数例如对离散系统传递函数freqz函数的的主要计算环节是计算编写下图所示程序验证之9Fs=1000;[b,a]=butter(2,300/(Fs/2),'high')[h,f]=f
2、reqz(b,a,128,Fs);h1=(b(1)+b(2)*exp(-j*2*pi*f/Fs)+b(3)*exp(-2*j*2*pi*f/Fs))./(a(1)+a(2)*exp(-j*2*pi*f/Fs)+a(3)*exp(-2*j*2*pi*f/Fs));plot(abs(h1-h))title('abs(h1-h)')图3图4可见h1和h相等图2中出现小于-360度是否表达其他不同的意义?-361度和-1度有什么区别吗?对于正弦波应该是一样的,故理论上说应该没有区别。butter函数的原理
3、是什么?顾名思义,butter函数的原理是基于Butterworth滤波器。这里始终要带着这个问题去研究,滤波系数本身有什么特性竟然可使低频的滤掉,高频的通过,其实这里想要寻找的是敏捷控程,理论上这个问题的答案已经很成熟。2impinvar函数用冲击响应不变法数字仿真模拟Butterworth滤波器,程序如下。9Fs=4000;[b,a]=butter(2,2*pi*1e3,'s')%designanalogButterworthlowpassfilter[bz,az]=impinvar(b,a,
4、Fs)图53bilinear函数用双线性变换法数字仿真模拟Butterworth滤波器,程序如下。Fs=4000;[b,a]=butter(2,2*pi*1e3,'s')%designanalogButterworthlowpassfilter[bz,az]=bilinear(b,a,Fs)图64fir1函数由理想滤波器幅频特性反推滤波系数,得出来的系数数量是无穷多的。故可采用加窗的方法舍去部分,留下有限的滤波系数数量,使仍能基本达到需要的滤波效果。Window=boxcar(8);b=fir1(
5、7,0.4,Window)freqz(b,1)图79图85fir2函数fir2函数的基本原理同fir1函数,它的功能更进一层,可以设计任意形状的频率响应图形。f=0:0.1:1;m=[00110011100];b=fir2(30,f,m);[h,w]=freqz(b,1,128);plot(f,m,w/pi,abs(h))legend('Ideal','fir2Designed')title('ComparisonofFrequencyResponseMagnitudes')图99图10、图9中,
6、w如果是角频率值,将w转换成频率值时,应该是将w除以2*pi,但是程序中为什么除以的是pi呢?准确地说,图9中的w并非是角频率值,而是频率值,freqz函数调用时若没有加入采样率参数,其返回的频率值的范围是0~pi。6fir1函数补充对调用方式b=fir(n,wn),wn的取值范围是(0,1),其中1对应于0.5fs(fs为采样率)。fs=100;fc=[0.350.45];b=fir1(40,fc);figure(1);freqz(b,1,128,fs)图119图12对图11中程序,1对应0.5
7、fs,那么0.45对应0.45*0.5*fs=22.5Hz,0.35对应0.35*0.5*fs=17.5Hz,和图12吻合。但是实际应用时,我们知道采样率,知道需要的通带,我们需要的是直接的答案。假设采样率为100Hz,现在要设计的带通滤波器的带宽是[20Hz,25Hz],对应图11中的fc我们该怎么取值,显然应该是fc=[2025]/(0.5*fs)。如下图程序所示。fs=100;fc=[2025]/(0.5*fs);b=fir1(40,fc);figure(1);freqz(b,1,128,f
8、s)图139图14下列程序是较为综合的一个程序clear;%signalgeneraterfs=100;Ts=1/fs;sampletime=3;t=0:Ts:sampletime;f=5;x=sin(2*pi*f*t);%filtergeneraterfc=4;%cutofffrequencyinnowsamplerateb=fir1(40,fc/(0.5*fs));figure(1);freqz(b,1,128,fs)%filtercoursey=filter(b,1,x);%