Browse Source

Use only 32 bit float in arm_snr_f32()

teensy4-core
PaulStoffregen 8 years ago
parent
commit
1074e6433c
1 changed files with 38 additions and 46 deletions
  1. +38
    -46
      teensy3/math_helper.c

+ 38
- 46
teensy3/math_helper.c View File

/* ---------------------------------------------------------------------- /* ----------------------------------------------------------------------
* 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;
}
}
}
}
} }
/** /**

Loading…
Cancel
Save