Hi,
I'm starting to test/study the CMSIS lib in the Stellaris/Tiva. Using the paper "Using the CMSIS DSP Library in Code Composer Studio™ for TM4C MCUs", I got build the library and it works fine. The examples return the expected state.
Now I'm trying to use the cFFT in a signal. To the test I created a pure sine wave with amplitude of 1000 and 10 cycles in an array of 1024 samples, as in the image.
After the processing the indexer return the correct harmonic (10th), but I don't understand the result of the magnitude. The magnitude of the 10th hamonic is 727.98. How it relates to the amplitude of the harmonic? The RMS value, if yes, why the error?
This is the principal part of code:
#define N_points 1024 ... uint32_t ifftFlag = 1; uint32_t doBitReverse = 1; /* Process the data through the CFFT/CIFFT module */ arm_cfft_f32(&arm_cfft_sR_f32_len512, wave_float, ifftFlag, doBitReverse); /* Process the data through the Complex Magnitude Module for calculating the magnitude at each bin */ arm_cmplx_mag_f32(wave_float, wave_out, N_points/2); /* Calculates maxValue and returns corresponding BIN value */ arm_max_f32(wave_out, N_points/2, &maxValue, &testIndex);
I tried to scale the sine wave between 1 and -1, but the result was the same. Instead of 727 the magnitude of the harmonic was 0.727.
It's strange because for different numbers of cycles the result of respective "bin" change.
Maintaining the same buffer size (1024) I changed to just one cycle and the result was around 708, very close to the RMS value. See this little list:
1024 samples
01 cycle -> 708.8323
02 cycles -> 710.9644
04 cycles -> 715.2491
08 cycles -> 723.74
16 cycles -> 740.4352
I tried to change the buffer size to 64 samples to test. In this case the result of one cycle was around 740.
I'm reading about how to obtain the amplitude, but in this moment I'm lost!
Hi dwhite85 and goodwin, sorry for the delay.
I managed to solve my doubt.
I posted the same question in the e2e forum and the Matin's answer guided me to solve the problem. cFFT using CMSIS in the Tiva/Stellaris - TM4C Microcontrollers Forum - TM4C Microcontrollers - TI E2E Community.
In the function "arm_cfft_f32( )" the argument "&arm_cfft_sR_f32_len512" was correct, but the input of the function not. The size of array is 1024 because is complex (real, imag). In this case the true lenght is 512 points.
In the end I changed the cfft by the rfft because the input data are real.
To solve the problem was necessary to scale each bin based in the RMS value of the input wave. After understand this the code worked well. I have tested some waves with different length, THD, amplitude and number of cycles. Now works fine.
Hi agaelema,
I commend you if everything work smoothly now, I'll just give additional thoughts since this topic may still be useful for us in the future.
I asked for the numerical data of the input signal because of the following:
To avoid swamping your list of things to mind, I deferred to state any of these until you provide a detailed information about your input and output data, meanwhile I just assumed you know that you are using a Complex version of FFT. This is water under the bridge now.
Although you switched to Real FFT it may worth stating some concerns about the Complex FFT function since you may stumble upon it again.
If you have used 10 cycles in 1024 samples in your recent experiment, arm_cfft_sR_f32_len512 will work. The reason is that you are just actually giving only half of your samples (512) to FFT and the first half of your input data is the same as the second half, just as in your previous test.
You can try to prove what I am pointing out by trying just one cycle at 1024 samples and use arm_cfft_sR_f32_len512. The defect will become obvious when you work with it.
If you used 10 cycles in 1024 samples in your recent experiment, you will not get a faithful spectrum from your FFT until you do something about the spectral leakage that Daniel white mentioned in his reply to your original post.
Regards,
Goodwin
I opened the TI E2E Community link you provided, and these are my views about your discussion:
1 cycle at 1024 samples, 1 cycle at 64 samples
if we properly use the FFT Function we can get a faithful spectrum, that is, a spectrum that is free from harmonics, other form of aliasing, or forms of distortion (of course the amplitude is subjected to round-off errors but we don't have to get bothered by this for the moment).
Enjoy working with your Tiva/Stellaris.