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
00118 void arm_fir_lattice_f32(
00119 const arm_fir_lattice_instance_f32 * S,
00120 float32_t * pSrc,
00121 float32_t * pDst,
00122 uint32_t blockSize)
00123 {
00124 float32_t *pState;
00125 float32_t *pCoeffs = S->pCoeffs;
00126 float32_t *px;
00127 float32_t *pk;
00128 float32_t fcurr1, fnext1, gcurr1, gnext1;
00129 float32_t fcurr2, fnext2, gnext2;
00130 float32_t fcurr3, fnext3, gnext3;
00131 float32_t fcurr4, fnext4, gnext4;
00132 uint32_t numStages = S->numStages;
00133 uint32_t blkCnt, stageCnt;
00134
00135 gcurr1 = 0.0f;
00136 pState = &S->pState[0];
00137
00138 blkCnt = blockSize >> 2;
00139
00140
00141
00142 while(blkCnt > 0u)
00143 {
00144
00145
00146
00147 fcurr1 = *pSrc++;
00148 fcurr2 = *pSrc++;
00149
00150
00151 pk = (pCoeffs);
00152
00153
00154 px = pState;
00155
00156
00157 gcurr1 = *px;
00158
00159
00160
00161 fnext1 = fcurr1 + ((*pk) * gcurr1);
00162
00163 gnext1 = (fcurr1 * (*pk)) + gcurr1;
00164
00165
00166
00167 fnext2 = fcurr2 + ((*pk) * fcurr1);
00168 gnext2 = (fcurr2 * (*pk)) + fcurr1;
00169
00170
00171
00172 fcurr3 = *pSrc++;
00173 fcurr4 = *pSrc++;
00174
00175
00176
00177 *px++ = fcurr4;
00178
00179
00180 fnext3 = fcurr3 + ((*pk) * fcurr2);
00181 gnext3 = (fcurr3 * (*pk)) + fcurr2;
00182
00183
00184 fnext4 = fcurr4 + ((*pk) * fcurr3);
00185 gnext4 = (fcurr4 * (*pk++)) + fcurr3;
00186
00187
00188 fcurr1 = fnext1;
00189 fcurr2 = fnext2;
00190 fcurr3 = fnext3;
00191 fcurr4 = fnext4;
00192
00193
00194 stageCnt = (numStages - 1u) >> 2u;
00195
00196
00197
00198
00199
00200 while(stageCnt > 0u)
00201 {
00202
00203 gcurr1 = *px;
00204
00205
00206 *px++ = gnext4;
00207
00208
00209
00210
00211 fnext1 = fcurr1 + ((*pk) * gcurr1);
00212
00213
00214 fnext2 = fcurr2 + ((*pk) * gnext1);
00215
00216 fnext3 = fcurr3 + ((*pk) * gnext2);
00217
00218 fnext4 = fcurr4 + ((*pk) * gnext3);
00219
00220
00221
00222 gnext4 = (fcurr4 * (*pk)) + gnext3;
00223 gnext3 = (fcurr3 * (*pk)) + gnext2;
00224 gnext2 = (fcurr2 * (*pk)) + gnext1;
00225 gnext1 = (fcurr1 * (*pk++)) + gcurr1;
00226
00227
00228
00229 gcurr1 = *px;
00230
00231
00232 *px++ = gnext4;
00233
00234
00235
00236
00237 fcurr1 = fnext1 + ((*pk) * gcurr1);
00238
00239 fcurr2 = fnext2 + ((*pk) * gnext1);
00240
00241 fcurr3 = fnext3 + ((*pk) * gnext2);
00242
00243 fcurr4 = fnext4 + ((*pk) * gnext3);
00244
00245
00246
00247 gnext4 = (fnext4 * (*pk)) + gnext3;
00248 gnext3 = (fnext3 * (*pk)) + gnext2;
00249 gnext2 = (fnext2 * (*pk)) + gnext1;
00250 gnext1 = (fnext1 * (*pk++)) + gcurr1;
00251
00252
00253
00254 gcurr1 = *px;
00255
00256
00257 *px++ = gnext4;
00258
00259
00260
00261
00262 fnext1 = fcurr1 + ((*pk) * gcurr1);
00263
00264
00265 fnext2 = fcurr2 + ((*pk) * gnext1);
00266
00267 fnext3 = fcurr3 + ((*pk) * gnext2);
00268
00269 fnext4 = fcurr4 + ((*pk) * gnext3);
00270
00271
00272
00273 gnext4 = (fcurr4 * (*pk)) + gnext3;
00274 gnext3 = (fcurr3 * (*pk)) + gnext2;
00275 gnext2 = (fcurr2 * (*pk)) + gnext1;
00276 gnext1 = (fcurr1 * (*pk++)) + gcurr1;
00277
00278
00279 gcurr1 = *px;
00280
00281
00282 *px++ = gnext4;
00283
00284
00285
00286
00287 fcurr1 = fnext1 + ((*pk) * gcurr1);
00288
00289 fcurr2 = fnext2 + ((*pk) * gnext1);
00290
00291 fcurr3 = fnext3 + ((*pk) * gnext2);
00292
00293 fcurr4 = fnext4 + ((*pk) * gnext3);
00294
00295
00296
00297 gnext4 = (fnext4 * (*pk)) + gnext3;
00298 gnext3 = (fnext3 * (*pk)) + gnext2;
00299 gnext2 = (fnext2 * (*pk)) + gnext1;
00300 gnext1 = (fnext1 * (*pk++)) + gcurr1;
00301
00302 stageCnt--;
00303 }
00304
00305
00306 stageCnt = (numStages - 1u) % 0x4u;
00307
00308 while(stageCnt > 0u)
00309 {
00310 gcurr1 = *px;
00311
00312
00313 *px++ = gnext4;
00314
00315
00316 fnext1 = fcurr1 + ((*pk) * gcurr1);
00317 fnext2 = fcurr2 + ((*pk) * gnext1);
00318 fnext3 = fcurr3 + ((*pk) * gnext2);
00319 fnext4 = fcurr4 + ((*pk) * gnext3);
00320
00321
00322 gnext4 = (fcurr4 * (*pk)) + gnext3;
00323 gnext3 = (fcurr3 * (*pk)) + gnext2;
00324 gnext2 = (fcurr2 * (*pk)) + gnext1;
00325 gnext1 = (fcurr1 * (*pk++)) + gcurr1;
00326
00327
00328 fcurr1 = fnext1;
00329 fcurr2 = fnext2;
00330 fcurr3 = fnext3;
00331 fcurr4 = fnext4;
00332
00333 stageCnt--;
00334
00335 }
00336
00337
00338
00339 *pDst++ = fcurr1;
00340 *pDst++ = fcurr2;
00341 *pDst++ = fcurr3;
00342 *pDst++ = fcurr4;
00343
00344 blkCnt--;
00345 }
00346
00347
00348
00349 blkCnt = blockSize % 0x4u;
00350
00351 while(blkCnt > 0u)
00352 {
00353
00354 fcurr1 = *pSrc++;
00355
00356
00357 pk = (pCoeffs);
00358
00359
00360 px = pState;
00361
00362
00363 gcurr1 = *px;
00364
00365
00366
00367 fnext1 = fcurr1 + ((*pk) * gcurr1);
00368
00369 gnext1 = (fcurr1 * (*pk++)) + gcurr1;
00370
00371
00372 *px++ = fcurr1;
00373
00374
00375
00376 fcurr1 = fnext1;
00377
00378 stageCnt = (numStages - 1u);
00379
00380
00381 while(stageCnt > 0u)
00382 {
00383
00384 gcurr1 = *px;
00385
00386
00387 *px++ = gnext1;
00388
00389
00390
00391 fnext1 = fcurr1 + ((*pk) * gcurr1);
00392
00393 gnext1 = (fcurr1 * (*pk++)) + gcurr1;
00394
00395
00396
00397 fcurr1 = fnext1;
00398
00399 stageCnt--;
00400
00401 }
00402
00403
00404 *pDst++ = fcurr1;
00405
00406 blkCnt--;
00407
00408 }
00409 }
00410