数字信号处理实验:数字滤波器的设计与应用

  • Post author:
  • Post category:其他



一. 实验目的

1.掌握模拟滤波器的设计方法,以及脉冲响应不变法和双线性变换法设计IIR数字滤波 器的方法,针对实际信号能设计相应的 IIR 数字滤波器,并按要求进行滤波。

2.掌握用窗函数法设计FIR数字滤波器的方法,并通过实验了解各种窗函数对滤波特性的影响;针对已知多频率正弦信号的频谱或实际信号,能设计相应的FIR滤波器按要求进行滤波。


二. 实验原理

1.基于模拟滤波器的IIR的数字滤波器设计(双线性变换法):

a.确定抽样频率T。双线性变换法中参数T的选择和最终设计出的数字滤波器无关,因此可以取实际关系中的值,有时为了设计简单,常取T=2;

b.按照

进行非线性预畸变矫正,将数字滤波器的通带截止频率

和阻带截止频率

ωst


转换成模拟滤波器的通带截止频率

和阻带截止频率

c.按照模拟滤波器的技术指标

设计模拟滤波器

d.将模拟滤波器

从s平面转换到z平面,得到数字低通滤波器的系统函数

2.FIR数字滤波器的设计(窗函数设计法):

a.依据理想的频率响应函数

来求解单位抽样响应

b.依据阻带最小衰减要求,结合书中的表格,选择窗函数类型;依据过渡带宽的要求确定窗的长度N;

c.加窗处理,得到设计结果为



MATLAB中提供了利用函数fir1实现窗函数设计FIR数字滤波器的通用应用格式,即

其中,

为FIR滤波器的阶数,对于高通、带阻滤波器

取偶数。

为滤波器截止频率,取值范围0~1。对于带通、带阻滤波器,

,且



为滤波器类型。缺省时为低通或带通滤波器,为’high’时是高通滤波器,为’stop’时是带阻滤波器。

为窗函数,列向量,其长度为

;缺省时,自动取hamming窗。输出参数B为FIR滤波器系数向量,长度为n+1。


三. 实验内容

(1) 用双线性变换法设计一个巴特沃斯低通IIR数字滤波器。设计指标参数为:在通带内频率低于

0.2π

时,最大衰减小于1dB;在阻带内

[0.3π,π]

频率区间上,最小衰减大于15dB。其中采样间隔为

0.02π

(2) 用步骤(1)所设计的滤波器对实际心电图信号采样序列进行仿真滤波处理,观察总结滤波作用与效果,心电图信号为


x


n


={


-4,-2,0,-4,-6,-4,-2,-4,-6,-6,-4,-4,-6,-6,-26,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

}

(3)已知信号

,其中

a

为42,

b

为1。采用窗函数法设计低通、带通、高通滤波器分别提取信号





,设计带阻滤波器提取信号

,并对滤波效果进行分析。


四. 实验步骤

①用双线性变换法设计一个巴特沃斯低通IIR数字滤波器。设计指标参数为:在通带内频率低于

0.2π

时,最大衰减小于1dB;在阻带内

[0.3π,π]

频率区间上,最小衰减大于15dB。其中采样间隔为

0.02π

②用步骤①所设计的滤波器对实际心电图信号采样序列进行仿真滤波处理,观察总结滤波作用与效果,心电图信号为


x


n


={


-4,-2,0,-4,-6,-4,-2,-4,-6,-6,-4,-4,-6,-6,-26,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

}

实验代码:

clc,clear;
%用双线性变换法设计一个巴特沃斯低通IIR数字滤波器
wp=0.2*pi;ws=0.3*pi;   	 %数字滤波器截止频率 
Ap=1;As=15;             %衰减设置
T=0.02*pi;fs=1/T;      	 %抽样间隔与抽样频率
Wp=(2/T)*tan(wp/2);Ws=(2/T)*tan(ws/2);  	 %转换为模拟滤波器截止频率
[N,Wc]=buttord(Wp,Ws,Ap,As,'s');        		 %计算阶数和截止频率
[z,p,k]=buttap(N); 		 	%归一化原型滤波器设计
B=k*real(poly(z));  			%分子多项式系数
A=real(poly(p));   			%分母多项式系数
[Bs,As]=lp2lp(B,A,Wc);      	%去归一化得到模拟低通滤波器
[Bz,Az]=bilinear(Bs,As,fs); 		%数字低通滤波器系数   
[Hz,w]=freqz(Bz,Az);          %数字低通滤波器的频率响应
dbHz=20*log10(abs(Hz)/max(abs(Hz)));    %化为分贝值
subplot(1,3,1);plot(w/pi,abs(Hz));grid on;
set(gca,'xtick',[0 0.2 0.3 1]);set(gca,'xticklabel',[0 0.2 0.3 1]);
set(gca,'ytick',[0 0.178 0.891 1]);set(gca,'yticklabel',[0 0.178 0.891 1]);
xlabel('\omega/\pi');ylabel('|H(e^j^\omega)|');
subplot(1,3,2);plot(w/pi,angle(Hz));grid on;
set(gca,'xtick',[0 0.2 0.3 1]);set(gca,'xticklabel',[0 0.2 0.3 1]);
xlabel('\omega/\pi');ylabel('相位');
subplot(1,3,3);plot(w/pi,dbHz);grid on;
axis([0,1,-80,5]);
set(gca,'xtick',[0 0.2 0.3 1]);set(gca,'xticklabel',[0 0.2 0.3 1]);
set(gca,'ytick',[-80 -15 -1 0]);set(gca,'yticklabel',[-80 -15 -1 0]);
xlabel('\omega/\pi');ylabel('幅度(bB)');
 % 对心电图数字信号进行滤波
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];
y=filter(Bz,Az,x);            %滤波函数进行滤波 
subplot(2,1,1);plot(x),axis([0 60 -100 40]),title('原始信号');
subplot(2,1,2);plot(y),axis([0 60 -100 40]),title('滤波后信号');

仿真结果:

由图可知设计出的数字低通滤波器阻带满足指标要求,通带指标有富余,没有频谱混叠。但数字滤波器和模拟滤波器的幅频响应曲线形状有很大区别,这是频率非线性畸变引起的。

将离散的心电图转变为连续信号进行观察,从图中可以清晰的看出:原始信号的波形波动较大,存在或多或少的“突起”,但是经过低通滤波器后,过滤掉了阻带不满足要求的信号,滤波后的信号看起来更为的平滑,可见达到了滤除无效部分的效果。

③已知信号:

,其中

a

为42,

b

为1。采用窗函数法设计低通、带通、高通滤波器分别提取信号





,设计带阻滤波器提取信号

,并对滤波效果进行分析。

低通滤波器实验代码:

clc,clear;
% 用汉明窗设计FIR低通滤波器
wc=0.35;    			%归一化6dB截止频率,相当于除以pi
alpha=20;   
N=2*alpha+1;    		%FIR滤波器长度
hn=fir1(N-1,wc,'low',hamming(N));   			%用汉明窗设计低通滤波器
omega=linspace(0,pi,512);       				%频率抽样512个点
mag=20*log10(abs(freqz(hn,1,omega)));         %计算幅度频率响应的频率响应
subplot(321);stem((0:N-1),hn,'.');grid on;
xlabel('n');ylabel('h(n)');title('单位抽样响应');
subplot(322);plot(omega/pi,mag);grid on;
axis([0 1 -80 10]);
set(gca,'xtick',[0 0.5 1]);set(gca,'xticklabel',[0 0.5 1]);
set(gca,'ytick',[-80 -53 -6 0]);set(gca,'yticklabel',[-80 -53 -6 0]);
xlabel('\omega/\pi');ylabel('dB');title('幅度频率响应');
% 采用该FIR低通滤波器对已知信号进行信号提取
a=42;b=1;
fs=20000;  						 %采样频率
f1=a*b*50;f2=a*b*100;f3=a*b*150;  %待滤波余弦信号频率
t=(0:400)/fs;   					%定义时间步长
s=cos(2*f1*pi*t)+cos(2*f2*pi*t)+cos(2*f3*pi*t);
sf=filter(hn,1,s);  				%使用filter函数对信号进行滤波
subplot(323);plot(t,s);  			%滤波前的信号图像
axis([0 0.005 -1.5 3.5]);
xlabel('时间/秒');ylabel('幅度');title('信号滤波前时域图');
Fs=fft(s,512);AFs=abs(Fs);f=fs/512*(0:255);
subplot(324);plot(f,AFs(1:256));     %滤波前的信号频谱图
xlabel('频率/赫兹');ylabel('幅度');title('信号滤波前频域图');
subplot(325);plot(t,sf);  			 %滤波后的信号图像
axis([0 0.005 -1.1 1.1]);
xlabel('时间/秒');ylabel('幅度');title('信号滤波后时域图');
Fsf=fft(sf,512);   				 %滤波后的信号频谱图
AFsf=abs(Fsf);  	 				 %信号频谱图的幅值
subplot(326);plot(f,AFsf(1:256));    %滤波后的信号频谱图
xlabel('频率/赫兹');ylabel('幅度');title('信号滤波后频域图');

仿真结果:

带通滤波器实验代码:

clc,clear;
% 用汉明窗设计FIR带通滤波器
wc1=0.35;wc2=0.5;     %归一化6dB截止频率,相当于除以pi 
alpha=20;
N=2*alpha+1;    %FIR滤波器长度
hn=fir1(N-1,[wc1 wc2],'bandpass',hamming(N));   %用汉明窗设计带通滤波器
omega=linspace(0,pi,512);       %频率抽样512个点
mag=20*log10(abs(freqz(hn,1,omega)));       %计算幅度频率响应的频率响应
subplot(321);stem((0:N-1),hn,'.');grid on;
xlabel('n');ylabel('h(n)');title('单位抽样响应');
subplot(322);plot(omega/pi,mag);grid on;
axis([0 1 -80 10]);
set(gca,'xtick',[0 0.5 1]);set(gca,'xticklabel',[0 0.5 1]);
set(gca,'ytick',[-80 -53 -6 0]);set(gca,'yticklabel',[-80 -53 -6 0]);
xlabel('\omega/\pi');ylabel('dB');title('幅度频率响应');
% 采用该FIR带通滤波器对已知信号进行信号提取
a=42;b=1;
fs=20000;   %采样频率
f1=a*b*50;f2=a*b*100;f3=a*b*150;  %待滤波余弦信号频率
t=(0:400)/fs;   %定义时间步长
s=cos(2*f1*pi*t)+cos(2*f2*pi*t)+cos(2*f3*pi*t);
sf=filter(hn,1,s);  %使用filter函数对信号进行滤波
subplot(323);plot(t,s);  %滤波前的信号图像
axis([0 0.005 -1.5 3.5]);
xlabel('时间/秒');ylabel('幅度');title('信号滤波前时域图');
Fs=fft(s,512);AFs=abs(Fs);f=fs/512*(0:255);
subplot(324);plot(f,AFs(1:256));     %滤波前的信号频谱图
xlabel('频率/赫兹');ylabel('幅度');title('信号滤波前频域图');
subplot(325);plot(t,sf);  %滤波后的信号图像
axis([0 0.005 -1.1 1.1]);
xlabel('时间/秒');ylabel('幅度');title('信号滤波后时域图');
Fsf=fft(sf,512);    %滤波后的信号频谱图
AFsf=abs(Fsf);  %信号频谱图的幅值
subplot(326);plot(f,AFsf(1:256));    %滤波后的信号频谱图
xlabel('频率/赫兹');ylabel('幅度');title('信号滤波后频域图');

仿真结果:

高通滤波器实验代码:

clc,clear;
% 用汉明窗设计FIR高通滤波器
wc=0.5;     %归一化6dB截止频率,相当于除以pi
alpha=20;   
N=2*alpha+1;    					%FIR滤波器长度
hn=fir1(N-1,wc,'high',hamming(N));     %用汉明窗设计高通滤波器
omega=linspace(0,pi,512);      		 %频率抽样512个点
mag=20*log10(abs(freqz(hn,1,omega)));       %计算幅度频率响应的频率响应
subplot(321);stem((0:N-1),hn,'.');grid on;
xlabel('n');ylabel('h(n)');title('单位抽样响应');
subplot(322);plot(omega/pi,mag);grid on;
axis([0 1 -80 10]);
set(gca,'xtick',[0 0.5 1]);set(gca,'xticklabel',[0 0.5 1]);
set(gca,'ytick',[-80 -53 -6 0]);set(gca,'yticklabel',[-80 -53 -6 0]);
xlabel('\omega/\pi');ylabel('dB');title('幅度频率响应');
% 采用该FIR高通滤波器对已知信号进行信号提取
a=42;b=1;
fs=20000;   						%采样频率
f1=a*b*50;f2=a*b*100;f3=a*b*150;  	%待滤波余弦信号频率
t=(0:400)/fs;   						%定义时间步长
s=cos(2*f1*pi*t)+cos(2*f2*pi*t)+cos(2*f3*pi*t);
sf=filter(hn,1,s);  					%使用filter函数对信号进行滤波
subplot(323);plot(t,s); 				%滤波前的信号图像
axis([0 0.005 -1.5 3.5]);
xlabel('时间/秒');ylabel('幅度');title('信号滤波前时域图');
Fs=fft(s,512);AFs=abs(Fs);f=fs/512*(0:255);
subplot(324);plot(f,AFs(1:256));    	%滤波前的信号频谱图
xlabel('频率/赫兹');ylabel('幅度');title('信号滤波前频域图');
subplot(325);plot(t,sf);  				%滤波后的信号图像
axis([0 0.005 -1.1 1.5]);
xlabel('时间/秒');ylabel('幅度');title('信号滤波后时域图');
Fsf=fft(sf,512);    					%滤波后的信号频谱图
AFsf=abs(Fsf);  						%信号频谱图的幅值
subplot(326);plot(f,AFsf(1:256));    	%滤波后的信号频谱图
xlabel('频率/赫兹');ylabel('幅度');title('信号滤波后频域图');

仿真结果:

带阻滤波器实验代码:

clc,clear;
% 用汉明窗设计FIR带阻滤波器
wc1=0.3;wc2=0.55;     %归一化6dB截止频率,相当于除以pi 
alpha=20;
N=2*alpha+1;    %FIR滤波器长度
hn=fir1(N-1,[wc1 wc2],'stop',hamming(N));   %用汉明窗设计带阻滤波器
omega=linspace(0,pi,512);       %频率抽样512个点
mag=20*log10(abs(freqz(hn,1,omega)));       %计算幅度频率响应的频率响应
subplot(321);stem((0:N-1),hn,'.');grid on;
xlabel('n');ylabel('h(n)');title('单位抽样响应');
subplot(322);plot(omega/pi,mag);grid on;
axis([0 1 -80 10]);
set(gca,'xtick',[0 0.5 1]);set(gca,'xticklabel',[0 0.5 1]);
set(gca,'ytick',[-80 -53 -6 0]);set(gca,'yticklabel',[-80 -53 -6 0]);
xlabel('\omega/\pi');ylabel('dB');title('幅度频率响应');
% 采用该FIR带阻滤波器对已知信号进行信号提取
a=42;b=1;
fs=20000;   %采样频率
f1=a*b*50;f2=a*b*100;f3=a*b*150;  %待滤波余弦信号频率
t=(0:400)/fs;   %定义时间步长
s=cos(2*f1*pi*t)+cos(2*f2*pi*t)+cos(2*f3*pi*t);
sf=filter(hn,1,s);  %使用filter函数对信号进行滤波
subplot(323);plot(t,s);  %滤波前的信号图像
axis([0 0.005 -1.5 3.5]);
xlabel('时间/秒');ylabel('幅度');title('信号滤波前时域图');
Fs=fft(s,512);AFs=abs(Fs);f=fs/512*(0:255);
subplot(324);plot(f,AFs(1:256));     %滤波前的信号频谱图
xlabel('频率/赫兹');ylabel('幅度');title('信号滤波前频域图');
subplot(325);plot(t,sf);  %滤波后的信号图像
axis([0 0.005 -2 2.2]);
xlabel('时间/秒');ylabel('幅度');title('信号滤波后时域图');
Fsf=fft(sf,512);    %滤波后的信号频谱图
AFsf=abs(Fsf);  %信号频谱图的幅值
subplot(326);plot(f,AFsf(1:256));    %滤波后的信号频谱图
xlabel('频率/赫兹');ylabel('幅度');title('信号滤波后频域图');

仿真结果:

总结:使用窗函数是为了消除无限序列的截短而引起的吉布效应。加窗后,使频响产生一过渡带,其宽度正好等于窗的频响的主瓣宽度。出现肩峰时,肩峰两侧形成起伏振荡,其振荡幅度取决于旁瓣的相对幅度。​​​​​​​



版权声明:本文为m0_56324525原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。