Hello, I am working on an audio spectrum analyzer with
LPCXpresso54608 (Cortex-M4F).

I am working on a program to calculate the FFT spectrum of an input
signal.

All the functions from CMSIS library work fine but I don't understand
the length of the input and output vectors.

The ARM CMSIS official documentation is, in my opinion, a bit
confusing on this topic and I'd like to share my thoughts.

Here's an outline of my algorithm:

Start with a sample buffer of length N=1024 (Skip how the samples are acquired, let's just assume they are there)

float rx_buffer[1024];

Now this is a real signal, so calculate the FFT using
**arm_rfft_fast_f32()**:

float fft_out[1024]; arm_rfft_fast_instance_f32 fftInstance; arm_rfft_fast_init_f32(&fftInstance, 1024); arm_rfft_fast_f32(&fftInstance, rx_buffer, fft_out, 0);

From the official documentation
(www.keil.com/.../group__RealFFT.html),

I understand that arm_rfft_fast_f32() outputs an array of N=1024
floats: N/2 are the real parts and N/2 are imaginary parts
interleaved, in total N/2 complex pairs.

This is **only one half of the spectrum** since the other half is
symmetric. So the spectrum is not replicated.

Now, I want to calculate the magnitude of each complex number so I do:

float fft_magnitude[512]; arm_cmplx_mag_squared_f32(fft_out, fft_magnitude, 512);

With this, I get a spectrum of 512 points, **symmetric arround
the point 256**. So in total, I get 256 useful points. Is this the
expected behavior? I thought that arm_rfft_fast_f32() output already
only half of the spectrum, thus I should end up with 512 useful
points. Where am I wrong?

Cheers.