| #include "ref.h"  | 
|   | 
| void ref_iir_lattice_f32(  | 
|   const arm_iir_lattice_instance_f32 * S,  | 
|   float32_t * pSrc,  | 
|   float32_t * pDst,  | 
|   uint32_t blockSize)  | 
| {  | 
|   float32_t fcurr, fnext = 0, gcurr, gnext;      /* Temporary variables for lattice stages */  | 
|   float32_t acc;                                 /* Accumlator */  | 
|   uint32_t blkCnt, tapCnt;                       /* temporary variables for counts */  | 
|   float32_t *px1, *px2, *pk, *pv;                /* temporary pointers for state and coef */  | 
|   uint32_t numStages = S->numStages;             /* number of stages */  | 
|   float32_t *pState;                             /* State pointer */  | 
|   float32_t *pStateCurnt;                        /* State current pointer */  | 
|   | 
|   blkCnt = blockSize;  | 
|   pState = &S->pState[0];  | 
|   | 
|   /* Sample processing */  | 
|   while (blkCnt > 0U)  | 
|   {  | 
|     /* Read Sample from input buffer */  | 
|     /* fN(n) = x(n) */  | 
|     fcurr = *pSrc++;  | 
|   | 
|     /* Initialize state read pointer */  | 
|     px1 = pState;  | 
|     /* Initialize state write pointer */  | 
|     px2 = pState;  | 
|     /* Set accumulator to zero */  | 
|     acc = 0.0f;  | 
|     /* Initialize Ladder coeff pointer */  | 
|     pv = &S->pvCoeffs[0];  | 
|     /* Initialize Reflection coeff pointer */  | 
|     pk = &S->pkCoeffs[0];  | 
|   | 
|     /* Process sample for numStages */  | 
|     tapCnt = numStages;  | 
|   | 
|     while (tapCnt > 0U)  | 
|     {  | 
|       gcurr = *px1++;  | 
|       /* Process sample for last taps */  | 
|       fnext = fcurr - (*pk) * gcurr;  | 
|       gnext = fnext * (*pk++) + gcurr;  | 
|   | 
|       /* Output samples for last taps */  | 
|       acc += gnext * (*pv++);  | 
|       *px2++ = gnext;  | 
|       fcurr = fnext;  | 
|   | 
|       /* Decrementing loop counter */  | 
|       tapCnt--;  | 
|     }  | 
|   | 
|     /* y(n) += g0(n) * v0 */  | 
|     acc += fnext * (*pv);  | 
|   | 
|     *px2++ = fnext;  | 
|   | 
|     /* write out into pDst */  | 
|     *pDst++ = acc;  | 
|   | 
|     /* Advance the state pointer by 1 to process the next group of samples */  | 
|     pState = pState + 1U;  | 
|     blkCnt--;  | 
|   }  | 
|   | 
|   /* Processing is complete. Now copy last S->numStages samples to start of the buffer             | 
|      for the preperation of next frame process */  | 
|   | 
|   /* Points to the start of the state buffer */  | 
|   pStateCurnt = &S->pState[0];  | 
|   pState = &S->pState[blockSize];  | 
|   | 
|   tapCnt = numStages;  | 
|   | 
|   /* Copy the data */  | 
|   while (tapCnt > 0U)  | 
|   {  | 
|     *pStateCurnt++ = *pState++;  | 
|   | 
|     /* Decrement the loop counter */  | 
|     tapCnt--;  | 
|   }  | 
| }  | 
|   | 
| void ref_iir_lattice_q31(  | 
|   const arm_iir_lattice_instance_q31 * S,  | 
|   q31_t * pSrc,  | 
|   q31_t * pDst,  | 
|   uint32_t blockSize)  | 
| {  | 
|   q31_t fcurr, fnext = 0, gcurr = 0, gnext;      /* Temporary variables for lattice stages */  | 
|   q63_t acc;                                     /* Accumlator */  | 
|   uint32_t blkCnt, tapCnt;                       /* Temporary variables for counts */  | 
|   q31_t *px1, *px2, *pk, *pv;                    /* Temporary pointers for state and coef */  | 
|   uint32_t numStages = S->numStages;             /* number of stages */  | 
|   q31_t *pState;                                 /* State pointer */  | 
|   q31_t *pStateCurnt;                            /* State current pointer */  | 
|   | 
|   blkCnt = blockSize;  | 
|   pState = &S->pState[0];  | 
|   | 
|   /* Sample processing */  | 
|   while (blkCnt > 0U)  | 
|   {  | 
|     /* Read Sample from input buffer */  | 
|     /* fN(n) = x(n) */  | 
|     fcurr = *pSrc++;  | 
|   | 
|     /* Initialize state read pointer */  | 
|     px1 = pState;  | 
|     /* Initialize state write pointer */  | 
|     px2 = pState;  | 
|     /* Set accumulator to zero */  | 
|     acc = 0;  | 
|     /* Initialize Ladder coeff pointer */  | 
|     pv = &S->pvCoeffs[0];  | 
|     /* Initialize Reflection coeff pointer */  | 
|     pk = &S->pkCoeffs[0];  | 
|   | 
|     tapCnt = numStages;  | 
|   | 
|     while (tapCnt > 0U)  | 
|     {  | 
|       gcurr = *px1++;  | 
|       /* Process sample */  | 
|       /* fN-1(n) = fN(n) - kN * gN-1(n-1) */  | 
|       fnext =  | 
|         ref_sat_q31(((q63_t) fcurr -  | 
|                          ((q31_t) (((q63_t) gcurr * (*pk)) >> 31))));  | 
|       /* gN(n) = kN * fN-1(n) + gN-1(n-1) */  | 
|       gnext =  | 
|         ref_sat_q31(((q63_t) gcurr +  | 
|                          ((q31_t) (((q63_t) fnext * (*pk++)) >> 31))));  | 
|       /* Output samples */  | 
|       /* y(n) += gN(n) * vN  */  | 
|       acc += ((q63_t) gnext * *pv++);  | 
|       /* write gN-1(n-1) into state for next sample processing */  | 
|       *px2++ = gnext;  | 
|       /* Update f values for next coefficient processing */  | 
|       fcurr = fnext;  | 
|   | 
|       tapCnt--;  | 
|     }  | 
|   | 
|     /* y(n) += g0(n) * v0 */  | 
|     acc += (q63_t) fnext *(*pv++);  | 
|   | 
|     *px2++ = fnext;  | 
|   | 
|     /* write out into pDst */  | 
|     *pDst++ = (q31_t) (acc >> 31U);  | 
|   | 
|     /* Advance the state pointer by 1 to process the next group of samples */  | 
|     pState = pState + 1U;  | 
|     blkCnt--;  | 
|   }  | 
|   | 
|   /* Processing is complete. Now copy last S->numStages samples to start of the buffer             | 
|      for the preperation of next frame process */  | 
|   | 
|   /* Points to the start of the state buffer */  | 
|   pStateCurnt = &S->pState[0];  | 
|   pState = &S->pState[blockSize];  | 
|   | 
|   tapCnt = numStages;  | 
|   | 
|   /* Copy the remaining q31_t data */  | 
|   while (tapCnt > 0U)  | 
|   {  | 
|     *pStateCurnt++ = *pState++;  | 
|   | 
|     /* Decrement the loop counter */  | 
|     tapCnt--;  | 
|   }  | 
| }  | 
|   | 
| void ref_iir_lattice_q15(  | 
|   const arm_iir_lattice_instance_q15 * S,  | 
|   q15_t * pSrc,  | 
|   q15_t * pDst,  | 
|   uint32_t blockSize)  | 
| {  | 
|   q31_t fcurr, fnext = 0, gcurr = 0, gnext;      /* Temporary variables for lattice stages */  | 
|   uint32_t stgCnt;                               /* Temporary variables for counts */  | 
|   q63_t acc;                                     /* Accumlator */  | 
|   uint32_t blkCnt, tapCnt;                       /* Temporary variables for counts */  | 
|   q15_t *px1, *px2, *pk, *pv;                    /* temporary pointers for state and coef */  | 
|   uint32_t numStages = S->numStages;             /* number of stages */  | 
|   q15_t *pState;                                 /* State pointer */  | 
|   q15_t *pStateCurnt;                            /* State current pointer */  | 
|   q15_t out;                                     /* Temporary variable for output */  | 
|   | 
|   blkCnt = blockSize;  | 
|   pState = &S->pState[0];  | 
|   | 
|   /* Sample processing */  | 
|   while (blkCnt > 0U)  | 
|   {  | 
|     /* Read Sample from input buffer */  | 
|     /* fN(n) = x(n) */  | 
|     fcurr = *pSrc++;  | 
|   | 
|     /* Initialize state read pointer */  | 
|     px1 = pState;  | 
|     /* Initialize state write pointer */  | 
|     px2 = pState;  | 
|     /* Set accumulator to zero */  | 
|     acc = 0;  | 
|     /* Initialize Ladder coeff pointer */  | 
|     pv = &S->pvCoeffs[0];  | 
|     /* Initialize Reflection coeff pointer */  | 
|     pk = &S->pkCoeffs[0];  | 
|   | 
|     tapCnt = numStages;  | 
|   | 
|     while (tapCnt > 0U)  | 
|     {  | 
|       gcurr = *px1++;  | 
|       /* Process sample */  | 
|       /* fN-1(n) = fN(n) - kN * gN-1(n-1) */  | 
|       fnext = fcurr - ((gcurr * (*pk)) >> 15);  | 
|       fnext = ref_sat_q15(fnext);  | 
|       /* gN(n) = kN * fN-1(n) + gN-1(n-1) */  | 
|       gnext = ((fnext * (*pk++)) >> 15) + gcurr;  | 
|       gnext = ref_sat_q15(gnext);  | 
|       /* Output samples */  | 
|       /* y(n) += gN(n) * vN */  | 
|       acc += (q31_t) ((gnext * (*pv++)));  | 
|       /* write gN(n) into state for next sample processing */  | 
|       *px2++ = (q15_t) gnext;  | 
|       /* Update f values for next coefficient processing */  | 
|       fcurr = fnext;  | 
|   | 
|       tapCnt--;  | 
|     }  | 
|   | 
|     /* y(n) += g0(n) * v0 */  | 
|     acc += (q31_t) ((fnext * (*pv++)));  | 
|   | 
|     out = ref_sat_q15(acc >> 15);  | 
|     *px2++ = (q15_t) fnext;  | 
|   | 
|     /* write out into pDst */  | 
|     *pDst++ = out;  | 
|   | 
|     /* Advance the state pointer by 1 to process the next group of samples */  | 
|     pState = pState + 1U;  | 
|     blkCnt--;  | 
|   }  | 
|   | 
|   /* Processing is complete. Now copy last S->numStages samples to start of the buffer             | 
|      for the preperation of next frame process */  | 
|   /* Points to the start of the state buffer */  | 
|   pStateCurnt = &S->pState[0];  | 
|   pState = &S->pState[blockSize];  | 
|   | 
|   stgCnt = numStages;  | 
|   | 
|   /* copy data */  | 
|   while (stgCnt > 0U)  | 
|   {  | 
|     *pStateCurnt++ = *pState++;  | 
|   | 
|     /* Decrement the loop counter */  | 
|     stgCnt--;  | 
|   }  | 
| }  |