一. 实验目的
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('信号滤波后频域图');
仿真结果:
总结:使用窗函数是为了消除无限序列的截短而引起的吉布效应。加窗后,使频响产生一过渡带,其宽度正好等于窗的频响的主瓣宽度。出现肩峰时,肩峰两侧形成起伏振荡,其振荡幅度取决于旁瓣的相对幅度。