如何对傅里叶复数值进行下采样?

How to downsample Fourier complex values?

免责声明:我不是信号处理专家。

我正在编写一个接受一维数组并对其执行快速傅立叶变换的函数。运作方式如下:

  1. 如果数组的大小不是 2 的幂,则在末尾用 0 填充它,使其大小变为 2 的幂。
  2. 对填充后的数组执行FFT并将结果存储在数组x中。
  3. 对复数数组进行下采样 x 以匹配原始未填充数组的长度。
  4. Return x.

我在 步骤 3 上遇到了问题。如果我省略第 3 步并对函数调用的结果执行逆 FFT,我将得到初始填充数组,这意味着该函数成功执行了第 1 步和第 2 步。

我尝试通过使用线性插值进行下采样来实现步骤 3,但是当我使用 MatLab 对最终结果进行逆傅立叶变换时,我得到的结果与原始数组不等价。我需要使用的编程语言不是MatLab,我只是用MatLab来验证结果的正确性。

我可以使用什么技术来执行第 3 步,同时仍然能够在反向 FFT 后恢复原始的非填充数组?

使用圆形Sinc核插值来计算下采样点。 Sinc 宽度将是低通滤波器的宽度,其截止频率适用于新的较低下采样采样率的抗混叠。

如果您需要准确的结果,那么您可以使用 Bluestein 的 Chirp Z 变换算法在 O(N log N) 时间内计算烦人大小的 DFT。

参见:https://en.wikipedia.org/wiki/Chirp_Z-transform

它不如 2 的幂 FFT 快,但它比错误长度的 FFT 上的插值快得多(对于高精度)。