We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
Problem Statement: Processing the array with sound samples through FFT on Cortex M0
I am using the ARM CMSIS DSP Library for the Cortex-M0, using following command
data_length = 256;
float32_t sample_data[data_length*2];
int16_t data_temp[] = {-163, -181, -206, -194, -167, -119, -46, 20, 84, 139, 195, 223, 221, 190, 135, 96, 32, -34, -95, -179, -205, -201, -174, -129, -70, -4, 60, 119, 169, 204, 222, 220, 196, 145, 88, 23, -42, -102, -171, -187, -203, -190, -147, -92, -29, 37, 108, 166, 197, 219, 221, 201, 162, 109, 14, -61, -117, -174, -192, -202, -192, -153, -101, -40, 25, 86, 140, 183, 211, 219, 208, 176, 127, 68, 4, -69, -124, -176, -192, -197, -159, -121, -62, 1, 63, 120, 167, 204, 216, 201, 152, 98, 37, -27, -86, -136, -183, -194, -195, -175, -137, -84, -23, 51, 108, 156, 192, 211, 212, 191, 153, 100, 39, -24, -83, -133, -184, -195, -193, -172, -132, -78, -17, 45, 102, 150, 187, 206, 208, 189, 152, 91, 31, -31, -89, -138, -186, -193, -194, -175, -136, -84, -24, 38, 95, 150, 185, 205, 191, 159, 111, 54, -8, -78, -129, -190, -197, -182, -149, -100, -41, 20, 88, 150, 190, 200, 187, 162, 118, 62, 1, -59, -113, -157, -194, -200, -206, -194, -167, -119, -46, 20, 84, 139, 195, 223, 221, 190, 135, 96, 32, -34, -95, -179, -205, -206, -194, -167, -119, -46, 20, 84, 139, 195, 223, 221, 190, 135, 96, 32, -34, -95, -179, -205, -206, -194, -167, -119, -46, 20, 84, 139, 195, 223, 221, 190, 135, 96, 32, -34, -95, -179, -205, -206, -194, -167, -119, -46, 20, 84, 139, 195, 223, 221, 190, 135, 96, 32, -34, -95, -179, -205, -206, -194, -167, -192 };
// Assign the value here
// odd samples are complex values, set each to zero
for (z = 0; z < data_length; z++) {
sample_data[z*2] = data_temp[z];
sample_data[z*2+1] = 0.0;
}
// Actual FFT processing with ARM optimized library function
// FFT is done in-place, sample_data will contain the results
arm_cfft_f32(&arm_cfft_sR_f32_len256, sample_data, 0, 1); // no inverse, do bit reverse
However, when I try to execute it on the microcontroller the arm_cfft_f32 function calls
arm_cfft_radix8by4_f32 ( (arm_cfft_instance_f32 *) S, p1);
where S is arm_cfft_sR_f32_len256, and p1 is sample_data,
however, it got hanged in the function, and does not give back results.
I am currently using LPC114/333 MCU Settings.
Need your advise, specially if you have an experience of running this FFT library on Cortex-M0, Thank you
Hi ihaabi,
Have you tried single stepping through the function? Where does it hang?
Hello ihaabi,
I can not confirm your statement.I used CMSIS V3.20 (which contains CMSIS-DSP Verison 1.4.1) to reproduce your test.
Function arm_cfft_f32 finished without problems.
Below is the code I used.
#include "arm_math.h" #include "arm_const_structs.h" #define TEST_LENGTH_SAMPLES 512 float32_t sample_data_f32[TEST_LENGTH_SAMPLES]; int16_t data_temp[] = { -163, -181, -206, -194, -167, -119, -46, 20, 84, 139, 195, 223, 221, 190, 135, 96, 32, -34, -95, -179, -205, -201, -174, -129, -70, -4, 60, 119, 169, 204, 222, 220, 196, 145, 88, 23, -42, -102, -171, -187, -203, -190, -147, -92, -29, 37, 108, 166, 197, 219, 221, 201, 162, 109, 14, -61, -117, -174, -192, -202, -192, -153, -101, -40, 25, 86, 140, 183, 211, 219, 208, 176, 127, 68, 4, -69, -124, -176, -192, -197, -159, -121, -62, 1, 63, 120, 167, 204, 216, 201, 152, 98, 37, -27, -86, -136, -183, -194, -195, -175, -137, -84, -23, 51, 108, 156, 192, 211, 212, 191, 153, 100, 39, -24, -83, -133, -184, -195, -193, -172, -132, -78, -17, 45, 102, 150, 187, 206, 208, 189, 152, 91, 31, -31, -89, -138, -186, -193, -194, -175, -136, -84, -24, 38, 95, 150, 185, 205, 191, 159, 111, 54, -8, -78, -129, -190, -197, -182, -149, -100, -41, 20, 88, 150, 190, 200, 187, 162, 118, 62, 1, -59, -113, -157, -194, -200, -206, -194, -167, -119, -46, 20, 84, 139, 195, 223, 221, 190, 135, 96, 32, -34, -95, -179, -205, -206, -194, -167, -119, -46, 20, 84, 139, 195, 223, 221, 190, 135, 96, 32, -34, -95, -179, -205, -206, -194, -167, -119, -46, 20, 84, 139, 195, 223, 221, 190, 135, 96, 32, -34, -95, -179, -205, -206, -194, -167, -119, -46, 20, 84, 139, 195, 223, 221, 190, 135, 96, 32, -34, -95, -179, -205, -206, -194, -167, -192 }; int32_t main(void) { uint32_t z; // odd samples are complex values, set each to zero for (z = 0; z < (TEST_LENGTH_SAMPLES/2); z++) { sample_data_f32[z*2 ] = data_temp[z]; sample_data_f32[z*2+1] = 0.0; } // FFT is done in-place, sample_data_f32 will contain the results arm_cfft_f32(&arm_cfft_sR_f32_len256, sample_data_f32, 0, 1); // no inverse, do bit reverse while(1); /* main function does not return */ }
Be sure to set define 'ARM_MATH_CM0' for use of Cortex-M0 DSP lib code.
Best Regards, Martin
Hi Ihaabi
Did you find the solution for this issue? I also tried implementing this function in Cortex-M4 and I am the same issue. The program is hanging in arm_cfft_f32() I am giving floating values i/p according to the arm_fft_bin_example_f32 present in the CMSIS library. My function worked if i didn't do bit reversal. while debugging I found out that it was getting hanged in bitreversalpart. I don't know if the issue was from ARM but I used their library and there functions. SO my recommendation to you is check if it works without bitreversal. If It works for you also then I think there is an issue with the function in the library.
arm_cfft_f32(&arm_cfft_sR_f32_len256, sample_data, 0, 0); // no inverse, no bit reverse
Just check if it works this way
One more corrections which I think should be done to your sample data is that since this function supports float32_t values so it is recommended to store the real sample data in this format.
i.e float32_t data_temp[] = {-163.0, -181.0, -206.0, .... and so on }
Kind Regards
Amit Kumar
Hello,Thanks for your suggestions it helped me.In my case i was using cortex m0 MCU. I just changed the variable types to float instead of float32_t.
float data_temp[] = {-163.0, -181.0, -206.0, .... and so on }
And do bit reverse same as others.