| /* ---------------------------------------------------------------------- | /* ---------------------------------------------------------------------- | ||||
| * Include standard header files | * Include standard header files | ||||
| * -------------------------------------------------------------------- */ | * -------------------------------------------------------------------- */ | ||||
| #include<math.h> | |||||
| #include <math.h> | |||||
| /* ---------------------------------------------------------------------- | /* ---------------------------------------------------------------------- | ||||
| * Include project header files | * Include project header files | ||||
| float arm_snr_f32(float *pRef, float *pTest, uint32_t buffSize) | float arm_snr_f32(float *pRef, float *pTest, uint32_t buffSize) | ||||
| { | { | ||||
| float EnergySignal = 0.0, EnergyError = 0.0; | |||||
| uint32_t i; | |||||
| float SNR; | |||||
| int temp; | |||||
| int *test; | |||||
| for (i = 0; i < buffSize; i++) | |||||
| { | |||||
| /* Checking for a NAN value in pRef array */ | |||||
| test = (int *)(&pRef[i]); | |||||
| temp = *test; | |||||
| if(temp == 0x7FC00000) | |||||
| { | |||||
| return(0); | |||||
| } | |||||
| /* Checking for a NAN value in pTest array */ | |||||
| test = (int *)(&pTest[i]); | |||||
| temp = *test; | |||||
| if(temp == 0x7FC00000) | |||||
| { | |||||
| return(0); | |||||
| } | |||||
| EnergySignal += pRef[i] * pRef[i]; | |||||
| EnergyError += (pRef[i] - pTest[i]) * (pRef[i] - pTest[i]); | |||||
| } | |||||
| float EnergySignal = 0.0; | |||||
| float EnergyError = 0.0; | |||||
| uint32_t i; | |||||
| float SNR; | |||||
| int temp; | |||||
| int *test; | |||||
| for (i = 0; i < buffSize; i++) { | |||||
| /* Checking for a NAN value in pRef array */ | |||||
| test = (int *)(&pRef[i]); | |||||
| temp = *test; | |||||
| if (temp == 0x7FC00000) { | |||||
| return(0); | |||||
| } | |||||
| /* Checking for a NAN value in pTest array */ | |||||
| test = (int *)(&pTest[i]); | |||||
| temp = *test; | |||||
| if (temp == 0x7FC00000) { | |||||
| return(0); | |||||
| } | |||||
| EnergySignal += pRef[i] * pRef[i]; | |||||
| EnergyError += (pRef[i] - pTest[i]) * (pRef[i] - pTest[i]); | |||||
| } | |||||
| /* Checking for a NAN value in EnergyError */ | /* Checking for a NAN value in EnergyError */ | ||||
| test = (int *)(&EnergyError); | test = (int *)(&EnergyError); | ||||
| temp = *test; | |||||
| temp = *test; | |||||
| if(temp == 0x7FC00000) | |||||
| { | |||||
| return(0); | |||||
| } | |||||
| SNR = 10 * log10 (EnergySignal / EnergyError); | |||||
| return (SNR); | |||||
| if(temp == 0x7FC00000) { | |||||
| return(0); | |||||
| } | |||||
| SNR = 10 * log10f(EnergySignal / EnergyError); | |||||
| return (SNR); | |||||
| } | } | ||||
| { | { | ||||
| uint32_t i; | uint32_t i; | ||||
| for (i = 0; i < numSamples; i++) | |||||
| { | |||||
| /* 1048576.0f corresponds to pow(2, 20) */ | |||||
| for (i = 0; i < numSamples; i++) { | |||||
| /* 1048576.0f corresponds to pow(2, 20) */ | |||||
| pOut[i] = (q31_t) (pIn[i] * 1048576.0f); | pOut[i] = (q31_t) (pIn[i] * 1048576.0f); | ||||
| pOut[i] += pIn[i] > 0 ? 0.5 : -0.5; | pOut[i] += pIn[i] > 0 ? 0.5 : -0.5; | ||||
| if (pIn[i] == (float) 1.0) | |||||
| { | |||||
| if (pIn[i] == (float) 1.0) { | |||||
| pOut[i] = 0x000FFFFF; | pOut[i] = 0x000FFFFF; | ||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| } | } | ||||
| /** | /** |