FIR滤波器结合快速卷积滤波

一、要求

选择子作业1中的音频信号,自行给定滤波器的单位取样响应,采用快速卷积实现对音频信号的滤波,比较滤波前后信号的波形和回放的效果。

二、实现思路

设计FIR滤波器

  • 分析原始音频信号的频谱,观察有用信号和噪声的分布,选择滤波器类型(低通、高通、带通、带阻等)
  • 设定幅频响应下降三分贝的截止频率和滤波器阶数
  • 选择合适的窗函数(包括Rectangular、Hanning、Hamming、Bartlett、Blackman、Kaiser、Gaussian、Flat-top等)
  • 获得滤波器的单位采样响应hn

快速卷积

  • 计算原始音频信号x与滤波器的单位采样响应hn的线性卷积长度,L=length(x)+length(hn)
  • 设计FFT的长度N>=L
  • 对x和hn分别做N点FFT变换获得Xk、Hk
  • 将Xk与Hk相乘得到Yk
  • 将Yk做IFFT逆变换得到yn,即完成快速卷积

三、实现过程

FIR滤波器

设FIR滤波器的单位冲激响应h(n)为一个N点序列,0≤n≤N-1,则滤波器的系统函数为:
H ( z ) = ∑ k = 0 N − 1 h ( k ) ∗ z − k H(\mathrm{z})=\sum_{k=0}^{N-1}h(\mathrm{k})*\mathrm{z}^{-k} H(z)=k=0N1h(k)zk
直接型FIR滤波器的差分方程为:
y ( n ) = ∑ m = 0 N − 1 h ( m ) x ( n − m ) \mathrm{y(n)}=\sum_{m=0}^{N-1}\mathrm{h(m)x(n-m)} y(n)=m=0N1h(m)x(nm)
由差分方程可知只需要求出FIR滤波器的单位冲激响应h(n),设置滤波阶数3db通带截止频率fc,采用汉明窗函数处理,再使用fir1函数将其与待滤波信号卷积即可完成滤波,具体实现代码如下。

%% hamming窗低通滤波器设计
fc=7.95e3; %下降3分贝截止频率
hn=fir1(1000,fc*2/Fs,"low");
hn=hn';
Nh=length(hn);

FIR滤波器的单位冲击响应如下图所示:

快速卷积

线性卷积在满足圆周卷积点数大于等于线性卷积长度的条件下可以用圆周卷积计算,而圆周卷积可以使用DFT计算,而DFT有快速算法FFT,因此可以利用FFT算法减少运算量快速计算线性卷积。先将做卷积的两个信号补零到指定长度,然后分别做FFT变换,根据卷积定理可得时域上做卷积,就是在频域上做乘积,将两者频谱相乘后做IFFT即可实现快速卷积,整个过程如下图所示:

FFT流程图

实现快速卷积的代码如下所示:

%% 快速卷积和线性卷积
L=Nx+Nh-1;
Xk=fft(x,L);%计算x的L点FFT,结果为X(k)
Hk=fft(hn,L);%计算hn的L点FFT,结果为H(k)
Yk=Xk.*Hk;%计算YK
y1n=ifft(Yk,L);%对YK调用IFFT,求得y1(n)
y2n=conv(x,hn);%计算y2(n)的卷积

四、结果展示

线性卷积和FFT快速卷积滤波前后对比图

Fast_Conv

五、结果分析

  • 由上图可知普通线性卷积的结果和快速卷积的结果一样,但快速卷积大大提高了运算速率,减少了运算量,提高了运算效率。
  • 离散傅立叶变换(DFT)实现了频域的离散化,方便了计算机处理,在数字信号处理中有着非常重要的作用。但直接计算DFT的运算量与变换长度N的平方成正比,计算量太大。而快速傅立叶变换FFT则是快速计算DFT的有效算法,大大提高了DFT的运算效率,在信号频谱的分析、滤波器频率响应的计算,以及线性卷积的快速计算等方面起着非常重要的作用。

代码开源

【验证码:code=ig9R】

源代码包有需要可以自行下载,里面包括源代码、滤波后的音频和PDF参考文档。

欢迎各位有志之士关注我的博客共同学习成长!

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐