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


Answers:


86

FFT从根本上说是基础的改变。FFT改变原始信号的基础是一组正弦波。为了使该基础描述所有可能的输入,它必须能够表示相位和幅度。该阶段用复数表示。

例如,假设您对仅包含一个正弦波的信号进行FFT。根据相位,您可能会获得完全真实的FFT结果。但是,如果将输入的相位偏移几度,则FFT输出还能如何表示该输入?

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


3
它对回答很有帮助。如果FFT结果仅包含频率和相位,它如何捕获时域样本中的幅度信息?也就是说,它如何在iFFT中重新创建正确的幅度?
史蒂夫·兰迪斯2012年

7
嗯,FFT中的每个值都对应一个不同的频率分量。该值的大小是该分量的幅度,而复角是该分量的相位。
zmccord 2012年

52

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

如果您只关心强度,则复数的大小足以进行分析。


41

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

FFT结果中的那些复数仅是2个实数,这两个都需要为您提供具有长度和方向角(或幅值和相位)的结果向量的2D坐标。FFT结果中的每个频率分量都可以具有唯一的幅度和唯一的相位(相对于FFT孔径中的某个点)。

单是一个实数不能代表幅度和相位。如果丢掉相位信息,如果尝试使用iFFT重建信号(信号不对称),则很容易使信号失真。因此,完整的FFT结果需要每个FFT仓2个实数。根据常规约定,这2个实数在复杂数据类型的某些FFT中捆绑在一起,但是FFT结果可以轻松地(某些FFT确实)产生2个实向量(一个用于余弦坐标,一个用于正弦坐标)。

也有直接产生幅度和相位的FFT例程,但是它们比产生复杂(或两个实数)矢量结果的FFT运行得慢。也有一些FFT例程,它们仅计算幅度并且仅丢弃相位信息,但是它们的运行速度通常不比让您在执行更通用的FFT之后自己执行的速度更快。也许他们以不可逆的代价为编码员节省了几行代码。但是很多库都不会费心去包含这些较慢且不太通用的FFT形式,而只是让编码器转换或忽略它们需要或不需要的内容。

此外,许多人认为参与是一个数学大量的使用复杂的算法(其中,对于严格的实际输入,余弦相关性,甚至部分的FFT结果放在实分量更优雅,和正弦相关或奇数组件FFT结果放入复数的虚数部分中。)

(添加:)此外,作为另一种选择,您可以考虑每个FFT结果仓的两个分量,而不是将它们视为实数和虚数分量,而将其视为偶数和奇数分量。


19

如果给定频率的FFT系数fx + i y,你可以看看x作为在该频率的余弦的系数,而y是正弦系数。如果将这两个波添加到特定频率,则将获得该频率的相移波。这波的大小是sqrt(x*x + y*y)的大小等于,复数的大小。

离散余弦变换(DCT)是傅立叶的相对变换其产生的所有实系数。许多图像/视频压缩算法都使用二维DCT。


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

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

我可能弄错了一些细节;)


1
对于转换F(x + iy),我很乐意找到更多相关信息-之后将DFT分开。
CatsLoveJazz
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.