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

ste*_*iss 73 algorithm math audio signal-processing fft

我们遇到的所有FFT实现都会产生复杂的值(具有实部和虚部),即使算法的输入是一组离散的实数(整数).

是否仅可以用实数表示频域?

zmc*_*ord 77

FFT基本上是基础的变化.FFT改变原始信号的基础是一组正弦波.为了使该基础描述所有可能的输入,它需要能够表示相位和幅度; 相位用复数表示.

例如,假设您对仅包含单个正弦波的信号进行FFT.根据相位,您可能会获得完全真实的FFT结果.但是如果你将输入的相位移动几度,那么FFT输出怎么能代表那个输入呢?

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

  • 那么,FFT中的每个值对应于不同的频率分量.该值的大小是分量的幅度,复角度是该分量的相位. (7认同)
  • 它有助于回答很多问题.如果FFT结果仅包含频率和相位,它如何捕获时域样本中的幅度信息?也就是说,它如何在iFFT中重新创建正确的幅度? (3认同)

小智 47

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

如果您关心的只是强度,那么复数的大小就足以进行分析.


hot*_*aw2 37

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

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

仅一个实数就不能代表幅度和相位.如果您丢弃相位信息,如果您尝试使用iFFT重新创建它(信号不对称),则可能会轻易地使信号失真.因此,完整的FFT结果需要每个FFT bin 2个实数.这两个实数通过常规约束在一些复杂数据类型的FFT中捆绑在一起,但FFT结果很容易(并且一些FFT)只产生2个实数向量(一个用于余弦坐标,一个用于正弦坐标).

还存在直接产生幅度和相位的FFT例程,但它们比产生复杂(或两个实际)矢量结果的FFT运行得慢.还有一些FFT例程只能计算幅度并且只是丢弃相位信息,但是它们通常运行速度不会比在更通用的FFT之后自己完成.也许他们以不可逆的代价为代码保存了几行代码.但是很多库都不愿意包含这些较慢且不那么通用的FFT形式,只需让编码器转换或忽略它们需要或不需要的东西.

此外,许多人认为参与是一个数学大量使用复杂的算法更优雅.

(已添加:)而且,作为另一种选择,您可以考虑每个FFT结果箱的两个组件,而不是实数和虚数组件,作为偶数和奇数组件,两者都是实数.


com*_*orm 18

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

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


tc.*_*tc. 9

  1. 离散傅立叶变换基本上是从"时域"中的复数向量到"频域"中的复数向量的变换(我使用引号,因为如果你应用正确的缩放因子,DFT就是它自己的逆).如果您的输入是真实的,那么您可以一次执行两个DFT:获取输入向量xy并计算F(x  +  i  y).我忘记了你之后如何分离DFT,但我怀疑它是关于对称性和复共轭的东西.

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

我可能错了一些细节;)