matlab数字带阻滤波器设计以及DSP设计(精)Word文档下载推荐.doc
《matlab数字带阻滤波器设计以及DSP设计(精)Word文档下载推荐.doc》由会员分享,可在线阅读,更多相关《matlab数字带阻滤波器设计以及DSP设计(精)Word文档下载推荐.doc(5页珍藏版)》请在冰豆网上搜索。
rp=1;
rs=40;
wp1=0.11*pi;
wp2=0.81*pi;
ws1=0.31*pi;
ws2=0.61*pi;
%数字带阻滤波器技术指标>
wc1=(2/T)*tan(wp1/2);
%频率预畸变>
wc2=(2/T)*tan(wp2/2);
wr1=(2/T)*tan(ws1/2);
wr2=(2/T)*tan(ws2/2);
w0=sqrt(wc1*wc2);
B=wc2-wc1;
wp=1;
%归一化通带截止频率>
ws=wp*(wr1*B)/(w0^2-wr1^2);
%归一化阻带截止频率>
[N,wc]=buttord(wp,ws,rp,rs,'
s'
);
%求滤波器阶数和3dB截止频率>
[Z,P,K]=buttap(N);
[Md,Nd]=zp2tf(Z,P,K);
%将零极点形式转换为传输形式>
[M,N]=lp2bs(Md,Nd,w0,B);
%对低通滤波器进行频率变换,转换为带阻滤波器>
[h,w]=freqs(M,N);
%模拟带阻滤波器的幅频响应>
xlabel('
频率/Hz'
ylabel('
幅度'
title('
模拟带阻滤波器'
[b,a]=bilinear(M,N,15000);
%对模拟滤波器双线性变换>
figure
(1);
freqz(b,a);
[H,W]=freqz(b,a);
%绘出频率响应>
axis([0,1,-100,20]);
figure
(2);
plot(W*fs/(2*pi),abs(H));
gridon;
幅值'
title('
数字滤波器幅频响应
|H(ejOmega)|'
指标参数:
sl=0.5062rad,sl=0.5536rad,
pl=0.3750rad,pu=0.6750rad,
p=1dB,s=40dB
由MATLAB可得出系统函数系数:
Bz=[0.35210.18191.04160.35761.04160.18190.3521]
Az=[1.00000.35311.05470.30380.72320.06450.0095]
系统函数为:
H(Z)=(0.3521+0.1819*z-1+1.0416*z-2+0.3576*z-3+1.0416*z-4+0.1819*z+0.3521*z)/(1.0000+0.3531*z+1.0547*z+0.3038*z+
-4-5-60.7232*z+0.0645*z+0.0095*z)
DSP带阻源程序:
#include"
math.h"
#defineIIRNUMBER30
#defineSIGNAL1F2200
#defineSAMPLEF8000
#definePI3.1415926-5-6-1-2-3
floatInputWave();
floatIIR();
floatfAn[IIRNUMBER]=
{0.3521,0.0575735,0.649911,-0.0395743,0.0979831,-0.0727494,-0.190606,0.100419,0.113193,-0.0413053,0.00630108,-0.0526857,-0.0620213,0.0971701,0.0441409,-0.0611411,-0.00629462,-0.0124744,-0.00798267,0.0583348,-0.000312435,-0.0489819,0.0065404,0.0078924,0.00173493,0.023966,-0.0142577,-0.0264339,0.0152646,0.00930233,-0.00260476}
floatfXn[IIRNUMBER]={0.0};
floatfInput,fOutput;
floatfSignal1,fSignal2,fSignal3;
floatfStepSignal1,fStepSignal2,fStepSignal3;
floatf2PI;
inti;
floatfIn[256],fOut[256];
intnIn,nOut;
main()
{
nIn=0;
nOut=0;
fInput=fOutput=0;
f2PI=2*PI;
fSignal1=0.0;
fSignal2=0.0;
fSignal3=0.0;
fStepSignal1=PI*0.4;
fStepSignal2=PI*0.55;
fStepSignal2=PI*0.7;
while
(1)
fInput=InputWave();
fIn[nIn]=fInput;
nIn++;
nIn%=256;
fOutput=IIR();
fOut[nOut]=fOutput;
nOut++;
//breakpoint
if(nOut>
=256)
nOut=0;
}
floatInputWave()
{for(i=IIRNUMBER-1;
i>
0;
i--)
{fXn[i]=fXn[i-1];
fXn[0]=sin((double)fSignal1)+sin((double)fSignal2)+sin((double)fSignal3);
fSignal1+=fStepSignal1;
if(fSignal1>
=f2PI)fSignal1-=f2PI;
fSignal2+=fStepSignal2;
if(fSignal2>
=f2PI)fSignal2-=f2PI;
fSignal3+=fStepSignal3;
if(fSignal3>
=f2PI)fSignal3-=f2PI;
return(fXn[0]);
floatIIR()
{floatfSum;
fSum=0.0;
for(i=0;
i<
IIRNUMBER;
i++)
{fSum+=(fXn[i]*fAn[i]);
return(fSum);