我正在尝试使用简单的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 :(得分:2)
对于理想的无限长信号,它将是0-1j
和1+0j
。然而,这是一个有限长度的数字信号。由于窗口化以及在计算机上表示浮点数的限制,它永远不会与理想情况完全匹配。
答案 1 :(得分:-1)
您的输入长度看起来像一个人。
FFT仅为FFT长度中精确整数周期的正弦曲线提供精确结果。对于无限多个其他频率,您可以通过FFT结果箱之间的抛物线或Sinc插值来改善结果。