【问题标题】:numpy.fft() what is the return value amplitude + phase shift OR angle?numpy.fft() 返回值幅度+相移或角度是多少?
【发布时间】:2015-02-19 22:54:37
【问题描述】:

np.fft.fft() 返回一个复数数组....复数是什么意思? 我想真正的部分是幅度! 虚部是相移 ?相位角 ?或者别的什么!

我发现数组中的位置代表频率。

【问题讨论】:

  • 通常要解释 fft,您将绘制 20*log(abs(fft(x)),这需要复数的大小并将其置于 dB 标度中

标签: python numpy fft


【解决方案1】:

这不是一个真正的编程问题,也不是特定于numpy。简单来说,复数(sqrt(x.real**2 + x.imag**2),或numpy.abs())的绝对值就是幅值。

更详细地说,当您将 FFT 应用于数组 X(例如,其中包含函数 X(t) 的不同值 t 的多个样本)时,您尝试将其表示为具有不同w 值的“平面波”exp(i w t)(其中i 是虚数单位,w 是实值频率)。也就是说,你想要类似的东西

X = A exp(i w1 t) + B exp(i w2 t) + ...

FFT 会返回这些系数AB 等对应于一些固定频率w1w2 等(在numpy 中,您可以从fftfreq() 获得它们的值)。

现在,这些系数通常是复杂的。复数A 可以表示为“幅度”和“相位”的组合:

A = r exp(i p)

其中r (== numpy.abs(A)) 是幅度,p (== numpy.angle(A)) 是相位,都是实数值。如果将其代入 FFT 展开式中的项,则得到

r exp(i p) exp(i w t) == r exp(i (w t + p))

因此,幅度r 改变了项的绝对值,而相位p 则改变了相位。因此,为了从 FFT 的结果中获取幅度数组,您需要对其应用numpy.abs


但我真的建议您阅读有关 FFT 理论的内容,周围有很多信息,例如 wiki

【讨论】:

  • 感谢您的回答...我正在尝试通过 FFT 从 (time,amp) 获取顶部 (freq,amp,phase),然后使用生成的 freq++ 绘制正弦波。不同之处在于我想在我拥有的样本的时间范围之上/之后绘制。
【解决方案2】:

对于我所知道的任何 DFT 实现,您获得的值数组是复数数组。复数有一个范数,它对应于幅度。根据实部和虚部,它在复平面上有一个角度(有时称为参数)。这个角度对应于相位。复平面(来自Wolfram docs):

所以,您的数组包含xy,实部和虚部。您对角度theta 感兴趣。可以这样计算:

tan(theta) = y/x

theta = arctan(y/x)

这会产生以弧度为单位的角度。您可能还想看看numpy.angle()

【讨论】:

    【解决方案3】:

    给定频率的幅度 r 表示原始信号中该频率的数量。复数参数表示相位角,theta。

    x + i*y = r * exp(i*theta)

    其中 x 和 y 是 numpy FFT 返回的数字。

    【讨论】:

      猜你喜欢
      • 2012-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-27
      相关资源
      最近更新 更多