数字信号处理实验报告汇总.docx
《数字信号处理实验报告汇总.docx》由会员分享,可在线阅读,更多相关《数字信号处理实验报告汇总.docx(11页珍藏版)》请在冰豆网上搜索。
数字信号处理实验报告汇总
实验报告
课程名称数字信号处理
姓名:
学号:
实验二、基于MATLAB的数字滤波器的设计
1.实验目的
1)熟悉IIR数字滤波器设计的原理与方法。
2)熟悉用窗函数法设计FIR数字滤波器设计的原理与方法。
3)掌握IIR和FIR数字滤波器的计算机仿真方法。
4)通过观察对实际心电信号的滤波作用,获得数字滤波的感性知识。
2.实验原理
IIR滤波器常用的一种设计方法是借助模拟滤波器的设计方法进行的,即,先设计模拟滤波器得到传输函数,然后将按某种方法转换成数字滤波器的系统函数。
转换方法主要有脉冲响应不变法和双线性变换法。
脉冲响应不变法就是使数字滤波器的单位脉冲响应模仿模拟滤波器的冲激响应,由于时域采样后造成频域的周期延拓,可能会造成频域的混叠,因此不适合高通、带阻滤波器的设计。
另一种常用的方法是双线性变换法。
双线性变换法为了克服s平面与z平面的非一一对应关系,采用了非线性频率压缩方法:
首先将原s平面压缩到s1平面的一条横带内,再将s1平面映射到z平面上。
虽然双线性变换法的模拟频率与数字频率间是非线性的关系,但消除了频率的混叠。
FIR滤波器常用的一种设计方法是窗口法。
如果希望滤波器的频率响应为,则其对应的单位脉冲响应为。
窗函数设计法的基本原理是用有限长单位脉冲响应序列h(n)逼近hd(n)。
由于hd(n)往往是无限长序列,且是非因果的,所以用窗函数w(n)将hd(n)截断,并进行加权处理,得到h(n)=hd(n)w(n),h(n)就作为实际设计的FIR数字滤波器的单位脉冲响应序列,其频率响应函数为,式中N为所选窗函数w(n)的长度。
用窗函数法设计的滤波器性能取决于窗函数的类型及窗口长度。
设计中,要根据对阻带最小衰减和过渡带宽度的要求选择合适的窗函数类型和窗口长度。
选定窗函数类型和窗口长度后,求出单位脉冲响应和频率响应。
频率响应是否满足要求,要进行验算,如果不满足要求,则要重新选择窗函数类型和长度,再次验算,直至满足要求为止。
如果要求线性相位特性,则单位脉冲响应还必须满足偶对称或奇对称特性。
根据单位脉冲响应的奇偶对称性和长度的奇偶性又将线性相位FIR滤波器分成四类,要根据所设计的滤波特性正确选择其中一类。
3、实验内容
1)设计给定指标的Butterworth数字低通滤波器。
设计指标参数为:
在通带内[0,0.2π]频率区间上,最大衰减小于1dB;在阻带[0.3π,π]内,最小衰减大于15dB。
并画出滤波器的频响特性曲线。
2)设计给定指标的FIR数字低通滤波器。
3)用所设计的数字滤波器对实际心电信号进行仿真滤波处理,分别打印出滤波前后的心电信号时域和频域波形。
4、实验步骤
1)复习有关Butterworth模拟滤波器设计和用双线性变换法设计IIR数字滤波器的内容,用双线性变换法设计数字滤波器的系统函数。
2)复习用窗函数法设计FIR数字滤波器的内容,并设计数字滤波器的系统函数。
3)用Matlab中的函数画出心电信号的时域和频域波形。
4)用Matlab中的函数设计满足要求的数字滤波器,画出滤波器的频响曲线。
5)用设计出的滤波器对心电信号进行滤波处理,画出滤波后的信号时域与频域波形。
6)用C语言编写滤波器仿真程序,对心电信号进行滤波处理,将结果与步骤5的结果进行比较。
5、实验结果
1)设计给定指标的Butterworth数字低通滤波器:
代码:
clc
[N,wc]=buttord(0.2,0.3,1,15);
[b,a]=butter(N,wc)
设计结果:
b=0.00070.00440.01110.01480.01110.00440.0007
a=1.0000-3.18364.6222-3.77951.8136-0.48000.0544
2)设计给定指标的FIR数字低通滤波器:
代码:
clc;
wp=0.2*pi;ws=0.3*pi;deltaw=ws-wp;
N0=ceil(6.6*pi/deltaw);%计算海明窗长度
N=N0+mod(N0+1,2);
wd=(hamming(N))';
wc=(wp+ws)/2;
t=(N-1)/2;
n=[0:
1:
N-1];
hd=sin(wc*(n-t+eps))./(pi*(n-t+eps));
h=hd.*wd
[A,w]=freqz(h);
mag=abs(A);
db=20*log10(mag+eps)/max(mag);
plot(w/pi,db);
title('幅度响应(db)');xlabel('w/pi');ylabel('20log|H(e^j^w|(db)');
axis([0,1,-80,5]);
频率响应:
产生心电图信号:
代码:
x=[-4,-2,0,-4,-6,-4,-2,-4,-6,-6,-4,-4,-6,-6,-2,6,12,8,0,-16,-38,-60,-84,-90,-66,-32,-4,2,-4,8,12,12,10,6,6,6,4,0,0,0,0,0,-2,-4,0,0,0,-2,-2,0,0,-2,-2,-2,-2,0,2,-4,-2,0,-2,-4,-4,2,0,0,-2,-4,-2,0,0,-2,-4,-2,0,0,-4,-4,-2,-2,-4,-6,-6,-4,-4,8,-10,-8,-6,-6,-8,-12,-10,-8,-8,-10,-12,-10,-8,-8,-10,-10,-8,-6,-6,-8,-8,-4,-2,-4,-4,-4,0,0,-2,-4,-2,-2,0,-4];
tt=0:
119;
figure
(2);plot(tt,x);
y=fft(x);
figure(3);plot(abs(y));
时域波形:
频域波形:
经过IIR滤波和FIR滤波:
代码:
[N1,wc]=buttord(0.2,0.3,1,15);
[b,a]=butter(N1,wc);
Y1=filter(b,a,x);
figure(4);plot(Y1);
Y2=conv(x,h);
figure(5);plot(Y2);
F1=fft(Y1);
figure(6);plot(abs(F1));
F2=fft(Y2);
figure(7);plot(abs(F2));
经过IIR滤波后时域波形:
经IIR滤波后的频域波形:
经FIR滤波后的时域波形:
经FIR滤波后的频域波形:
FIR滤波器的C语言代码:
RunIntegerFIRFilter(double*FiltCoeff,intNumTaps,double*Signal,double*FilteredSignal,intNumSigPts)
{
intj,k;
longlongy;
longlongOne=1;
doubleTwoToN=One<<(RegisterSize-1);//Minusonebecauseofthesignbit.
longlongReg[256];
longlongIntFirCoeff[256];
for(j=0;j<256;j++)Reg[j]=0;//Initthedelayregisters.
for(j=0;jfor(j=0;j{
//ShifttheregistervaluesdownandsetReg[0].
for(k=NumTaps;k>1;k--)Reg[k-1]=Reg[k-2];
Reg[0]=RndWholePart(TwoToN*Signal[j]);//Assumes-1.0y=0;
for(k=0;k{
y+=IntFirCoeff[k]*Reg[k];
}
FilteredSignal[j]=(double)y/TwoToN/TwoToN;
}
}