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.
All,
I have a task to acquire a block of ADC samples, process them, and display the rms result. I have successfully setup the processor on a nucleo STM32F401 development board, and can read ADC data plus compute the rms of that dataset.
My trouble occurs when I process the data using arm_biquad_cascade_df1_f32. The rms output is always "1.#INF". I have checked the initialization code, the arrays, etc. The processed data array is >400 samples long and generally becomes +- infinity after a couple hundred data points.
As indicated, the code functions correctly, including performing the same rms function on the sample array. So if I had a 2 V DC signal on the ADC pin, the rms would read approximately 2482 ( [2482/4095] * 3.3V = 2V).
I suspect my problem lies with either the coefficients (I don't believe the polarity on a1 or a2 need to be flipped, but I could be wrong), which were calculated using matlab ellip function,
www.mathworks.com/.../ellip.html
or in my attempt to convert ADC int32 data to float. I have read several forums, which I can list if desired, but I am still not successful. I have 2 arrays; the first is a reference to compare and the second is my original array.
applicable ADC code: float32_t temp_f = 0.0; temp_f = HAL_ADC_GetValue(&hadc1); ADC_samples_ref[BLOCKSIZE] = temp_f; ADC_samples_L[BLOCKSIZE] = ((temp_f-2048)/4095) * S1_Gain; //S1_Gain is the filter gain from matlab
applicable processing code: arm_biquad_casd_df1_inst_f32 S1; float32_t *S1_pState[4*NUMSTAGES]; const float32_t S1_coeffs[5*NUMSTAGES] = {numbers}; // I'm omiting these numbers in this thread arm_biquad_cascade_df1_init_f32(&S1, NUMSTAGES, (float32_t *) &S1_coeffs[0], *S1_pState);
arm_rms_f32(ADC_samples_ref, BLOCKSIZE, &ref_rms); // used only to troubleshoot and validate filters work
arm_biquad_cascade_df1_f32(&S1, (float32_t *) &ADC_samples_L[0], (float32_t *) &low_proc[0], BLOCKSIZE); arm_rms_f32((float32_t *) &low_proc[0], BLOCKSIZE, &low__rms);
I hope this is enough information for assistance; I'm trying to avoid posting large blocks of code. Please let me know if you see a problem, particularly with how I'm creating the floating array, which as I said is where I suspect I have a problem if not the matlab coefficients.