2017-03-01 33 views
2

我對任意長度的數組執行FFT。 該API可以列舉如下:JTransforms FFT:偶數和奇數之差

realForward

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] 

看完幾個已經回答了這個問題, ,我仍然無法定義循環來獲得幅度值m_k=sqrt(RE_k²+IM_k²)

什麼是index=1在每種情況下? (或者作者的意思是index=0)?

回答

2

a數組中的大部分返回值都很複雜,並以其固有的頻域順序返回。然而,有一些特殊的情況下,它們是:

  • 的爲0Hz頻率成分是純實數(奇數和偶數n
  • 奈奎斯特頻率分量這也是奇n純實。

筆者則選擇把所有正常的情況下,在指數2起,並保留一對值的a[0]a[1]來處理這些特殊情況。 a[0]是0Hz頻率分量。對於a[1]它有點棘手。它始終是最高頻率分量的一部分,但如果n是偶數或奇數,該如何處理。即使是n,那麼最後的頻率分量也是純粹的實數,因此可以直接存儲在a[1]中。對於奇數n,最後一個頻率分量不是純粹的實數,所以我們仍然需要一對數組元素來存儲結果。在這種情況下,由於對從索引2開始,並且該數組具有奇數大小,因此最後一對不適合,因此作者使用a[1]作爲缺失的元素。

也許最簡單的方法來看這是幾個例子。所以,這裏是一個偶數長度n=8例如:

Bin Complex result Comments 
=== ============== ============= 
0 (a[0],0)  Purely real 
1 (a[2],a[3]) 
2 (a[4],a[5]) 
3 (a[6],a[7]) 
4 (a[1],0)  Purely real 
5 (a[6],-a[7]) Symmetric with bin 3 
6 (a[4],-a[5]) Symmetric with bin 2 
7 (a[2],-a[3]) Symmetric with bin 1 

這裏是奇數長度n=7例如:

Bin Complex result Comments 
=== ============== ============= 
0 (a[0],0)  Purely real 
1 (a[2],a[3]) 
2 (a[4],a[5]) 
3 (a[6],a[1]) 
4 (a[6],-a[1]) Symmetric with bin 3 
5 (a[4],-a[5]) Symmetric with bin 2 
6 (a[2],-a[3]) Symmetric with bin 1 

最後相應的代碼計算幅值:

double[] m = new double[n/2 + 1]; 

boolean isOdd = ((n % 2) == 1); 
if (isOdd) { 
    // odd case 
    m[0] = abs(a[0]); 
    for (int i = 1; i < (n-1)/2; i++) { 
    m[i] = sqrt(a[2*i]*a[2*i] + a[2*i+1]*a[2*i+1]); 
    } 
    m[(n-1)/2] = sqrt(a[n-1]*a[n-1] + a[1]*a[1]); 
} else { 
    // even case 
    m[0] = abs(a[0]); 
    for (int i = 1; i < n/2; i++) { 
    m[i] = sqrt(a[2*i]*a[2*i] + a[2*i+1]*a[2*i+1]); 
    } 
    m[n/2] = abs(a[1]); 
} 
+0

謝謝您。那麼m的長度是n/2 + 1? 'abs(a [0])'意味着'| a [0] |'?我想知道,我獲得了很高的幅度值..從使用來自公共數學庫的FFT生成的FFT更大。 – Jan

+0

您的if條件不起作用。我依靠你的意見..但目前還不清楚..你能否編輯你的答案,以便清楚? – Jan

+0

這是正確的長度(假設奇數'n'通常截斷除法)。至於生成的幅度有多大,[normalization](http://commons.apache.org/proper/commons-math/javadocs/api-3.4/org/apache/commons/math3/transform/DftNormalization.html)你用commons-Math嗎? – SleuthEye