14

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 までのパワー スペクトル密度棒グラフを作成することです。

4

3 に答える 3

9

出力データを次のように解釈する必要があると思います。

10952       Re[0] = sum of all inputs = DC component
 -152       Re[5] - see note about a[1] being special - there is no Im[0]
   80.052   Re[1]
  379.936   Im[1]
 -307.691   Re[2]
   12.734   Im[2]
 -224.052   Re[3]
  427.607   Im[3]
  -48.308   Re[4]
   81.472   Im[4]

したがって、大きさは次のとおりです。

spectrum[0] = 10952
spectrum[1] = sqrt(80.052^2 + 379.936^2) = 388.278
spectrum[2] = sqrt(-307.691^2 + 12.734^2) = 307.427
spectrum[3] = sqrt(-224.052^2 + 427.607^2) = 482.749
spectrum[4] = sqrt(-48.308^2 + 81.472^2) = 94.717

[現在、私からの回答が 2 つに分かれて申し訳ありません。新しい回答に取り組んでいる間に、関連する 2 つの質問がマージされたと思います]

于 2011-02-15T22:46:12.510 に答える
1

変換の各エントリは、サンプル内の周波数の (複素) マグニチュードを表します。

特定の周波数における電力密度は、その周波数における変換の複素振幅の大きさにすぎません。複素数の大きさはその成分から計算され、これを取得するのに問題はないはずです

各列は、0 (最初のエントリ) から始まり、2 Pi/T (T はサンプルの長さ) から最後のサンプル 2*Pi*N /T (N は数値) まで、増加する周波数の振幅を表します。サンプルの)

-Pi * N /T 周波数から Pi * N / T までの変換が返され、0 周波数成分が配列の中央にある他の規則があります。

お役に立てれば

于 2011-02-14T20:30:30.690 に答える
0

ビンkの大きさを取得するには、sqrt(re * re + im * im)を計算する必要があります。ここで、re、imは、ビンkのFFT出力の実数成分と虚数成分です。

特定のFFTre[k] = a[2*k]および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]))
于 2011-02-14T20:41:42.037 に答える