Python FFT不';t返回正确的振幅

Python FFT不';t返回正确的振幅,python,numpy,fft,Python,Numpy,Fft,我试图使用简单的FFT对某些函数进行傅里叶变换,但显然numpy和scipyFFT即使对1024个点也不能很好地工作 例如,假设我想对sin(50x)+cos(80x)进行FFT。然后,在k=50点,应该是纯虚的,k=80应该是纯实的。通常会有一些错误,但使用1024个点的工作通常会提供非常令人满意的输出。但是这里的输出中有相当多的错误。随着点数的增加,结果没有多大改善 有人能解释一下原因吗 我在Python中尝试了以下代码: from __future__ import division im

我试图使用简单的FFT对某些函数进行傅里叶变换,但显然
numpy
scipy
FFT即使对1024个点也不能很好地工作

例如,假设我想对sin(50x)+cos(80x)进行FFT。然后,在
k=50
点,应该是纯虚的,
k=80
应该是纯实的。通常会有一些错误,但使用1024个点的工作通常会提供非常令人满意的输出。但是这里的输出中有相当多的错误。随着点数的增加,结果没有多大改善

有人能解释一下原因吗

我在Python中尝试了以下代码:

from __future__ import division
import numpy as np
import matplotlib.pyplot as plt
import scipy.fftpack

pi = np.pi

#no. of points
N = 1024

#real axis
x = np.linspace(0,2*pi,N)

#real fn
f_x = np.sin(50*x)+np.cos(80*x)

f_k = (2/N)*scipy.fftpack.fft(f_x)

print f_k[50]
print f_k[80]
它给出以下输出:

(0.155273271152-0.983403030451j)
(0.960302223459+0.242617561413j)
应该是,
0-1j
1+0j
。有了1024分,我希望得到更准确的结果


我还尝试使用显式FT公式进行转换,并使用
numpy
而不是
scipy
。两者都具有相同的精度。

对于理想的无限长信号,它应该是
0-1j
1+0j
。然而,这是一个有限长度的数字信号。由于窗口和在计算机上表示浮点数的限制,它永远不会与理想情况完全匹配。

您的输入长度看起来相差1


FFT仅给出FFT长度中正整数周期的正弦信号的精确结果。对于无限多的其他频率,您可以通过FFT结果仓之间的抛物线插值或Sinc插值来改进结果。

FFT函数计算离散傅里叶变换,并精确到浮点精度。然而,离散变换与连续变换不同。但是,在这里,由于给定的函数是周期性的,sin(50x)+cos(80x),离散傅里叶变换是我们需要的,对吗?你需要什么取决于你正在尝试做什么;你上面写的听起来像是你期望的离散变换和连续变换的行为相似。特别是,对于离散变换,采样的精确方式至关重要,如下面的答案所述。例如,尝试
x=np.linspace(0,2*pi,N+1)[:-1]
。有关更多详细信息,请参阅信号处理课程的课程材料。本课程不分一节。代码都在那里。我试着用1023和1025的长度重新运行他的代码,但仍然有相同的效果。但是这些是周期为50和80的正弦曲线。但是在5月份的其他计算中,我们得到了非常令人满意的结果,这就是困扰我的地方。为什么在这种情况下,即使使用1024个长度,结果仍然很差?此外,如果我们增加点的数量,精度不会收敛得太快。