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]);
}
謝謝您。那麼m的長度是n/2 + 1? 'abs(a [0])'意味着'| a [0] |'?我想知道,我獲得了很高的幅度值..從使用來自公共數學庫的FFT生成的FFT更大。 – Jan
您的if條件不起作用。我依靠你的意見..但目前還不清楚..你能否編輯你的答案,以便清楚? – Jan
這是正確的長度(假設奇數'n'通常截斷除法)。至於生成的幅度有多大,[normalization](http://commons.apache.org/proper/commons-math/javadocs/api-3.4/org/apache/commons/math3/transform/DftNormalization.html)你用commons-Math嗎? – SleuthEye