DFT vs FFT:奇数只适用于DFT吗?

信息处理 fft 离散信号 信号分析 自由度
2022-02-17 00:46:52

我总是对 FFT 和 DFT 感到困惑。在这两种算法中,都假设信号是周期性的(所以我的理解是,如果您有 20 个样本点的信号,并且您进行 DFT 或 FFT,则该算法假设重复 20 个样本点)。

现在问题来了,有人告诉我DFT可以取奇数个样本,如果使用DFT可以避免频谱泄漏。

我不同意这个人的观点,因为在 FFT 和 DFT 中都会发生频谱泄漏。我也不同意,因为 DFT 和 FFT 都可以取奇数个样本点,只是在 FFT 情况下它会慢一些。它是否正确?

2个回答

FFT 是一种计算 DFT 的优化方法,适用于任意数量的样本,这些样本主要是小素数因子的乘积。它们产生完全相同的结果,除了数字噪声。因子 2 很常见,但 3 和 5 也是小素数,可用于非常有效的奇数长度 FFT 实现。许多较新的 FFT 库(Accelerate/vDSP、FFTW 等)因此支持奇数长度 FFT,而不仅仅是 2 的幂。在较新的处理器上,FFT 的速度更受数据缓存大小和策略以及 CPU 指令流水线深度和危险,而不是因为输入是否只是一个幂或 2。

该算法没有假设信号是周期性的(尽管有些人这样做),因为它只是一个有限矩阵基变换。如果信号输入在 FFT 宽度上不是完全周期性的整数,并且从较长的信号中切除了该宽度,则会出现一些窗口伪影,通常称为频谱泄漏(但它们的形状与使用的窗口,因此它们与窗口的关系比与光谱的关系要大得多。)

如果您更改 DFT 或 FFT 窗口的大小,使其恰好是纯周期性输入波形周期的整数倍,则窗口伪影(或泄漏)恰好全为零。

DFT 代表离散傅里叶变换,FFT 代表快速傅里叶变换。FFT 只是一个名称,指的是 DFT 的一种非常快速的实现。所以,基本上它们是一样的。使用 FFT 时,出于实现原因,信号的长度最好是 2 的倍数,因此通常用 0 填充信号,直到长度为 2 的倍数。

因此,用偶数或奇数长度的信号回答您的问题。