【发布时间】:2011-05-25 23:52:02
【问题描述】:
我使用 fft 分析了 sunspots.dat 数据(如下),这是该领域的经典示例。我从 fft 获得了真实和想象部分的结果。然后我尝试使用这些系数(前 20 个)按照傅里叶变换的公式重新创建数据。认为真实部分对应a_n,想象部分对应b_n,我有
import numpy as np
from scipy import *
from matplotlib import pyplot as gplt
from scipy import fftpack
def f(Y,x):
total = 0
for i in range(20):
total += Y.real[i]*np.cos(i*x) + Y.imag[i]*np.sin(i*x)
return total
tempdata = np.loadtxt("sunspots.dat")
year=tempdata[:,0]
wolfer=tempdata[:,1]
Y=fft(wolfer)
n=len(Y)
print n
xs = linspace(0, 2*pi,1000)
gplt.plot(xs, [f(Y, x) for x in xs], '.')
gplt.show()
然而,出于某种原因,我的情节并未反映 ifft 生成的情节(我在两侧使用相同数量的系数)。有什么问题?
数据:
【问题讨论】:
-
只是出于好奇,你在用光谱做什么?如果您尝试确定各种组件的相对频谱幅度,您可能需要使用数据窗口 (en.wikipedia.org/wiki/Window_function)。例如,如果您绘制
np.abs(fft(wolfer*hanning(len(wolfer)))),n=30 附近的峰值显示的结构比没有窗口时要多一些。
标签: python math signal-processing fft