source: S-port/trunk/Drivers/CMSIS/DSP/DSP_Lib_TestSuite/RefLibs/src/ComplexMathFunctions/cmplx_dot_prod.c@ 1

Last change on this file since 1 was 1, checked in by AlexLir, 2 years ago
File size: 1.5 KB
Line 
1#include "ref.h"
2
3void 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
26void 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
50void 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}
Note: See TracBrowser for help on using the repository browser.