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