我只想澄清某些'FFT实现'之间的区别。我已经读过有1D FFT,然后有2D FFT和其他。
我可以知道这些有什么不同(例如输入,输出等)。例如,什么维度FFT使用arr [n * 2] = real和arr [n * 2 + 1] = imaginary的输入?
另外,对于某些FFT算法,Complex []的用途是什么?我注意到他们在FFT算法中使用X和Y.哪个是真实的和想象的?
谢谢!
答案 0 :(得分:4)
正弦和余弦函数具有90度的相位差,并且由于频率数据可以具有任何相位,因此完整的FFT结果必须报告正弦和余弦分量。通过将这两个分量描述为1个复数相量,可以“简化”FFT的数学运算。并且这些复数可以用二维量表示(称为一维I和另一个Q,或X和Y,或U和V等)。一些FFT例程交织2个分量(余弦和正弦,或实数和虚数),有些则将它们保存在单独的数组或向量中。
由于FFT具有几乎相同计算的逆,这意味着输入数据也可能是复杂的,这可能有用也可能没用。如果您的数据没有第二个或“虚构”分量,您可以使用零提供FFT,或者使用略微修改的FFT算法,该算法通过隐式零修剪所有乘法。仅实数FFT的结果将具有一些冗余对称性,因此结果也可能被修剪。
答案 1 :(得分:3)
FFT可以具有任意数量的维度,但是1D FFT通常用于本质上是一维的数据,例如,音频和2D FFT用于2D数据,如图像。
在一般情况下,输入数据和输出数据都是复杂的,即每个输入/输出值中存在实部和虚部。然而,对于大多数“现实世界”,即物理数据,输入数据的虚部将为零。然而,即使对于纯粹的实际输入数据,FFT的输出也将具有实部和虚部。
根据FFT实现,输入/输出数据可能只是交错数组,其中实数组件为2 * i,虚数组件为索引2 * i + 1,或者它们可能使用某些复杂数据类型或者有时真实和虚构的组件可能在单独的数组中。这只是一个API细节,但基础算法仍然是相同的。
答案 2 :(得分:0)
2D FFT只是首先应用于每行,然后应用于阵列的每列的1D FFT。