Subversion Repositories FuelGauge

Rev

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

  1. #include "ref.h"
  2.  
  3. void ref_cmplx_dot_prod_f32(
  4.   float32_t * pSrcA,
  5.   float32_t * pSrcB,
  6.   uint32_t numSamples,
  7.   float32_t * realResult,
  8.   float32_t * imagResult)
  9. {
  10.         float32_t sumr, sumi;
  11.         uint32_t i;
  12.        
  13.         sumr = 0;
  14.         sumi = 0;
  15.        
  16.         for(i=0;i<numSamples*2;i+=2)
  17.         {
  18.                 sumr += pSrcA[i] * pSrcB[i]   - pSrcA[i+1] * pSrcB[i+1];
  19.                 sumi += pSrcA[i] * pSrcB[i+1] + pSrcA[i+1] * pSrcB[i];
  20.         }
  21.        
  22.         *realResult = sumr;
  23.         *imagResult = sumi;
  24. }
  25.  
  26. void ref_cmplx_dot_prod_q31(
  27.   q31_t * pSrcA,
  28.   q31_t * pSrcB,
  29.   uint32_t numSamples,
  30.   q63_t * realResult,
  31.   q63_t * imagResult)
  32. {
  33.         q63_t sumr, sumi;
  34.         uint32_t i;
  35.        
  36.         sumr = 0;
  37.         sumi = 0;
  38.        
  39.         for(i=0;i<numSamples*2;i+=2)
  40.         {
  41.                 //shifting down 14 here to provide guard bits
  42.                 sumr += (((q63_t)pSrcA[i] * pSrcB[i]  ) >> 14) - (((q63_t)pSrcA[i+1] * pSrcB[i+1]) >> 14);
  43.                 sumi += (((q63_t)pSrcA[i] * pSrcB[i+1]) >> 14) + (((q63_t)pSrcA[i+1] * pSrcB[i]  ) >> 14);
  44.         }
  45.        
  46.         *realResult = sumr;
  47.         *imagResult = sumi;
  48. }
  49.  
  50. void ref_cmplx_dot_prod_q15(
  51.   q15_t * pSrcA,
  52.   q15_t * pSrcB,
  53.   uint32_t numSamples,
  54.   q31_t * realResult,
  55.   q31_t * imagResult)
  56. {
  57.         q63_t sumr, sumi;
  58.         uint32_t i;
  59.        
  60.         sumr = 0;
  61.         sumi = 0;
  62.        
  63.         for(i=0;i<numSamples*2;i+=2)
  64.         {
  65.                 sumr += (q31_t)pSrcA[i] * pSrcB[i]   - (q31_t)pSrcA[i+1] * pSrcB[i+1];
  66.                 sumi += (q31_t)pSrcA[i] * pSrcB[i+1] + (q31_t)pSrcA[i+1] * pSrcB[i];
  67.         }
  68.        
  69.         //shifting down 6 at the end here because there are already 32 guard bits available, this method is more accurate
  70.         *realResult = (q31_t)(sumr >> 6);
  71.         *imagResult = (q31_t)(sumi >> 6);
  72. }
  73.