Subversion Repositories canSerial

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. #include "ref.h"
  2.  
  3. void ref_std_f32(
  4.   float32_t * pSrc,
  5.   uint32_t blockSize,
  6.   float32_t * pResult)
  7. {
  8.         uint32_t i;
  9.         float32_t sum=0, sumsq=0;
  10.        
  11.         if (blockSize == 1)
  12.         {
  13.                 *pResult = 0;
  14.                 return;
  15.         }
  16.        
  17.         for(i=0;i<blockSize;i++)
  18.         {
  19.                         sum += pSrc[i];
  20.                         sumsq += pSrc[i] * pSrc[i];
  21.         }
  22.         *pResult = sqrtf((sumsq - sum * sum / (float32_t)blockSize) / ((float32_t)blockSize - 1));
  23. }
  24.  
  25. void ref_std_q31(
  26.   q31_t * pSrc,
  27.   uint32_t blockSize,
  28.   q31_t * pResult)
  29. {
  30.         uint32_t i;
  31.         q63_t sum=0, sumsq=0;
  32.         q31_t in;
  33.        
  34.         if (blockSize == 1)
  35.         {
  36.                 *pResult = 0;
  37.                 return;
  38.         }
  39.        
  40.         for(i=0;i<blockSize;i++)
  41.         {
  42.                         in = pSrc[i] >> 8;
  43.                         sum += in;
  44.                         sumsq += (q63_t)in * in;
  45.         }
  46.         sumsq /= (q63_t)(blockSize - 1);
  47.         sum = sum * sum / (q63_t)(blockSize * (blockSize - 1));
  48.         *pResult = (q31_t)(sqrtf((float)( (sumsq - sum) >> 15) / 2147483648.0f ) * 2147483648.0f);
  49. }
  50.  
  51. void ref_std_q15(
  52.   q15_t * pSrc,
  53.   uint32_t blockSize,
  54.   q15_t * pResult)
  55. {
  56.         uint32_t i;
  57.         q31_t sum=0;
  58.         q63_t sumsq=0;
  59.        
  60.         if (blockSize == 1)
  61.         {
  62.                 *pResult = 0;
  63.                 return;
  64.         }
  65.        
  66.         for(i=0;i<blockSize;i++)
  67.         {
  68.                         sum += pSrc[i];
  69.                         sumsq += (q63_t)pSrc[i] * pSrc[i];
  70.         }
  71.         sumsq /= (q63_t)(blockSize - 1);
  72.         sum = (q31_t)((q63_t)sum * sum / (q63_t)(blockSize * (blockSize - 1)));
  73.         *pResult = (q15_t)(sqrtf((float)ref_sat_q15( (sumsq - sum) >> 15) / 32768.0f ) * 32768.0f);
  74. }
  75.