42 template <
typename dataType>
45 void *restrict pFilterCoeff,
46 void *restrict pFilterVar,
52 printf(
"Enter DSPLIB_cascadeBiquad_exec_cn\n");
56 dataType *pFilterCoeffLocal = (dataType *) pFilterCoeff;
57 dataType *pFilterVarLocal = (dataType *) pFilterVar;
70 printf(
"Enter pInLocal %p pFilterCoeffLocal %p pFilterVarLocal %p pOut %p filterVarPitch %d\n", pIn,
71 pFilterCoeffLocal, pFilterVarLocal, pOut, filterVarPitch);
74 dataType b11, b12, a11, a12;
75 dataType b21, b22, a21, a22;
76 dataType b31, b32, a31, a32;
77 dataType b41, b42, a41, a42;
78 dataType b51, b52, a51, a52;
79 dataType b61, b62, a61, a62;
80 dataType b71, b72, a71, a72;
81 dataType b10, b20, b30, b40, b50, b60, b70;
82 dataType vd0, vd1, vd2, vd3, vd4, vd5, vd6, vd7, vd8, vd9, vd10, vd11, vd12, vd13;
84 float coeff0 = pFilterCoeffLocal[0];
86 dataType r = (dataType) (1 / coeff0);
87 b11 = pFilterCoeffLocal[1] * r;
88 b12 = pFilterCoeffLocal[2] * r;
89 a11 = -pFilterCoeffLocal[3];
90 a12 = -pFilterCoeffLocal[4];
93 b20 = pFilterCoeffLocal[5];
94 r = (dataType) (1 / b20);
95 b21 = pFilterCoeffLocal[6] * r;
96 b22 = pFilterCoeffLocal[7] * r;
97 a21 = -pFilterCoeffLocal[8];
98 a22 = -pFilterCoeffLocal[9];
109 if (numStages >= 3) {
110 b30 = pFilterCoeffLocal[10];
111 r = (dataType) (1 / b30);
112 b31 = pFilterCoeffLocal[11] * r;
113 b32 = pFilterCoeffLocal[12] * r;
114 a31 = -pFilterCoeffLocal[13];
115 a32 = -pFilterCoeffLocal[14];
126 if (numStages >= 4) {
127 b40 = pFilterCoeffLocal[15];
128 r = (dataType) (1 / b40);
129 b41 = pFilterCoeffLocal[16] * r;
130 b42 = pFilterCoeffLocal[17] * r;
131 a41 = -pFilterCoeffLocal[18];
132 a42 = -pFilterCoeffLocal[19];
143 if (numStages >= 5) {
144 b50 = pFilterCoeffLocal[20];
145 r = (dataType) (1 / b50);
146 b51 = pFilterCoeffLocal[21] * r;
147 b52 = pFilterCoeffLocal[22] * r;
148 a51 = -pFilterCoeffLocal[23];
149 a52 = -pFilterCoeffLocal[24];
160 if (numStages >= 6) {
161 b60 = pFilterCoeffLocal[25];
162 r = (dataType) (1 / b60);
163 b61 = pFilterCoeffLocal[26] * r;
164 b62 = pFilterCoeffLocal[27] * r;
165 a61 = -pFilterCoeffLocal[28];
166 a62 = -pFilterCoeffLocal[29];
177 if (numStages >= 7) {
178 b70 = pFilterCoeffLocal[30];
179 r = (dataType) (1 / b70);
180 b71 = pFilterCoeffLocal[31] * r;
181 b72 = pFilterCoeffLocal[32] * r;
182 a71 = -pFilterCoeffLocal[33];
183 a72 = -pFilterCoeffLocal[34];
195 dataType outGain = b10 * b20 * b30 * b40 * b50 * b60 * b70;
196 dataType input1, output01, output02, output03, output04, output05, output06, output07;
197 dataType t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13;
200 #if DSPLIB_DEBUGPRINT
201 printf(
"DSPLIB_DEBUGPRINT a11 %f a12 %f b11 %f b12 %f b21 %f b22 %f b31 %f b32 %f\n", a11, a12, b11, b12, b21, b22,
203 printf(
"DSPLIB_DEBUGPRINT a41 %f a42 %f b41 %f b42 %f b51 %f b52 %f b61 %f b62 %f\n", a41, a42, b41, b42, b51, b52,
205 printf(
"DSPLIB_DEBUGPRINT b10 %f b20 %f b30 %f b40 %f b50 %f b60 %f b70 %f\n", b10, b20, b30, b40, b50, b60, b70);
206 printf(
"DSPLIB_DEBUGPRINT outGain %f\n", outGain);
209 for (uint32_t numCh = 0; numCh < numChannels; numCh++) {
210 pInLocal = (dataType *) pIn + numCh;
211 pOutLocal = (dataType *) pOut + numCh;
212 vd0 = pFilterVarLocal[0];
213 vd1 = pFilterVarLocal[filterVarPitch];
214 if (numStages >= 2) {
215 vd2 = pFilterVarLocal[2 * filterVarPitch];
216 vd3 = pFilterVarLocal[3 * filterVarPitch];
222 if (numStages >= 3) {
223 vd4 = pFilterVarLocal[4 * filterVarPitch];
224 vd5 = pFilterVarLocal[5 * filterVarPitch];
230 if (numStages >= 4) {
231 vd6 = pFilterVarLocal[6 * filterVarPitch];
232 vd7 = pFilterVarLocal[7 * filterVarPitch];
238 if (numStages >= 5) {
239 vd8 = pFilterVarLocal[8 * filterVarPitch];
240 vd9 = pFilterVarLocal[9 * filterVarPitch];
246 if (numStages >= 6) {
247 vd10 = pFilterVarLocal[10 * filterVarPitch];
248 vd11 = pFilterVarLocal[11 * filterVarPitch];
254 if (numStages >= 7) {
255 vd12 = pFilterVarLocal[12 * filterVarPitch];
256 vd13 = pFilterVarLocal[13 * filterVarPitch];
263 #if DSPLIB_DEBUGPRINT
264 printf(
"DSPLIB_DEBUGPRINT numCh %d: pFilterVarLocal %p vd0 %f vd1 %f vd2 %f vd3 %f vd4 %f vd5 %f\n", numCh,
265 pFilterVarLocal, vd0, vd1, vd2, vd3, vd4, vd5);
266 printf(
"DSPLIB_DEBUGPRINT vd6 %f vd7 %f vd8 %f vd9 %f vd10 %f vd11 %f vd12 %f vd13 %f\n", vd6, vd7, vd8, vd9,
267 vd10, vd11, vd12, vd13);
270 for (uint32_t samp = 0; samp < dataSize; samp++) {
271 input1 = *(pInLocal);
272 pInLocal = (dataType *) pInLocal + dataBufferInPitch;
275 output01 = input1 + vd0;
276 t1 = (((b11 + a11) * input1) + vd1);
278 vd0 = ((a11 * vd0) + t1);
279 vd1 = (((b12 + a12) * input1) + t0);
282 output02 = (output01 + vd2);
283 t3 = (((b21 + a21) * output01) + vd3);
285 vd2 = ((a21 * vd2) + t3);
286 vd3 = (((b22 + a22) * output01) + t2);
289 output03 = (output02 + vd4);
290 t5 = (((b31 + a31) * output02) + vd5);
292 vd4 = ((a31 * vd4) + t5);
293 vd5 = (((b32 + a32) * output02) + t4);
296 output04 = output03 + vd6;
297 t7 = (((b41 + a41) * output03) + vd7);
299 vd6 = ((a41 * vd6) + t7);
300 vd7 = (((b42 + a42) * output03) + t6);
303 output05 = (output04 + vd8);
304 t9 = (((b51 + a51) * output04) + vd9);
306 vd8 = ((a51 * vd8) + t9);
307 vd9 = (((b52 + a52) * output04) + t8);
310 output06 = (output05 + vd10);
311 t11 = (((b61 + a61) * output05) + vd11);
313 vd10 = ((a61 * vd10) + t11);
314 vd11 = (((b62 + a62) * output05) + t10);
317 output07 = (output06 + vd12);
318 t13 = (((b71 + a71) * output06) + vd13);
320 vd12 = ((a71 * vd12) + t13);
321 vd13 = (((b72 + a72) * output06) + t12);
323 #if DSPLIB_DEBUGPRINT
331 output = output07 * outGain;
334 *(dataType *) pOutLocal = output;
335 pOutLocal = (dataType *) pOutLocal + dataBufferOutPitch;
336 #if DSPLIB_DEBUGPRINT
338 printf(
"DSPLIB_DEBUGPRINT numCh %d samp %d input1 %f output01 %f output02 %f output03 %f output07 %f output "
339 "%f outGain %f pInLocal %p pOutLocal %p pOutLocal %f dataBufferOutPitch %d\n",
340 numCh, samp, input1, output01, output02, output03, output07, output, outGain, pInLocal, pOutLocal,
341 *(dataType *) pOutLocal, dataBufferOutPitch);
345 *(pFilterVarLocal) = vd0;
346 *(pFilterVarLocal + filterVarPitch) = vd1;
347 if (numStages >= 2) {
348 *(pFilterVarLocal + 2 * filterVarPitch) = vd2;
349 *(pFilterVarLocal + 3 * filterVarPitch) = vd3;
351 if (numStages >= 3) {
352 *(pFilterVarLocal + 4 * filterVarPitch) = vd4;
353 *(pFilterVarLocal + 5 * filterVarPitch) = vd5;
355 if (numStages >= 4) {
356 *(pFilterVarLocal + 6 * filterVarPitch) = vd6;
357 *(pFilterVarLocal + 7 * filterVarPitch) = vd7;
359 if (numStages >= 5) {
360 *(pFilterVarLocal + 8 * filterVarPitch) = vd8;
361 *(pFilterVarLocal + 9 * filterVarPitch) = vd9;
363 if (numStages >= 6) {
364 *(pFilterVarLocal + 10 * filterVarPitch) = vd10;
365 *(pFilterVarLocal + 11 * filterVarPitch) = vd11;
367 if (numStages >= 7) {
368 *(pFilterVarLocal + 12 * filterVarPitch) = vd12;
369 *(pFilterVarLocal + 13 * filterVarPitch) = vd13;
379 void *restrict pFilterCoeff,
380 void *restrict pFilterVar,
381 void *restrict pOut);
DSPLIB_STATUS DSPLIB_cascadeBiquad_exec_cn(DSPLIB_kernelHandle handle, void *restrict pIn, void *restrict pFilterCoeff, void *restrict pFilterVar, void *restrict pOut)
This function is the main execution function for the natural C implementation of the kernel....
template DSPLIB_STATUS DSPLIB_cascadeBiquad_exec_cn< float >(DSPLIB_kernelHandle handle, void *restrict pIn, void *restrict pFilterCoeff, void *restrict pFilterVar, void *restrict pOut)
DSPLIB_STATUS DSPLIB_cascadeBiquad_init_cn(DSPLIB_kernelHandle handle, DSPLIB_bufParams2D_t *bufParamsIn, DSPLIB_bufParams1D_t *bufParamsFilterCoeff, DSPLIB_bufParams2D_t *bufParamsFilterVar, DSPLIB_bufParams2D_t *bufParamsOut, DSPLIB_cascadeBiquad_InitArgs *pKerInitArgs)
This function is the initialization function for the natural C implementation of the kernel....
Header file for kernel's internal use. For the kernel's interface, please see DSPLIB_cascadeBiquad.
DSPLIB_STATUS_NAME
The enumeration of all status codes.
void * DSPLIB_kernelHandle
Handle type for DSPLIB operations.
A structure for a 1 dimensional buffer descriptor.
A structure for a 2 dimensional buffer descriptor.
Structure containing the parameters to initialize the kernel.
uint32_t dataSize
Size of input data
uint32_t numChannels
number of channels
uint32_t numStages
Size of batch in terms of number of channels of input data
Structure that is reserved for internal use by the kernel.
uint32_t filterVarPitch
Pitch of filter Variable buffer for different channels DSPLIB_cascadeBiquad_init that will be retriev...
uint32_t dataBufferOutPitch
Pitch of output buffer for different batches DSPLIB_cascadeBiquad_init that will be retrieved and use...
DSPLIB_cascadeBiquad_InitArgs initArgs
Structure holding initialization parameters
uint32_t dataBufferInPitch
Pitch of input buffer for different batches DSPLIB_cascadeBiquad_init that will be retrieved and used...