具有非整数周期的傅立叶数据,校正相位偏差

机器算法验证 曲线拟合
2022-03-13 05:38:15

我有我认为是正弦曲线的数据,但我没有整数个周期。我如何找到“最合适”的Sin/Cos功能,对此和出现的丑陋常数进行补偿?例子:

  • 这是一些遵循正弦模式的数据(Mathematica 格式)

    t4 = N[Table[Sin[3.17*2*Pi*x/200], {x,1,200}]];

  • 现在,使用 just t4,我想返回Sin[3.17*2*Pi*x/200]或等效。

  • 请注意,它Mean[t4]是非零的(大约是0.0281886)。到目前为止我尝试过的分析“拉出”这个意思(如“ 0.0281886 + ...”)。这很糟糕,因为我不太可能在那个常数被拉出的情况下恢复到我原来的形式。

  • 使用来自https://stackoverflow.com/questions/4463481/continuous-fourier-transform-on-discrete-data-using-mathematica的 j0ker5 的出色技术,我可以补偿非积分期并获得:

    0.0281886 + 0.983639 Cos[1.49867 - 0.0992743 x]

请注意,该x术语3.16*2*Pi*x/200非常接近我的原始术语。

  • 我稍微修改了 j0ker5 的技术。我用来获得上述内容的实际功能:

superfourier2[data_] :=Module[ 
 {pdata, n, f, pos, fr, frpos, freq, phase, coeff}, 
 pdata = data; 
 n = Length[data]; 
 f = Abs[Fourier[pdata]]; 
 pos = Ordering[-f, 1][[1]] - 1; 
 fr = Abs[Fourier[pdata*Exp[2*PiIposRange[0,n-1]/n], 
      FourierParameters -> {0, 2/n}]]; 
 frpos = Ordering[-fr, 1][[1]]; 
 freq = (pos + 2(frpos - 1)/n); 
 phase = Sum[Exp[freq*2*PiIx/n]*pdata[[x]], {x,1,n}]; 
 coeff =  N[{Mean[data], 2*Abs[phase]/n, freq*2*Pi/n, Arg[phase]}]; 
 Function[x, Evaluate[coeff[[1]] + coeff[[2]]*Cos[coeff[[3]]*x - coeff[[4]]]]] 
] 

  • 除了糟糕的常数项之外,请注意在yield中添加“ 0.983639*Cos[1.49867 - 0.0992743 x],我相信这会使事情变得更糟,而不是更好。x=1..2000.0279175*200

  • 我相信0.0279175*200余弦和 200*0.0281886平均值的总和可以以某种方式“取消”以返回我的纯Sin[]函数。

想法?

1个回答

周期将估计周期。它还将处理噪声数据并挑选出不同时期的多个正弦分量。

快速而肮脏的Mathematica计算是

data = N[Table[Sin[3.17*2*Pi*x/200], {x, 1, n}]];
welch = 1 - (2 (Range[n] - (n - 1)/2)/(n + 1))^2;
fData = Append[Abs[Fourier[welch data]]^2 / (Plus @@ (welch^2)), 0];
fData = (fData + Reverse[fData])/2;
fData = fData / (Plus @@ fData);

(您实际上并不需要最后两个步骤,但我保留了它们,因为它们制作了下面的插图。)

这是此示例中周期图的重要部分的图:

周期图

这些点是周期图的值,而线是快速平滑的(我使用了 5 阶多项式插值器,但更多时间将应用高斯核平滑):

f = Interpolation[Log[fData], InterpolationOrder -> 5];
period = x /. (NMaximize[f[x + 1], x] // Last)

平滑值的最大值出现在,其接近证明了这种技术的前景。3.176613.17

一旦您估计了周期,就可以直接找到相位和幅度(使用非线性最小二乘,或者在傅里叶变换上运行一个紧带通滤波器并将其反转)。

NonlinearModelFit[data, a Sin[\[Phi] + period*2*Pi*x/200], {a, \[Phi]}, x]

估计的幅度 ( ) 为,相位 ( ) 为,两者分别接近的实际值。(相位估计小于正确相位的一个采样间隔(),这与预期的一样好。)将数据与此拟合进行比较:a1.00011ϕ0.0212758102π/200=0.0314

数据与拟合

残差表现出一些准周期性(可归因于在非整数周期截断数据),范围从0.0180.021