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