我们遇到的所有 FFT 实现都会产生复数值(具有实部和虚部),即使算法的输入是一组离散的实数(整数)。
难道不能只用实数来表示频域吗?
我们遇到的所有 FFT 实现都会产生复数值(具有实部和虚部),即使算法的输入是一组离散的实数(整数)。
难道不能只用实数来表示频域吗?
FFT 从根本上说是基础的变化。FFT 改变原始信号的基础是一组正弦波。为了使该基础能够描述所有可能的输入,它需要能够表示相位和幅度;相位用复数表示。
例如,假设您对仅包含单个正弦波的信号进行 FFT。根据相位,您很可能会得到完全真实的 FFT 结果。但是,如果您将输入的相位移动几度,FFT 输出还能如何表示该输入?
编辑:这是一个有点松散的解释,但我只是想激发直觉。
FFT 为您提供幅度和相位。幅度被编码为复数的大小 (sqrt(x^2+y^2)),而相位被编码为角度 (atan2(y,x))。要从 FFT 得到严格的实数结果,输入信号必须具有偶数对称性(即 x[n]=conj(x[Nn]))。
如果您只关心强度,则复数的大小足以进行分析。
是的,可以仅使用实数来表示严格实数输入的 FFT 频域结果。
FFT 结果中的那些复数只是 2 个实数,它们都是为您提供具有长度和方向角(或幅度和相位)的结果向量的 2D 坐标所必需的。FFT 结果中的每个频率分量都可以具有唯一的幅度和唯一的相位(相对于 FFT 孔径中的某个点)。
单独一个实数不能同时代表幅度和相位。如果您丢弃相位信息,如果您尝试使用 iFFT 重新创建信号(并且信号不对称),则很容易使信号严重失真。因此,完整的 FFT 结果需要每个 FFT bin 有 2 个实数。这 2 个实数在某些 FFT 中按照常见约定以复杂数据类型捆绑在一起,但 FFT 结果很容易(有些 FFT 确实如此)只产生 2 个实向量(一个用于余弦坐标,一个用于正弦坐标)。
也有直接产生幅度和相位的 FFT 例程,但它们比产生复数(或两个实数)矢量结果的 FFT 运行得更慢。也存在仅计算幅度并丢弃相位信息的 FFT 例程,但它们的运行速度通常不会比让您在更通用的 FFT 之后自己执行此操作更快。也许他们以不可逆为代价为编码人员节省了几行代码。但是很多库都懒得包含这些速度较慢且不太通用的 FFT 形式,而只是让编码器转换或忽略他们需要或不需要的内容。
此外,许多人认为使用复数运算所涉及的数学要优雅得多(对于严格的实数输入,将 FFT 结果的余弦相关或偶数部分放入实数部分,将正弦相关或奇数部分放入FFT 结果被放入复数的虚部。)
(添加:)而且,作为另一种选择,您可以考虑每个 FFT 结果箱的两个分量,而不是实数和虚数分量,偶数和奇数分量,都是实数。
如果给定频率的 FFT 系数f
是x + i y
,则可以将x
其视为该频率处的余弦系数,而y
是正弦系数。如果将这两个波添加到特定频率,您将获得该频率的相移波;该波的幅度为sqrt(x*x + y*y)
,等于复系数的幅度。
离散余弦变换(DCT) 是产生所有实系数的傅里叶变换的相对形式。许多图像/视频压缩算法都使用二维 DCT。
离散傅里叶变换基本上是从“时域”中的复数向量到“频域”中的复数向量的变换(我使用引号是因为如果您应用正确的缩放因子,DFT 就是它自己的逆)。如果您的输入是真实的,那么您可以一次执行两个 DFT:获取输入向量x和y并计算 F( x + i y )。我忘记了你之后如何分离 DFT,但我怀疑它是关于对称性和复共轭的。
离散余弦变换排序让您可以用实数表示“频域”,并且在有损压缩算法(JPEG、MP3)中很常见。(对我来说)令人惊讶的是,即使它似乎丢弃了相位信息,它也能工作,但这似乎也使它对大多数信号处理目的不太有用(我不知道一种简单的方法来进行卷积/相关) DCT)。
我可能弄错了一些细节;)
您提出这个问题的方式,我相信您正在寻找一种更直观的思维方式,而不是数学答案。我来自机械工程背景,这就是我对傅里叶变换的看法。我参考钟摆对傅立叶变换进行上下文化。如果我们只有摆的 x 速度与时间的关系,并且我们被要求估计摆的能量(或摆的力源),则傅立叶变换给出了完整的答案。通常我们观察到的只是 x 速度,我们可能会得出结论,只需要为钟摆提供与其动能的正弦变化相当的能量。但钟摆也有势能。该能量与势能相差 90 度。因此,为了跟踪势能,我们只是跟踪(动力学)实分量的 90 度异相部分。虚部可以被认为是一个“势速”,它代表了源必须提供的势能的表现,以迫使振荡行为。有用的是,这可以很容易地扩展到电容器和电感器也以“潜在形式”存储能量的电气环境。如果信号不是正弦曲线,那么变换当然会尝试将其分解为正弦曲线。我认为这是假设最终信号是由无限源的组合作用产生的,每个源都具有不同的正弦曲线行为。我们试图确定的是在每个时刻产生最终观察到的信号的每个源的强度和相位。
PS: 1) The last two statements is generally how I think of the Fourier transform itself. 2) I say potential velocity rather the potential energy as the transform usually does not change dimensions of the original signal or physical quantity so it cannot shift from representing velocity to energy.