質問

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ヘルツ

JTransform関数のドキュメントには、(aはデータセット)が記載されています。:

public void realForward(double[] a) realの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 is even"メソッドが使用されます)

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

今、フォーラムに投稿された次の方法を使用して:

Bin kの大きさを取得するには、計算する必要があります sqrt(re * re + im * im), ここで、re、imはbin 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

役に立ちましたか?

解決

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

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つの関連する質問がマージされたと思い

他のヒント

変換の各エントリは、サンプル内の周波数の(複素)大きさを表します。

与えられた周波数における電力密度は、その周波数における変換の複素振幅の大きさにすぎません。複素数の大きさはその成分から計算されるので、これを得るのに問題はありません

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

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

これが役立つことを願っています

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

あなたの特定のFFTのために re[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]))
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top