私はいくつかの定期的なデータを持っていますが、データの量は、期間の の倍数ではありません。このデータをフーリエ解析するにはどうすればよいですか?例:Mathematicaを使って離散データを連続的にフーリエ変換する?
%のテストのためにいくつかのデータを作成してみましょう:
data = Table[N[753+919*Sin[x/623-125]], {x,1,25000}]
%私は今、このデータを受信し、それが上記 式から来たということは考えています。私はちょうど 'データ'から数式を再構築しようとしています。
%フーリエ級数の最初のいくつかの非定数項を見て:周期の数が実際 25000 /(623あるので
ListPlot[Table[Abs[Fourier[data]][[x]], {x,2,20}], PlotJoined->True,
PlotRange->All]
(6における予想スパイクを示します* 2 * Pi)または約6.38663、これはわかりませんが)。
%6.38663を返すにはどうしたらいいですか? 1つの方法は、データを の任意の倍数の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)))
%しかし、このプロセスは、醜い人間の介入を必要とし、 コンプconvolve []は本当に遅いです。これを行うより良い方法はありますか?
%データのフーリエ級数を見れば、どういうわけか 「真」のピリオドの数は6.38663です。もちろん、 の実際の結果は6.283185になります。なぜなら、私のデータはより良く適合するからです(私は有限の点で のサンプリングしかないので)。見積もりを取得するには、自己相関を使用して、期間の長さのため
素晴らしい!私は 'pos'(データを正規化し、最大のフーリエ係数[正規化のために定数項が0であることがわかる])の手順を実行しましたが、fr =行の魔法は何ですか?それは私が探していたものの要点であるようです。 – barrycarter
これはpdata * e^i(...)上でフーリエをやり直しています。フーリエ変換のプロパティを使って補正を計算します。/魔法を実行します。 – tsvikas