频域中的抽取和滤波

信息处理 fft 抽取 特别提款权 快速卷积
2022-02-22 03:33:35

我正在从事一个软件定义无线电项目,我想对以 96ksps 采样的分析信号 (IQ) 进行低通滤波和抽取。假设低通滤波器的截止频率为 5kHz,我想以 4 倍抽取,这样我就有 24ksps 输出。

这个想法是使用本文[pdf]中描述的重叠和保存方法使用快速卷积执行过滤:

http://www.3db-labs.com/01598092_MultibandFilterbank.pdf

我想知道我的方法是否有任何陷阱:

  1. 执行 N 长度 FFT。
  2. 然后做一个 N 长度的循环卷积(我乘以我的长度为 P 的滤波器的 FFT)。
  3. 然后使用前向 FFT 的N/4中心抽头执行N/4 IFFT 以抽取 4 。由于我的滤波器是一个截止频率为 5kHz 的低通滤波器,因此在 FFT 的 N/4 中心抽头之外应该只有很少的能量,并且我需要丢弃的 P - 1 个样本也应该位于 IFFT 之外(如果我的滤波器不会太长)。

编辑:

这个特定的应用程序是在 Raspberry Pi 3 上的。在考虑了更多之后,我意识到它并不像我最初想象的那么聪明。我对以 0 为中心的 FFT 看得太多了,并短暂地忘记了事实并非如此。我必须在我的 FFT 中间“删除”零以使其更短,然后执行 IFFT。

我要做的是使用 N 长度 FFT 和 N 长度 IFFT 进行快速卷积,并在我将样本复制到输出缓冲区时抽取。

1个回答

我在频域做了很多抽取。小细节很重要。

我假设您已经知道快速卷积的基本规则:FFT 长度 N 等于数据块大小 L 加上滤波器脉冲响应的长度 M 减 1。每个操作使用 L 个新数据样本加上 M-1 个数据样本从旧街区。

确保低通滤波器的脉冲响应移动到时域缓冲区的前面,并在进行前向 FFT 以获得滤波器的频域表示之前正确加窗到 M 个样本。当您进行逆 FFT 时,这可以防止结果在时域中回绕。(请记住,当您想要线性卷积时,您实际上是在进行循环卷积。)

Kaiser 是迄今为止我最喜欢的窗户,因为它的调音旋钮。使用足够大的值将旁瓣向下推,因为它们会混叠到您的输出中。我通常在频域中构建一个零相位砖墙,进行逆变换,应用窗口并移动到缓冲区的前面,然后进行前向 FFT。

还要确保你的频率响应的主瓣在你的抽取输出的奈奎斯特极限之后仍然基本上为零。即,不要使Kaiser 参数太大

如果您还通过旋转频率箱进行频移,请记住您必须移动与一个数据块大小相对应的多个箱。例如,如果 L=M-1,那么您可以平移任意偶数个 bin。

不要担心不是 2 次方的 FFT 块大小。只需选择一个没有任何大质因数的方便尺寸,FFTW3 就会表现良好。我使用 L=M-1=3840 以 4:1 到 48 kHz 抽取 192 kHz,块时间为 20 ms。这是 L+M-1 = 7680 = 2^9 * 3 * 5 的 FFT 块大小。