Home : Signal Processing Library | Fixed-point IIR filters

Description

Fixed-point functions for fixed-order (fixed at compile time) and variable-order (order specified at run time) IIR filters.

IIR function parameter combinations for input sample, history data, and computed result are provided for all supported fixed-point formats (Q25, Q28, Q31).

Fixed length IIR filters are faster than the variable length IIR filters of the same order since they can be optimizationed to reduce memory (history data) copying.

Naming Conventions

  • nNN indicates the IIR filter order (1st, 2nd, 3rd, 4th and 5th orders are supported).
  • rRRxXXcCC indicates the result (RR), sample data (XX), and coefficient (CC) formats respectively.

Example: Function for 4th order IIR filter with a Q28 formatted sample, Q25 formatted coefficients, and a Q31 formatted result:

int xsignalproc_iir_n04_r31x28c25( int sample, const int coefficients[9], int history[9] )

Example Usage

The following example shows how to use a variable order IIR filter function.

Example for 4th order IIR filter using Q28 fixed-point format:

const int coefficients[5] = { [Q28P(0.0)],[Q28P(0.0)],[Q28P(0.0)],[Q28P(0.0)],
                              [Q28P(0.0)],[Q28P(0.0)],[Q28P(0.0)],[Q28P(0.0)] };
int history[4] = {0,0,0,0,0,0}; // Must be initialized to zero's

sample = xsignalproc_iir_n04_r28x28c28( sample, coefficients, history );

where ...

  • 'coefficients' array size is equal [2*nn+1] where nn is the filter order
  • 'history' array size is equal to [2*nn1] where nn is the filter order
  • 'history' must be inititalized to all zeros

The following example shows how to use a fixed order IIR filter function.

Example for 4th order IIR filter using Q28 fixed-point format:

const int coefficients[9] = { [Q28P(0.0)],[Q28P(0.0)],[Q28P(0.0)],[Q28P(0.0)],
                        [Q28P(0.0)],[Q28P(0.0)],[Q28P(0.0)],[Q28P(0.0)] };
int history[9] = {0,0,0,0,0,0,0,0,0,0}; // Must be initialized to zero's

sample_q28 = xsignalproc_iir_n04_r28x28c28( sample_q28, coefficients, history );

where ...

  • 'coefficients' array size is equal [2*nn+1] where nn is the filter order
  • 'history' array size is equal to [2*nn1] where nn is the filter order
  • 'history' must be inititalized to all zeros

Source Files

xsignalproc_iir.h Fixed-point functions for single and cascaded (double, triple, and quadruple) biquad filters
xsignalproc_iir.xc  

Source Listings

xsignalproc_iir.h

#ifndef XSIGNALPROC_IIR_INCLUDED
#define XSIGNALPROC_IIR_INCLUDED

// Note that code is generated for EACH combination of IIR order and sample, cooefficients and result format.

// Variable Order IIR Filters

// Note: 'coefficient' array size is equal to 2 * filter_order + 1
// Note: coeffients in the array (starting with offset 0) are arranged as B0, B1, ... BN, A1, ... A(N-1)
// Note: 'history' array size is equal to 2 * filter_order + 1
// Note: 'history' must be inititalized to all zeros

// Example: int coefficients[5] = {[?],[?],[?],[?],[?],} // Array literal of 5th order filter coefficients
//          int history[4] = {0,0,0,0};                  // Array literal of 5th order filter history data

int xsignalproc_iir_nNN_r31x31c31( int sample, const int coefficients[], int history[], int order );
int xsignalproc_iir_nNN_r31x31c28( int sample, const int coefficients[], int history[], int order );
int xsignalproc_iir_nNN_r31x31c25( int sample, const int coefficients[], int history[], int order );
int xsignalproc_iir_nNN_r31x28c31( int sample, const int coefficients[], int history[], int order );
int xsignalproc_iir_nNN_r31x28c28( int sample, const int coefficients[], int history[], int order );
int xsignalproc_iir_nNN_r31x28c25( int sample, const int coefficients[], int history[], int order );
int xsignalproc_iir_nNN_r31x25c31( int sample, const int coefficients[], int history[], int order );
int xsignalproc_iir_nNN_r31x25c28( int sample, const int coefficients[], int history[], int order );
int xsignalproc_iir_nNN_r31x25c25( int sample, const int coefficients[], int history[], int order );
int xsignalproc_iir_nNN_r28x31c31( int sample, const int coefficients[], int history[], int order );
int xsignalproc_iir_nNN_r28x31c28( int sample, const int coefficients[], int history[], int order );
int xsignalproc_iir_nNN_r28x31c25( int sample, const int coefficients[], int history[], int order );
int xsignalproc_iir_nNN_r28x28c31( int sample, const int coefficients[], int history[], int order );
int xsignalproc_iir_nNN_r28x28c28( int sample, const int coefficients[], int history[], int order );
int xsignalproc_iir_nNN_r28x28c25( int sample, const int coefficients[], int history[], int order );
int xsignalproc_iir_nNN_r28x25c31( int sample, const int coefficients[], int history[], int order );
int xsignalproc_iir_nNN_r28x25c28( int sample, const int coefficients[], int history[], int order );
int xsignalproc_iir_nNN_r28x25c25( int sample, const int coefficients[], int history[], int order );
int xsignalproc_iir_nNN_r25x31c31( int sample, const int coefficients[], int history[], int order );
int xsignalproc_iir_nNN_r25x31c28( int sample, const int coefficients[], int history[], int order );
int xsignalproc_iir_nNN_r25x31c25( int sample, const int coefficients[], int history[], int order );
int xsignalproc_iir_nNN_r25x28c31( int sample, const int coefficients[], int history[], int order );
int xsignalproc_iir_nNN_r25x28c28( int sample, const int coefficients[], int history[], int order );
int xsignalproc_iir_nNN_r25x28c25( int sample, const int coefficients[], int history[], int order );
int xsignalproc_iir_nNN_r25x25c31( int sample, const int coefficients[], int history[], int order );
int xsignalproc_iir_nNN_r25x25c28( int sample, const int coefficients[], int history[], int order );
int xsignalproc_iir_nNN_r25x25c25( int sample, const int coefficients[], int history[], int order );

// Fixed (5th, 10th, 20th, 40th) order IIR Filters

// Note: 'coefficient' array size is equal to 2 * filter_order + 1
// Note: coeffients in the array (starting with offset 0) are arranged as B0, B1, ... BN, A1, ... A(N-1)
// Note: 'history' array size is equal to  2 * filter order + 1
// Note: 'history' must be inititalized to all zeros (except for the last element - see next note)

// Note: The last element in the history array is used as a filter algorithm state-machine state variable and
//       must be initialized to a value of ranging from 0 through 3.

// Example: int coefficients[5] = {[?],[?],[?],[?],[?],} // Array literal of 5th order filter coefficients
//          int history[5] = {0,0,0,0,0};                // Array literal of 5th order filter history data

#define XSIGNALPROC_IIR_NN_INTERFACE( N ) \
        \
        int xsignalproc_iir_n##N##_r31x31c31( int sample, const int coefficients[2*N+1], int history[2*N+1] ); \
        int xsignalproc_iir_n##N##_r31x31c28( int sample, const int coefficients[2*N+1], int history[2*N+1] ); \
        int xsignalproc_iir_n##N##_r31x31c25( int sample, const int coefficients[2*N+1], int history[2*N+1] ); \
        int xsignalproc_iir_n##N##_r31x28c31( int sample, const int coefficients[2*N+1], int history[2*N+1] ); \
        int xsignalproc_iir_n##N##_r31x28c28( int sample, const int coefficients[2*N+1], int history[2*N+1] ); \
        int xsignalproc_iir_n##N##_r31x28c25( int sample, const int coefficients[2*N+1], int history[2*N+1] ); \
        int xsignalproc_iir_n##N##_r31x25c31( int sample, const int coefficients[2*N+1], int history[2*N+1] ); \
        int xsignalproc_iir_n##N##_r31x25c28( int sample, const int coefficients[2*N+1], int history[2*N+1] ); \
        int xsignalproc_iir_n##N##_r31x25c25( int sample, const int coefficients[2*N+1], int history[2*N+1] ); \
        int xsignalproc_iir_n##N##_r28x31c31( int sample, const int coefficients[2*N+1], int history[2*N+1] ); \
        int xsignalproc_iir_n##N##_r28x31c28( int sample, const int coefficients[2*N+1], int history[2*N+1] ); \
        int xsignalproc_iir_n##N##_r28x31c25( int sample, const int coefficients[2*N+1], int history[2*N+1] ); \
        int xsignalproc_iir_n##N##_r28x28c31( int sample, const int coefficients[2*N+1], int history[2*N+1] ); \
        int xsignalproc_iir_n##N##_r28x28c28( int sample, const int coefficients[2*N+1], int history[2*N+1] ); \
        int xsignalproc_iir_n##N##_r28x28c25( int sample, const int coefficients[2*N+1], int history[2*N+1] ); \
        int xsignalproc_iir_n##N##_r28x25c31( int sample, const int coefficients[2*N+1], int history[2*N+1] ); \
        int xsignalproc_iir_n##N##_r28x25c28( int sample, const int coefficients[2*N+1], int history[2*N+1] ); \
        int xsignalproc_iir_n##N##_r28x25c25( int sample, const int coefficients[2*N+1], int history[2*N+1] ); \
        int xsignalproc_iir_n##N##_r25x31c31( int sample, const int coefficients[2*N+1], int history[2*N+1] ); \
        int xsignalproc_iir_n##N##_r25x31c28( int sample, const int coefficients[2*N+1], int history[2*N+1] ); \
        int xsignalproc_iir_n##N##_r25x31c25( int sample, const int coefficients[2*N+1], int history[2*N+1] ); \
        int xsignalproc_iir_n##N##_r25x28c31( int sample, const int coefficients[2*N+1], int history[2*N+1] ); \
        int xsignalproc_iir_n##N##_r25x28c28( int sample, const int coefficients[2*N+1], int history[2*N+1] ); \
        int xsignalproc_iir_n##N##_r25x28c25( int sample, const int coefficients[2*N+1], int history[2*N+1] ); \
        int xsignalproc_iir_n##N##_r25x25c31( int sample, const int coefficients[2*N+1], int history[2*N+1] ); \
        int xsignalproc_iir_n##N##_r25x25c28( int sample, const int coefficients[2*N+1], int history[2*N+1] ); \
        int xsignalproc_iir_n##N##_r25x25c25( int sample, const int coefficients[2*N+1], int history[2*N+1] ); \

XSIGNALPROC_IIR_NN_INTERFACE( 01 )
XSIGNALPROC_IIR_NN_INTERFACE( 02 )
XSIGNALPROC_IIR_NN_INTERFACE( 03 )
XSIGNALPROC_IIR_NN_INTERFACE( 04 )
XSIGNALPROC_IIR_NN_INTERFACE( 05 )

#endif

xsignalproc_iir.xc

#include "xstream-dsp-iir.h"
#include "xstream-dsp-types.h"

#include <xs1.h>

#define _XSIGNALPROC_IIRnn \
    register int ah=0; register unsigned rr, al=0; \
    for( int i = 1*nn; i > 1; --i ) {{ah,al} = macs( hh[i-1], ba[i], ah, al ); hh[i-1] = hh[i-2];} \
    {ah,al} = macs( hh[0], ba[ 1], ah, al ); hh[0] = xx; \
    {ah,al} = macs( xx,    ba[ 0], ah, al ); \
    for( int i = 2*nn; i > nn+1; --i ) {{ah,al} = macs( hh[i-1], ba[i], ah, al ); hh[i-1] = hh[i-2];} \
    {ah,al} = macs( hh[nn], ba[nn+1], ah, al ); \
    hh[nn] = rr

int _xsignalproc_iirNN_R05( int xx, const int ba[], int hh[], int nn ) {_XSIGNALPROC_IIRnn = (ah>> 5);          return rr; }
int _xsignalproc_iirNN_R02( int xx, const int ba[], int hh[], int nn ) {_XSIGNALPROC_IIRnn = (ah>> 2);          return rr; }
int _xsignalproc_iirNN_L01( int xx, const int ba[], int hh[], int nn ) {_XSIGNALPROC_IIRnn = (ah<< 1)+(al>>31); return rr; }
int _xsignalproc_iirNN_L04( int xx, const int ba[], int hh[], int nn ) {_XSIGNALPROC_IIRnn = (ah<< 4)+(al>>28); return rr; }
int _xsignalproc_iirNN_L07( int xx, const int ba[], int hh[], int nn ) {_XSIGNALPROC_IIRnn = (ah<< 7)+(al>>25); return rr; }
int _xsignalproc_iirNN_L10( int xx, const int ba[], int hh[], int nn ) {_XSIGNALPROC_IIRnn = (ah<<10)+(al>>22); return rr; }
int _xsignalproc_iirNN_L13( int xx, const int ba[], int hh[], int nn ) {_XSIGNALPROC_IIRnn = (ah<<13)+(al>>19); return rr; }

int xsignalproc_iir_nNN_r31x31c31( int xx, const int bb[], int hh[], int nn ) { return _xsignalproc_iirNN_L01( xx, bb, hh, nn ); }
int xsignalproc_iir_nNN_r31x31c28( int xx, const int bb[], int hh[], int nn ) { return _xsignalproc_iirNN_L04( xx, bb, hh, nn ); }
int xsignalproc_iir_nNN_r31x31c25( int xx, const int bb[], int hh[], int nn ) { return _xsignalproc_iirNN_L07( xx, bb, hh, nn ); }
int xsignalproc_iir_nNN_r31x28c31( int xx, const int bb[], int hh[], int nn ) { return _xsignalproc_iirNN_L04( xx, bb, hh, nn ); }
int xsignalproc_iir_nNN_r31x28c28( int xx, const int bb[], int hh[], int nn ) { return _xsignalproc_iirNN_L07( xx, bb, hh, nn ); }
int xsignalproc_iir_nNN_r31x28c25( int xx, const int bb[], int hh[], int nn ) { return _xsignalproc_iirNN_L10( xx, bb, hh, nn ); }
int xsignalproc_iir_nNN_r31x25c31( int xx, const int bb[], int hh[], int nn ) { return _xsignalproc_iirNN_L07( xx, bb, hh, nn ); }
int xsignalproc_iir_nNN_r31x25c28( int xx, const int bb[], int hh[], int nn ) { return _xsignalproc_iirNN_L10( xx, bb, hh, nn ); }
int xsignalproc_iir_nNN_r31x25c25( int xx, const int bb[], int hh[], int nn ) { return _xsignalproc_iirNN_L13( xx, bb, hh, nn ); }
int xsignalproc_iir_nNN_r28x31c31( int xx, const int bb[], int hh[], int nn ) { return _xsignalproc_iirNN_R02( xx, bb, hh, nn ); }
int xsignalproc_iir_nNN_r28x31c28( int xx, const int bb[], int hh[], int nn ) { return _xsignalproc_iirNN_L01( xx, bb, hh, nn ); }
int xsignalproc_iir_nNN_r28x31c25( int xx, const int bb[], int hh[], int nn ) { return _xsignalproc_iirNN_L04( xx, bb, hh, nn ); }
int xsignalproc_iir_nNN_r28x28c31( int xx, const int bb[], int hh[], int nn ) { return _xsignalproc_iirNN_L01( xx, bb, hh, nn ); }
int xsignalproc_iir_nNN_r28x28c28( int xx, const int bb[], int hh[], int nn ) { return _xsignalproc_iirNN_L04( xx, bb, hh, nn ); }
int xsignalproc_iir_nNN_r28x28c25( int xx, const int bb[], int hh[], int nn ) { return _xsignalproc_iirNN_L07( xx, bb, hh, nn ); }
int xsignalproc_iir_nNN_r28x25c31( int xx, const int bb[], int hh[], int nn ) { return _xsignalproc_iirNN_L04( xx, bb, hh, nn ); }
int xsignalproc_iir_nNN_r28x25c28( int xx, const int bb[], int hh[], int nn ) { return _xsignalproc_iirNN_L07( xx, bb, hh, nn ); }
int xsignalproc_iir_nNN_r28x25c25( int xx, const int bb[], int hh[], int nn ) { return _xsignalproc_iirNN_L10( xx, bb, hh, nn ); }
int xsignalproc_iir_nNN_r25x31c31( int xx, const int bb[], int hh[], int nn ) { return _xsignalproc_iirNN_R05( xx, bb, hh, nn ); }
int xsignalproc_iir_nNN_r25x31c28( int xx, const int bb[], int hh[], int nn ) { return _xsignalproc_iirNN_R02( xx, bb, hh, nn ); }
int xsignalproc_iir_nNN_r25x31c25( int xx, const int bb[], int hh[], int nn ) { return _xsignalproc_iirNN_L01( xx, bb, hh, nn ); }
int xsignalproc_iir_nNN_r25x28c31( int xx, const int bb[], int hh[], int nn ) { return _xsignalproc_iirNN_R02( xx, bb, hh, nn ); }
int xsignalproc_iir_nNN_r25x28c28( int xx, const int bb[], int hh[], int nn ) { return _xsignalproc_iirNN_L01( xx, bb, hh, nn ); }
int xsignalproc_iir_nNN_r25x28c25( int xx, const int bb[], int hh[], int nn ) { return _xsignalproc_iirNN_L04( xx, bb, hh, nn ); }
int xsignalproc_iir_nNN_r25x25c31( int xx, const int bb[], int hh[], int nn ) { return _xsignalproc_iirNN_L01( xx, bb, hh, nn ); }
int xsignalproc_iir_nNN_r25x25c28( int xx, const int bb[], int hh[], int nn ) { return _xsignalproc_iirNN_L04( xx, bb, hh, nn ); }
int xsignalproc_iir_nNN_r25x25c25( int xx, const int bb[], int hh[], int nn ) { return _xsignalproc_iirNN_L07( xx, bb, hh, nn ); }

inline int _xsignalproc_adjust_R05( int ah, unsigned al ) { return (ah>>5); }
inline int _xsignalproc_adjust_R02( int ah, unsigned al ) { return (ah>>2); }
inline int _xsignalproc_adjust_L01( int ah, unsigned al ) { return (ah<< 1)+(al>>31); }
inline int _xsignalproc_adjust_L04( int ah, unsigned al ) { return (ah<< 4)+(al>>28); }
inline int _xsignalproc_adjust_L07( int ah, unsigned al ) { return (ah<< 7)+(al>>25); }
inline int _xsignalproc_adjust_L10( int ah, unsigned al ) { return (ah<<10)+(al>>22); }
inline int _xsignalproc_adjust_L13( int ah, unsigned al ) { return (ah<<13)+(al>>19); }

#define _XSIGNALPROC_IIR01 \
    \
    register int ah=0; register unsigned rr, al=0; \
    {ah,al} = macs( hh[0], ba[ 1], ah, al ); hh[0] = xx; \
    {ah,al} = macs( xx,    ba[ 0], ah, al ); \
    {ah,al} = macs( hh[1], ba[ 2], ah, al ); hh[1] = rr

int _xsignalproc_iir01_R05( int xx, const int ba[3], int hh[3] ) {_XSIGNALPROC_IIR01 = (ah>> 5);          return rr; }
int _xsignalproc_iir01_R02( int xx, const int ba[3], int hh[3] ) {_XSIGNALPROC_IIR01 = (ah>> 2);          return rr; }
int _xsignalproc_iir01_L01( int xx, const int ba[3], int hh[3] ) {_XSIGNALPROC_IIR01 = (ah<< 1)+(al>>31); return rr; }
int _xsignalproc_iir01_L04( int xx, const int ba[3], int hh[3] ) {_XSIGNALPROC_IIR01 = (ah<< 4)+(al>>28); return rr; }
int _xsignalproc_iir01_L07( int xx, const int ba[3], int hh[3] ) {_XSIGNALPROC_IIR01 = (ah<< 7)+(al>>25); return rr; }
int _xsignalproc_iir01_L10( int xx, const int ba[3], int hh[3] ) {_XSIGNALPROC_IIR01 = (ah<<10)+(al>>22); return rr; }
int _xsignalproc_iir01_L13( int xx, const int ba[3], int hh[3] ) {_XSIGNALPROC_IIR01 = (ah<<13)+(al>>19); return rr; }

int xsignalproc_iir_n01_r31x31c31( int xx, const int ba[3], int hh[3] ) { return _xsignalproc_iir01_L01( xx, ba, hh ); }
int xsignalproc_iir_n01_r31x31c28( int xx, const int ba[3], int hh[3] ) { return _xsignalproc_iir01_L04( xx, ba, hh ); }
int xsignalproc_iir_n01_r31x31c25( int xx, const int ba[3], int hh[3] ) { return _xsignalproc_iir01_L07( xx, ba, hh ); }
int xsignalproc_iir_n01_r31x28c31( int xx, const int ba[3], int hh[3] ) { return _xsignalproc_iir01_L04( xx, ba, hh ); }
int xsignalproc_iir_n01_r31x28c28( int xx, const int ba[3], int hh[3] ) { return _xsignalproc_iir01_L07( xx, ba, hh ); }
int xsignalproc_iir_n01_r31x28c25( int xx, const int ba[3], int hh[3] ) { return _xsignalproc_iir01_L10( xx, ba, hh ); }
int xsignalproc_iir_n01_r31x25c31( int xx, const int ba[3], int hh[3] ) { return _xsignalproc_iir01_L07( xx, ba, hh ); }
int xsignalproc_iir_n01_r31x25c28( int xx, const int ba[3], int hh[3] ) { return _xsignalproc_iir01_L10( xx, ba, hh ); }
int xsignalproc_iir_n01_r31x25c25( int xx, const int ba[3], int hh[3] ) { return _xsignalproc_iir01_L13( xx, ba, hh ); }
int xsignalproc_iir_n01_r28x31c31( int xx, const int ba[3], int hh[3] ) { return _xsignalproc_iir01_R02( xx, ba, hh ); }
int xsignalproc_iir_n01_r28x31c28( int xx, const int ba[3], int hh[3] ) { return _xsignalproc_iir01_L01( xx, ba, hh ); }
int xsignalproc_iir_n01_r28x31c25( int xx, const int ba[3], int hh[3] ) { return _xsignalproc_iir01_L04( xx, ba, hh ); }
int xsignalproc_iir_n01_r28x28c31( int xx, const int ba[3], int hh[3] ) { return _xsignalproc_iir01_L01( xx, ba, hh ); }
int xsignalproc_iir_n01_r28x28c28( int xx, const int ba[3], int hh[3] ) { return _xsignalproc_iir01_L04( xx, ba, hh ); }
int xsignalproc_iir_n01_r28x28c25( int xx, const int ba[3], int hh[3] ) { return _xsignalproc_iir01_L07( xx, ba, hh ); }
int xsignalproc_iir_n01_r28x25c31( int xx, const int ba[3], int hh[3] ) { return _xsignalproc_iir01_L04( xx, ba, hh ); }
int xsignalproc_iir_n01_r28x25c28( int xx, const int ba[3], int hh[3] ) { return _xsignalproc_iir01_L07( xx, ba, hh ); }
int xsignalproc_iir_n01_r28x25c25( int xx, const int ba[3], int hh[3] ) { return _xsignalproc_iir01_L10( xx, ba, hh ); }
int xsignalproc_iir_n01_r25x31c31( int xx, const int ba[3], int hh[3] ) { return _xsignalproc_iir01_R05( xx, ba, hh ); }
int xsignalproc_iir_n01_r25x31c28( int xx, const int ba[3], int hh[3] ) { return _xsignalproc_iir01_R02( xx, ba, hh ); }
int xsignalproc_iir_n01_r25x31c25( int xx, const int ba[3], int hh[3] ) { return _xsignalproc_iir01_L01( xx, ba, hh ); }
int xsignalproc_iir_n01_r25x28c31( int xx, const int ba[3], int hh[3] ) { return _xsignalproc_iir01_R02( xx, ba, hh ); }
int xsignalproc_iir_n01_r25x28c28( int xx, const int ba[3], int hh[3] ) { return _xsignalproc_iir01_L01( xx, ba, hh ); }
int xsignalproc_iir_n01_r25x28c25( int xx, const int ba[3], int hh[3] ) { return _xsignalproc_iir01_L04( xx, ba, hh ); }
int xsignalproc_iir_n01_r25x25c31( int xx, const int ba[3], int hh[3] ) { return _xsignalproc_iir01_L01( xx, ba, hh ); }
int xsignalproc_iir_n01_r25x25c28( int xx, const int ba[3], int hh[3] ) { return _xsignalproc_iir01_L04( xx, ba, hh ); }
int xsignalproc_iir_n01_r25x25c25( int xx, const int ba[3], int hh[3] ) { return _xsignalproc_iir01_L07( xx, ba, hh ); }

// Fixed Order (order = 2) IIR Filters

#define _XSIGNALPROC_IIR02(adjust) \
    \
    register int ah=0; register unsigned rr, al=0; \
    switch( hh[4] ) \
    { \
        case 0: hh[4] = 1; \
                {ah,al} = macs( hh[0], ba[ 2], ah, al ); \
                {ah,al} = macs( hh[1], ba[ 1], ah, al ); \
                {ah,al} = macs( xx,    ba[ 0], ah, al ); hh[0] = xx; \
                {ah,al} = macs( hh[2], ba[ 4], ah, al ); \
                {ah,al} = macs( hh[3], ba[ 3], ah, al ); hh[2] = rr = adjust(ah,al); break; \
        case 1: hh[4] = 0; \
                {ah,al} = macs( hh[1], ba[ 2], ah, al ); \
                {ah,al} = macs( hh[0], ba[ 1], ah, al ); \
                {ah,al} = macs( xx,    ba[ 0], ah, al ); hh[1] = xx; \
                {ah,al} = macs( hh[3], ba[ 4], ah, al ); \
                {ah,al} = macs( hh[2], ba[ 3], ah, al ); hh[3] = rr = adjust(ah,al); break; \
    }

int _xsignalproc_iir02_R05( int xx, const int ba[5], int hh[5] ) {_XSIGNALPROC_IIR02(_xsignalproc_adjust_R05); return rr; }
int _xsignalproc_iir02_R02( int xx, const int ba[5], int hh[5] ) {_XSIGNALPROC_IIR02(_xsignalproc_adjust_R02); return rr; }
int _xsignalproc_iir02_L01( int xx, const int ba[5], int hh[5] ) {_XSIGNALPROC_IIR02(_xsignalproc_adjust_L01); return rr; }
int _xsignalproc_iir02_L04( int xx, const int ba[5], int hh[5] ) {_XSIGNALPROC_IIR02(_xsignalproc_adjust_L04); return rr; }
int _xsignalproc_iir02_L07( int xx, const int ba[5], int hh[5] ) {_XSIGNALPROC_IIR02(_xsignalproc_adjust_L07); return rr; }
int _xsignalproc_iir02_L10( int xx, const int ba[5], int hh[5] ) {_XSIGNALPROC_IIR02(_xsignalproc_adjust_L10); return rr; }
int _xsignalproc_iir02_L13( int xx, const int ba[5], int hh[5] ) {_XSIGNALPROC_IIR02(_xsignalproc_adjust_L13); return rr; }

int xsignalproc_iir_n02_r31x31c31( int xx, const int ba[5], int hh[5] ) { return _xsignalproc_iir02_L01( xx, ba, hh ); }
int xsignalproc_iir_n02_r31x31c28( int xx, const int ba[5], int hh[5] ) { return _xsignalproc_iir02_L04( xx, ba, hh ); }
int xsignalproc_iir_n02_r31x31c25( int xx, const int ba[5], int hh[5] ) { return _xsignalproc_iir02_L07( xx, ba, hh ); }
int xsignalproc_iir_n02_r31x28c31( int xx, const int ba[5], int hh[5] ) { return _xsignalproc_iir02_L04( xx, ba, hh ); }
int xsignalproc_iir_n02_r31x28c28( int xx, const int ba[5], int hh[5] ) { return _xsignalproc_iir02_L07( xx, ba, hh ); }
int xsignalproc_iir_n02_r31x28c25( int xx, const int ba[5], int hh[5] ) { return _xsignalproc_iir02_L10( xx, ba, hh ); }
int xsignalproc_iir_n02_r31x25c31( int xx, const int ba[5], int hh[5] ) { return _xsignalproc_iir02_L07( xx, ba, hh ); }
int xsignalproc_iir_n02_r31x25c28( int xx, const int ba[5], int hh[5] ) { return _xsignalproc_iir02_L10( xx, ba, hh ); }
int xsignalproc_iir_n02_r31x25c25( int xx, const int ba[5], int hh[5] ) { return _xsignalproc_iir02_L13( xx, ba, hh ); }
int xsignalproc_iir_n02_r28x31c31( int xx, const int ba[5], int hh[5] ) { return _xsignalproc_iir02_R02( xx, ba, hh ); }
int xsignalproc_iir_n02_r28x31c28( int xx, const int ba[5], int hh[5] ) { return _xsignalproc_iir02_L01( xx, ba, hh ); }
int xsignalproc_iir_n02_r28x31c25( int xx, const int ba[5], int hh[5] ) { return _xsignalproc_iir02_L04( xx, ba, hh ); }
int xsignalproc_iir_n02_r28x28c31( int xx, const int ba[5], int hh[5] ) { return _xsignalproc_iir02_L01( xx, ba, hh ); }
int xsignalproc_iir_n02_r28x28c28( int xx, const int ba[5], int hh[5] ) { return _xsignalproc_iir02_L04( xx, ba, hh ); }
int xsignalproc_iir_n02_r28x28c25( int xx, const int ba[5], int hh[5] ) { return _xsignalproc_iir02_L07( xx, ba, hh ); }
int xsignalproc_iir_n02_r28x25c31( int xx, const int ba[5], int hh[5] ) { return _xsignalproc_iir02_L04( xx, ba, hh ); }
int xsignalproc_iir_n02_r28x25c28( int xx, const int ba[5], int hh[5] ) { return _xsignalproc_iir02_L07( xx, ba, hh ); }
int xsignalproc_iir_n02_r28x25c25( int xx, const int ba[5], int hh[5] ) { return _xsignalproc_iir02_L10( xx, ba, hh ); }
int xsignalproc_iir_n02_r25x31c31( int xx, const int ba[5], int hh[5] ) { return _xsignalproc_iir02_R05( xx, ba, hh ); }
int xsignalproc_iir_n02_r25x31c28( int xx, const int ba[5], int hh[5] ) { return _xsignalproc_iir02_R02( xx, ba, hh ); }
int xsignalproc_iir_n02_r25x31c25( int xx, const int ba[5], int hh[5] ) { return _xsignalproc_iir02_L01( xx, ba, hh ); }
int xsignalproc_iir_n02_r25x28c31( int xx, const int ba[5], int hh[5] ) { return _xsignalproc_iir02_R02( xx, ba, hh ); }
int xsignalproc_iir_n02_r25x28c28( int xx, const int ba[5], int hh[5] ) { return _xsignalproc_iir02_L01( xx, ba, hh ); }
int xsignalproc_iir_n02_r25x28c25( int xx, const int ba[5], int hh[5] ) { return _xsignalproc_iir02_L04( xx, ba, hh ); }
int xsignalproc_iir_n02_r25x25c31( int xx, const int ba[5], int hh[5] ) { return _xsignalproc_iir02_L01( xx, ba, hh ); }
int xsignalproc_iir_n02_r25x25c28( int xx, const int ba[5], int hh[5] ) { return _xsignalproc_iir02_L04( xx, ba, hh ); }
int xsignalproc_iir_n02_r25x25c25( int xx, const int ba[5], int hh[5] ) { return _xsignalproc_iir02_L07( xx, ba, hh ); }

// Fixed Order (order = 3) IIR Filters

#define _XSIGNALPROC_IIR03( adjust ) \
    \
    register int ah=0; register unsigned rr, al=0; \
    switch( hh[6] ) \
    { \
        case 0: hh[6] = 1; \
                {ah,al} = macs( hh[2], ba[ 3], ah, al ); \
                {ah,al} = macs( hh[1], ba[ 2], ah, al ); \
                {ah,al} = macs( hh[0], ba[ 1], ah, al ); \
                {ah,al} = macs( xx,    ba[ 0], ah, al ); hh[2] = xx; \
                {ah,al} = macs( hh[5], ba[ 6], ah, al ); \
                {ah,al} = macs( hh[4], ba[ 5], ah, al ); \
                {ah,al} = macs( hh[3], ba[ 4], ah, al ); hh[5] = rr = adjust(ah,al); break; \
            case 1: hh[6] = 2; \
                {ah,al} = macs( hh[1], ba[ 3], ah, al ); \
                {ah,al} = macs( hh[0], ba[ 2], ah, al ); \
                {ah,al} = macs( hh[2], ba[ 1], ah, al ); \
                {ah,al} = macs( xx,    ba[ 0], ah, al ); hh[1] = xx; \
                {ah,al} = macs( hh[4], ba[ 6], ah, al ); \
                {ah,al} = macs( hh[3], ba[ 5], ah, al ); \
                {ah,al} = macs( hh[5], ba[ 4], ah, al ); hh[4] = rr = adjust(ah,al); break; \
            case 2: hh[6] = 0; \
                {ah,al} = macs( hh[0], ba[ 3], ah, al ); \
                {ah,al} = macs( hh[2], ba[ 2], ah, al ); \
                {ah,al} = macs( hh[1], ba[ 1], ah, al ); \
                {ah,al} = macs( xx,    ba[ 0], ah, al ); hh[0] = xx; \
                {ah,al} = macs( hh[3], ba[ 6], ah, al ); \
                {ah,al} = macs( hh[5], ba[ 5], ah, al ); \
                {ah,al} = macs( hh[4], ba[ 4], ah, al ); hh[3] = rr = adjust(ah,al); break; \
    }

int _xsignalproc_iir03_R05( int xx, const int ba[7], int hh[7] ) {_XSIGNALPROC_IIR03(_xsignalproc_adjust_R05); return rr; }
int _xsignalproc_iir03_R02( int xx, const int ba[7], int hh[7] ) {_XSIGNALPROC_IIR03(_xsignalproc_adjust_R02); return rr; }
int _xsignalproc_iir03_L01( int xx, const int ba[7], int hh[7] ) {_XSIGNALPROC_IIR03(_xsignalproc_adjust_L01); return rr; }
int _xsignalproc_iir03_L04( int xx, const int ba[7], int hh[7] ) {_XSIGNALPROC_IIR03(_xsignalproc_adjust_L04); return rr; }
int _xsignalproc_iir03_L07( int xx, const int ba[7], int hh[7] ) {_XSIGNALPROC_IIR03(_xsignalproc_adjust_L07); return rr; }
int _xsignalproc_iir03_L10( int xx, const int ba[7], int hh[7] ) {_XSIGNALPROC_IIR03(_xsignalproc_adjust_L10); return rr; }
int _xsignalproc_iir03_L13( int xx, const int ba[7], int hh[7] ) {_XSIGNALPROC_IIR03(_xsignalproc_adjust_L13); return rr; }

int xsignalproc_iir_n03_r31x31c31( int xx, const int ba[7], int hh[7] ) { return _xsignalproc_iir03_L01( xx, ba, hh ); }
int xsignalproc_iir_n03_r31x31c28( int xx, const int ba[7], int hh[7] ) { return _xsignalproc_iir03_L04( xx, ba, hh ); }
int xsignalproc_iir_n03_r31x31c25( int xx, const int ba[7], int hh[7] ) { return _xsignalproc_iir03_L07( xx, ba, hh ); }
int xsignalproc_iir_n03_r31x28c31( int xx, const int ba[7], int hh[7] ) { return _xsignalproc_iir03_L04( xx, ba, hh ); }
int xsignalproc_iir_n03_r31x28c28( int xx, const int ba[7], int hh[7] ) { return _xsignalproc_iir03_L07( xx, ba, hh ); }
int xsignalproc_iir_n03_r31x28c25( int xx, const int ba[7], int hh[7] ) { return _xsignalproc_iir03_L10( xx, ba, hh ); }
int xsignalproc_iir_n03_r31x25c31( int xx, const int ba[7], int hh[7] ) { return _xsignalproc_iir03_L07( xx, ba, hh ); }
int xsignalproc_iir_n03_r31x25c28( int xx, const int ba[7], int hh[7] ) { return _xsignalproc_iir03_L10( xx, ba, hh ); }
int xsignalproc_iir_n03_r31x25c25( int xx, const int ba[7], int hh[7] ) { return _xsignalproc_iir03_L13( xx, ba, hh ); }
int xsignalproc_iir_n03_r28x31c31( int xx, const int ba[7], int hh[7] ) { return _xsignalproc_iir03_R02( xx, ba, hh ); }
int xsignalproc_iir_n03_r28x31c28( int xx, const int ba[7], int hh[7] ) { return _xsignalproc_iir03_L01( xx, ba, hh ); }
int xsignalproc_iir_n03_r28x31c25( int xx, const int ba[7], int hh[7] ) { return _xsignalproc_iir03_L04( xx, ba, hh ); }
int xsignalproc_iir_n03_r28x28c31( int xx, const int ba[7], int hh[7] ) { return _xsignalproc_iir03_L01( xx, ba, hh ); }
int xsignalproc_iir_n03_r28x28c28( int xx, const int ba[7], int hh[7] ) { return _xsignalproc_iir03_L04( xx, ba, hh ); }
int xsignalproc_iir_n03_r28x28c25( int xx, const int ba[7], int hh[7] ) { return _xsignalproc_iir03_L07( xx, ba, hh ); }
int xsignalproc_iir_n03_r28x25c31( int xx, const int ba[7], int hh[7] ) { return _xsignalproc_iir03_L04( xx, ba, hh ); }
int xsignalproc_iir_n03_r28x25c28( int xx, const int ba[7], int hh[7] ) { return _xsignalproc_iir03_L07( xx, ba, hh ); }
int xsignalproc_iir_n03_r28x25c25( int xx, const int ba[7], int hh[7] ) { return _xsignalproc_iir03_L10( xx, ba, hh ); }
int xsignalproc_iir_n03_r25x31c31( int xx, const int ba[7], int hh[7] ) { return _xsignalproc_iir03_R05( xx, ba, hh ); }
int xsignalproc_iir_n03_r25x31c28( int xx, const int ba[7], int hh[7] ) { return _xsignalproc_iir03_R02( xx, ba, hh ); }
int xsignalproc_iir_n03_r25x31c25( int xx, const int ba[7], int hh[7] ) { return _xsignalproc_iir03_L01( xx, ba, hh ); }
int xsignalproc_iir_n03_r25x28c31( int xx, const int ba[7], int hh[7] ) { return _xsignalproc_iir03_R02( xx, ba, hh ); }
int xsignalproc_iir_n03_r25x28c28( int xx, const int ba[7], int hh[7] ) { return _xsignalproc_iir03_L01( xx, ba, hh ); }
int xsignalproc_iir_n03_r25x28c25( int xx, const int ba[7], int hh[7] ) { return _xsignalproc_iir03_L04( xx, ba, hh ); }
int xsignalproc_iir_n03_r25x25c31( int xx, const int ba[7], int hh[7] ) { return _xsignalproc_iir03_L01( xx, ba, hh ); }
int xsignalproc_iir_n03_r25x25c28( int xx, const int ba[7], int hh[7] ) { return _xsignalproc_iir03_L04( xx, ba, hh ); }
int xsignalproc_iir_n03_r25x25c25( int xx, const int ba[7], int hh[7] ) { return _xsignalproc_iir03_L07( xx, ba, hh ); }

// Fixed Order (order = 4) IIR Filters

#define _XSIGNALPROC_IIR04( adjust ) \
    \
    register int ah=0; register unsigned rr, al=0; \
    switch( hh[8] ) \
    { \
        case 0: hh[8] = 1; \
                {ah,al} = macs( hh[3], ba[ 4], ah, al ); \
                {ah,al} = macs( hh[2], ba[ 3], ah, al ); \
                {ah,al} = macs( hh[1], ba[ 2], ah, al ); \
                {ah,al} = macs( hh[0], ba[ 1], ah, al ); \
                {ah,al} = macs( xx,    ba[ 0], ah, al ); hh[3] = xx; \
                {ah,al} = macs( hh[7], ba[ 8], ah, al ); \
                {ah,al} = macs( hh[6], ba[ 7], ah, al ); \
                {ah,al} = macs( hh[5], ba[ 6], ah, al ); \
                {ah,al} = macs( hh[4], ba[ 5], ah, al ); hh[7] = rr = adjust(ah,al); break; \
        case 1: hh[8] = 2; \
                {ah,al} = macs( hh[2], ba[ 4], ah, al ); \
                {ah,al} = macs( hh[1], ba[ 3], ah, al ); \
                {ah,al} = macs( hh[0], ba[ 2], ah, al ); \
                {ah,al} = macs( hh[3], ba[ 1], ah, al ); \
                {ah,al} = macs( xx,    ba[ 0], ah, al ); hh[2] = xx; \
                {ah,al} = macs( hh[6], ba[ 8], ah, al ); \
                {ah,al} = macs( hh[5], ba[ 7], ah, al ); \
                {ah,al} = macs( hh[4], ba[ 6], ah, al ); \
                {ah,al} = macs( hh[7], ba[ 5], ah, al ); hh[6] = rr = adjust(ah,al); break; \
        case 2: hh[8] = 3; \
                {ah,al} = macs( hh[1], ba[ 4], ah, al ); \
                {ah,al} = macs( hh[0], ba[ 3], ah, al ); \
                {ah,al} = macs( hh[3], ba[ 2], ah, al ); \
                {ah,al} = macs( hh[2], ba[ 1], ah, al ); \
                {ah,al} = macs( xx,    ba[ 0], ah, al ); hh[1] = xx; \
                {ah,al} = macs( hh[5], ba[ 8], ah, al ); \
                {ah,al} = macs( hh[4], ba[ 7], ah, al ); \
                {ah,al} = macs( hh[7], ba[ 6], ah, al ); \
                {ah,al} = macs( hh[6], ba[ 5], ah, al ); hh[5] = rr = adjust(ah,al); break; \
        case 3: hh[8] = 0; \
                {ah,al} = macs( hh[0], ba[ 4], ah, al ); \
                {ah,al} = macs( hh[3], ba[ 3], ah, al ); \
                {ah,al} = macs( hh[2], ba[ 2], ah, al ); \
                {ah,al} = macs( hh[1], ba[ 1], ah, al ); \
                {ah,al} = macs( xx,    ba[ 0], ah, al ); hh[0] = xx; \
                {ah,al} = macs( hh[4], ba[ 8], ah, al ); \
                {ah,al} = macs( hh[7], ba[ 7], ah, al ); \
                {ah,al} = macs( hh[6], ba[ 6], ah, al ); \
                {ah,al} = macs( hh[5], ba[ 5], ah, al ); hh[4] = rr = adjust(ah,al); break; \
    }

int _xsignalproc_iir04_R05( int xx, const int ba[9], int hh[9] ) {_XSIGNALPROC_IIR04(_xsignalproc_adjust_R05); return rr; }
int _xsignalproc_iir04_R02( int xx, const int ba[9], int hh[9] ) {_XSIGNALPROC_IIR04(_xsignalproc_adjust_R02); return rr; }
int _xsignalproc_iir04_L01( int xx, const int ba[9], int hh[9] ) {_XSIGNALPROC_IIR04(_xsignalproc_adjust_L01); return rr; }
int _xsignalproc_iir04_L04( int xx, const int ba[9], int hh[9] ) {_XSIGNALPROC_IIR04(_xsignalproc_adjust_L04); return rr; }
int _xsignalproc_iir04_L07( int xx, const int ba[9], int hh[9] ) {_XSIGNALPROC_IIR04(_xsignalproc_adjust_L07); return rr; }
int _xsignalproc_iir04_L10( int xx, const int ba[9], int hh[9] ) {_XSIGNALPROC_IIR04(_xsignalproc_adjust_L10); return rr; }
int _xsignalproc_iir04_L13( int xx, const int ba[9], int hh[9] ) {_XSIGNALPROC_IIR04(_xsignalproc_adjust_L13); return rr; }

int xsignalproc_iir_n04_r31x31c31( int xx, const int ba[9], int hh[9] ) { return _xsignalproc_iir04_L01( xx, ba, hh ); }
int xsignalproc_iir_n04_r31x31c28( int xx, const int ba[9], int hh[9] ) { return _xsignalproc_iir04_L04( xx, ba, hh ); }
int xsignalproc_iir_n04_r31x31c25( int xx, const int ba[9], int hh[9] ) { return _xsignalproc_iir04_L07( xx, ba, hh ); }
int xsignalproc_iir_n04_r31x28c31( int xx, const int ba[9], int hh[9] ) { return _xsignalproc_iir04_L04( xx, ba, hh ); }
int xsignalproc_iir_n04_r31x28c28( int xx, const int ba[9], int hh[9] ) { return _xsignalproc_iir04_L07( xx, ba, hh ); }
int xsignalproc_iir_n04_r31x28c25( int xx, const int ba[9], int hh[9] ) { return _xsignalproc_iir04_L10( xx, ba, hh ); }
int xsignalproc_iir_n04_r31x25c31( int xx, const int ba[9], int hh[9] ) { return _xsignalproc_iir04_L07( xx, ba, hh ); }
int xsignalproc_iir_n04_r31x25c28( int xx, const int ba[9], int hh[9] ) { return _xsignalproc_iir04_L10( xx, ba, hh ); }
int xsignalproc_iir_n04_r31x25c25( int xx, const int ba[9], int hh[9] ) { return _xsignalproc_iir04_L13( xx, ba, hh ); }
int xsignalproc_iir_n04_r28x31c31( int xx, const int ba[9], int hh[9] ) { return _xsignalproc_iir04_R02( xx, ba, hh ); }
int xsignalproc_iir_n04_r28x31c28( int xx, const int ba[9], int hh[9] ) { return _xsignalproc_iir04_L01( xx, ba, hh ); }
int xsignalproc_iir_n04_r28x31c25( int xx, const int ba[9], int hh[9] ) { return _xsignalproc_iir04_L04( xx, ba, hh ); }
int xsignalproc_iir_n04_r28x28c31( int xx, const int ba[9], int hh[9] ) { return _xsignalproc_iir04_L01( xx, ba, hh ); }
int xsignalproc_iir_n04_r28x28c28( int xx, const int ba[9], int hh[9] ) { return _xsignalproc_iir04_L04( xx, ba, hh ); }
int xsignalproc_iir_n04_r28x28c25( int xx, const int ba[9], int hh[9] ) { return _xsignalproc_iir04_L07( xx, ba, hh ); }
int xsignalproc_iir_n04_r28x25c31( int xx, const int ba[9], int hh[9] ) { return _xsignalproc_iir04_L04( xx, ba, hh ); }
int xsignalproc_iir_n04_r28x25c28( int xx, const int ba[9], int hh[9] ) { return _xsignalproc_iir04_L07( xx, ba, hh ); }
int xsignalproc_iir_n04_r28x25c25( int xx, const int ba[9], int hh[9] ) { return _xsignalproc_iir04_L10( xx, ba, hh ); }
int xsignalproc_iir_n04_r25x31c31( int xx, const int ba[9], int hh[9] ) { return _xsignalproc_iir04_R05( xx, ba, hh ); }
int xsignalproc_iir_n04_r25x31c28( int xx, const int ba[9], int hh[9] ) { return _xsignalproc_iir04_R02( xx, ba, hh ); }
int xsignalproc_iir_n04_r25x31c25( int xx, const int ba[9], int hh[9] ) { return _xsignalproc_iir04_L01( xx, ba, hh ); }
int xsignalproc_iir_n04_r25x28c31( int xx, const int ba[9], int hh[9] ) { return _xsignalproc_iir04_R02( xx, ba, hh ); }
int xsignalproc_iir_n04_r25x28c28( int xx, const int ba[9], int hh[9] ) { return _xsignalproc_iir04_L01( xx, ba, hh ); }
int xsignalproc_iir_n04_r25x28c25( int xx, const int ba[9], int hh[9] ) { return _xsignalproc_iir04_L04( xx, ba, hh ); }
int xsignalproc_iir_n04_r25x25c31( int xx, const int ba[9], int hh[9] ) { return _xsignalproc_iir04_L01( xx, ba, hh ); }
int xsignalproc_iir_n04_r25x25c28( int xx, const int ba[9], int hh[9] ) { return _xsignalproc_iir04_L04( xx, ba, hh ); }
int xsignalproc_iir_n04_r25x25c25( int xx, const int ba[9], int hh[9] ) { return _xsignalproc_iir04_L07( xx, ba, hh ); }

// Fixed Order (order = 5) IIR Filters

#define _XSIGNALPROC_IIR05( adjust ) \
    \
    register int ah=0; register unsigned rr, al=0; \
    switch( hh[10] ) \
    { \
        case 0: hh[10] = 1; \
                {ah,al} = macs( hh[4], ba[ 5], ah, al ); \
                {ah,al} = macs( hh[3], ba[ 4], ah, al ); \
                {ah,al} = macs( hh[2], ba[ 3], ah, al ); \
                {ah,al} = macs( hh[1], ba[ 2], ah, al ); \
                {ah,al} = macs( hh[0], ba[ 1], ah, al ); \
                {ah,al} = macs( xx,    ba[ 0], ah, al ); hh[4] = xx; \
                {ah,al} = macs( hh[9], ba[10], ah, al ); \
                {ah,al} = macs( hh[8], ba[ 9], ah, al ); \
                {ah,al} = macs( hh[7], ba[ 8], ah, al ); \
                {ah,al} = macs( hh[6], ba[ 7], ah, al ); \
                {ah,al} = macs( hh[5], ba[ 6], ah, al ); hh[9] = rr = adjust(ah,al); break; \
        case 1: hh[10] = 2; \
                {ah,al} = macs( hh[3], ba[ 5], ah, al ); \
                {ah,al} = macs( hh[2], ba[ 4], ah, al ); \
                {ah,al} = macs( hh[1], ba[ 3], ah, al ); \
                {ah,al} = macs( hh[0], ba[ 2], ah, al ); \
                {ah,al} = macs( hh[4], ba[ 1], ah, al ); \
                {ah,al} = macs( xx,    ba[ 0], ah, al ); hh[3] = xx; \
                {ah,al} = macs( hh[8], ba[10], ah, al ); \
                {ah,al} = macs( hh[7], ba[ 9], ah, al ); \
                {ah,al} = macs( hh[6], ba[ 8], ah, al ); \
                {ah,al} = macs( hh[5], ba[ 7], ah, al ); \
                {ah,al} = macs( hh[9], ba[ 6], ah, al ); hh[8] = rr = adjust(ah,al); break; \
        case 2: hh[10] = 3; \
                {ah,al} = macs( hh[2], ba[ 5], ah, al ); \
                {ah,al} = macs( hh[1], ba[ 4], ah, al ); \
                {ah,al} = macs( hh[0], ba[ 3], ah, al ); \
                {ah,al} = macs( hh[4], ba[ 2], ah, al ); \
                {ah,al} = macs( hh[3], ba[ 1], ah, al ); \
                {ah,al} = macs( xx,    ba[ 0], ah, al ); hh[2] = xx; \
                {ah,al} = macs( hh[7], ba[10], ah, al ); \
                {ah,al} = macs( hh[6], ba[ 9], ah, al ); \
                {ah,al} = macs( hh[5], ba[ 8], ah, al ); \
                {ah,al} = macs( hh[9], ba[ 7], ah, al ); \
                {ah,al} = macs( hh[8], ba[ 6], ah, al ); hh[7] = rr = adjust(ah,al); break; \
        case 3: hh[10] = 4; \
                {ah,al} = macs( hh[1], ba[ 5], ah, al ); \
                {ah,al} = macs( hh[0], ba[ 4], ah, al ); \
                {ah,al} = macs( hh[4], ba[ 3], ah, al ); \
                {ah,al} = macs( hh[3], ba[ 2], ah, al ); \
                {ah,al} = macs( hh[2], ba[ 1], ah, al ); \
                {ah,al} = macs( xx,    ba[ 0], ah, al ); hh[1] = xx; \
                {ah,al} = macs( hh[6], ba[10], ah, al ); \
                {ah,al} = macs( hh[5], ba[ 9], ah, al ); \
                {ah,al} = macs( hh[9], ba[ 8], ah, al ); \
                {ah,al} = macs( hh[8], ba[ 7], ah, al ); \
                {ah,al} = macs( hh[7], ba[ 6], ah, al ); hh[6] = rr = adjust(ah,al); break; \
        case 4: hh[10] = 0; \
                {ah,al} = macs( hh[0], ba[ 5], ah, al ); \
                {ah,al} = macs( hh[4], ba[ 4], ah, al ); \
                {ah,al} = macs( hh[3], ba[ 3], ah, al ); \
                {ah,al} = macs( hh[2], ba[ 2], ah, al ); \
                {ah,al} = macs( hh[1], ba[ 1], ah, al ); \
                {ah,al} = macs( xx,    ba[ 0], ah, al ); hh[0] = xx; \
                {ah,al} = macs( hh[5], ba[10], ah, al ); \
                {ah,al} = macs( hh[9], ba[ 9], ah, al ); \
                {ah,al} = macs( hh[8], ba[ 8], ah, al ); \
                {ah,al} = macs( hh[7], ba[ 7], ah, al ); \
                {ah,al} = macs( hh[6], ba[ 6], ah, al ); hh[5] = rr = adjust(ah,al); break; \
    }

int _xsignalproc_iir05_R05( int xx, const int ba[11], int hh[11] ) {_XSIGNALPROC_IIR05(_xsignalproc_adjust_R05); return rr; }
int _xsignalproc_iir05_R02( int xx, const int ba[11], int hh[11] ) {_XSIGNALPROC_IIR05(_xsignalproc_adjust_R02); return rr; }
int _xsignalproc_iir05_L01( int xx, const int ba[11], int hh[11] ) {_XSIGNALPROC_IIR05(_xsignalproc_adjust_L01); return rr; }
int _xsignalproc_iir05_L04( int xx, const int ba[11], int hh[11] ) {_XSIGNALPROC_IIR05(_xsignalproc_adjust_L04); return rr; }
int _xsignalproc_iir05_L07( int xx, const int ba[11], int hh[11] ) {_XSIGNALPROC_IIR05(_xsignalproc_adjust_L07); return rr; }
int _xsignalproc_iir05_L10( int xx, const int ba[11], int hh[11] ) {_XSIGNALPROC_IIR05(_xsignalproc_adjust_L10); return rr; }
int _xsignalproc_iir05_L13( int xx, const int ba[11], int hh[11] ) {_XSIGNALPROC_IIR05(_xsignalproc_adjust_L13); return rr; }

int xsignalproc_iir_n05_r31x31c31( int xx, const int ba[11], int hh[11] ) { return _xsignalproc_iir05_L01( xx, ba, hh ); }
int xsignalproc_iir_n05_r31x31c28( int xx, const int ba[11], int hh[11] ) { return _xsignalproc_iir05_L04( xx, ba, hh ); }
int xsignalproc_iir_n05_r31x31c25( int xx, const int ba[11], int hh[11] ) { return _xsignalproc_iir05_L07( xx, ba, hh ); }
int xsignalproc_iir_n05_r31x28c31( int xx, const int ba[11], int hh[11] ) { return _xsignalproc_iir05_L04( xx, ba, hh ); }
int xsignalproc_iir_n05_r31x28c28( int xx, const int ba[11], int hh[11] ) { return _xsignalproc_iir05_L07( xx, ba, hh ); }
int xsignalproc_iir_n05_r31x28c25( int xx, const int ba[11], int hh[11] ) { return _xsignalproc_iir05_L10( xx, ba, hh ); }
int xsignalproc_iir_n05_r31x25c31( int xx, const int ba[11], int hh[11] ) { return _xsignalproc_iir05_L07( xx, ba, hh ); }
int xsignalproc_iir_n05_r31x25c28( int xx, const int ba[11], int hh[11] ) { return _xsignalproc_iir05_L10( xx, ba, hh ); }
int xsignalproc_iir_n05_r31x25c25( int xx, const int ba[11], int hh[11] ) { return _xsignalproc_iir05_L13( xx, ba, hh ); }
int xsignalproc_iir_n05_r28x31c31( int xx, const int ba[11], int hh[11] ) { return _xsignalproc_iir05_R02( xx, ba, hh ); }
int xsignalproc_iir_n05_r28x31c28( int xx, const int ba[11], int hh[11] ) { return _xsignalproc_iir05_L01( xx, ba, hh ); }
int xsignalproc_iir_n05_r28x31c25( int xx, const int ba[11], int hh[11] ) { return _xsignalproc_iir05_L04( xx, ba, hh ); }
int xsignalproc_iir_n05_r28x28c31( int xx, const int ba[11], int hh[11] ) { return _xsignalproc_iir05_L01( xx, ba, hh ); }
int xsignalproc_iir_n05_r28x28c28( int xx, const int ba[11], int hh[11] ) { return _xsignalproc_iir05_L04( xx, ba, hh ); }
int xsignalproc_iir_n05_r28x28c25( int xx, const int ba[11], int hh[11] ) { return _xsignalproc_iir05_L07( xx, ba, hh ); }
int xsignalproc_iir_n05_r28x25c31( int xx, const int ba[11], int hh[11] ) { return _xsignalproc_iir05_L04( xx, ba, hh ); }
int xsignalproc_iir_n05_r28x25c28( int xx, const int ba[11], int hh[11] ) { return _xsignalproc_iir05_L07( xx, ba, hh ); }
int xsignalproc_iir_n05_r28x25c25( int xx, const int ba[11], int hh[11] ) { return _xsignalproc_iir05_L10( xx, ba, hh ); }
int xsignalproc_iir_n05_r25x31c31( int xx, const int ba[11], int hh[11] ) { return _xsignalproc_iir05_R05( xx, ba, hh ); }
int xsignalproc_iir_n05_r25x31c28( int xx, const int ba[11], int hh[11] ) { return _xsignalproc_iir05_R02( xx, ba, hh ); }
int xsignalproc_iir_n05_r25x31c25( int xx, const int ba[11], int hh[11] ) { return _xsignalproc_iir05_L01( xx, ba, hh ); }
int xsignalproc_iir_n05_r25x28c31( int xx, const int ba[11], int hh[11] ) { return _xsignalproc_iir05_R02( xx, ba, hh ); }
int xsignalproc_iir_n05_r25x28c28( int xx, const int ba[11], int hh[11] ) { return _xsignalproc_iir05_L01( xx, ba, hh ); }
int xsignalproc_iir_n05_r25x28c25( int xx, const int ba[11], int hh[11] ) { return _xsignalproc_iir05_L04( xx, ba, hh ); }
int xsignalproc_iir_n05_r25x25c31( int xx, const int ba[11], int hh[11] ) { return _xsignalproc_iir05_L01( xx, ba, hh ); }
int xsignalproc_iir_n05_r25x25c28( int xx, const int ba[11], int hh[11] ) { return _xsignalproc_iir05_L04( xx, ba, hh ); }
int xsignalproc_iir_n05_r25x25c25( int xx, const int ba[11], int hh[11] ) { return _xsignalproc_iir05_L07( xx, ba, hh ); }