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 #include "arm_math.h"
00026
00134 void arm_biquad_cascade_df2T_f32(
00135 const arm_biquad_cascade_df2T_instance_f32 * S,
00136 float32_t * pSrc,
00137 float32_t * pDst,
00138 uint32_t blockSize)
00139 {
00140
00141 float32_t *pIn = pSrc;
00142 float32_t *pOut = pDst;
00143 float32_t *pState = S->pState;
00144 float32_t *pCoeffs = S->pCoeffs;
00145 float32_t acc0;
00146 float32_t b0, b1, b2, a1, a2;
00147 float32_t Xn;
00148 float32_t d1, d2;
00149 uint32_t sample, stage = S->numStages;
00150 float32_t Xn1, Xn2;
00151 float32_t acc1;
00152
00153 do
00154 {
00155
00156 b0 = *pCoeffs++;
00157 b1 = *pCoeffs++;
00158 b2 = *pCoeffs++;
00159 a1 = *pCoeffs++;
00160 a2 = *pCoeffs++;
00161
00162
00163 d1 = pState[0];
00164 d2 = pState[1];
00165
00166
00167 sample = blockSize >> 2u;
00168
00169
00170
00171 while(sample > 0u)
00172 {
00173
00174
00175
00176
00177
00178
00179 Xn1 = *pIn++;
00180
00181
00182 acc0 = (b0 * Xn1) + d1;
00183
00184
00185 d1 = (b1 * Xn1) + d2;
00186
00187
00188 d2 = (b2 * Xn1);
00189
00190
00191 Xn2 = *pIn++;
00192
00193
00194 d1 = (a1 * acc0) + d1;
00195
00196
00197 *pOut++ = acc0;
00198
00199 d2 = (a2 * acc0) + d2;
00200
00201
00202 acc1 = (b0 * Xn2) + d1;
00203
00204
00205 Xn1 = *pIn++;
00206
00207 d1 = (b1 * Xn2) + d2;
00208
00209 d2 = (b2 * Xn2);
00210
00211
00212 *pOut++ = acc1;
00213
00214 d1 = (a1 * acc1) + d1;
00215
00216 d2 = (a2 * acc1) + d2;
00217
00218
00219 acc0 = (b0 * Xn1) + d1;
00220
00221 d1 = (b1 * Xn1) + d2;
00222
00223 d2 = (b2 * Xn1);
00224
00225
00226 Xn2 = *pIn++;
00227
00228 d1 = (a1 * acc0) + d1;
00229
00230
00231 *pOut++ = acc0;
00232
00233 d2 = (a2 * acc0) + d2;
00234
00235
00236 acc1 = (b0 * Xn2) + d1;
00237
00238 d1 = (b1 * Xn2) + d2;
00239
00240 d2 = (b2 * Xn2);
00241
00242
00243 *pOut++ = acc1;
00244
00245 d1 = (a1 * acc1) + d1;
00246
00247 d2 = (a2 * acc1) + d2;
00248
00249
00250 sample--;
00251
00252 }
00253
00254
00255
00256 sample = blockSize & 0x3u;
00257
00258 while(sample > 0u)
00259 {
00260
00261 Xn = *pIn++;
00262
00263
00264 acc0 = (b0 * Xn) + d1;
00265
00266
00267 *pOut++ = acc0;
00268
00269
00270
00271 d1 = ((b1 * Xn) + (a1 * acc0)) + d2;
00272
00273
00274 d2 = (b2 * Xn) + (a2 * acc0);
00275
00276
00277 sample--;
00278 }
00279
00280
00281 *pState++ = d1;
00282 *pState++ = d2;
00283
00284
00285 pIn = pDst;
00286
00287
00288 pOut = pDst;
00289
00290
00291 stage--;
00292
00293 } while(stage > 0u);
00294
00295 }
00296
00297