2012-10-29 31 views
3

我有,我想在一個ArrayList存儲的輸入信號ArrayList的 然後將其轉換成複雜的,這是這樣的 轉換情結的Java

-0.03480425839330703 
0.07910192950176387 
0.7233322451735928 
0.1659819820667019 

這個輸出其FFT這樣

0.9336118983487516 
-0.7581365035668999 + 0.08688005256493803i 
0.44344407521182005 
-0.7581365035668999 - 0.08688005256493803i 

這是一個複雜的結構,我想將它轉換成一個ArrayList類型。同時降低了+ 0.08688005256493803i的值。

所以我需要的是這些值

0.9336118983487516 
-0.7581365035668999 
0.44344407521182005 
-0.7581365035668999 

什麼是要對這個最好的方法?

這是我使用

public static Complex[] fft(Complex[] x) { 
     int N = x.length; 

     // base case 
     if (N == 1) return new Complex[] { x[0] }; 

     // radix 2 Cooley-Tukey FFT 
     if (N % 2 != 0) { throw new RuntimeException("N is not a power of 2"); } 

     // fft of even terms 
     Complex[] even = new Complex[N/2]; 
     for (int k = 0; k < N/2; k++) { 
      even[k] = x[2*k]; 
     } 
     Complex[] q = fft(even); 

     // fft of odd terms 
     Complex[] odd = even; // reuse the array 
     for (int k = 0; k < N/2; k++) { 
      odd[k] = x[2*k + 1]; 
     } 
     Complex[] r = fft(odd); 

     // combine 
     Complex[] y = new Complex[N]; 
     for (int k = 0; k < N/2; k++) { 
      double kth = -2 * k * Math.PI/N; 
      Complex wk = new Complex(Math.cos(kth), Math.sin(kth)); 
      y[k]  = q[k].plus(wk.times(r[k])); 
      y[k + N/2] = q[k].minus(wk.times(r[k])); 
     } 
     return y; 
    } 
+1

向我們顯示「複雜」數據類型的代碼 – mishadoff

+0

@mishadoff我也上傳了代碼 – Jonathan

+1

我問'複雜'類不是fft方法.. – mishadoff

回答

1

代碼所有你想要做的只是放下你Complex數據結構的虛部。

當你不告訴我們Complex類假設它具有真正的部分成員(如double real;) 要降虛部只需要調用類似complex.getRealPart(),或訪問complex.real(代替你的真實成員名稱)。

要撰寫ArrayList<Double>使用下面的代碼片段:

ArrayList<Double> list = new ArrayList<Double>(); 
for (Complex c : complexes) { // complexes your array of complexes returned from for fft 
    list.add(c.getRealpart()); 
} 

注:以防萬一,我可能是錯的,但我認爲不是真正的一部分,你需要的複數絕對值。要計算它使用:

Math.sqrt(c.getRealPart() * c.getRealPart() + c.getImPart() * c.getImPart()); 
0

從我的理解你只是想要的複雜價值的實際部分。如果是這種情況,大概你的Complex類也有getReal()和getImaginary()(或類似的)方法 - 所以只需使用getReal()。