我有我认为是正弦曲线的数据,但我没有整数个周期。我如何找到“最合适”的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[]函数。
想法?

