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
00025 #include "arm_math.h"
00026
00060 arm_status arm_mat_cmplx_mult_q31(
00061 const arm_matrix_instance_q31 * pSrcA,
00062 const arm_matrix_instance_q31 * pSrcB,
00063 arm_matrix_instance_q31 * pDst)
00064 {
00065 q31_t *pIn1 = pSrcA->pData;
00066 q31_t *pIn2 = pSrcB->pData;
00067 q31_t *pInA = pSrcA->pData;
00068 q31_t *pOut = pDst->pData;
00069 q31_t *px;
00070 uint16_t numRowsA = pSrcA->numRows;
00071 uint16_t numColsB = pSrcB->numCols;
00072 uint16_t numColsA = pSrcA->numCols;
00073 q63_t sumReal1, sumImag1;
00074 q31_t a0, b0, c0, d0;
00075 q31_t a1, b1, c1, d1;
00076
00077
00078
00079
00080 uint16_t col, i = 0u, j, row = numRowsA, colCnt;
00081 arm_status status;
00082
00083 #ifdef ARM_MATH_MATRIX_CHECK
00084
00085
00086
00087 if((pSrcA->numCols != pSrcB->numRows) ||
00088 (pSrcA->numRows != pDst->numRows) || (pSrcB->numCols != pDst->numCols))
00089 {
00090
00091
00092 status = ARM_MATH_SIZE_MISMATCH;
00093 }
00094 else
00095 #endif
00096
00097 {
00098
00099
00100 do
00101 {
00102
00103 px = pOut + 2 * i;
00104
00105
00106 col = numColsB;
00107
00108
00109
00110 pIn2 = pSrcB->pData;
00111
00112 j = 0u;
00113
00114
00115 do
00116 {
00117
00118 sumReal1 = 0.0;
00119 sumImag1 = 0.0;
00120
00121
00122 pIn1 = pInA;
00123
00124
00125 colCnt = numColsA >> 2;
00126
00127
00128 while(colCnt > 0u)
00129 {
00130
00131
00132 a0 = *pIn1;
00133
00134
00135 c0 = *pIn2;
00136
00137
00138 b0 = *(pIn1 + 1u);
00139
00140
00141 d0 = *(pIn2 + 1u);
00142
00143
00144 sumReal1 += (q63_t)a0 * c0;
00145 sumImag1 += (q63_t)b0 * c0;
00146
00147
00148 pIn1 += 2u;
00149 pIn2 += 2* numColsB;
00150
00151
00152 sumReal1 -= (q63_t)b0 * d0;
00153 sumImag1 += (q63_t)a0 * d0;
00154
00155
00156
00157
00158 a1 = *pIn1;
00159 c1 = *pIn2;
00160 b1 = *(pIn1 + 1u);
00161 d1 = *(pIn2 + 1u);
00162
00163
00164 sumReal1 += (q63_t)a1 * c1;
00165 sumImag1 += (q63_t)b1 * c1;
00166
00167
00168 pIn1 += 2u;
00169 pIn2 += 2* numColsB;
00170
00171
00172 sumReal1 -= (q63_t)b1 * d1;
00173 sumImag1 += (q63_t) a1 * d1;
00174
00175 a0 = *pIn1;
00176 c0 = *pIn2;
00177
00178 b0 = *(pIn1 + 1u);
00179 d0 = *(pIn2 + 1u);
00180
00181
00182 sumReal1 += (q63_t)a0 * c0;
00183 sumImag1 += (q63_t)b0 * c0;
00184
00185
00186 pIn1 += 2u;
00187 pIn2 += 2* numColsB;
00188
00189
00190 sumReal1 -= (q63_t)b0 * d0;
00191 sumImag1 += (q63_t)a0 * d0;
00192
00193
00194
00195 a1 = *pIn1;
00196 c1 = *pIn2;
00197
00198 b1 = *(pIn1 + 1u);
00199 d1 = *(pIn2 + 1u);
00200
00201
00202 sumReal1 += (q63_t)a1 * c1;
00203 sumImag1 += (q63_t)b1 * c1;
00204
00205
00206 pIn1 += 2u;
00207 pIn2 += 2* numColsB;
00208
00209
00210 sumReal1 -= (q63_t)b1 * d1;
00211 sumImag1 += (q63_t)a1 * d1;
00212
00213
00214 colCnt--;
00215 }
00216
00217
00218
00219 colCnt = numColsA % 0x4u;
00220
00221 while(colCnt > 0u)
00222 {
00223
00224 a1 = *pIn1;
00225 c1 = *pIn2;
00226
00227 b1 = *(pIn1 + 1u);
00228 d1 = *(pIn2 + 1u);
00229
00230
00231 sumReal1 += (q63_t)a1 * c1;
00232 sumImag1 += (q63_t)b1 * c1;
00233
00234
00235 pIn1 += 2u;
00236 pIn2 += 2* numColsB;
00237
00238
00239 sumReal1 -= (q63_t)b1 * d1;
00240 sumImag1 += (q63_t)a1 * d1;
00241
00242
00243 colCnt--;
00244 }
00245
00246
00247 #ifdef CCS
00248 *px++ = (q31_t)__SSATA((sumReal1 >> 31), 0, 31);
00249 *px++ = (q31_t)__SSATA((sumImag1 >> 31), 0, 31);
00250 #else
00251 *px++ = (q31_t)__SSAT((sumReal1 >> 31), 31);
00252 *px++ = (q31_t)__SSAT((sumImag1 >> 31), 31);
00253 #endif
00254
00255 j++;
00256 pIn2 = pSrcB->pData + 2u * j;
00257
00258
00259 col--;
00260
00261 } while(col > 0u);
00262
00263
00264 i = i + numColsB;
00265 pInA = pInA + 2 * numColsA;
00266
00267
00268 row--;
00269
00270 } while(row > 0u);
00271
00272
00273 status = ARM_MATH_SUCCESS;
00274 }
00275
00276
00277 return (status);
00278 }
00279