xn=0.8.^n; %生成x(n) hn=ones(1,N2); %生成h(n)
yln=conv(xn,hn); %直接用函数conv计算线性卷积 ycn=circonv(xn,hn,N1); %用函数circonv计算N1点循环卷积 ny1=[0:1:length(yln)-1]; ny2=[0:1:length(ycn)-1]; subplot(2,1,1); %画图 stem(ny1,yln); subplot(2,1,2); stem(ny2,ycn); axis([0,16,0,4]); 运行结果:
43线性卷积210024681012141643循环卷积2100246810121416线性卷积和循环卷积的比较图
2、利用离散傅里叶变换(DFT)分析信号的频谱
MATLAB中计算序列的离散傅里叶变换和逆变换是采用快速算法,利用fft和ifft函数实现。函数fft用来求序列的DFT,函数ifft用来求IDFT。
例2:已知序列x(n)?2sin(0.48?n)?cos(0.52?n) 0?n?100,试绘制x(n)及它的离散傅里叶变换
|X(k)|图。
MATLAB实现程序: clear all N=100; n=0:N-1;
xn=2*sin(0.48*pi*n)+cos(0.52*pi*n); XK=fft(xn,N); magXK=abs(XK); phaXK=angle(XK); subplot(1,2,1) plot(n,xn)
xlabel('n');ylabel('x(n)'); title('x(n) N=100'); subplot(1,2,2)
k=0:length(magXK)-1; stem(k,magXK,'.');
xlabel('k');ylabel('|X(k)|');
16
title('X(k) N=100'); 运行结果:
x(n) N=100321600-1-2-320100X(k) N=10080|X(k)|40050n10000x(n)信号及离散傅里叶变换|X(k)|图
50k100
3、利用FFT实现线性卷积
若序列x1(n)、N2的有限长序列,两序列的N点的循环卷积yc(n)?x1(n)?x2(n),x2(n)为长度分别为N1、
DFT的性质可知:当yl(n)?x1(n)?x2(n)。由N?N1?N2?1时有
序列较长时DFT运算通常用快速算法FFT实现。在MATLAByl(n)?yc(n)?IDFT{DFT[x1(n)]?DFT[x2(n)]}。
的信号处理工具箱中函数FFT和IFFT用于快速傅里叶变换和逆变换。
例3:用FFT实现例1中两序列的线性卷积。 MATLAB实现程序: n=[0:1:11]; m=[0:1:5]; N1=length(n); N2=length(m);
xn=0.8.^n; %生成x(n) hn=ones(1,N2); %生成h(n) N=N1+N2-1; XK=fft(xn,N); HK=fft(hn,N); YK=XK.*HK; yn=ifft(YK,N);
if all(imag(xn)==0)&(all(imag(hn)==0)) %实序列的循环卷积仍然为实序列 yn=real(yn) end
x=0:N-1;
stem(x,yn,'.')运行结果:
4321005101520利用傅里叶变换实现线性卷积的结果图
4、IIR滤波器的设计与实现
基于模拟滤波器变换原理IIR滤波器的经典设计:首先,根据模拟滤波器的指标设计出相应的模拟滤波
17
器,然后,将设计好的模拟滤波器转换成满足给定技术指标的数字滤波器。通常算法有脉冲响应不变法和双线性变换法。在MATLAB的数字信号处理工具箱中提供了相应的设计函数。常用的有: (1)Butterworth滤波器阶数选择函数
[N,Wn]=buttord(Wp,Ws,Rp,Rs)
输入参数:Wp通带截止频率,Ws阻带截止频率,Rp通带最大衰减,Rs阻带最小衰减; 输出参数:N符合要求的滤波器最小阶数,Wn为Butterworth滤波器固有频率(3dB)。 (2)零极点增益模型到传递函数模型的转换
[num,den]=zp2tf(Z,P,K);
输入参数:Z,P,K分别表示零极点增益模型的零点、极点和增益; 输出参数:num,den分别为传递函数分子和分母的多项式系数。 (3)从低通向低通的转换
[b,a]=lp2lp(Bap,Aap,Wn);
功能:把模拟滤波器原型转换成截至频率为Wn的低通滤波器。 (4)双线性变换函数
[bz,az]=bilinear(b,a,Fs);
功能:把模拟滤波器的零极点模型转换为数字滤波器的零极点模型,其中Fs是采样频率。
例4:用双线性变换法设计一个Butterworth数字低通滤波器,要求其通带截至频率0.2? rad,阻带截至频率0.4? rad,通带衰减Rp小于0.75dB,阻带衰减Rs大于20dB。 MATLAB实现程序: wp=0.2*pi; ws=0.4*pi; ap=0.75; as=20; T=1;
Wp=2/T*tan(wp/2); %求模拟原型滤波器参数 Ws=2/T*tan(ws/2);
[N,Wc]=buttord(Wp,Ws,ap,as,'s'); %求滤波器的阶数
[BS,AS]=butter(N,Wc,'s');%得到模拟原型滤波器的系统函数
[BZ,AZ]=bilinear(BS,AS,1/T);%双线性变换法转换到数字滤波器的系统函数 [H,W]=freqs(BS,AS);
plot(W/pi,20*log10(abs(H)));%画模拟原型滤波器的频响 hold on;grid;
[H,W]=freqz(BZ,AZ);
plot(W/pi,20*log10(abs(H)),'r'); %画数字滤波器的频响
运行结果:
Butterworth低通滤波器的频率响应图
5、FIR滤波器的设计与实现
FIR滤波器的设计方法常用的有窗函数法和频率采样法两种,在MATLAB的数字信号处理工具箱中提供了函数fir1。fir1是采用经典窗函数法设计线性相位FIR数字滤波器,且具有标准低通、带通、高通和带阻等类型。
18
语法格式: B=fir1(n,Wn)
B=fir1(n,Wn,’ftype’) B=fir1(n,Wn,window)
B=fir1(n,Wn,’ftype’,window)
其中,n为FIR滤波器的阶数,对于高通、带阻滤波器n取偶数。Wn为滤波器截止频率,取值范围0~1;对于带通、带阻滤波器,Wn=[W1,W2],且W1 Matlab提供了几个函数来实现这些窗函数。 W=boxcar(N); N点的矩形窗 W=triang(N); N点的三角窗 W=hanning(N); N点的汉宁窗 W=hamming(N); N点的海明窗 W=blackman(N); N点的布莱克曼窗 W=kaiser(N,beta); N点的凯泽窗(beta=0.7865) 例5: 用窗函数法设计一个线性相位FIR低通滤波器,性能指标:通带截止频率wp?0.2?,阻带截止频率ws?0.3?,阻带衰减不小于40dB,通带衰减不大于3dB。 MATLAB实现程序: %程序中采用汉宁窗(hanning) wp=0.2*pi;ws=0.3*pi; wdelta=ws-wp; N=ceil(8*pi/wdelta); Wn=(0.2+0.3)*pi/2; b=fir1(N,Wn/pi,hanning(N+1)); freqz(b,1,512) 运行结果为: 500Magnitude (dB)-50-100-150-20000.10.20.30.40.50.60.7Normalized Frequency (?? rad/sample)0.80.910-500Phase (degrees)-1000-1500-2000-250000.10.20.30.40.50.60.7Normalized Frequency (?? rad/sample)0.80.91 FIR滤波器的幅频和相频特性图 19