Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python numpy';s的快速傅里叶变换产生了意想不到的结果_Python_Numpy_Fft - Fatal编程技术网

Python numpy';s的快速傅里叶变换产生了意想不到的结果

Python numpy';s的快速傅里叶变换产生了意想不到的结果,python,numpy,fft,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

我正在努力解决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)
蓝线是我的信号,绿线是鼻窦

蓝线是
变换的\u信号
,绿线是
变换的\u信号

仅绘制
转换的\u信号
说明了上述行为:

有人能给我解释一下这是怎么回事吗

更新

我确实很难调用FFT。这是正确的调用和正确的结果:

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

[EDIT]我忽略了斯特里奥斯所说的关键问题!尽管如此,我还是在这里留下了我的答案,因为虽然没有找到你麻烦的根本原因,但它仍然是正确的,并且包含了一些你必须考虑的有用的FFT

正如你所说,你正在转换一个非周期性的信号。 您的信号有一些涟漪(高次谐波),这些涟漪很好地显示在FFT中。 正弦信号的高频率要小得多,主要由直流分量组成

到目前为止还不错。我不明白的是,你的信号也有一个直流分量,根本不显示。这可能是一个规模问题

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

最值得注意的是,两者都没有一个频率对应于半鼻窦。这是因为“半鼻窦”不是通过将整个鼻窦相加而形成的。换句话说:在一半的周期内,潜在的完整窦波不在窦的频谱内容中


顺便说一句,只有60个样本是有点少,香农说,你的样本频率应该至少是最高信号频率的两倍,否则会发生混叠(映射频率到错误的地方)。换言之:采样后,信号在视觉上应该是平滑的(当然,除非它是不连续的或具有不连续的导数,如块波或三角波)。但在您的例子中,尖峰似乎是欠采样的伪影。

Numpy的
fft
默认应用于行。由于
信号
变量是列向量,
fft
应用于由一个元素组成的行,并返回每个元素的一点fft

使用
fft
的轴选项指定要对
信号的列应用fft,即

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

我对FFT很陌生,不完全理解你的答案。我想我知道信号看起来与FFT完全不同,因此会产生完全不同的结果。但是我不知道你说的直流分量是什么意思。你为什么认为应该有一个?为了缓解这个可能出现的规模问题,您建议做些什么?“我将试图找到一个更长的信号来解释这个别名。”保罗·雅克指的是这个别名。采样频率必须是要捕获的信号中最高频率分量频率的两倍。作为指示:使用至少20个要检测的最低频率的完整周期,在最高频率的整个周期内至少进行2次采样,并在开始和结束时逐渐衰减信号,以防止信号及其导数的不连续性(因此在零处切断不会起作用,因为导数会产生跳跃)直流分量是平均值,由频率为0的余弦表示。我发现我的信号可能太短,无法得到可靠的结果。谢谢你的回答,是的,请留下。我认为理解正在发生的事情非常有帮助。或者,如果意图是将
信号
转换为一维向量,则使用类似
np.array([x[0]表示信号中的x])
transformed_signal = abs(np.fft.fft(signal,axis=0)[:30] / len(signal))