我正在尝试使用简单的 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
。然而,这是一个有限长度的数字信号。由于窗口和计算机上表示 float 的限制,它永远不会完美匹配理想情况。
关于python - FFT 未返回正确的幅度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29365367/