matlab数字带阻滤波器设计以及DSP设计(精)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数字滤波器设计是用硬件或者软件实现的一种算法,这个算法是为了达到滤波的目的而对数字输入信号进行运算产生数字输出信号。
数字滤波器这个词是指执行滤波算法的特定硬件或者软件程序,数字滤波器经常作用的对象是数字化的模拟信号,或者刚好是存储在计算机存储器里代表某些变量的数据。
下图给出了一个具有模拟输入信号和输出信号的实时数字滤波器的简化框图。
带限模拟信号x(t)被周期地抽样,然后通过量化转化成一数字序列x(n)(n=0,1,……)。
数字处理器依据滤波器的计算算法执行滤波运算,把输入系列x(n)映射到输出
系列y(n)。
DAC把数字滤波后的输出转化成模拟值,这些模拟值接着被模拟滤波器平滑,并且消去不想要的高频分量.
利用MATLAB的强大运算功能,基于MATLAB信号处理工具的数字滤波器设计法可以快速有效的设计由软件组成的常规数字滤波器,设计方便、快捷,极大的减轻了工作量。
在设计过程中可以对比滤波器特性,随时更改参数,以达到滤波器设计的最优化。
1、MATLB仿真源程序
fs=15000;T=1/fs; >> 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));grid on;
>> xlabel('频率/Hz');ylabel('幅值'); >> title('数字滤波器幅频响应
|H(ejOmega)| ');
指标参数:
sl=0.5062 rad, sl=0.5536 rad,
pl=0.3750 rad, pu=0.6750 rad,
p=1dB, s=40 dB
由MATLAB可得出系统函数系数:
Bz=[ 0.3521 0.1819 1.0416 0.3576 1.0416 0.1819 0.3521]
Az=[ 1.0000 0.3531 1.0547 0.3038 0.7232 0.0645 0.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"
#define IIRNUMBER 30
#define SIGNAL1F 2200
#define SAMPLEF 8000
#define PI 3.1415926 -5-6-1-2-3
float InputWave();
float IIR();
float fAn[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}
float fXn[IIRNUMBER]={ 0.0 };
float fInput,fOutput;
float fSignal1,fSignal2,fSignal3;
float fStepSignal1,fStepSignal2,fStepSignal3;
float f2PI;
int i;
float fIn[256],fOut[256];
int nIn,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++; // break point
if ( nOut>=256 )
{
nOut=0;
}
}
}
float InputWave()
{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]);
}
float IIR()
{float fSum;
fSum=0.0;
for ( i=0;i<IIRNUMBER;i++ )
{fSum+=(fXn[i]*fAn[i]);
}
return(fSum);
}。