2011-02-15 131 views
10

我正在使用Jtransforms java庫對給定數據集執行分析。jTransforms的功率譜密度DoubleFFT_1D

的數據的例子如下:

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結果存放一個。輸出數據 的物理佈局是如下:

如果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。

參數: - :(因爲我的數據陣列的長度爲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是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的功率譜密度條形圖

+0

這不是從昨天你的問題的重複:http://stackoverflow.com/questions/4996747/interpreting-jtransform-fft-results? – 2011-02-15 22:32:36

回答

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 

[對不起那裏是來自我的兩個不同的答案 - 我認爲兩個相關的問題在我正在處理新答案時合併]

1

變換中的每個條目都表示樣本中頻率的(複數)幅度。

給定頻率的功率密度只是該頻率變換的複數幅度的大小。複數的大小是從它的分量計算出來的,你不應該有一個問題來獲得這個數據。每一列代表增加頻率的幅度,從0(第一項)開始,然後是2 Pi/T(其中T是您的樣本的長度),直到最後一個樣本2 * Pi * N/T(其中N是樣本數量)

還有其他約定,其中將變換返回-Pi * N/T頻率上到PI * N/T,和0的頻率分量是在該陣列的中間

希望這有助於

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])) 
+0

感謝您的幫助。這是迄今爲止最好的信息。我用你的光譜方程來計算下列數據集的值:
1068,1116,1140,1144,1160,1136,1100,1080,1200,1212,1092,952,1060,1068 – Damon 2011-02-15 00:19:16

+1

@Damon,如果這個幫助你,請點擊右邊的答案,使複選標記變爲綠色 – lurscher 2011-02-15 16:06:36