【问题标题】:Differences in types of FFT?FFT类型的差异?
【发布时间】:2011-02-19 02:16:19
【问题描述】:
我只想澄清某些“FFT 的实现”之间的区别。我读过有 1D FFT,然后有 2D FFT 和其他。
我想知道这些有什么区别吗(例如输入、输出等)。例如,什么维度的 FFT 使用 arr[n*2] = real 和 arr[n*2+1] = imaginary 的输入?
另外,对于某些 FFT 算法,Complex[] 有什么用?我注意到他们在 FFT 算法中使用了 X 和 Y。哪个是真实的和想象的?
谢谢!
【问题讨论】:
标签:
signal-processing
fft
【解决方案1】:
正弦和余弦函数具有 90 度的相位差,并且由于频率数据可以具有任何相位,因此完整的 FFT 结果必须同时报告正弦和余弦分量。 FFT 的数学可以通过将这 2 个分量描述为 1 个复相量来“简化”。而这些复数可以用二维量来表示(称为一维 I 和另一个 Q,或 X 和 Y,或 U 和 V 等)。一些 FFT 例程将 2 个分量(余弦和正弦,或实数和虚数)交错,一些将它们保存在单独的数组或向量中。
由于 FFT 的逆运算几乎是相同的计算,这意味着输入数据也可能很复杂,这可能有用也可能没有用。如果您的数据没有第二个或“虚数”分量,您可以使用零输入 FFT,或者使用稍微修改的 FFT 算法将所有乘法修剪为隐式零。纯数据 FFT 的结果将具有一些冗余对称性,因此该结果也可能会被修剪。
【解决方案2】:
FFT 可以有任意数量的维度,但一维 FFT 通常用于本质上是一维的数据,例如音频和 2D FFT 用于图像等 2D 数据。
在一般情况下,输入数据和输出数据都是复数,即每个输入/输出值都有实部和虚部。然而,对于大多数“现实世界”,即物理数据,输入数据的虚部将为零。不过,即使对于纯实输入数据,FFT 的输出也将包含实部和虚部。
根据 FFT 实现,输入/输出数据可能只是交错数组,其中实部在 2*i 处,虚部在索引 2*i+1 处,或者它们可能使用一些复杂的数据类型,或者有时实部和虚部可能位于不同的数组中。这只是一个 API 细节,底层算法还是一样的。
【解决方案3】:
2D FFT 就是将 1D FFT 先应用于数组的每一行,然后应用于数组的每一列。