Details | Last modification | View Log | RSS feed
| Rev | Author | Line No. | Line |
|---|---|---|---|
| 2 | mjames | 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 | } |