使用FFT进行快速FIR滤波

本文详细介绍了如何利用傅里叶变换(FFT)加速有限冲击响应(FIR)滤波器的计算,通过Overlap-and-Save和Overlap-and-Add两种方法实现长序列的卷积。这两种技术基于频域乘法定理,通过在时域上零填充输入序列和滤波器系数,进行FFT运算,然后在频域进行乘法和逆FFT,有效减少了计算复杂度。Overlap-and-Save适用于输出序列长度固定的场合,而Overlap-and-Add则适合处理连续的输入数据流。通过对不同FFT尺寸的选取,可以在计算效率和资源消耗之间找到平衡。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

摘自<Understanding Digital Signal Processing>第三版,13.10 Fast FIR Filtering Using the FFT一节

基于的理论:频域上的乘积等效于时域上的卷积。

基本的计算流程,如下图所示。

在这里插入图片描述

将输入信号x(n)x(n)x(n)和滤波器参数h(k)h(k)h(k)分别进行FFT,得到X(m)X(m)X(m)H(m)H(m)H(m),在频域上进行乘积,然后,进行IFFT。

对于Q−tapQ-tapQtap的FIR滤波器,其标准的卷积方程为
y(n)=∑k=0Q−1h(k)x(n−k)=h(k)∗x(n) y(n)=\sum ^{Q-1} _{k=0} {h(k)x(n-k)}=h(k)*x(n) y(n)=k=0Q1h(k)x(nk)=h(k)x(n)
假设h(k)h(k)h(k)的长度为QQQx(n)x(n)x(n)的长度为PPP,则最终输出的y(n)y(n)y(n)的长度为L=Q+P−1L=Q+P-1L=Q+P1.

为了使快速卷积技术能得到有效的结果,前向和逆FFT的尺寸必须等于或大于LLL,因此,N−pointN-pointNpoint的FFT尺寸为N≥LN\ge LNL,并对h(k)h(k)h(k)x(n)x(n)x(n)进行zero−padzero-padzeropad,使其长度等于NNN所需要的输出y(n)y(n)y(n)为逆FFT的前LLL个样本的实数部分。关于滤波器参数的FFT只需计算一次并存储下来即可。

当输出序列长度太大,必须进行分段处理时,有两种处理方法:overlap−and−saveoverlap-and-saveoverlapandsaveoverlap−and−addoverlap-and-addoverlapandadd

Overlap-and-save

具体流程,如下图所示。

在这里插入图片描述

对于给定的FIR滤波器的脉冲响应h(k)h(k)h(k)的长度为QQQ,输入序列x(n)x(n)x(n)的长度为PPP,具体步骤:

  1. 选择FFT的尺寸为NNN,其中NNN为2的指数,约等于4倍QQQ
  2. h(k)h(k)h(k)的末端增加(N−Q)(N-Q)(NQ)个零值样本,进行N−pointN-pointNpoint的FFT,生成复序列H(m)H(m)H(m);
  3. 计算整数M,M=N−(Q−1)M=N-(Q-1)M=N(Q1)
  4. x(n)x(n)x(n)的前MMM样本之前插入(Q−1)(Q-1)(Q1)个零值样本,创建N−pointN-pointNpoint的FFT的输入序列x1(n)x_1(n)x1(n)
  5. x1(n)x_1(n)x1(n)进行N−pointN-pointNpoint的FFT计算,并乘以H(m)H(m)H(m),然后,对乘积进行N−pointN-pointNpoint的逆FFT。去掉逆FFT结果的前(Q−1)(Q-1)(Q1)个样本,生成M−pointM-pointMpoint的输出y1(n)y_1(n)y1(n)
  6. x1(n)x_1(n)x1(n)的前(Q−1)(Q-1)(Q1)个零值样本增加到第二个原始长度为M的x(n)x(n)x(n)的开头部分,创建第二个N−pointN-pointNpoint的FFT输入序列x2(n)x_2(n)x2(n)
  7. x2(n)x_2(n)x2(n)进行N−pointN-pointNpoint的FFT计算,并乘以H(m)H(m)H(m),然后,进行逆FFT,去除前(Q−1)(Q-1)(Q1)个样本,生成第二个M点的输出数据y2(n)y_2(n)y2(n)
  8. 重复步骤6-7,直至处理完整个输入序列。
  9. 将生成的y1(n),y2(n),y3(n),....y_1(n),y_2(n),y_3(n),....y1(n),y2(n),y3(n),....进行串联合并,生成最终的线性卷积滤波器的输出序列y(n)y(n)y(n)
  10. 可以试验不同的NNN值,看是否存在一个最优的NNN使得你的硬件和软件实现的计算载荷最小。不过,在任何情况下,NNN必须不小于(M+Q−1)(M+Q-1)(M+Q1)

Overlap-and-add

具体流程,如下图所示。

在这里插入图片描述

对于这种方法,输入序列x(n)x(n)x(n)被分段成长度为MMM的数据片段,数据的overlap发生在逆FFT计算。对于给定的FIR滤波器的脉冲响应h(k)h(k)h(k)的长度为QQQ,输入序列x(n)x(n)x(n)的长度为PPP,具体步骤:

  1. 选择FFT尺寸为NNN,其中NNN为2的指数,约等于2倍的Q;
  2. h(k)h(k)h(k)的末端增加(N−Q)(N-Q)(NQ)个零值样本,进行N−pointN-pointNpoint的FFT,生成复序列H(m)H(m)H(m);
  3. 计算整数M,M=N−(Q−1)M=N-(Q-1)M=N(Q1)
  4. 在原始序列x1(n)x_1(n)x1(n)的前MMM样本末端增加(Q−1)(Q-1)(Q1)个零值样本,创建N−pointN-pointNpoint的FFT的输入序列x1(n)x_1(n)x1(n)
  5. x1(n)x_1(n)x1(n)进行N−pointN-pointNpoint的FFT计算,并乘以H(m)H(m)H(m),然后,对乘积进行N−pointN-pointNpoint的逆FFT。并保留前MMM个样本,生成MMM样本的输出数据y1(n)y_1(n)y1(n)
  6. 在第二个原始序列x2(n)x_2(n)x2(n)的前MMM样本末端增加(Q−1)(Q-1)(Q1)个零值样本,创建N−pointN-pointNpoint的FFT的输入序列x2(n)x_2(n)x2(n)
  7. 对第二个N−pointN-pointNpoint的输入序列进行FFT计算,并乘以H(m)H(m)H(m),然后,对乘积进行N−pointN-pointNpoint的逆FFT。将上一步的逆FFT的最后Q−1Q-1Q1个样本增加到当前逆FFT序列的开头的Q−1Q-1Q1个样本上。保留Q−1Q-1Q1个样本相加过程的结果序列中的开头的MMM个样本作为输出数据y2(n)y_2(n)y2(n);
  8. 重复步骤6-7,直至处理完整个数据序列。
  9. 将生成的y1(n),y2(n),y3(n),....y_1(n),y_2(n),y_3(n),....y1(n),y2(n),y3(n),....进行串联合并,生成最终的线性卷积滤波器的输出序列y(n)y(n)y(n)
  10. 可以试验不同的NNN值,看是否存在一个最优的NNN使得你的硬件和软件实现的计算载荷最小。不过,在任何情况下,NNN必须不小于$
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值