3

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

我正在编写一个函数,它采用一维数组并对其执行快速傅里叶变换。以下是它的工作原理:

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

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

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

我可以使用哪些技术来执行步骤 3,同时仍然能够在逆 FFT 后取回原始的未填充数组?

4

2 回答 2

1

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

于 2017-04-09T15:56:48.383 回答
0

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

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

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

于 2017-04-09T21:12:39.907 回答