numpy的快速傅里叶变换会产生意想不到的结果

时间:2016-08-07 09:08:47

标签: python numpy fft

我正在努力实现numpy快速傅里叶变换的实现。我的信号不是周期性的,因此肯定不是理想的候选者,但FFT的结果却远非我所期待的。这是相同的信号,只是因某种因素而延伸。我绘制了一条正弦曲线,近似于我旁边的信号,这应该说明我正确使用FFT函数:

import numpy as np
from matplotlib import pyplot as plt

signal = array([[ 0.], [ 0.1667557 ], [ 0.31103874], [ 0.44339886], [ 0.50747922],
    [ 0.47848347], [ 0.64544846], [ 0.67861755], [ 0.69268326], [ 0.71581176],
    [ 0.726552  ], [ 0.75032795], [ 0.77133769], [ 0.77379966], [ 0.80519187],
    [ 0.78756476], [ 0.84179849], [ 0.85406538], [ 0.82852684], [ 0.87172407],
    [ 0.9055542 ], [ 0.90563205], [ 0.92073452], [ 0.91178145], [ 0.8795554 ],
    [ 0.89155587], [ 0.87965686], [ 0.91819571], [ 0.95774404], [ 0.95432073],
    [ 0.96326252], [ 0.99480947], [ 0.94754962], [ 0.9818627 ], [ 0.9804966 ],
    [ 1.], [ 0.99919711], [ 0.97202208], [ 0.99065786], [ 0.90567128],
    [ 0.94300558], [ 0.89839004], [ 0.87312245], [ 0.86288378], [ 0.87301008],
    [ 0.78184963], [ 0.73774451], [ 0.7450479 ], [ 0.67291666], [ 0.63518575],
    [ 0.57036157], [ 0.5709147 ], [ 0.63079811], [ 0.61821523], [ 0.49526048],
    [ 0.4434457 ], [ 0.29746173], [ 0.13024641], [ 0.17631683], [ 0.08590552]])

sinus = np.sin(np.linspace(0, np.pi, 60))

plt.plot(signal)
plt.plot(sinus)

蓝线是我的信号,绿线是窦。

raw.pdf

transformed_signal = abs(np.fft.fft(signal)[:30] / len(signal))
transformed_sinus = abs(np.fft.fft(sinus)[:30] / len(sinus))

plt.plot(transformed_signal)
plt.plot(transformed_sinus)

蓝线为transformed_signal,绿线为transformed_sinus

fft.pdf

仅绘图transformed_signal说明了上述行为:

enter image description here

有人可以向我解释这里发生了什么吗?

更新

我确实是调用FFT的问题。这是正确的调用和正确的结果:

transformed_signal = abs(np.fft.fft(signal,axis=0)[:30] / len(signal))

enter image description here

2 个答案:

答案 0 :(得分:4)

Numpy的fft默认应用于行。由于您的signal变量是列向量,因此fft应用于由一个元素组成的行,并返回每个元素的单点FFT。

使用fft的轴选项指定您希望在signal列上应用FFT,即

transformed_signal = abs(np.fft.fft(signal,axis=0)[:30] / len(signal))

答案 1 :(得分:1)

[编辑]我忽略了Stelios所说的关键事情!不过我在这里留下答案,因为虽然没有发现你的麻烦的根本原因,但它仍然是真的,包含了你可以用来计算可用FFT的东西。

正如你所说,你正在改变非周期性信号。 你的信号有一些波纹(高次谐波)很好地出现在FFT中。 正弦确实具有更低的频率,主要由直流分量组成。

到目前为止一切顺利。我不明白的是,你的信号还有一个直流分量,根本不会出现。可能这是规模问题。

问题的核心是,虽然窦和你的信号看起来完全相同,但它们的谐波含量完全不同。

最值得注意的是,两者都没有保持与半窦相对应的频率。这是因为一个半窦'并不是通过对整个正弦进行求和来建立的。换句话说:在半个周期内,基底全窦波不在窦的光谱内容中。

只有60个样本的BTW有点微薄,Shannon声称你的采样频率至少应该是最高信号频率的两倍,否则会出现混叠(将频率映射到错误的位置)。换句话说:您的信号在采样后应在视觉上显得平滑(除非它是不连续的或具有不连续的导数,如块或三角波)。但在你的情况下,看起来尖锐的峰值是欠采样的假象。