Fast Fourier Transform (FFT) (Part 4)
Part 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
Once the FFT algorithm is executed, we get complex values, made of imaginary values and real values. We need to apply some maths in order to convert them in magnitude values. This is quite simply done thanks to the following routine which converts the complex (so as to say rectangular) values into a polar value:
void PlainFFT::complexToMagnitude(double *vR, double *vI, uint8_t samples) { // vM is half the size of vR and vI for (uint8_t i = 0; i < samples; i++) { vR[i] = sqrt(sq(vR[i]) + sq(vI[i])); } }
Read this document about conversion (p 6)
Computing the phase information is quite easy, but I do not really care about it and it requires the arctangent() trigonometric which does not come standard in Arduino language. However if you need it, you will have to use the math library) and compute the pahse values using the following formula: phase[FFT(A)]=arctangent(|Imag[FFT(A)]| / |Real[FFT(A)]|).