【问题标题】:Do Fourier Transformation using Python使用 Python 进行傅里叶变换
【发布时间】:2018-12-20 01:26:49
【问题描述】:

我正在尝试使用 Python 进行傅里叶变换。

有一个不错的库numpy 具有fft 函数,该函数假定根据文档获取一系列点并返回它们的傅里叶变换。

现在我尝试让它工作 - 但它看起来不对......

我创建了简单的sine wave 1HzAmplitude=1。 我用8Hz 对其进行采样(所以 8 个样本)

这些是样本:

[0,0.707,1,0.707,0,-0.707,-1,-0.707]

现在我希望得到 ens 的回报。 [0,4,0,0,0,0,0,4][0,8,0,0] 表示频率为1Hz(取决于它是否根据奈奎斯特限制进行所需的修整)。

但实际上我得到以下信息:

[0.00000000e+00+0.00000000e+00j, -2.22044605e-16-3.99969798e+00j,
 0.00000000e+00+0.00000000e+00j, -2.22044605e-16+3.02022804e-04j,
 0.00000000e+00+0.00000000e+00j,  2.22044605e-16-3.02022804e-04j,
 0.00000000e+00+0.00000000e+00j,  2.22044605e-16+3.99969798e+00j]

这是我的代码:

import numpy
signal = numpy.array([0,0.707,1,0.707,0,-0.707,-1,-0.707], dtype=float)
f =  numpy.fft.fft(signal)
print (f)

为什么我会得到这个结果?我做错了什么?

【问题讨论】:

  • 试试cos而不是sin。
  • "这些是示例:[0,0.707,1,0.707,0,-0.707,-1,-0.707]" 如果将 0.707 替换为更准确的值np.sqrt(2)/2,您将显着降低数值噪声。
  • @OliverCharlesworth 出于好奇,为什么这会对 OP 有所帮助?
  • @tel 它将消除导致 OP 输出为虚构的 90 度相移(尽管存在数字问题)。
  • @OliverCharlesworth 有道理,谢谢。这个问题对物理 201 来说是相当复习的。

标签: python numpy fft


【解决方案1】:

傅里叶变换的输出

nummpy.fft.fft(以及所有其他傅立叶变换方法)的输出具有复数值。该输出对输入中每个频率分量的幅度和相移信息进行编码。您在输出中得到的复数是正确的。

如何从fft.fft的输出中得到频谱

从您的示例中,您似乎试图获得的输出实际上是频谱(技术上,energy spectral density)。你可以通过取numpy.fft.fft返回的结果的绝对值来计算:

import numpy
signal = numpy.array([0,0.707,1,0.707,0,-0.707,-1,-0.707], dtype=float)
f =  numpy.fft.fft(signal)
print(np.abs(f))

输出:

[0.00000000e+00 3.99969798e+00 0.00000000e+00 3.02022804e-04
 0.00000000e+00 3.02022804e-04 0.00000000e+00 3.99969798e+00]

这正是您所期望的,只是在一些数值上不准确。

根据 Warren Weckesser 的评论,您可以通过使用 2**.5/2 的“真实”值来代替您的简写 .707s,从而在一定程度上减少数字误差:

signal = numpy.array([0, 2**.5/2, 1, 2**.5/2, 0, -2**.5/2, -1, -2**.5/2])
f =  numpy.fft.fft(signal)
print(np.abs(f))

输出:

[0.00000000e+00 4.00000000e+00 0.00000000e+00 2.22044605e-16
 0.00000000e+00 2.22044605e-16 0.00000000e+00 4.00000000e+00]

复数的绝对值就是它的大小。根据Fourier transform wiki

傅里叶变换在一点上的大小是有多少频率内容

【讨论】:

  • 取绝对值貌似解决了问题,但不正确,也不能推广到其他输入函数。问题是 OP 对输入信号的来源(以及输出)的错误期望。请参阅建议的重复问题。
猜你喜欢
  • 2015-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-02
  • 2012-05-18
  • 1970-01-01
  • 2021-05-18
  • 1970-01-01
相关资源
最近更新 更多