我有一些周期性的数据,但是数据量不是周期的倍数。如何对这些数据进行傅里叶分析?例如:
% 让我们创建一些用于测试的数据:
data = Table[N[753+919*Sin[x/623-125]], {x,1,25000}]
我现在收到了这些数据,但不知道它来自上述公式。我正在尝试从“数据”中重构公式。
观察傅里叶级数的前几个非常数项:
ListPlot[Table[Abs[Fourier[data]][[x]], {x,2,20}], PlotJoined->True,
PlotRange->All]
上图显示了一个在6处的预期峰值(因为周期数实际上是25000/(623*2*Pi)或约为6.38663,尽管我们不知道这个数值)。
% 现在,如何得到回6.38663?一种方法是使用任意倍数的Cos[x]“卷积”数据。
convolve[n_] := Sum[data[[x]]*Cos[n*x], {x,1,25000}]
% 并在n=6附近绘制“卷积”图形:
Plot[convolve[n],{n,5,7}, PlotRange->All]
我们可以在预期范围内看到一个峰值。
% 我们尝试使用FindMaximum:
FindMaximum[convolve[n],{n,5,7}]
但结果无用且不准确:
FindMaximum::fmmp:
Machine precision is insufficient to achieve the requested accuracy or
precision.
Out[119]= {98.9285, {n -> 5.17881}}
由于该函数非常波动,我们需要通过对绘图进行视觉分析来细化我们的区间,最终找到一个convolve[]不会过于波动的区间:
Plot[convolve[n],{n,6.2831,6.2833}, PlotRange->All]
FindMaximum是如何工作的:
FindMaximum[convolve[n],{n,6.2831,6.2833}] // FortranForm
List(1.984759605826571e7,List(Rule(n,6.2831853071787975)))
% 但是,这个过程很丑陋,需要人为干预,而且计算convolve[]非常慢。有没有更好的方法来解决这个问题?
% 查看数据的傅里叶级数,我能否推断出“真实”的周期数是6.38663?当然,实际结果应该是6.283185,因为我的数据更符合这个值(因为我只在有限数量的点上采样)。
ListCorrelate
来提高效率。 - Szabolcs