Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "arm_math.h"
00025
00050 void arm_cmplx_mult_cmplx_q31(
00051 q31_t * pSrcA,
00052 q31_t * pSrcB,
00053 q31_t * pDst,
00054 uint32_t numSamples)
00055 {
00056 q31_t a1, b1, c1, d1;
00057 q31_t a2, b2, c2, d2;
00058 q31_t out1, out2;
00059 q31_t mul1, mul2, mul3, mul4;
00060 uint32_t blkCnt;
00061
00062
00063 blkCnt = numSamples >> 2u;
00064
00065
00066
00067 while(blkCnt > 0u)
00068 {
00069
00070
00071 a1 = pSrcA[0];
00072 b1 = pSrcA[1];
00073 c1 = pSrcB[0];
00074 d1 = pSrcB[1];
00075
00076 mul1 = (q31_t)(((q63_t)a1 * c1) >> 32);
00077 mul2 = (q31_t)(((q63_t)b1 * d1) >> 32);
00078 mul3 = (q31_t)(((q63_t)a1 * d1) >> 32);
00079 mul4 = (q31_t)(((q63_t)b1 * c1) >> 32);
00080
00081 a2 = pSrcA[2];
00082 b2 = pSrcA[3];
00083 c2 = pSrcB[2];
00084 a1 = (mul1 >> 1);
00085 d2 = pSrcB[3];
00086
00087 b1 = (mul2 >> 1);
00088 c1 = (mul3 >> 1);
00089 d1 = (mul4 >> 1);
00090
00091 mul1 = (q31_t)(((q63_t)a2 * c2) >> 32);
00092 mul2 = (q31_t)(((q63_t)b2 * d2) >> 32);
00093 mul3 = (q31_t)(((q63_t)a2 * d2) >> 32);
00094 mul4 = (q31_t)(((q63_t)b2 * c2) >> 32);
00095
00096 out1 = a1 - b1;
00097 a1 = pSrcA[4];
00098 out2 = c1 + d1;
00099 b1 = pSrcA[5];
00100 c1 = pSrcB[4];
00101 d1 = pSrcB[5];
00102
00103 pDst[0] = out1;
00104
00105 a2 = (mul1 >> 1);
00106 pDst[1] = out2;
00107 b2 = (mul2 >> 1);
00108 c2 = (mul3 >> 1);
00109 d2 = (mul4 >> 1);
00110
00111 out1 = a2 - b2;
00112 a2 = pSrcA[6];
00113 out2 = c2 + d2;
00114
00115 mul1 = (q31_t)(((q63_t)a1 * c1) >> 32);
00116 mul2 = (q31_t)(((q63_t)b1 * d1) >> 32);
00117 mul3 = (q31_t)(((q63_t)a1 * d1) >> 32);
00118 mul4 = (q31_t)(((q63_t)b1 * c1) >> 32);
00119
00120 b2 = pSrcA[7];
00121 c2 = pSrcB[6];
00122 d2 = pSrcB[7];
00123
00124 pDst[2] = out1;
00125 a1 = (mul1 >> 1);
00126 pDst[3] = out2;
00127 b1 = (mul2 >> 1);
00128 c1 = (mul3 >> 1);
00129 d1 = (mul4 >> 1);
00130
00131 out1 = a1 - b1;
00132 out2 = c1 + d1;
00133
00134 mul1 = (q31_t)(((q63_t)a2 * c2) >> 32);
00135 mul2 = (q31_t)(((q63_t)b2 * d2) >> 32);
00136 mul3 = (q31_t)(((q63_t)a2 * d2) >> 32);
00137 mul4 = (q31_t)(((q63_t)b2 * c2) >> 32);
00138
00139 pDst[4] = out1;
00140 pSrcA += 8u;
00141 pDst[5] = out2;
00142 pSrcB += 8u;
00143
00144 a2 = (mul1 >> 1);
00145 b2 = (mul2 >> 1);
00146 c2 = (mul3 >> 1);
00147 d2 = (mul4 >> 1);
00148
00149 out1 = a2 - b2;
00150 out2 = c2 + d2;
00151
00152 pDst[6] = out1;
00153 pDst[7] = out2;
00154
00155 pDst += 8u;
00156
00157
00158 blkCnt--;
00159 }
00160
00161
00162
00163 blkCnt = numSamples % 0x4u;
00164
00165 while(blkCnt > 0u)
00166 {
00167
00168
00169 a1 = *pSrcA++;
00170 b1 = *pSrcA++;
00171 c1 = *pSrcB++;
00172 d1 = *pSrcB++;
00173
00174
00175 *pDst++ = (q31_t) ((((q63_t) a1 * c1) >> 33) - (((q63_t) b1 * d1) >> 33));
00176
00177 *pDst++ = (q31_t) ((((q63_t) a1 * d1) >> 33) + (((q63_t) b1 * c1) >> 33));
00178
00179
00180 blkCnt--;
00181 }
00182 }
00183