82 q15_t *pb = pScratchIn;
85 uint32_t delaySize = S->
maxDelay + blockSize;
88 uint32_t tapCnt, blkCnt;
89 q15_t coeff = *pCoeffs++;
90 q31_t *pScr2 = pScratchOut;
93 #ifndef ARM_MATH_CM0_FAMILY 102 arm_circularWrite_q15(py, delaySize, &S->
stateIndex, 1, pIn, 1, blockSize);
108 readIndex = (S->
stateIndex - blockSize) - *pTapDelay++;
113 readIndex += (int32_t) delaySize;
120 arm_circularRead_q15(py, delaySize, &readIndex, 1,
121 pb, pb, blockSize, 1, blockSize);
131 blkCnt = blockSize >> 2;
136 *pScratchOut++ = ((
q31_t) * px++ * coeff);
137 *pScratchOut++ = ((
q31_t) * px++ * coeff);
138 *pScratchOut++ = ((
q31_t) * px++ * coeff);
139 *pScratchOut++ = ((
q31_t) * px++ * coeff);
147 blkCnt = blockSize % 0x4u;
152 *pScratchOut++ = ((
q31_t) * px++ * coeff);
163 readIndex = (S->
stateIndex - blockSize) - *pTapDelay++;
168 readIndex += (int32_t) delaySize;
172 tapCnt = (uint32_t) numTaps - 2u;
180 arm_circularRead_q15(py, delaySize, &readIndex, 1,
181 pb, pb, blockSize, 1, blockSize);
191 blkCnt = blockSize >> 2;
196 *pScratchOut++ += (
q31_t) * px++ * coeff;
197 *pScratchOut++ += (
q31_t) * px++ * coeff;
198 *pScratchOut++ += (
q31_t) * px++ * coeff;
199 *pScratchOut++ += (
q31_t) * px++ * coeff;
207 blkCnt = blockSize % 0x4u;
212 *pScratchOut++ += (
q31_t) * px++ * coeff;
223 readIndex = (S->
stateIndex - blockSize) - *pTapDelay++;
228 readIndex += (int32_t) delaySize;
241 arm_circularRead_q15(py, delaySize, &readIndex, 1,
242 pb, pb, blockSize, 1, blockSize);
252 blkCnt = blockSize >> 2;
257 *pScratchOut++ += (
q31_t) * px++ * coeff;
258 *pScratchOut++ += (
q31_t) * px++ * coeff;
259 *pScratchOut++ += (
q31_t) * px++ * coeff;
260 *pScratchOut++ += (
q31_t) * px++ * coeff;
268 blkCnt = blockSize % 0x4u;
273 *pScratchOut++ += (
q31_t) * px++ * coeff;
282 blkCnt = blockSize >> 2;
289 #ifndef ARM_MATH_BIG_ENDIAN 292 __PKHBT((
q15_t) __SSAT(in1 >> 15, 16), (
q15_t) __SSAT(in2 >> 15, 16),
297 __PKHBT((
q15_t) __SSAT(in2 >> 15, 16), (
q15_t) __SSAT(in1 >> 15, 16),
306 #ifndef ARM_MATH_BIG_ENDIAN 309 __PKHBT((
q15_t) __SSAT(in1 >> 15, 16), (
q15_t) __SSAT(in2 >> 15, 16),
315 __PKHBT((
q15_t) __SSAT(in2 >> 15, 16), (
q15_t) __SSAT(in1 >> 15, 16),
327 blkCnt = blockSize % 0x4u;
331 *pOut++ = (
q15_t) __SSAT(*pScr2++ >> 15, 16);
341 arm_circularWrite_q15(py, delaySize, &S->
stateIndex, 1, pIn, 1, blockSize);
347 readIndex = (S->
stateIndex - blockSize) - *pTapDelay++;
352 readIndex += (int32_t) delaySize;
359 arm_circularRead_q15(py, delaySize, &readIndex, 1,
360 pb, pb, blockSize, 1, blockSize);
373 *pScratchOut++ = ((
q31_t) * px++ * coeff);
384 readIndex = (S->
stateIndex - blockSize) - *pTapDelay++;
389 readIndex += (int32_t) delaySize;
393 tapCnt = (uint32_t) numTaps - 2u;
401 arm_circularRead_q15(py, delaySize, &readIndex, 1,
402 pb, pb, blockSize, 1, blockSize);
415 *pScratchOut++ += (
q31_t) * px++ * coeff;
426 readIndex = (S->
stateIndex - blockSize) - *pTapDelay++;
431 readIndex += (int32_t) delaySize;
444 arm_circularRead_q15(py, delaySize, &readIndex, 1,
445 pb, pb, blockSize, 1, blockSize);
458 *pScratchOut++ += (
q31_t) * px++ * coeff;
471 *pOut++ = (
q15_t) __SSAT(*pScr2++ >> 15, 16);
Instance structure for the Q15 sparse FIR filter.
int16_t q15_t
16-bit fractional data type in 1.15 format.
#define __SIMD32(addr)
definition to read/write two 16 bit values.
int32_t q31_t
32-bit fractional data type in 1.31 format.
void arm_fir_sparse_q15(arm_fir_sparse_instance_q15 *S, q15_t *pSrc, q15_t *pDst, q15_t *pScratchIn, q31_t *pScratchOut, uint32_t blockSize)
Processing function for the Q15 sparse FIR filter.