2

问题:我有一组表现出周期性变化的测量值(时间、测量值、误差),我想用傅里叶级数形式拟合它们

在此处输入图像描述

其中 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

程序成功完成,但拟合似乎失败,如下图所示: 在此处输入图像描述

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

4

2 回答 2

1

我不明白傅立叶拟合背后的原因。我想您想知道数据的调制频率分量。我建议您每次取数据的平均值并取其 fft,它会让您更深入地了解数据的频谱。

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

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

问候

于 2015-12-20T07:35:31.410 回答
0

如果您知道数据的周期,您应该对 x 轴进行相位折叠。看起来 x 轴是在儒略日。您应该在测量期间计算相位

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

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

于 2018-11-03T20:28:16.940 回答