本文最后更新于:2 年前
FIR和IIR滤波器设计与实现
一、要求
在子作业4的基础上,采用MATLAB的filterDesigner或fdatool工具箱,设计出相应的IIR滤波器和FIR滤波器。
二、实现思路
1.IIR滤波器设计实现
根据作业四得到的性能指标,利用MATLAB滤波器工具箱,输入性能指标参数选择效果最好的IIR滤波器进行滤波。
2.FIR滤波器设计实现
根据作业四得到的性能指标,利用MATLAB滤波器工具箱,输入截止频率**$f_c$**选择合适的窗函数设计得到FIR滤波器。
三、实现过程
1.性能指标分析
数字滤波器的频率响应表示为:
$$
H(e^{j\omega})=|H(e^{j\omega})|e^{j\beta(j\omega)}
$$
根据下图中理想低通滤波器逼近的误差容限可以看出,频率响应有通带、过渡带、阻带三个范围:
下图展示了不同滤波器的技术指标:
依据作业四得到的性能指标,通带截止频率**$w_p=10.7khz$,阻带截止频率$w_{st}=11.15khz$,通带最大衰减系数$\delta_1=2db$,阻带最小衰减$\delta_2=80db$**。可以使用MATLAB滤波器工具箱进行IIR和FIR滤波器的设计。
2.IIR滤波器设计实现
采用MATLAB的滤波器设计工具进行设计,在尝试不同种类的滤波器后,对比发现巴特沃斯滤波器的效果最佳,因此选择该滤波器来滤除噪声信号,设计得到的IIR滤波器结果如下图所示:
IIR滤波过程代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| clc clear all
[x,Fs]=audioread('D:\DSP实验报告\大作业报告\ch4andch5\myaudio_11.15k_11.95k.wav'); x=x(:,1); N=length(x); t=(0:N-1)/Fs; df=Fs/length(t); f=t*df; X=FFT(x,N,Fs,t); X=fftshift(X); f=(f*Fs-Fs/2)/1e3; X=abs(X);
figure; subplot(221) plot(t,x); title("原信号音频时域图"); xlabel("t/s"); subplot(222) plot(f(:,ceil(N/2):end),X(ceil(N/2):end,1),'c') title("原信号音频幅频响应"); xlabel("f/Khz");
y=filter(IIR,x); Y=FFT(y,N,Fs,t); Y=fftshift(Y); Y=abs(Y);
subplot(223) plot(t,y,'b'); title("IIR滤波后信号音频时域图"); xlabel("t/s"); subplot(224) plot(f(1,ceil(N/2):end),Y(ceil(N/2):end,1),'g') title("IIR滤波后信号音频幅频响应"); xlabel("f/Khz");
sound(y,Fs); audiowrite('./IIRfilter.wav',y,Fs)
|
3.FIR滤波器设计实现
采用MATLAB的滤波器设计工具进行设计,在尝试不同种类的窗函数后,对比发现布莱克曼窗的效果最佳,因此选择该窗函数来滤除噪声信号,设计得到的FIR滤波器结果如下图所示:
FIR时域和频域特性图如下图上所示:
FIR滤波过程代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| clc clear all
[x,Fs]=audioread('D:\DSP实验报告\大作业报告\ch4andch5\myaudio_11.15k_11.95k.wav'); x=x(:,1); Nx=length(x); tx=(0:Nx-1)/Fs; df=Fs/length(tx); fx=tx*df; X=FFT(x,Nx,Fs,tx); fx=(fx*Fs)/1e3; X=abs(X);
figure; subplot(221) plot(tx,x); title("原信号音频时域图"); xlabel("t/s"); subplot(222) plot(fx(1,1:ceil(Nx/2)),X(1:ceil(Nx/2),1),'b') title("原信号音频幅频响应"); xlabel("f/Khz");
y=filter(FIR,x); Ny=length(y); ty=(0:Ny-1)/Fs; Y=FFT(y,Ny,Fs,ty); df=Fs/length(ty); fy=ty*df; fy=(fy*Fs)/1e3; Y=abs(Y);
subplot(223) plot(ty,y,"b"); title("FIR滤波后信号音频时域图"); xlabel("t/s"); subplot(224) stem(fx(1,1:ceil(Ny/2)),Y(1:ceil(Ny/2),1),'c','.') title("FIR滤波后信号音频幅频响应"); xlabel("f/Khz");
sound(y,Fs); audiowrite('./FIRfilter.wav',y,Fs)
|
四、结果展示
加噪信号经过IIR滤波器和FIR滤波器前后时域、频域对比图如下图所示:
由图可知IIR和FIR滤波器都很好的滤除了噪声信号,达到了预期的设计,IIR和FIR滤波后的音频依附录可见。
五、结果分析
- IIR滤波器和FIR滤波器各自有各自的优缺点,都有不同的结构和实现方法。IIR滤波器结构简单容易实现,但是一般阶数较高,而且不稳定,相频响应不是完全线性相位。FIR滤波器一般阶数较低,相频响应具有完全的线性相位,系统绝对稳定,但是线性相位结构的FIR滤波器结构相对比较复杂难以实现。
- IIR和FIR滤波器实际人工设计实现起来相对比较复杂,我们可以利用MATLAB中的滤波器设计工具箱辅助我们完成满足要求的各种滤波器,实现起来比较简单容易,
六、源码开源
源代码资源包有需要的小伙伴可以下载参考。