Jonathan
Jonathan

Reputation: 2738

Converting Complex to ArrayList<Float> in Java

I have an input signal that I want to store in an ArrayList then convert it into Complex, which goes something like this

-0.03480425839330703
0.07910192950176387
0.7233322451735928
0.1659819820667019

and this outputs its FFT like this

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

This is in a complex structure, I want to convert this into an ArrayList type. while dropping the + 0.08688005256493803i value.

So All I need are these values

0.9336118983487516
-0.7581365035668999
0.44344407521182005
-0.7581365035668999

What is the best way of going about this?

And this is the code that I am using

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;
    }

Upvotes: 3

Views: 613

Answers (2)

Dave Richardson
Dave Richardson

Reputation: 5005

From what I understand you just want the real part of the complex value. If that's the case, presumably your Complex class also has getReal() and getImaginary() (or similar) methods - so just use getReal().

Upvotes: 0

mishadoff
mishadoff

Reputation: 10789

All you want to do is just drop imaginary part of your Complex data structure.

As you not show us Complex class assume it has member for real part (e.g double real;) To drop imaginary part just call something like complex.getRealPart(), or access complex.real (substitute with your real member name).

To compose ArrayList<Double> use the following snippet:

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

Note: Just in case, I can be wrong, but I assume that instead of real part you need absolute value of complex number. To calculate it use:

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

Upvotes: 1

Related Questions