3

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;
    }
3
  • 1
    Show us code for Complex data type Commented Oct 29, 2012 at 16:05
  • @mishadoff I uploaded the code as well Commented Oct 29, 2012 at 16:08
  • 1
    I asked about Complex class not fft method.. Commented Oct 29, 2012 at 16:16

2 Answers 2

1

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());
Sign up to request clarification or add additional context in comments.

Comments

0

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().

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.