用傅立叶分量拟合时间序列:估计傅里叶级数系数

时间:2015-12-18 17:49:12

标签: python scipy time-series fft model-fitting

问题:我有一组显示周期性变化的测量值(时间,测量值,误差),我希望用形式的傅里叶级数拟合它们

enter image description here

其中A0是我测量的平均值,t是时间,t0是(已知的)参考时间,P是(已知)时间。我想适合系数A_k和phi_k。

这是我现在所得到的:

# Find Fourier components
# nfourier is the number of fourier components 

    def fourier(coeffs, time_data, epoch, period, nfourier, A0):
       import numpy as np
       omega = 2.0*np.pi/period
       fseries = np.zeros(len(time_data))
       fseries.fill(A0)
       for k in range(nfourier):
          ak = coeffs[k]
          phik = coeffs[k+1]
          time_diff = time_data - epoch
          fseries = fseries + ak * np.cos(k * omega * time_diff + phik)

       return fseries

我估计残差如下:

def residuals(coeffs, measurement_data, time_data, error_data, epoch, period, nfourier, A0):
   model = fourier(coeffs, time_data, epoch, period, nfourier, A0)
   result = measurement_data - model
   return result

然后我适合:

def fit_it(coeffs, measurement_data, time_data, error_data, epoch, period, nfourier, A0):
   from scipy.optimize import leastsq
   opt_coeff = leastsq(residuals, coeffs, args=(measurement_data, time_data, error_data, epoch, period, nfourier, A0))
   return opt_coeff

程序成功完成,但从这个图中可以看出拟合似乎失败了: enter image description here

我不确定我在这里做错了什么,但也许专家可以提供一些建议。如果有人愿意提供帮助,我很乐意提供测试数据集。

2 个答案:

答案 0 :(得分:1)

我不明白傅立叶拟合背后的原因。我想你想知道数据的调制频率成分。我建议你每次都采用数据的平均值,然后取这个数据,它会让你更深入地了解数据的频谱。

就您的代码而言,我想发两条评论。首先,第k个元素的相位是第k + 1个元素的幅度。第二,error_data没有从函数残差中获取任何东西。您可以查看这些要点。

这更像是评论,但我没有足够的声誉发表评论。只是想帮忙。

问候

答案 1 :(得分:0)

如果您知道数据的周期,则应将x轴相折叠。看起来x轴在儒略日中。您应该在测量期间计算 phase

阶段=((时间-参考时间)%周期)/周期

您将需要使傅立叶级数适合测量与相位图,这看起来更像是周期性信号。