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
00031
00062 void arm_fir_sparse_q7(
00063 arm_fir_sparse_instance_q7 * S,
00064 q7_t * pSrc,
00065 q7_t * pDst,
00066 q7_t * pScratchIn,
00067 q31_t * pScratchOut,
00068 uint32_t blockSize)
00069 {
00070
00071 q7_t *pState = S->pState;
00072 q7_t *pCoeffs = S->pCoeffs;
00073 q7_t *px;
00074 q7_t *py = pState;
00075 q7_t *pb = pScratchIn;
00076 q7_t *pOut = pDst;
00077 int32_t *pTapDelay = S->pTapDelay;
00078 uint32_t delaySize = S->maxDelay + blockSize;
00079 uint16_t numTaps = S->numTaps;
00080 int32_t readIndex;
00081 uint32_t tapCnt, blkCnt;
00082 q7_t coeff = *pCoeffs++;
00083 q31_t *pScr2 = pScratchOut;
00084 q31_t in;
00085 q7_t in1, in2, in3, in4;
00086
00087
00088
00089 arm_circularWrite_q7(py, (int32_t) delaySize, &S->stateIndex, 1, pSrc, 1,
00090 blockSize);
00091
00092
00093 tapCnt = numTaps;
00094
00095
00096 readIndex = ((int32_t) S->stateIndex - (int32_t) blockSize) - *pTapDelay++;
00097
00098
00099 if(readIndex < 0)
00100 {
00101 readIndex += (int32_t) delaySize;
00102 }
00103
00104
00105 py = pState;
00106
00107
00108 arm_circularRead_q7(py, (int32_t) delaySize, &readIndex, 1, pb, pb,
00109 (int32_t) blockSize, 1, blockSize);
00110
00111
00112 px = pb;
00113
00114
00115 pScratchOut = pScr2;
00116
00117
00118
00119 blkCnt = blockSize >> 2;
00120
00121 while(blkCnt > 0u)
00122 {
00123
00124 *pScratchOut++ = ((q31_t) * px++ * coeff);
00125 *pScratchOut++ = ((q31_t) * px++ * coeff);
00126 *pScratchOut++ = ((q31_t) * px++ * coeff);
00127 *pScratchOut++ = ((q31_t) * px++ * coeff);
00128
00129
00130 blkCnt--;
00131 }
00132
00133
00134
00135 blkCnt = blockSize % 0x4u;
00136
00137 while(blkCnt > 0u)
00138 {
00139
00140 *pScratchOut++ = ((q31_t) * px++ * coeff);
00141
00142
00143 blkCnt--;
00144 }
00145
00146
00147
00148 coeff = *pCoeffs++;
00149
00150
00151 readIndex = ((int32_t) S->stateIndex - (int32_t) blockSize) - *pTapDelay++;
00152
00153
00154 if(readIndex < 0)
00155 {
00156 readIndex += (int32_t) delaySize;
00157 }
00158
00159
00160 tapCnt = (uint32_t) numTaps - 1u;
00161
00162 while(tapCnt > 0u)
00163 {
00164
00165 py = pState;
00166
00167
00168 arm_circularRead_q7(py, (int32_t) delaySize, &readIndex, 1, pb, pb,
00169 (int32_t) blockSize, 1, blockSize);
00170
00171
00172 px = pb;
00173
00174
00175 pScratchOut = pScr2;
00176
00177
00178
00179 blkCnt = blockSize >> 2;
00180
00181 while(blkCnt > 0u)
00182 {
00183
00184 in = *pScratchOut + ((q31_t) * px++ * coeff);
00185 *pScratchOut++ = in;
00186 in = *pScratchOut + ((q31_t) * px++ * coeff);
00187 *pScratchOut++ = in;
00188 in = *pScratchOut + ((q31_t) * px++ * coeff);
00189 *pScratchOut++ = in;
00190 in = *pScratchOut + ((q31_t) * px++ * coeff);
00191 *pScratchOut++ = in;
00192
00193
00194 blkCnt--;
00195 }
00196
00197
00198
00199 blkCnt = blockSize % 0x4u;
00200
00201 while(blkCnt > 0u)
00202 {
00203
00204 in = *pScratchOut + ((q31_t) * px++ * coeff);
00205 *pScratchOut++ = in;
00206
00207
00208 blkCnt--;
00209 }
00210
00211
00212
00213 coeff = *pCoeffs++;
00214
00215
00216 readIndex = ((int32_t) S->stateIndex -
00217 (int32_t) blockSize) - *pTapDelay++;
00218
00219
00220 if(readIndex < 0)
00221 {
00222 readIndex += (int32_t) delaySize;
00223 }
00224
00225
00226 tapCnt--;
00227 }
00228
00229
00230
00231
00232 blkCnt = blockSize >> 2;
00233
00234 while(blkCnt > 0u)
00235 {
00236 in1 = (q7_t) __SSAT(*pScr2++ >> 7, 8);
00237 in2 = (q7_t) __SSAT(*pScr2++ >> 7, 8);
00238 in3 = (q7_t) __SSAT(*pScr2++ >> 7, 8);
00239 in4 = (q7_t) __SSAT(*pScr2++ >> 7, 8);
00240
00241 *__SIMD32(pOut)++ = __PACKq7(in1, in2, in3, in4);
00242
00243
00244 blkCnt--;
00245 }
00246
00247
00248
00249 blkCnt = blockSize % 0x4u;
00250
00251 while(blkCnt > 0u)
00252 {
00253 *pOut++ = (q7_t) __SSAT(*pScr2++ >> 7, 8);
00254
00255
00256 blkCnt--;
00257 }
00258 }
00259