如对您有帮助,请购买打赏,谢谢您!
实验二 FIR数字滤波器设计与软件实现
1.实验目的
(1)掌握用窗函数法设计FIR数字滤波器的原理和方法。
(2)掌握用等波纹最佳逼近法设计FIR数字滤波器的原理和方法。 (3)掌握FIR滤波器的快速卷积实现原理。
(4)学会调用MATLAB函数设计与实现FIR滤波器。 2. 两种设计FIR滤波器的方法比较
窗函数法简单方便,易于实现。但存在以下缺点:滤波器边界频率不易精确控制。窗函数法总使通带和阻带波纹幅度相等,不能分别控制通带和阻带波纹幅度。所设计的滤波器在阻带边界频率附近的衰减最小,距阻带边界频率越远,衰减越大。,所以如果在阻带边界频率附近的衰减刚好达到设计指标要求,则阻带中其他频段的衰减就有很大富余量,存在较大的资源浪费。
等波纹最佳逼近法是一种优化设计方法,克服了窗函数法的缺点,使最大误差最小化,并在整个逼近频段上均匀分布。用等波纹最佳逼近法设计的FIR数字滤波器的幅频响应在通带和阻带都是等波纹的,而且可以分别控制通带和阻带波纹幅度。与窗函数法相比,由于这种设计法使最大误差均匀分布,所以设计的滤波器性能价格比最高。阶数相同时,这种设计方法使滤波器的最大逼近误差最小,即通带最大衰减最小,阻带最小衰减最大。指标相同时,这种设计法使滤波器阶数最低。 3. 滤波器参数及实验程序清单
(1) 滤波器参数选取
根据加噪信号频谱图和实验要求,可选择一低通滤波器进行滤波,确定滤波器指标参数:通带截止频率fp?130Hz,阻带截至频率fs?150Hz,换算成数字频率,通带截止频率
?p?2?fpT?0.26?,通带最大衰减为?p?0.1dB,阻带截至频率
?s?2?fsT?0.3? (2) 实验程序清单
,阻带最小衰减为?s?60dB。
图1 程序流程图
信号产生函数xtg程序清单 function xt=xtg
%产生一个长度为N,有加性高频噪声的单频调幅信号xt,采样频率Fs=1000Hz %载波频率fc=Fs/10=100Hz,调制正弦波频率f0=fc/10=10Hz. N=1600;
Fs=1000;T=1/Fs;Tp=N*T; t=0:T:(N-1)*T;
fc=Fs/10;f0=fc/10; %载波频率fc=Fs/10,单频调制信号频率为f0=Fc/10; mt=cos(2*pi*f0*t); %产生单频正弦波调制信号mt,频率为f0 ct=cos(2*pi*fc*t); %产生载波正弦波信号ct,频率为fc xt=mt.*ct; %相乘产生单频调制信号xt nt=2*rand(1,N)-1; %产生随机噪声nt
%=======设计高通滤波器hn,用于滤除噪声nt中的低频成分,生成高通噪声======= fp=150; fs=200;Rp=0.1;As=70; % 滤波器指标
如对您有帮助,请购买打赏,谢谢您!
fb=[fp,fs];m=[0,1]; % 计算remezord函数所需参数f,m,dev dev=[10^(-As/20),(10^(Rp/20)-1)/(10^(Rp/20)+1)];
[n,fo,mo,W]=remezord(fb,m,dev,Fs); % 确定remez函数所需参数
hn=remez(n,fo,mo,W); % 调用remez函数进行设计,用于滤除噪声nt中的低频成分 yt=filter(hn,1,10*nt); %滤除随机噪声中低频成分,生成高通噪声yt
%================================================================ xt=xt+yt; %噪声加信号 fst=fft(xt,N); k=0:N-1; f=k/Tp; figure(1);
subplot(2,1,1);plot(t,xt); grid;
xlabel('t/s'); ylabel('x(t)');
axis([0,Tp/4,min(xt),max(xt)]); title('信号加噪声波形'); subplot(2,1,2);
plot(f,abs(fst)/max(abs(fst))); grid;
title('信号加噪声的频谱'); axis([0,Fs/2,0,1.2]); xlabel('f/Hz');
ylabel('幅度');
FIR数字滤波器设计及软件实现程序清单 clear all;close all
xt=xtg; %调用xtg产生信号xt, xt长度N=1600,并显示xt及其频谱 fp=130;fs=150;Rp=0.1;As=60;Fs=1000; % 输入给定指标 %用窗函数法设计滤波器
wc=(fp+fs)/Fs; %理想低通滤波器截止频率(关于pi归一化) B=2*pi*(fs-fp)/Fs; Nb=ceil(11*pi/B);
hn=fir1(Nb-1,wc,blackman(Nb));
y1t=fftfilt(hn,xt,1600); %调用函数fftfilt对xt滤波 figure(2);
t=0:0.001:1.599; %绘制滤波后的信号时域波形图 subplot(2,1,1); plot(t,y1t); grid;
xlabel('t/s');ylabel('y_1(t)'); title('滤波后的y_1(t)的波形'); axis([0 0.5 -1 1]); subplot(2,1,2);
[h w]=freqz(hn); %绘制低通滤波器的损耗函数曲线
如对您有帮助,请购买打赏,谢谢您!
plot(w/pi,20*log10(abs(h))); grid;
xlabel('ω/π');ylabel('幅度(dB)');
title('窗函数法低通滤波器的损耗函数曲线'); axis([0 1 -120 5]);
%用等波纹最佳逼近法设计滤波器 fb=[fp,fs];m=[1,0]; %确定remezord函数所需参数f,m,dev dev=[(10^(Rp/20)-1)/(10^(Rp/20)+1),10^(-As/20)];
[Ne,fo,mo,W]=remezord(fb,m,dev,Fs); %确定remez函数所需参数 hn=remez(Ne,fo,mo,W); %调用remez函数进行设计 y2t=fftfilt(hn,xt,1600); %调用函数fftfilt对xt滤波 figure(3);
t=0:0.001:1.599; %绘制滤波后的信号时域波形图 subplot(2,1,1); plot(t,y2t); grid;
xlabel('t/s');ylabel('y_2(t)'); title('滤波后的y_2(t)的波形'); axis([0 0.5 -1 1]); subplot(2,1,2);
[h w]=freqz(hn); %绘制低通滤波器的损耗函数曲线 plot(w/pi,20*log10(abs(h))); grid;
xlabel('ω/π');ylabel('幅度(dB)');
title('等波纹逼近法低通滤波器的损耗函数曲线'); axis([0 1 -80 5]); 4. 实验结果
在matlab中键入以上程序,得到的仿真结果如下
图2 具有加性噪声的信号x(t)及其频谱
图3 窗函数法设计的滤波器损耗函数曲线及其滤波后的信号y1(t) 图4 等波纹逼近法设计的滤波器损耗函数曲线及其滤波后的信号y2(t)
由上述实验结果可见用窗函数法设计滤波器,滤波器长度 Nb=184。滤波器损耗函数和滤波器输出y1(t)如图3所示。
用等波纹最佳逼近法设计滤波器,滤波器长度 Ne=83。滤波器损耗函数和滤波器输出
y2(t)如图4所示。
两种方法设计的滤波器都能有效地从噪声中提取信号,但等波纹最佳逼近法设计的滤波器阶数低得多,当然滤波实现的运算量以及时延也小得多,从图3和4可以直观地看出时延差别。 5. 思考题
(1)如果给定通带截止频率和阻带截止频率以及阻带最小衰减,如何用窗函数法设计线性相