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 #include "arm_math.h"
00033
00113 void arm_fir_sparse_f32(
00114 arm_fir_sparse_instance_f32 * S,
00115 float32_t * pSrc,
00116 float32_t * pDst,
00117 float32_t * pScratchIn,
00118 uint32_t blockSize)
00119 {
00120
00121 float32_t *pState = S->pState;
00122 float32_t *pCoeffs = S->pCoeffs;
00123 float32_t *px;
00124 float32_t *py = pState;
00125 float32_t *pb = pScratchIn;
00126 float32_t *pOut;
00127 int32_t *pTapDelay = S->pTapDelay;
00128 uint32_t delaySize = S->maxDelay + blockSize;
00129 uint16_t numTaps = S->numTaps;
00130 int32_t readIndex;
00131 uint32_t tapCnt, blkCnt;
00132 float32_t coeff = *pCoeffs++;
00133
00134
00135
00136
00137
00138 arm_circularWrite_f32((int32_t *) py, delaySize, &S->stateIndex, 1,
00139 (int32_t *) pSrc, 1, blockSize);
00140
00141
00142
00143 readIndex = ((int32_t) S->stateIndex - (int32_t) blockSize) - *pTapDelay++;
00144
00145
00146 if(readIndex < 0)
00147 {
00148 readIndex += (int32_t) delaySize;
00149 }
00150
00151
00152 py = pState;
00153
00154
00155 arm_circularRead_f32((int32_t *) py, delaySize, &readIndex, 1,
00156 (int32_t *) pb, (int32_t *) pb, blockSize, 1,
00157 blockSize);
00158
00159
00160 px = pb;
00161
00162
00163 pOut = pDst;
00164
00165
00166 #ifndef ARM_MATH_CM0
00167
00168
00169
00170
00171
00172 blkCnt = blockSize >> 2u;
00173
00174 while(blkCnt > 0u)
00175 {
00176
00177 *pOut++ = *px++ * coeff;
00178 *pOut++ = *px++ * coeff;
00179 *pOut++ = *px++ * coeff;
00180 *pOut++ = *px++ * coeff;
00181
00182
00183 blkCnt--;
00184 }
00185
00186
00187
00188 blkCnt = blockSize % 0x4u;
00189
00190 while(blkCnt > 0u)
00191 {
00192
00193 *pOut++ = *px++ * coeff;
00194
00195
00196 blkCnt--;
00197 }
00198
00199
00200
00201 coeff = *pCoeffs++;
00202
00203
00204 readIndex = ((int32_t) S->stateIndex - (int32_t) blockSize) - *pTapDelay++;
00205
00206
00207 if(readIndex < 0)
00208 {
00209 readIndex += (int32_t) delaySize;
00210 }
00211
00212
00213 tapCnt = (uint32_t) numTaps - 1u;
00214
00215 while(tapCnt > 0u)
00216 {
00217
00218
00219 py = pState;
00220
00221
00222 arm_circularRead_f32((int32_t *) py, delaySize, &readIndex, 1,
00223 (int32_t *) pb, (int32_t *) pb, blockSize, 1,
00224 blockSize);
00225
00226
00227 px = pb;
00228
00229
00230 pOut = pDst;
00231
00232
00233
00234 blkCnt = blockSize >> 2u;
00235
00236 while(blkCnt > 0u)
00237 {
00238
00239 *pOut++ += *px++ * coeff;
00240 *pOut++ += *px++ * coeff;
00241 *pOut++ += *px++ * coeff;
00242 *pOut++ += *px++ * coeff;
00243
00244
00245 blkCnt--;
00246 }
00247
00248
00249
00250 blkCnt = blockSize % 0x4u;
00251
00252 while(blkCnt > 0u)
00253 {
00254
00255 *pOut++ += *px++ * coeff;
00256
00257
00258 blkCnt--;
00259 }
00260
00261
00262
00263 coeff = *pCoeffs++;
00264
00265
00266 readIndex = ((int32_t) S->stateIndex -
00267 (int32_t) blockSize) - *pTapDelay++;
00268
00269
00270 if(readIndex < 0)
00271 {
00272 readIndex += (int32_t) delaySize;
00273 }
00274
00275
00276 tapCnt--;
00277 }
00278
00279 #else
00280
00281
00282
00283 blkCnt = blockSize;
00284
00285 while(blkCnt > 0u)
00286 {
00287
00288 *pOut++ = *px++ * coeff;
00289
00290
00291 blkCnt--;
00292 }
00293
00294
00295
00296 coeff = *pCoeffs++;
00297
00298
00299 readIndex = ((int32_t) S->stateIndex - (int32_t) blockSize) - *pTapDelay++;
00300
00301
00302 if(readIndex < 0)
00303 {
00304 readIndex += (int32_t) delaySize;
00305 }
00306
00307
00308 tapCnt = (uint32_t) numTaps - 1u;
00309
00310 while(tapCnt > 0u)
00311 {
00312
00313
00314 py = pState;
00315
00316
00317 arm_circularRead_f32((int32_t *) py, delaySize, &readIndex, 1,
00318 (int32_t *) pb, (int32_t *) pb, blockSize, 1,
00319 blockSize);
00320
00321
00322 px = pb;
00323
00324
00325 pOut = pDst;
00326
00327 blkCnt = blockSize;
00328
00329 while(blkCnt > 0u)
00330 {
00331
00332 *pOut++ += *px++ * coeff;
00333
00334
00335 blkCnt--;
00336 }
00337
00338
00339
00340 coeff = *pCoeffs++;
00341
00342
00343 readIndex =
00344 ((int32_t) S->stateIndex - (int32_t) blockSize) - *pTapDelay++;
00345
00346
00347 if(readIndex < 0)
00348 {
00349 readIndex += (int32_t) delaySize;
00350 }
00351
00352
00353 tapCnt--;
00354 }
00355
00356 #endif
00357
00358 }
00359