FFT不会返回正确的幅度

时间:2015-03-31 09:37:39

标签: python numpy fft

我正在尝试使用简单的FFT对某些函数进行傅里叶变换,但显然numpyscipy 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-1j1+0j。有了1024分,我期待得到更准确的结果。

我还尝试使用显式FT公式进行转换,numpy代替scipy。两者都给出了相同的准确度。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:-1)

您的输入长度看起来像一个人。

FFT仅为FFT长度中精确整数周期的正弦曲线提供精确结果。对于无限多个其他频率,您可以通过FFT结果箱之间的抛物线或Sinc插值来改善结果。