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
00026
00027
00028
00029
00030
00031
00032
00033 #include "arm_math.h"
00069 void arm_lms_q31(
00070 const arm_lms_instance_q31 * S,
00071 q31_t * pSrc,
00072 q31_t * pRef,
00073 q31_t * pOut,
00074 q31_t * pErr,
00075 uint32_t blockSize)
00076 {
00077 q31_t *pState = S->pState;
00078 uint32_t numTaps = S->numTaps;
00079 q31_t *pCoeffs = S->pCoeffs;
00080 q31_t *pStateCurnt;
00081 q31_t mu = S->mu;
00082 q31_t *px;
00083 q31_t *pb;
00084 uint32_t tapCnt, blkCnt;
00085 q63_t acc;
00086 q31_t e = 0;
00087 q31_t alpha;
00088 uint8_t shift = (uint8_t) (32u - (S->postShift + 1u));
00089 q31_t coef;
00090
00091
00092
00093 pStateCurnt = &(S->pState[(numTaps - 1u)]);
00094
00095
00096 blkCnt = blockSize;
00097
00098
00099 #ifndef ARM_MATH_CM0
00100
00101
00102
00103 while(blkCnt > 0u)
00104 {
00105
00106 *pStateCurnt++ = *pSrc++;
00107
00108
00109 px = pState;
00110
00111
00112 pb = pCoeffs;
00113
00114
00115 acc = 0;
00116
00117
00118 tapCnt = numTaps >> 2;
00119
00120 while(tapCnt > 0u)
00121 {
00122
00123
00124 acc += ((q63_t) (*px++)) * (*pb++);
00125
00126
00127 acc += ((q63_t) (*px++)) * (*pb++);
00128
00129
00130 acc += ((q63_t) (*px++)) * (*pb++);
00131
00132
00133 acc += ((q63_t) (*px++)) * (*pb++);
00134
00135
00136 tapCnt--;
00137 }
00138
00139
00140 tapCnt = numTaps % 0x4u;
00141
00142 while(tapCnt > 0u)
00143 {
00144
00145 acc += ((q63_t) (*px++)) * (*pb++);
00146
00147
00148 tapCnt--;
00149 }
00150
00151
00152
00153 acc = (q31_t) (acc >> shift);
00154
00155 *pOut++ = (q31_t) acc;
00156
00157
00158 e = *pRef++ - (q31_t) acc;
00159
00160 *pErr++ = (q31_t) e;
00161
00162
00163 alpha = (q31_t) (((q63_t) e * mu) >> 31);
00164
00165
00166
00167 px = pState++;
00168
00169
00170 pb = pCoeffs;
00171
00172
00173 tapCnt = numTaps >> 2;
00174
00175
00176 while(tapCnt > 0u)
00177 {
00178
00179 coef = (q31_t) (((q63_t) alpha * (*px++)) >> (32));
00180
00181 *pb = clip_q63_to_q31((q63_t) * pb + (coef << 1u));
00182
00183 pb++;
00184
00185 coef = (q31_t) (((q63_t) alpha * (*px++)) >> (32));
00186 *pb = clip_q63_to_q31((q63_t) * pb + (coef << 1u));
00187 pb++;
00188
00189 coef = (q31_t) (((q63_t) alpha * (*px++)) >> (32));
00190 *pb = clip_q63_to_q31((q63_t) * pb + (coef << 1u));
00191 pb++;
00192
00193 coef = (q31_t) (((q63_t) alpha * (*px++)) >> (32));
00194 *pb = clip_q63_to_q31((q63_t) * pb + (coef << 1u));
00195 pb++;
00196
00197
00198 tapCnt--;
00199 }
00200
00201
00202 tapCnt = numTaps % 0x4u;
00203
00204 while(tapCnt > 0u)
00205 {
00206
00207 coef = (q31_t) (((q63_t) alpha * (*px++)) >> (32));
00208 *pb = clip_q63_to_q31((q63_t) * pb + (coef << 1u));
00209 pb++;
00210
00211
00212 tapCnt--;
00213 }
00214
00215
00216 blkCnt--;
00217 }
00218
00219
00220
00221
00222
00223
00224 pStateCurnt = S->pState;
00225
00226
00227 tapCnt = (numTaps - 1u) >> 2u;
00228
00229
00230 while(tapCnt > 0u)
00231 {
00232 *pStateCurnt++ = *pState++;
00233 *pStateCurnt++ = *pState++;
00234 *pStateCurnt++ = *pState++;
00235 *pStateCurnt++ = *pState++;
00236
00237
00238 tapCnt--;
00239 }
00240
00241
00242 tapCnt = (numTaps - 1u) % 0x4u;
00243
00244
00245 while(tapCnt > 0u)
00246 {
00247 *pStateCurnt++ = *pState++;
00248
00249
00250 tapCnt--;
00251 }
00252
00253 #else
00254
00255
00256
00257 while(blkCnt > 0u)
00258 {
00259
00260 *pStateCurnt++ = *pSrc++;
00261
00262
00263 px = pState;
00264
00265
00266 pb = pCoeffs;
00267
00268
00269 acc = 0;
00270
00271
00272 tapCnt = numTaps;
00273
00274 while(tapCnt > 0u)
00275 {
00276
00277 acc += ((q63_t) (*px++)) * (*pb++);
00278
00279
00280 tapCnt--;
00281 }
00282
00283
00284
00285 acc = (q31_t) (acc >> shift);
00286
00287 *pOut++ = (q31_t) acc;
00288
00289
00290 e = *pRef++ - (q31_t) acc;
00291
00292 *pErr++ = (q31_t) e;
00293
00294
00295 alpha = (q31_t) (((q63_t) e * mu) >> 31);
00296
00297
00298
00299 px = pState++;
00300
00301
00302 pb = pCoeffs;
00303
00304
00305 tapCnt = numTaps;
00306
00307 while(tapCnt > 0u)
00308 {
00309
00310 coef = (q31_t) (((q63_t) alpha * (*px++)) >> (32));
00311 *pb += (coef << 1u);
00312 pb++;
00313
00314
00315 tapCnt--;
00316 }
00317
00318
00319 blkCnt--;
00320 }
00321
00322
00323
00324
00325
00326
00327 pStateCurnt = S->pState;
00328
00329
00330 tapCnt = (numTaps - 1u);
00331
00332
00333 while(tapCnt > 0u)
00334 {
00335 *pStateCurnt++ = *pState++;
00336
00337
00338 tapCnt--;
00339 }
00340
00341 #endif
00342
00343 }
00344