I have been trying to use the RFFT functions in the CMSIS DSP library which has been giving me some confusing outputs.
From the documentation:
Looking at the data, we see that we can uniquely represent the FFT using only N/2 complex numbers. These are packed into the output array in alternating real and imaginary components:
X = { real[0], imag[0], real[1], imag[1], real[2], imag[2] ... real[(N/2)-1], imag[(N/2)-1 }
I took this to mean that after running the rfft function on a sequence of N values, the function would output complex values only up to the N/2th value - ie we would only get the first half of the frequency domain output since the other half is just the complex conjugate of the other.
However, what I found was that the function seemingly outputs both halves.
My code is below:
float32_t H[1024]; // FIR filter coefficientsfloat32_t magnitude[512];
float32_t H[1024]; // FIR filter coefficients
float32_t magnitude[512];
arm_rfft_fast_instance_f32 rfftInstance;arm_rfft_fast_init_f32(&rfftInstance, 1024);
arm_rfft_fast_instance_f32 rfftInstance;
arm_rfft_fast_init_f32(&rfftInstance, 1024);
arm_rfft_fast_f32(&rfftInstance, H, H, 0);
arm_cmplx_mag_f32(H, magnitude, 512); // See image below for output
I am taking a 1024 point FFT on my filter coefficients, H. Given my assumption above, I would have expected only the first half of the spectrum.
Since the output has interlaced real/imag values, 512 complex values would require a 1024 element array.
When I take the magnitude of the output spectrum (see image), I get both halves which runs counter to my expectation. Moreover, given that I get both halves within a space of 512 points, it's almost as if I did a 512-point FFT instead of 1024.
I must be missing something here. Any help is appreciated.
Resultant magnitude spectrum. Array holding this data has 512 elements. Both halves of the spectrum are present.