Jtransforms Java ライブラリを使用して、特定のデータセットの分析を実行しています。
データの例は次のとおりです。
980,988,1160,1080,928,1068,1156,1152,1176,1264
jTransforms で DoubleFFT_1D 関数を使用しています。データ出力は次のとおりです。
10952, -152, 80.052, 379.936, -307.691, 12.734, -224.052, 427.607, -48.308, 81.472
出力の解釈に問題があります。出力配列の最初の要素が 10 個の入力の合計 (10952) であることは理解しています。これは
私が理解していない出力配列の他の要素。最終的には、入力データのパワー スペクトル密度をグラフにプロットし、0 ~ 0.5 Hz の量を見つけたいと考えています。
jTransform 関数のドキュメントには次のように記載されています (a はデータ セットです)。
public void realForward(double[] a)
実データの 1D 順方向 DFT を計算し、結果を a に残します。出力データの物理レイアウトは次のとおりです。n が偶数の場合
a[2*k] = Re[k], 0 <= k < n / 2 a[2*k+1] = Im[k], 0 < k < n / 2 a[1] = Re[n/2]
n が奇数の場合
a[2*k] = Re[k], 0 <= k < (n+1)/2 a[2*k+1] = Im[k], 0 < k< (n-1)/2 a[1] = Im[(n-1)/2]
このメソッドは、実際の変換の要素の半分だけを計算します。残りの半分は対称条件を満たしています。完全な実数順変換が必要な場合は、realForwardFull を使用します。元のデータを取得するには、このメソッドの出力で realInverse を使用します。
パラメータ: a - 変換するデータ
上記の方法を使用する場合: (データ配列の長さが 10 であるため、「n は偶数」の方法が使用されます)
Re[0] = 10952
Re[1] = 80.052
Re[2] = -307.691
Re[3] = -224.052
Re[4] = -48.308
Re[5] = 12.734
Im[0] = -152
Im[1] = 379.936
Im[2] = 12.734
Im[3] = 427.607
Im[4] = 81.472
いくつか質問があります: この出力は正しいですか? Re[0] は、元の配列のすべての要素の合計である 10952 であってはならないように思えます。
出力を少し修正する必要があるようです: (私は間違っていますか?)
Re[0] = 80.052
Re[1] = -307.691
Re[2] = -224.052
Re[3] = -48.308
Re[4] = -152
Im[0] = 379.936
Im[1] = 12.734
Im[2] = 427.607
Im[3] = 81.472
フォーラムに投稿された次の方法を使用します。
ビン k の大きさを取得するには、 を計算する必要がありますsqrt(re * re + im * im)
。ここで、re、im は、ビン k の FFT 出力の実数成分と虚数成分です。
あなたの特定の FFT についてre[k] = a[2*k] and im[k] = a[2*k+1]
。したがって、パワー スペクトルを計算するには、次のようにします。
for k in 0 to N/2 - 1
{
spectrum[k] = sqrt(sqr(a[2*k]) + sqr(a[2*k+1]))
}
したがって:
spectrum[0] = 388.278
spectrum[1] = 307.955
spectrum[2] = 482.75
spectrum[3] = 94.717
いくつかの質問。このデータは正しいように見えますか? 私は正しい軌道に乗っていますか?このスペクトル データを次のようにプロットします。
388.278 at .125 Hz
307.955 at .25 Hz
482.75 at .375 Hz
94.717 at .5 Hz
私は道を外れていますか?私の目標は、0 から 0.5Hz までのパワー スペクトル密度棒グラフを作成することです。