【问题标题】:Why does FFT produce complex numbers instead of real numbers?为什么 FFT 产生复数而不是实数?
【发布时间】:2012-05-05 11:32:01
【问题描述】:

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

难道不能只用实数来表示频域吗?

【问题讨论】:

    标签: algorithm math audio signal-processing fft


    【解决方案1】:

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

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

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

    【讨论】:

    • 它对回答很有帮助。如果 FFT 结果只包含频率和相位,它如何捕获时域样本中的幅度信息?也就是说,它如何在 iFFT 中重新创建正确的幅度?
    • 嗯,FFT 中的每个值对应一个不同的频率分量。该值的大小是分量的幅度,复角是该分量的相位。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      单独一个实数不能同时表示幅度和相位。如果您丢弃相位信息,如果您尝试使用 iFFT 重新创建信号(并且信号不对称),则很容易使信号严重失真。因此,完整的 FFT 结果需要每个 FFT bin 有 2 个实数。这 2 个实数在某些 FFT 中按照惯例以复杂数据类型捆绑在一起,但 FFT 结果很容易(有些 FFT 确实如此)只产生 2 个实向量(一个用于余弦坐标,一个用于正弦坐标)。

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

      另外,许多人认为所涉及的数学很多使用复数算术更优雅(对于严格的实数输入,FFT 结果的余弦相关甚至分量被放入实数分量中, 并将 FFT 结果的正弦相关或奇数分量放入复数的虚数分量中。)

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

      【讨论】:

        【解决方案4】:

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

        Discrete Cosine Transform (DCT) 是产生所有实系数的傅里叶变换的相对值。许多图像/视频压缩算法都使用二维 DCT。

        【讨论】:

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

          2. discrete cosine transform 排序允许您用实数表示“频域”,并且在有损压缩算法(JPEG、MP3)中很常见。 (对我来说)令人惊讶的是,即使它似乎丢弃了相位信息,它也能工作,但这似乎也使它对大多数信号处理目的不太有用(我不知道一种简单的方法来进行卷积/相关) DCT)。

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

          【讨论】:

          • 我很想找到更多关于你所说的信息 - 之后分离 DFT - 对于变换 F(x + i y) 的情况。
          【解决方案6】:

          您提出这个问题的方式,我相信您正在寻找一种更直观的思维方式,而不是数学答案。我来自机械工程背景,这就是我对傅里叶变换的看法。我参考钟摆对傅立叶变换进行上下文化。如果我们只有摆的 x 速度与时间的关系,并且要求我们估计摆的能量(或摆的力源),则傅立叶变换给出了完整的答案。通常我们观察到的只是 x 速度,我们可能会得出结论,只需要为钟摆提供与其动能的正弦变化相当的能量。但钟摆也有势能。该能量与势能相差 90 度。因此,为了跟踪势能,我们只是跟踪(动力学)实分量的 90 度异相部分。虚部可以被认为是“势速”,它代表了源必须提供的势能的表现,以迫使振荡行为。有用的是,这可以很容易地扩展到电容器和电感器也以“潜在形式”存储能量的电气环境。如果信号不是正弦曲线,那么变换当然会尝试将其分解为正弦曲线。我认为这是假设最终信号是由无限源的组合作用生成的,每个源都具有不同的正弦曲线行为。我们试图确定的是在每个时刻产生最终观察到的信号的每个源的强度和相位。

          PS:1)最后两个陈述通常是我对傅里叶变换本身的看法。 2)我说的是势速而不是势能,因为变换通常不会改变原始信号或物理量的维度,因此它不能从表示速度转变为能量。

          【讨论】:

            猜你喜欢
            • 2016-05-29
            • 2016-10-06
            • 1970-01-01
            • 2012-03-28
            • 2020-04-18
            • 2010-11-19
            相关资源
            最近更新 更多