为什么FFT产生复数而不是实数?

即使algorithm的input是一组离散的实数(整数),我们所遇到的所有FFT实现都会导致复值(包含实部和虚部)。

仅用实数来表示频域是不可能的?

FFT从根本上是一个变化的基础。 FFT改变原始信号的基础是一组正弦波。 为了在此基础上描述所有可能的input,它需要能够表示相位和幅度; 该阶段使用复数来表示。

例如,假设你FFT只包含一个正弦波的信号。 根据阶段,你可能会得到完全真实的FFT结果。 但是,如果将input的相位转换几度,那么FFT输出如何表示该input?

编辑:这是一个有点松散的解释,但我只是试图激发直觉。

FFT为您提供幅度相位。 幅度被编码为复数(sqrt(x ^ 2 + y ^ 2))的大小,而相位被编码为angular度(atan2(y,x))。 为了从FFT得到严格的实数结果,input信号必须具有偶数对称性(即x [n] = conj(x [Nn])))。

如果你所关心的只是强度,那么复数的大小足以进行分析。

是的,可以仅使用实数来表示严格实数input的FFT频域结果。

FFT结果中的那些复数仅仅是2个实数,这两个实数都需要给出具有长度和方向angular度(或幅度和相位)的结果向量的二维坐标。 并且FFT结果中的每个频率分量可以具有唯一的幅度和唯一的相位(相对于FFT孔径中的某个点)。

单靠一个实数不能代表量级和阶段。 如果丢弃相位信息,如果尝试使用iFFT重新创build信号(信号不对称),则很容易使信号大量失真。 所以一个完整的FFT结果需要每个FFT bin有两个实数。 这两个实数在一些复杂数据types的FFT中按照惯例被捆绑在一起,但是FFT结果可以很容易地(和一些FFT)产生2个实数vector(一个用于余弦坐标,一个用于正弦坐标)。

也有直接产生幅度和相位的FFT程序,但是它们比产生复杂(或两个实数)向量结果的FFT运行更慢。 还有一些FFT程序只计算幅度并丢弃相位信息,但通常运行速度不会比在更一般的FFT之后自己做。 也许他们会以不可逆的代价为代码保存几行代码。 但是很多库并不需要包含这些较慢和较不常用的FFTforms,只需让编码器转换或忽略他们需要或不需要的内容即可。

此外,许多人认为使用复杂的算术,涉及到的math更加优雅。

(增加:)而且,作为另一种select,您可以将每个FFT结果库的两个分量视为实数和虚数分量,而不是实数和偶数分量。

如果给定频率f FFT系数是x + iy ,则可以将x看作该频率下的余弦系数,而y则是正弦的系数。 如果在特定的频率上添加这两个波,则会在该频率上得到一个相移波; 这个波的幅度是sqrt(x*x + y*y) ,等于复数系数的大小。

离散余弦变换 (DCT)是产生所有实系数的傅立叶变换的一个相对variables。 二维DCT被许多图像/video压缩algorithm所使用。

  1. 离散傅里叶变换从根本上是从“时域”中的复数向量到“频域”中复数向量的变换(我使用引号是因为如果应用正确的比例因子,DFT是它自己的逆)。 如果您的input是真实的,那么您可以一次执行两个DFT:取input向量xy并计算F( x + i y )。 我忘记了如何将DFT分开,但我怀疑这是关于对称性和复共轭的。

  2. 离散余弦变换可以让你用实数表示“频域”,并且在有损压缩algorithm(JPEG,MP3)中很常见。 令人惊讶的是,即使似乎放弃了相位信息,它也可以工作,但是这似乎也使得它对于大多数信号处理目的来说不太有用(我不知道用一种简单的方法来进行卷积/相关一个DCT)。

我可能已经得到了一些细节错误;)