为什么FFT产生的是复数而不是实数?
是的,可以仅使用实数来表示严格实数输入的FFT频域结果。
FFT结果中的那些复数只是2个实数,这两个实数都需要给出同时具有长度和方向角(或幅度和相位)的结果向量的2D坐标。并且FFT结果中的每个频率分量可以具有唯一的振幅和唯一的相位(相对于FFT孔径中的某个点)。
一个实数本身并不能同时表示幅度和相位。如果您丢弃了相位信息,那么如果您尝试使用iFFT重新创建它(并且信号不对称),那么很容易造成信号的大量失真。因此,一个完整的FFT结果需要每个FFT bin 2个实数。按照通用约定,这两个实数在一些FFT中以复数数据类型捆绑在一起,但FFT结果很容易(一些FFT确实如此)只产生两个实数向量(一个用于余弦坐标,一个用于正弦坐标)。
也有直接产生幅度和相位的FFT例程,但它们的运行速度比产生复杂(或两个实数)矢量结果的FFT慢。还有一些FFT例程,只计算幅度并丢弃相位信息,但它们的运行速度通常不会比让您在进行更通用的FFT后自己计算更快。也许他们为程序员节省了几行代码,但代价是不可逆。但很多库不会费心去包含这些较慢且不太通用的FFT形式,而只是让编码器转换或忽略他们需要或不需要的内容。
此外,许多人认为所涉及的数学是使用复数运算的lot更优雅(对于严格的实数输入,将FFT结果的余弦相关或偶数分量放入实数分量,而将FFT结果的正弦相关或奇数分量放入复数的虚数分量。)
(添加:)并且,作为另一种选择,您可以考虑每个FFT结果框的两个分量,而不是实数和虚数分量,而是偶数和奇数分量,两者都是实数。