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
00062 arm_status arm_mat_mult_q31(
00063 const arm_matrix_instance_q31 * pSrcA,
00064 const arm_matrix_instance_q31 * pSrcB,
00065 arm_matrix_instance_q31 * pDst)
00066 {
00067 q31_t *pIn1 = pSrcA->pData;
00068 q31_t *pIn2 = pSrcB->pData;
00069 q31_t *pInA = pSrcA->pData;
00070 q31_t *pOut = pDst->pData;
00071 q31_t *px;
00072 q63_t sum;
00073 uint16_t numRowsA = pSrcA->numRows;
00074 uint16_t numColsB = pSrcB->numCols;
00075 uint16_t numColsA = pSrcA->numCols;
00076 uint16_t col, i = 0u, j, row = numRowsA, colCnt;
00077 arm_status status;
00078 q31_t a0, a1, a2, a3, b0, b1, b2, b3;
00079
00080 #ifdef ARM_MATH_MATRIX_CHECK
00081
00082 if((pSrcA->numCols != pSrcB->numRows) ||
00083 (pSrcA->numRows != pDst->numRows) || (pSrcB->numCols != pDst->numCols))
00084 {
00085
00086 status = ARM_MATH_SIZE_MISMATCH;
00087 }
00088 else
00089 #endif
00090 {
00091
00092
00093 do
00094 {
00095
00096 px = pOut + i;
00097
00098
00099 col = numColsB;
00100
00101
00102
00103 pIn2 = pSrcB->pData;
00104
00105 j = 0u;
00106
00107
00108 do
00109 {
00110
00111 sum = 0;
00112
00113
00114 pIn1 = pInA;
00115
00116
00117 colCnt = numColsA >> 2;
00118
00119
00120
00121 while(colCnt > 0u)
00122 {
00123
00124
00125 b0 = *pIn2;
00126 pIn2 += numColsB;
00127
00128 a0 = *pIn1++;
00129 a1 = *pIn1++;
00130
00131 b1 = *pIn2;
00132 pIn2 += numColsB;
00133 b2 = *pIn2;
00134 pIn2 += numColsB;
00135
00136 sum += (q63_t) a0 * b0;
00137 sum += (q63_t) a1 * b1;
00138
00139 a2 = *pIn1++;
00140 a3 = *pIn1++;
00141
00142 b3 = *pIn2;
00143 pIn2 += numColsB;
00144
00145 sum += (q63_t) a2 * b2;
00146 sum += (q63_t) a3 * b3;
00147
00148
00149 colCnt--;
00150 }
00151
00152
00153
00154 colCnt = numColsA % 0x4u;
00155
00156 while(colCnt > 0u)
00157 {
00158
00159
00160 a0 = * pIn1++;
00161 sum += (q63_t) a0 * *pIn2;
00162 pIn2 += numColsB;
00163
00164
00165 colCnt--;
00166 }
00167
00168
00169 *px++ = (q31_t) (sum >> 31);
00170
00171
00172 j++;
00173 pIn2 = (pSrcB->pData) + j;
00174
00175
00176 col--;
00177
00178 } while(col > 0u);
00179
00180
00181 i = i + numColsB;
00182 pInA = pInA + numColsA;
00183
00184
00185 row--;
00186
00187 } while(row > 0u);
00188
00189
00190 status = ARM_MATH_SUCCESS;
00191 }
00192
00193 return (status);
00194 }
00195