使用FFT进行快速FIR滤波

摘自<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 − t a p Q-tap Qtap的FIR滤波器,其标准的卷积方程为
y ( n ) = ∑ k = 0 Q − 1 h ( 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)的长度为 Q Q Q x ( n ) x(n) x(n)的长度为 P P P,则最终输出的 y ( n ) y(n) y(n)的长度为 L = Q + P − 1 L=Q+P-1 L=Q+P1.

为了使快速卷积技术能得到有效的结果,前向和逆FFT的尺寸必须等于或大于 L L L,因此, N − p o i n t N-point Npoint的FFT尺寸为 N ≥ L N\ge L NL,并对 h ( k ) h(k) h(k) x ( n ) x(n) x(n)进行 z e r o − p a d zero-pad zeropad,使其长度等于 N N N所需要的输出 y ( n ) y(n) y(n)为逆FFT的前 L L L个样本的实数部分。关于滤波器参数的FFT只需计算一次并存储下来即可。

当输出序列长度太大,必须进行分段处理时,有两种处理方法: o v e r l a p − a n d − s a v e overlap-and-save overlapandsave o v e r l a p − a n d − a d d overlap-and-add overlapandadd

Overlap-and-save

具体流程,如下图所示。

在这里插入图片描述

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

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

Overlap-and-add

具体流程,如下图所示。

在这里插入图片描述

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值