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