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 #include "arm_math.h"
00031
00164 void arm_lms_f32(
00165 const arm_lms_instance_f32 * S,
00166 float32_t * pSrc,
00167 float32_t * pRef,
00168 float32_t * pOut,
00169 float32_t * pErr,
00170 uint32_t blockSize)
00171 {
00172 float32_t *pState = S->pState;
00173 float32_t *pCoeffs = S->pCoeffs;
00174 float32_t *pStateCurnt;
00175 float32_t *px, *pb;
00176 float32_t mu = S->mu;
00177 uint32_t numTaps = S->numTaps;
00178 uint32_t tapCnt, blkCnt;
00179 float32_t sum, e, d;
00180 float32_t w = 0.0f;
00181
00182 e = 0.0f;
00183 d = 0.0f;
00184
00185
00186
00187 pStateCurnt = &(S->pState[(numTaps - 1u)]);
00188
00189 blkCnt = blockSize;
00190
00191 while(blkCnt > 0u)
00192 {
00193
00194 *pStateCurnt++ = *pSrc++;
00195
00196
00197 px = pState;
00198
00199
00200 pb = (pCoeffs);
00201
00202
00203 sum = 0.0f;
00204
00205
00206 tapCnt = numTaps >> 2;
00207
00208 while(tapCnt > 0u)
00209 {
00210
00211 sum += (*px++) * (*pb++);
00212 sum += (*px++) * (*pb++);
00213 sum += (*px++) * (*pb++);
00214 sum += (*px++) * (*pb++);
00215
00216
00217 tapCnt--;
00218 }
00219
00220
00221 tapCnt = numTaps % 0x4u;
00222
00223 while(tapCnt > 0u)
00224 {
00225
00226 sum += (*px++) * (*pb++);
00227
00228
00229 tapCnt--;
00230 }
00231
00232
00233 *pOut++ = sum;
00234
00235
00236 d = (float32_t) (*pRef++);
00237 e = d - sum;
00238 *pErr++ = e;
00239
00240
00241 w = e * mu;
00242
00243
00244 px = pState;
00245
00246
00247 pb = (pCoeffs);
00248
00249
00250 tapCnt = numTaps >> 2;
00251
00252
00253 while(tapCnt > 0u)
00254 {
00255
00256 *pb = *pb + (w * (*px++));
00257 pb++;
00258
00259 *pb = *pb + (w * (*px++));
00260 pb++;
00261
00262 *pb = *pb + (w * (*px++));
00263 pb++;
00264
00265 *pb = *pb + (w * (*px++));
00266 pb++;
00267
00268
00269 tapCnt--;
00270 }
00271
00272
00273 tapCnt = numTaps % 0x4u;
00274
00275 while(tapCnt > 0u)
00276 {
00277
00278 *pb = *pb + (w * (*px++));
00279 pb++;
00280
00281
00282 tapCnt--;
00283 }
00284
00285
00286 pState = pState + 1;
00287
00288
00289 blkCnt--;
00290 }
00291
00292
00293
00294
00295
00296
00297
00298 pStateCurnt = S->pState;
00299
00300
00301 tapCnt = (numTaps - 1u) >> 2u;
00302
00303
00304 while(tapCnt > 0u)
00305 {
00306 *pStateCurnt++ = *pState++;
00307 *pStateCurnt++ = *pState++;
00308 *pStateCurnt++ = *pState++;
00309 *pStateCurnt++ = *pState++;
00310
00311
00312 tapCnt--;
00313 }
00314
00315
00316 tapCnt = (numTaps - 1u) % 0x4u;
00317
00318
00319 while(tapCnt > 0u)
00320 {
00321 *pStateCurnt++ = *pState++;
00322
00323
00324 tapCnt--;
00325 }
00326 }
00327