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 #include "arm_math.h"
00030
00110 void arm_fir_sparse_f32(
00111 arm_fir_sparse_instance_f32 * S,
00112 float32_t * pSrc,
00113 float32_t * pDst,
00114 float32_t * pScratchIn,
00115 uint32_t blockSize)
00116 {
00117
00118 float32_t *pState = S->pState;
00119 float32_t *pCoeffs = S->pCoeffs;
00120 float32_t *px;
00121 float32_t *py = pState;
00122 float32_t *pb = pScratchIn;
00123 float32_t *pOut;
00124 int32_t *pTapDelay = S->pTapDelay;
00125 uint32_t delaySize = S->maxDelay + blockSize;
00126 uint16_t numTaps = S->numTaps;
00127 int32_t readIndex;
00128 uint32_t tapCnt, blkCnt;
00129 float32_t coeff = *pCoeffs++;
00130
00131
00132
00133
00134
00135 arm_circularWrite_f32((int32_t *) py, delaySize, &S->stateIndex, 1,
00136 (int32_t *) pSrc, 1, blockSize);
00137
00138
00139
00140 readIndex = ((int32_t) S->stateIndex - (int32_t) blockSize) - *pTapDelay++;
00141
00142
00143 if(readIndex < 0)
00144 {
00145 readIndex += (int32_t) delaySize;
00146 }
00147
00148
00149 py = pState;
00150
00151
00152 arm_circularRead_f32((int32_t *) py, delaySize, &readIndex, 1,
00153 (int32_t *) pb, (int32_t *) pb, blockSize, 1,
00154 blockSize);
00155
00156
00157 px = pb;
00158
00159
00160 pOut = pDst;
00161
00162
00163
00164 blkCnt = blockSize >> 2u;
00165
00166 while(blkCnt > 0u)
00167 {
00168
00169 *pOut++ = *px++ * coeff;
00170 *pOut++ = *px++ * coeff;
00171 *pOut++ = *px++ * coeff;
00172 *pOut++ = *px++ * coeff;
00173
00174
00175 blkCnt--;
00176 }
00177
00178
00179
00180 blkCnt = blockSize % 0x4u;
00181
00182 while(blkCnt > 0u)
00183 {
00184
00185 *pOut++ = *px++ * coeff;
00186
00187
00188 blkCnt--;
00189 }
00190
00191
00192
00193 coeff = *pCoeffs++;
00194
00195
00196 readIndex = ((int32_t) S->stateIndex - (int32_t) blockSize) - *pTapDelay++;
00197
00198
00199 if(readIndex < 0)
00200 {
00201 readIndex += (int32_t) delaySize;
00202 }
00203
00204
00205 tapCnt = (uint32_t) numTaps - 1u;
00206
00207 while(tapCnt > 0u)
00208 {
00209
00210
00211 py = pState;
00212
00213
00214 arm_circularRead_f32((int32_t *) py, delaySize, &readIndex, 1,
00215 (int32_t *) pb, (int32_t *) pb, blockSize, 1,
00216 blockSize);
00217
00218
00219 px = pb;
00220
00221
00222 pOut = pDst;
00223
00224
00225
00226 blkCnt = blockSize >> 2u;
00227
00228 while(blkCnt > 0u)
00229 {
00230
00231 *pOut++ += *px++ * coeff;
00232 *pOut++ += *px++ * coeff;
00233 *pOut++ += *px++ * coeff;
00234 *pOut++ += *px++ * coeff;
00235
00236
00237 blkCnt--;
00238 }
00239
00240
00241
00242 blkCnt = blockSize % 0x4u;
00243
00244 while(blkCnt > 0u)
00245 {
00246
00247 *pOut++ += *px++ * coeff;
00248
00249
00250 blkCnt--;
00251 }
00252
00253
00254
00255 coeff = *pCoeffs++;
00256
00257
00258 readIndex = ((int32_t) S->stateIndex -
00259 (int32_t) blockSize) - *pTapDelay++;
00260
00261
00262 if(readIndex < 0)
00263 {
00264 readIndex += (int32_t) delaySize;
00265 }
00266
00267
00268 tapCnt--;
00269 }
00270
00271 }
00272