【问题标题】:FFT real/imaginary/abs parts interpretationFFT 实部/虚部/abs 部分解释
【发布时间】:2014-10-26 18:53:23
【问题描述】:

我目前正在学习离散傅里叶变换,我正在使用 numpy 来更好地理解它。

我试图绘制一个“sin x sin x sin”信号,并获得了一个具有 4 个非零点的干净 FFT。我天真地告诉自己:“好吧,如果我用这些幅度和频率绘制一个“sin + sin + sin + sin”信号,我应该得到相同的“sin x sin x sin”信号,对吧?

嗯……不完全是

(第一个是“x”信号,第二个是“+”信号)

两者共享相同的幅度/频率,但不是相同的信号,即使我可以看到它们有一些相似之处。

好的,因为我只绘制了 FFT 的绝对值,我想我丢失了一些信息。

然后我绘制了两个信号的实部、虚部和绝对值:

现在,我很困惑。我该怎么办?我从数学的角度阅读了 DFT。我知道复杂的值来自单位圆。我什至必须了解希尔伯特空间才能理解它是如何工作的(这很痛苦!......而且我只触及了表面)。我只想了解这些真实/虚构的情节是否在数学世界之外具有任何具体含义:

  • abs(fft):频率 + 幅度
  • 真实(fft):?
  • 虚构的(fft):?

代码:

import numpy as np
import matplotlib.pyplot as plt
N = 512 # Sample count
fs = 128 # Sampling rate
st = 1.0 / fs # Sample time
t = np.arange(N) * st # Time vector

signal1 = \
1   *np.cos(2*np.pi * t) *\
2   *np.cos(2*np.pi * 4*t) *\
0.5 *np.cos(2*np.pi * 0.5*t)

signal2 = \
0.25*np.sin(2*np.pi * 2.5*t) +\
0.25*np.sin(2*np.pi * 3.5*t) +\
0.25*np.sin(2*np.pi * 4.5*t) +\
0.25*np.sin(2*np.pi * 5.5*t)



_, axes = plt.subplots(4, 2)

# Plot signal
axes[0][0].set_title("Signal 1 (multiply)")
axes[0][0].grid()
axes[0][0].plot(t, signal1, 'b-')

axes[0][1].set_title("Signal 2 (add)")
axes[0][1].grid()
axes[0][1].plot(t, signal2, 'r-')

# FFT + bins + normalization
bins = np.fft.fftfreq(N, st)    
fft  = [i / (N/2) for i in np.fft.fft(signal1)]
fft2 = [i / (N/2) for i in np.fft.fft(signal2)]

# Plot real
axes[1][0].set_title("FFT 1 (real)")
axes[1][0].grid()
axes[1][0].plot(bins[:N/2], np.real(fft[:N/2]), 'b-')

axes[1][1].set_title("FFT 2 (real)")
axes[1][1].grid()
axes[1][1].plot(bins[:N/2], np.real(fft2[:N/2]), 'r-')

# Plot imaginary
axes[2][0].set_title("FFT 1 (imaginary)")
axes[2][0].grid()
axes[2][0].plot(bins[:N/2], np.imag(fft[:N/2]), 'b-')

axes[2][1].set_title("FFT 2 (imaginary)")
axes[2][1].grid()
axes[2][1].plot(bins[:N/2], np.imag(fft2[:N/2]), 'r-')

# Plot abs
axes[3][0].set_title("FFT 1 (abs)")
axes[3][0].grid()
axes[3][0].plot(bins[:N/2], np.abs(fft[:N/2]), 'b-')

axes[3][1].set_title("FFT 2 (abs)")
axes[3][1].grid()
axes[3][1].plot(bins[:N/2], np.abs(fft2[:N/2]), 'r-')

plt.show()

【问题讨论】:

    标签: numpy signal-processing fft complex-numbers dft


    【解决方案1】:

    对于每个频率区间,幅度sqrt(re^2 + im^2) 会告诉您相应频率下分量的幅度。 phase atan2(im, re) 告诉您该组件的相对相位。实部和虚部本身并不是特别有用,除非您对数据窗口中心周围的对称属性感兴趣(偶数与奇数)。

    【讨论】:

    • 感谢您和 hotpaw2。我想我现在理解得更好了。我什至不知道atan2的存在!
    • 问题?:1)我假设复数平方的实部是正的,对吧? 2) 复数的虚部在平方时的符号是什么?是否因为 sqrt(-1)**2 为 -1 而为负?
    • @ox.: 不,把复数想象成re + j * im。所以reim都是实数,re^2im^2都是正数。
    【解决方案2】:

    对于某个参考点,比如固定时间窗口的中心,相同频率的正弦波和余弦波看起来会有所不同(相对于任何固定时间参考点具有不同的起始相位)。它们还将在任何整数周期宽度上在数学上正交,因此可以表示变换的独立基向量分量。

    FFT 结果的实部是每个频率分量与余弦波的相似程度,虚部是每个分量与正弦波的相似程度。各种比例的正弦和余弦分量一起可以构建任意或所需相位的正弦曲线,从而使 FFT 结果是完整的。

    仅靠幅度无法区分正弦波和余弦波。 IFFT(imag(FFT)) 会破坏相位与纯余弦不同的任何信号的重建。与 IFFT(re(FFT)) 和纯正弦波(相对于 FFT 孔径窗口)相同。

    【讨论】:

      【解决方案3】:

      您可以将信号 1(由三个 cos 函数的乘积组成)转换为四个 cos 函数的总和。这与函数 2 不同,后者是四个正弦函数的总和。

      cos 函数是偶函数 cos(-x) == cos(x)。 偶函数的傅里叶变换是纯实数。 这就是为什么函数 1 的 fft 的虚部图只包含接近零 (1e-15) 的值的原因。

      正弦函数是奇函数 sin(-x) == -sin(x)。 奇函数的傅里叶变换是纯虚数。 这就是为什么函数 2 的 fft 的实部图只包含接近零 (1e-15) 的值的原因。

      如果您想更详细地了解 FFT 和 DFT,请阅读电气工程信号分析教科书。

      【讨论】:

      • 你是对的,我没有提交好的例子(sin/cos)。好吧,我确实阅读了各种教科书、网站、观看视频、DSP mooc,但它们大多包含一些令人生畏的(至少对我而言)数学概念和公式,并且需要像这样的一些额外调查。我开始理解他们,但我还有很长的路要走。感谢先前的答案,我现在可以通过添加具有相应幅度和相位的余弦子信号(因为原始信号是真实的)来手动重建任何信号。相位公式是我遗漏的关键。这就是我接受 Paul R 答案的原因
      【解决方案4】:

      虽然……你现在一定是个不错的专家了 :) 对于其他人:请注意 with this set of Correct mathematical equation 因此将总和更正为:

          signal1 = \
      1   *np.cos(2*np.pi * t) *\
      2   *np.cos(2*np.pi * 4*t) *\
      0.5 *np.cos(2*np.pi * 0.5*t)
      
      signal2 = \
      0.25*np.cos(-2*np.pi * 2.5*t) +\
      0.25*np.cos(2*np.pi * 3.5*t) +\
      0.25*np.cos(-2*np.pi * 4.5*t) +\
      0.25*np.cos(2*np.pi * 5.5*t)
      

      现在给出以下结果

      (Now results are)

      所以重点是实部也应该是一样的

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-01-06
        • 1970-01-01
        • 1970-01-01
        • 2012-03-16
        • 1970-01-01
        • 2014-08-26
        • 1970-01-01
        相关资源
        最近更新 更多