我有一些週期性數據,但數據量並不是 期間的倍數。我如何傅立葉分析這些數據?例如:使用Mathematica對離散數據進行連續傅立葉變換?
%讓我們創建一些數據來進行測試:
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}}
因爲功能十分左右搖擺。
%通過完善我們的時間間隔(使用情節可視化分析),我們 終於找到一個區間,其中卷積[]不扭動太多:
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)))
%。然而,這個過程是醜陋的,需要人工干預,並且 補償uting convolve []是非常慢的。有一個更好的方法嗎?
查看數據的傅立葉級數,我可以以某種方式神聖 「真」的期數是6.38663?當然,實際結果 應該是6.283185,因爲我的數據更合適(因爲我只有 採樣在有限的點上)。
太棒了!我遵循通過'pos'的步驟(規格化數據並找到最大的傅里葉係數[由歸一化引起的常數項爲0]),但fr =線有什麼魔力?這似乎是我正在尋找的關鍵。 – barrycarter 2010-12-22 17:14:17
它在pdata * e^i(...)上再做一次傅里葉變換,並使用傅立葉變換的屬性來計算修正/做魔術。 – tsvikas 2010-12-22 17:24:35