Home : Signal Processing Library | Fixed-point FIR filters

Description

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

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

Fixed length FIR 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 FIR filter order (5th, 10th, 20th, 40th and 80th order filters are supported).
  • rRRxXXcCC indicates the result (RR), sample data (XX), and coefficient (CC) formats respectively.

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

int xsignalproc_fir_n20_r31x28c25( int sample, const int coefficients[21], int history[24] )

Example Usage

The following example shows how to use various FIR functions.

Example for 5th order FIR using Q28 fixed-point format:

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

sample_q28 = xsignalproc_fir_n05_r28x28c28( sample_q28, coefficients, history );

where ...

  • 'coefficients' array size is equal [nn+1] where nn is the FIR filter order (5, 10, 20 or 40)
  • 'history' array size is equal 6 for 5th order FIR filters
  • 'history' array size is equal to [nn+4] where nn is the FIR filter order (10, 20 or 40)
  • 'history' must be inititalized to all zeros

Source Files

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

Source Listings

xsignalproc_fir.h

#ifndef XSIGNALPROC_FIR_INCLUDED
#define XSIGNALPROC_FIR_INCLUDED

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

// Note: 'coefficient' array size is equal to filter order + 1
// Note: coeffients in the array (starting with offset 0) are arranged as B0, B1, B2, etc.
// Note: 'history' array size for 5th/10th/20th/40th order filters are 6/11/24/44 respectively
// 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,0};              // Array literal of 5th order filter history/state data

// Tip: The filter state machine state variable control when history data is shifted.  Due to optimization most shifts
//      occur during the last state (state=3).  To distribute CPU load when filters are executed in series the state
//      viriable can be initialized to 0, 1, 2 3, 0, 1,2 3, 0, etc. causing the last state of filter FSM's to occur
//      more evenly distributed over time.


#include "xstream-dsp-types.h"

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 );

#define XSIGNALPROC_FIR_NN_INTERFACE( N, cn, hn ) \
    \
    int xsignalproc_fir_n##N##_r31x31c31( int sample, const int coefficients[C], int history[H] ); \
    int xsignalproc_fir_n##N##_r31x31c28( int sample, const int coefficients[C], int history[H] ); \
    int xsignalproc_fir_n##N##_r31x31c25( int sample, const int coefficients[C], int history[H] ); \
    int xsignalproc_fir_n##N##_r31x28c31( int sample, const int coefficients[C], int history[H] ); \
    int xsignalproc_fir_n##N##_r31x28c28( int sample, const int coefficients[C], int history[H] ); \
    int xsignalproc_fir_n##N##_r31x28c25( int sample, const int coefficients[C], int history[H] ); \
    int xsignalproc_fir_n##N##_r31x25c31( int sample, const int coefficients[C], int history[H] ); \
    int xsignalproc_fir_n##N##_r31x25c28( int sample, const int coefficients[C], int history[H] ); \
    int xsignalproc_fir_n##N##_r31x25c25( int sample, const int coefficients[C], int history[H] ); \
    int xsignalproc_fir_n##N##_r28x31c31( int sample, const int coefficients[C], int history[H] ); \
    int xsignalproc_fir_n##N##_r28x31c28( int sample, const int coefficients[C], int history[H] ); \
    int xsignalproc_fir_n##N##_r28x31c25( int sample, const int coefficients[C], int history[H] ); \
    int xsignalproc_fir_n##N##_r28x28c31( int sample, const int coefficients[C], int history[H] ); \
    int xsignalproc_fir_n##N##_r28x28c28( int sample, const int coefficients[C], int history[H] ); \
    int xsignalproc_fir_n##N##_r28x28c25( int sample, const int coefficients[C], int history[H] ); \
    int xsignalproc_fir_n##N##_r28x25c31( int sample, const int coefficients[C], int history[H] ); \
    int xsignalproc_fir_n##N##_r28x25c28( int sample, const int coefficients[C], int history[H] ); \
    int xsignalproc_fir_n##N##_r28x25c25( int sample, const int coefficients[C], int history[H] ); \
    int xsignalproc_fir_n##N##_r25x31c31( int sample, const int coefficients[C], int history[H] ); \
    int xsignalproc_fir_n##N##_r25x31c28( int sample, const int coefficients[C], int history[H] ); \
    int xsignalproc_fir_n##N##_r25x31c25( int sample, const int coefficients[C], int history[H] ); \
    int xsignalproc_fir_n##N##_r25x28c31( int sample, const int coefficients[C], int history[H] ); \
    int xsignalproc_fir_n##N##_r25x28c28( int sample, const int coefficients[C], int history[H] ); \
    int xsignalproc_fir_n##N##_r25x28c25( int sample, const int coefficients[C], int history[H] ); \
    int xsignalproc_fir_n##N##_r25x25c31( int sample, const int coefficients[C], int history[H] ); \
    int xsignalproc_fir_n##N##_r25x25c28( int sample, const int coefficients[C], int history[H] ); \
    int xsignalproc_fir_n##N##_r25x25c25( int sample, const int coefficients[C], int history[H] ); \

XSIGNALPROC_FIR_NN_INTERFACE(  5,  6,  6 )
XSIGNALPROC_FIR_NN_INTERFACE( 10, 11, 14 )
XSIGNALPROC_FIR_NN_INTERFACE( 20, 21, 24 )
XSIGNALPROC_FIR_NN_INTERFACE( 40, 41, 44 )

#endif

xsignalproc_fir.xc

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

#include <xs1.h>

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

int _xsignalproc_firNN_R05( int xx, const int bb[], int hh[], int nn ) {_XSIGNALPROC_FIRnn; return (ah>> 5);         }
int _xsignalproc_firNN_R02( int xx, const int bb[], int hh[], int nn ) {_XSIGNALPROC_FIRnn; return (ah>> 2);         }
int _xsignalproc_firNN_L01( int xx, const int bb[], int hh[], int nn ) {_XSIGNALPROC_FIRnn; return (ah<< 1)+(al>>31);}
int _xsignalproc_firNN_L04( int xx, const int bb[], int hh[], int nn ) {_XSIGNALPROC_FIRnn; return (ah<< 4)+(al>>28);}
int _xsignalproc_firNN_L07( int xx, const int bb[], int hh[], int nn ) {_XSIGNALPROC_FIRnn; return (ah<< 7)+(al>>25);}
int _xsignalproc_firNN_L10( int xx, const int bb[], int hh[], int nn ) {_XSIGNALPROC_FIRnn; return (ah<<10)+(al>>22);}
int _xsignalproc_firNN_L13( int xx, const int bb[], int hh[], int nn ) {_XSIGNALPROC_FIRnn; return (ah<<13)+(al>>19);}

int xsignalproc_fir_nNN_r31x31c31( int xx, const int bb[], int hh[], int nn ) { return _xsignalproc_firNN_L01( xx, bb, hh, nn ); }
int xsignalproc_fir_nNN_r31x31c28( int xx, const int bb[], int hh[], int nn ) { return _xsignalproc_firNN_L04( xx, bb, hh, nn ); }
int xsignalproc_fir_nNN_r31x31c25( int xx, const int bb[], int hh[], int nn ) { return _xsignalproc_firNN_L07( xx, bb, hh, nn ); }
int xsignalproc_fir_nNN_r31x28c31( int xx, const int bb[], int hh[], int nn ) { return _xsignalproc_firNN_L04( xx, bb, hh, nn ); }
int xsignalproc_fir_nNN_r31x28c28( int xx, const int bb[], int hh[], int nn ) { return _xsignalproc_firNN_L07( xx, bb, hh, nn ); }
int xsignalproc_fir_nNN_r31x28c25( int xx, const int bb[], int hh[], int nn ) { return _xsignalproc_firNN_L10( xx, bb, hh, nn ); }
int xsignalproc_fir_nNN_r31x25c31( int xx, const int bb[], int hh[], int nn ) { return _xsignalproc_firNN_L07( xx, bb, hh, nn ); }
int xsignalproc_fir_nNN_r31x25c28( int xx, const int bb[], int hh[], int nn ) { return _xsignalproc_firNN_L10( xx, bb, hh, nn ); }
int xsignalproc_fir_nNN_r31x25c25( int xx, const int bb[], int hh[], int nn ) { return _xsignalproc_firNN_L13( xx, bb, hh, nn ); }
int xsignalproc_fir_nNN_r28x31c31( int xx, const int bb[], int hh[], int nn ) { return _xsignalproc_firNN_R02( xx, bb, hh, nn ); }
int xsignalproc_fir_nNN_r28x31c28( int xx, const int bb[], int hh[], int nn ) { return _xsignalproc_firNN_L01( xx, bb, hh, nn ); }
int xsignalproc_fir_nNN_r28x31c25( int xx, const int bb[], int hh[], int nn ) { return _xsignalproc_firNN_L04( xx, bb, hh, nn ); }
int xsignalproc_fir_nNN_r28x28c31( int xx, const int bb[], int hh[], int nn ) { return _xsignalproc_firNN_L01( xx, bb, hh, nn ); }
int xsignalproc_fir_nNN_r28x28c28( int xx, const int bb[], int hh[], int nn ) { return _xsignalproc_firNN_L04( xx, bb, hh, nn ); }
int xsignalproc_fir_nNN_r28x28c25( int xx, const int bb[], int hh[], int nn ) { return _xsignalproc_firNN_L07( xx, bb, hh, nn ); }
int xsignalproc_fir_nNN_r28x25c31( int xx, const int bb[], int hh[], int nn ) { return _xsignalproc_firNN_L04( xx, bb, hh, nn ); }
int xsignalproc_fir_nNN_r28x25c28( int xx, const int bb[], int hh[], int nn ) { return _xsignalproc_firNN_L07( xx, bb, hh, nn ); }
int xsignalproc_fir_nNN_r28x25c25( int xx, const int bb[], int hh[], int nn ) { return _xsignalproc_firNN_L10( xx, bb, hh, nn ); }
int xsignalproc_fir_nNN_r25x31c31( int xx, const int bb[], int hh[], int nn ) { return _xsignalproc_firNN_R05( xx, bb, hh, nn ); }
int xsignalproc_fir_nNN_r25x31c28( int xx, const int bb[], int hh[], int nn ) { return _xsignalproc_firNN_R02( xx, bb, hh, nn ); }
int xsignalproc_fir_nNN_r25x31c25( int xx, const int bb[], int hh[], int nn ) { return _xsignalproc_firNN_L01( xx, bb, hh, nn ); }
int xsignalproc_fir_nNN_r25x28c31( int xx, const int bb[], int hh[], int nn ) { return _xsignalproc_firNN_R02( xx, bb, hh, nn ); }
int xsignalproc_fir_nNN_r25x28c28( int xx, const int bb[], int hh[], int nn ) { return _xsignalproc_firNN_L01( xx, bb, hh, nn ); }
int xsignalproc_fir_nNN_r25x28c25( int xx, const int bb[], int hh[], int nn ) { return _xsignalproc_firNN_L04( xx, bb, hh, nn ); }
int xsignalproc_fir_nNN_r25x25c31( int xx, const int bb[], int hh[], int nn ) { return _xsignalproc_firNN_L01( xx, bb, hh, nn ); }
int xsignalproc_fir_nNN_r25x25c28( int xx, const int bb[], int hh[], int nn ) { return _xsignalproc_firNN_L04( xx, bb, hh, nn ); }
int xsignalproc_fir_nNN_r25x25c25( int xx, const int bb[], int hh[], int nn ) { return _xsignalproc_firNN_L07( xx, bb, hh, nn ); }

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

int xsignalproc_fir_n05_r31x31c31( int xx, const int bb[6], int hh[6] ) { _XSIGNALPROC_FIR05; return (ah<< 1)+(al>>31); }
int xsignalproc_fir_n05_r31x31c28( int xx, const int bb[6], int hh[6] ) { _XSIGNALPROC_FIR05; return (ah<< 4)+(al>>28); }
int xsignalproc_fir_n05_r31x31c25( int xx, const int bb[6], int hh[6] ) { _XSIGNALPROC_FIR05; return (ah<< 7)+(al>>25); }
int xsignalproc_fir_n05_r31x28c31( int xx, const int bb[6], int hh[6] ) { _XSIGNALPROC_FIR05; return (ah<< 4)+(al>>28); }
int xsignalproc_fir_n05_r31x28c28( int xx, const int bb[6], int hh[6] ) { _XSIGNALPROC_FIR05; return (ah<< 7)+(al>>25); }
int xsignalproc_fir_n05_r31x28c25( int xx, const int bb[6], int hh[6] ) { _XSIGNALPROC_FIR05; return (ah<<10)+(al>>22); }
int xsignalproc_fir_n05_r31x25c31( int xx, const int bb[6], int hh[6] ) { _XSIGNALPROC_FIR05; return (ah<< 7)+(al>>25); }
int xsignalproc_fir_n05_r31x25c28( int xx, const int bb[6], int hh[6] ) { _XSIGNALPROC_FIR05; return (ah<<10)+(al>>22); }
int xsignalproc_fir_n05_r31x25c25( int xx, const int bb[6], int hh[6] ) { _XSIGNALPROC_FIR05; return (ah<<13)+(al>>19); }
int xsignalproc_fir_n05_r28x31c31( int xx, const int bb[6], int hh[6] ) { _XSIGNALPROC_FIR05; return (ah>> 2);          }
int xsignalproc_fir_n05_r28x31c28( int xx, const int bb[6], int hh[6] ) { _XSIGNALPROC_FIR05; return (ah<< 1)+(al>>31); }
int xsignalproc_fir_n05_r28x31c25( int xx, const int bb[6], int hh[6] ) { _XSIGNALPROC_FIR05; return (ah<< 7)+(al>>25); }
int xsignalproc_fir_n05_r28x28c31( int xx, const int bb[6], int hh[6] ) { _XSIGNALPROC_FIR05; return (ah<< 1)+(al>>31); }
int xsignalproc_fir_n05_r28x28c28( int xx, const int bb[6], int hh[6] ) { _XSIGNALPROC_FIR05; return (ah<< 4)+(al>>28); }
int xsignalproc_fir_n05_r28x28c25( int xx, const int bb[6], int hh[6] ) { _XSIGNALPROC_FIR05; return (ah<< 7)+(al>>25); }
int xsignalproc_fir_n05_r28x25c31( int xx, const int bb[6], int hh[6] ) { _XSIGNALPROC_FIR05; return (ah<< 7)+(al>>25); }
int xsignalproc_fir_n05_r28x25c28( int xx, const int bb[6], int hh[6] ) { _XSIGNALPROC_FIR05; return (ah<< 7)+(al>>25); }
int xsignalproc_fir_n05_r28x25c25( int xx, const int bb[6], int hh[6] ) { _XSIGNALPROC_FIR05; return (ah<<10)+(al>>22); }
int xsignalproc_fir_n05_r25x31c31( int xx, const int bb[6], int hh[6] ) { _XSIGNALPROC_FIR05; return (ah>> 5);          }
int xsignalproc_fir_n05_r25x31c28( int xx, const int bb[6], int hh[6] ) { _XSIGNALPROC_FIR05; return (ah>> 2);          }
int xsignalproc_fir_n05_r25x31c25( int xx, const int bb[6], int hh[6] ) { _XSIGNALPROC_FIR05; return (ah<< 1)+(al>>31); }
int xsignalproc_fir_n05_r25x28c31( int xx, const int bb[6], int hh[6] ) { _XSIGNALPROC_FIR05; return (ah>> 2);          }
int xsignalproc_fir_n05_r25x28c28( int xx, const int bb[6], int hh[6] ) { _XSIGNALPROC_FIR05; return (ah<< 1)+(al>>31); }
int xsignalproc_fir_n05_r25x28c25( int xx, const int bb[6], int hh[6] ) { _XSIGNALPROC_FIR05; return (ah<< 4)+(al>>28); }
int xsignalproc_fir_n05_r25x25c31( int xx, const int bb[6], int hh[6] ) { _XSIGNALPROC_FIR05; return (ah<< 1)+(al>>31); }
int xsignalproc_fir_n05_r25x25c28( int xx, const int bb[6], int hh[6] ) { _XSIGNALPROC_FIR05; return (ah<< 4)+(al>>28); }
int xsignalproc_fir_n05_r25x25c25( int xx, const int bb[6], int hh[6] ) { _XSIGNALPROC_FIR05; return (ah<< 7)+(al>>25); }

#define _XSIGNALPROC_FIR10 \
    \
    register int ah=0; register unsigned int al=0; \
    switch( hh[13] ) \
    { \
        case 0: hh[13] = 1; \
                {ah,al} = macs( hh[12], bb[10], ah, al ); hh[12] = hh[8]; \
                {ah,al} = macs( hh[11], bb[ 9], ah, al ); \
                {ah,al} = macs( hh[10], bb[ 8], ah, al ); \
                {ah,al} = macs( hh[ 9], bb[ 7], ah, al ); \
                {ah,al} = macs( hh[ 8], bb[ 6], ah, al ); \
                {ah,al} = macs( hh[ 7], bb[ 5], ah, al ); \
                {ah,al} = macs( hh[ 6], bb[ 4], ah, al ); \
                {ah,al} = macs( hh[ 5], bb[ 3], ah, al ); \
                {ah,al} = macs( hh[ 4], bb[ 2], ah, al ); \
                {ah,al} = macs( hh[ 3], bb[ 1], ah, al ); \
                {ah,al} = macs( xx,     bb[ 0], ah, al ); hh[2] = xx; break; \
        \
        case 1: hh[13] = 2; \
                {ah,al} = macs( hh[11], bb[10], ah, al ); hh[11] = hh[7]; \
                {ah,al} = macs( hh[10], bb[ 9], ah, al ); \
                {ah,al} = macs( hh[ 9], bb[ 8], ah, al ); \
                {ah,al} = macs( hh[ 8], bb[ 7], ah, al ); \
                {ah,al} = macs( hh[ 7], bb[ 6], ah, al ); \
                {ah,al} = macs( hh[ 6], bb[ 5], ah, al ); \
                {ah,al} = macs( hh[ 5], bb[ 4], ah, al ); \
                {ah,al} = macs( hh[ 4], bb[ 3], ah, al ); \
                {ah,al} = macs( hh[ 3], bb[ 2], ah, al ); \
                {ah,al} = macs( hh[ 2], bb[ 1], ah, al ); \
                {ah,al} = macs( xx,     bb[ 0], ah, al ); hh[1] = xx; break; \
        \
        case 2: hh[13] = 3; \
                {ah,al} = macs( hh[10], bb[10], ah, al ); hh[10] = hh[6]; \
                {ah,al} = macs( hh[ 9], bb[ 9], ah, al ); \
                {ah,al} = macs( hh[ 8], bb[ 8], ah, al ); \
                {ah,al} = macs( hh[ 7], bb[ 7], ah, al ); \
                {ah,al} = macs( hh[ 6], bb[ 6], ah, al ); \
                {ah,al} = macs( hh[ 5], bb[ 5], ah, al ); \
                {ah,al} = macs( hh[ 4], bb[ 4], ah, al ); \
                {ah,al} = macs( hh[ 3], bb[ 3], ah, al ); \
                {ah,al} = macs( hh[ 2], bb[ 2], ah, al ); \
                {ah,al} = macs( hh[ 1], bb[ 1], ah, al ); \
                {ah,al} = macs( xx,     bb[ 0], ah, al ); hh[0] = xx; break; \
        \
        case 3: hh[13] = 0; \
                {ah,al} = macs( hh[ 9], bb[10], ah, al ); hh[ 9] = hh[5]; \
                {ah,al} = macs( hh[ 8], bb[ 9], ah, al ); hh[ 8] = hh[4]; \
                {ah,al} = macs( hh[ 7], bb[ 8], ah, al ); hh[ 7] = hh[3]; \
                {ah,al} = macs( hh[ 6], bb[ 7], ah, al ); hh[ 6] = hh[2]; \
                {ah,al} = macs( hh[ 5], bb[ 6], ah, al ); hh[ 5] = hh[1]; \
                {ah,al} = macs( hh[ 4], bb[ 5], ah, al ); hh[ 4] = hh[0]; \
                {ah,al} = macs( hh[ 3], bb[ 4], ah, al ); \
                {ah,al} = macs( hh[ 2], bb[ 3], ah, al ); \
                {ah,al} = macs( hh[ 1], bb[ 2], ah, al ); \
                {ah,al} = macs( hh[ 0], bb[ 1], ah, al ); \
                {ah,al} = macs( xx,     bb[ 0], ah, al ); hh[ 3] = xx; break; \
    }

int xsignalproc_fir_n10_r31x31c31( int xx, const int bb[11], int hh[14] ) { _XSIGNALPROC_FIR10; return (ah<< 1)+(al>>31); }
int xsignalproc_fir_n10_r31x31c28( int xx, const int bb[11], int hh[14] ) { _XSIGNALPROC_FIR10; return (ah<< 4)+(al>>28); }
int xsignalproc_fir_n10_r31x31c25( int xx, const int bb[11], int hh[14] ) { _XSIGNALPROC_FIR10; return (ah<< 7)+(al>>25); }
int xsignalproc_fir_n10_r31x28c31( int xx, const int bb[11], int hh[14] ) { _XSIGNALPROC_FIR10; return (ah<< 4)+(al>>28); }
int xsignalproc_fir_n10_r31x28c28( int xx, const int bb[11], int hh[14] ) { _XSIGNALPROC_FIR10; return (ah<< 7)+(al>>25); }
int xsignalproc_fir_n10_r31x28c25( int xx, const int bb[11], int hh[14] ) { _XSIGNALPROC_FIR10; return (ah<<10)+(al>>22); }
int xsignalproc_fir_n10_r31x25c31( int xx, const int bb[11], int hh[14] ) { _XSIGNALPROC_FIR10; return (ah<< 7)+(al>>25); }
int xsignalproc_fir_n10_r31x25c28( int xx, const int bb[11], int hh[14] ) { _XSIGNALPROC_FIR10; return (ah<<10)+(al>>22); }
int xsignalproc_fir_n10_r31x25c25( int xx, const int bb[11], int hh[14] ) { _XSIGNALPROC_FIR10; return (ah<<13)+(al>>19); }
int xsignalproc_fir_n10_r28x31c31( int xx, const int bb[11], int hh[14] ) { _XSIGNALPROC_FIR10; return (ah>> 2);          }
int xsignalproc_fir_n10_r28x31c28( int xx, const int bb[11], int hh[14] ) { _XSIGNALPROC_FIR10; return (ah<< 1)+(al>>31); }
int xsignalproc_fir_n10_r28x31c25( int xx, const int bb[11], int hh[14] ) { _XSIGNALPROC_FIR10; return (ah<< 7)+(al>>25); }
int xsignalproc_fir_n10_r28x28c31( int xx, const int bb[11], int hh[14] ) { _XSIGNALPROC_FIR10; return (ah<< 1)+(al>>31); }
int xsignalproc_fir_n10_r28x28c28( int xx, const int bb[11], int hh[14] ) { _XSIGNALPROC_FIR10; return (ah<< 4)+(al>>28); }
int xsignalproc_fir_n10_r28x28c25( int xx, const int bb[11], int hh[14] ) { _XSIGNALPROC_FIR10; return (ah<< 7)+(al>>25); }
int xsignalproc_fir_n10_r28x25c31( int xx, const int bb[11], int hh[14] ) { _XSIGNALPROC_FIR10; return (ah<< 7)+(al>>25); }
int xsignalproc_fir_n10_r28x25c28( int xx, const int bb[11], int hh[14] ) { _XSIGNALPROC_FIR10; return (ah<< 7)+(al>>25); }
int xsignalproc_fir_n10_r28x25c25( int xx, const int bb[11], int hh[14] ) { _XSIGNALPROC_FIR10; return (ah<<10)+(al>>22); }
int xsignalproc_fir_n10_r25x31c31( int xx, const int bb[11], int hh[14] ) { _XSIGNALPROC_FIR10; return (ah>> 5);          }
int xsignalproc_fir_n10_r25x31c28( int xx, const int bb[11], int hh[14] ) { _XSIGNALPROC_FIR10; return (ah>> 2);          }
int xsignalproc_fir_n10_r25x31c25( int xx, const int bb[11], int hh[14] ) { _XSIGNALPROC_FIR10; return (ah<< 1)+(al>>31); }
int xsignalproc_fir_n10_r25x28c31( int xx, const int bb[11], int hh[14] ) { _XSIGNALPROC_FIR10; return (ah>> 2);          }
int xsignalproc_fir_n10_r25x28c28( int xx, const int bb[11], int hh[14] ) { _XSIGNALPROC_FIR10; return (ah<< 1)+(al>>31); }
int xsignalproc_fir_n10_r25x28c25( int xx, const int bb[11], int hh[14] ) { _XSIGNALPROC_FIR10; return (ah<< 4)+(al>>28); }
int xsignalproc_fir_n10_r25x25c31( int xx, const int bb[11], int hh[14] ) { _XSIGNALPROC_FIR10; return (ah<< 1)+(al>>31); }
int xsignalproc_fir_n10_r25x25c28( int xx, const int bb[11], int hh[14] ) { _XSIGNALPROC_FIR10; return (ah<< 4)+(al>>28); }
int xsignalproc_fir_n10_r25x25c25( int xx, const int bb[11], int hh[14] ) { _XSIGNALPROC_FIR10; return (ah<< 7)+(al>>25); }

#define _XSIGNALPROC_FIR20 \
    \
    register int ah=0; register unsigned int al=0; \
    switch( hh[23] ) \
    { \
        case 0: hh[23] = 1; \
                {ah,al} = macs( hh[22], bb[20], ah, al ); hh[22] = hh[18]; \
                {ah,al} = macs( hh[21], bb[19], ah, al ); \
                {ah,al} = macs( hh[20], bb[18], ah, al ); \
                {ah,al} = macs( hh[19], bb[17], ah, al ); \
                {ah,al} = macs( hh[18], bb[16], ah, al ); \
                {ah,al} = macs( hh[17], bb[15], ah, al ); \
                {ah,al} = macs( hh[16], bb[14], ah, al ); \
                {ah,al} = macs( hh[15], bb[13], ah, al ); \
                {ah,al} = macs( hh[14], bb[12], ah, al ); \
                {ah,al} = macs( hh[13], bb[11], ah, al ); \
                {ah,al} = macs( hh[12], bb[10], ah, al ); \
                {ah,al} = macs( hh[11], bb[ 9], ah, al ); \
                {ah,al} = macs( hh[10], bb[ 8], ah, al ); \
                {ah,al} = macs( hh[ 9], bb[ 7], ah, al ); \
                {ah,al} = macs( hh[ 8], bb[ 6], ah, al ); \
                {ah,al} = macs( hh[ 7], bb[ 5], ah, al ); \
                {ah,al} = macs( hh[ 6], bb[ 4], ah, al ); \
                {ah,al} = macs( hh[ 5], bb[ 3], ah, al ); \
                {ah,al} = macs( hh[ 4], bb[ 2], ah, al ); \
                {ah,al} = macs( hh[ 3], bb[ 1], ah, al ); \
                {ah,al} = macs( xx,     bb[ 0], ah, al ); hh[2] = xx; break; \
        \
        case 1: hh[23] = 2; \
                {ah,al} = macs( hh[21], bb[20], ah, al ); hh[21] = hh[17]; \
                {ah,al} = macs( hh[20], bb[19], ah, al ); \
                {ah,al} = macs( hh[19], bb[18], ah, al ); \
                {ah,al} = macs( hh[18], bb[17], ah, al ); \
                {ah,al} = macs( hh[17], bb[16], ah, al ); \
                {ah,al} = macs( hh[16], bb[15], ah, al ); \
                {ah,al} = macs( hh[15], bb[14], ah, al ); \
                {ah,al} = macs( hh[14], bb[13], ah, al ); \
                {ah,al} = macs( hh[13], bb[12], ah, al ); \
                {ah,al} = macs( hh[12], bb[11], ah, al ); \
                {ah,al} = macs( hh[11], bb[10], ah, al ); \
                {ah,al} = macs( hh[10], bb[ 9], ah, al ); \
                {ah,al} = macs( hh[ 9], bb[ 8], ah, al ); \
                {ah,al} = macs( hh[ 8], bb[ 7], ah, al ); \
                {ah,al} = macs( hh[ 7], bb[ 6], ah, al ); \
                {ah,al} = macs( hh[ 6], bb[ 5], ah, al ); \
                {ah,al} = macs( hh[ 5], bb[ 4], ah, al ); \
                {ah,al} = macs( hh[ 4], bb[ 3], ah, al ); \
                {ah,al} = macs( hh[ 3], bb[ 2], ah, al ); \
                {ah,al} = macs( hh[ 2], bb[ 1], ah, al ); \
                {ah,al} = macs( xx,     bb[ 0], ah, al ); hh[1] = xx; break; \
        \
        case 2: hh[23] = 3; \
                {ah,al} = macs( hh[20], bb[20], ah, al ); hh[20] = hh[16]; \
                {ah,al} = macs( hh[19], bb[19], ah, al ); \
                {ah,al} = macs( hh[18], bb[18], ah, al ); \
                {ah,al} = macs( hh[17], bb[17], ah, al ); \
                {ah,al} = macs( hh[16], bb[16], ah, al ); \
                {ah,al} = macs( hh[15], bb[15], ah, al ); \
                {ah,al} = macs( hh[14], bb[14], ah, al ); \
                {ah,al} = macs( hh[13], bb[13], ah, al ); \
                {ah,al} = macs( hh[12], bb[12], ah, al ); \
                {ah,al} = macs( hh[11], bb[11], ah, al ); \
                {ah,al} = macs( hh[10], bb[10], ah, al ); \
                {ah,al} = macs( hh[ 9], bb[ 9], ah, al ); \
                {ah,al} = macs( hh[ 8], bb[ 8], ah, al ); \
                {ah,al} = macs( hh[ 7], bb[ 7], ah, al ); \
                {ah,al} = macs( hh[ 6], bb[ 6], ah, al ); \
                {ah,al} = macs( hh[ 5], bb[ 5], ah, al ); \
                {ah,al} = macs( hh[ 4], bb[ 4], ah, al ); \
                {ah,al} = macs( hh[ 3], bb[ 3], ah, al ); \
                {ah,al} = macs( hh[ 2], bb[ 2], ah, al ); \
                {ah,al} = macs( hh[ 1], bb[ 1], ah, al ); \
                {ah,al} = macs( xx,     bb[ 0], ah, al ); hh[0] = xx; break; \
        \
        case 3: hh[23] = 0; \
                {ah,al} = macs( hh[19], bb[20], ah, al ); \
                {ah,al} = macs( hh[18], bb[19], ah, al ); \
                {ah,al} = macs( hh[17], bb[18], ah, al ); \
                {ah,al} = macs( hh[16], bb[17], ah, al ); \
                {ah,al} = macs( hh[15], bb[16], ah, al ); hh[19] = hh[15]; \
                {ah,al} = macs( hh[14], bb[15], ah, al ); hh[18] = hh[14]; \
                {ah,al} = macs( hh[13], bb[14], ah, al ); hh[17] = hh[13]; \
                {ah,al} = macs( hh[12], bb[13], ah, al ); hh[16] = hh[12]; \
                {ah,al} = macs( hh[11], bb[12], ah, al ); hh[15] = hh[11]; \
                {ah,al} = macs( hh[10], bb[11], ah, al ); hh[14] = hh[10]; \
                {ah,al} = macs( hh[ 9], bb[10], ah, al ); hh[13] = hh[ 9]; \
                {ah,al} = macs( hh[ 8], bb[ 9], ah, al ); hh[12] = hh[ 8]; \
                {ah,al} = macs( hh[ 7], bb[ 8], ah, al ); hh[11] = hh[ 7]; \
                {ah,al} = macs( hh[ 6], bb[ 7], ah, al ); hh[10] = hh[ 6]; \
                {ah,al} = macs( hh[ 5], bb[ 6], ah, al ); hh[ 9] = hh[ 5]; \
                {ah,al} = macs( hh[ 4], bb[ 5], ah, al ); hh[ 8] = hh[ 4]; \
                {ah,al} = macs( hh[ 3], bb[ 4], ah, al ); hh[ 7] = hh[ 3]; \
                {ah,al} = macs( hh[ 2], bb[ 3], ah, al ); hh[ 6] = hh[ 2]; \
                {ah,al} = macs( hh[ 1], bb[ 2], ah, al ); hh[ 5] = hh[ 1]; \
                {ah,al} = macs( hh[ 0], bb[ 1], ah, al ); hh[ 4] = hh[ 0]; \
                {ah,al} = macs( xx,     bb[ 0], ah, al ); hh[ 3] = xx; break; \
    }

int xsignalproc_fir_n20_r31x31c31( int xx, const int bb[21], int hh[24] ) { _XSIGNALPROC_FIR20; return (ah<< 1)+(al>>31); }
int xsignalproc_fir_n20_r31x31c28( int xx, const int bb[21], int hh[24] ) { _XSIGNALPROC_FIR20; return (ah<< 4)+(al>>28); }
int xsignalproc_fir_n20_r31x31c25( int xx, const int bb[21], int hh[24] ) { _XSIGNALPROC_FIR20; return (ah<< 7)+(al>>25); }
int xsignalproc_fir_n20_r31x28c31( int xx, const int bb[21], int hh[24] ) { _XSIGNALPROC_FIR20; return (ah<< 4)+(al>>28); }
int xsignalproc_fir_n20_r31x28c28( int xx, const int bb[21], int hh[24] ) { _XSIGNALPROC_FIR20; return (ah<< 7)+(al>>25); }
int xsignalproc_fir_n20_r31x28c25( int xx, const int bb[21], int hh[24] ) { _XSIGNALPROC_FIR20; return (ah<<10)+(al>>22); }
int xsignalproc_fir_n20_r31x25c31( int xx, const int bb[21], int hh[24] ) { _XSIGNALPROC_FIR20; return (ah<< 7)+(al>>25); }
int xsignalproc_fir_n20_r31x25c28( int xx, const int bb[21], int hh[24] ) { _XSIGNALPROC_FIR20; return (ah<<10)+(al>>22); }
int xsignalproc_fir_n20_r31x25c25( int xx, const int bb[21], int hh[24] ) { _XSIGNALPROC_FIR20; return (ah<<13)+(al>>19); }
int xsignalproc_fir_n20_r28x31c31( int xx, const int bb[21], int hh[24] ) { _XSIGNALPROC_FIR20; return (ah>> 2);          }
int xsignalproc_fir_n20_r28x31c28( int xx, const int bb[21], int hh[24] ) { _XSIGNALPROC_FIR20; return (ah<< 1)+(al>>31); }
int xsignalproc_fir_n20_r28x31c25( int xx, const int bb[21], int hh[24] ) { _XSIGNALPROC_FIR20; return (ah<< 7)+(al>>25); }
int xsignalproc_fir_n20_r28x28c31( int xx, const int bb[21], int hh[24] ) { _XSIGNALPROC_FIR20; return (ah<< 1)+(al>>31); }
int xsignalproc_fir_n20_r28x28c28( int xx, const int bb[21], int hh[24] ) { _XSIGNALPROC_FIR20; return (ah<< 4)+(al>>28); }
int xsignalproc_fir_n20_r28x28c25( int xx, const int bb[21], int hh[24] ) { _XSIGNALPROC_FIR20; return (ah<< 7)+(al>>25); }
int xsignalproc_fir_n20_r28x25c31( int xx, const int bb[21], int hh[24] ) { _XSIGNALPROC_FIR20; return (ah<< 7)+(al>>25); }
int xsignalproc_fir_n20_r28x25c28( int xx, const int bb[21], int hh[24] ) { _XSIGNALPROC_FIR20; return (ah<< 7)+(al>>25); }
int xsignalproc_fir_n20_r28x25c25( int xx, const int bb[21], int hh[24] ) { _XSIGNALPROC_FIR20; return (ah<<10)+(al>>22); }
int xsignalproc_fir_n20_r25x31c31( int xx, const int bb[21], int hh[24] ) { _XSIGNALPROC_FIR20; return (ah>> 5);          }
int xsignalproc_fir_n20_r25x31c28( int xx, const int bb[21], int hh[24] ) { _XSIGNALPROC_FIR20; return (ah>> 2);          }
int xsignalproc_fir_n20_r25x31c25( int xx, const int bb[21], int hh[24] ) { _XSIGNALPROC_FIR20; return (ah<< 1)+(al>>31); }
int xsignalproc_fir_n20_r25x28c31( int xx, const int bb[21], int hh[24] ) { _XSIGNALPROC_FIR20; return (ah>> 2);          }
int xsignalproc_fir_n20_r25x28c28( int xx, const int bb[21], int hh[24] ) { _XSIGNALPROC_FIR20; return (ah<< 1)+(al>>31); }
int xsignalproc_fir_n20_r25x28c25( int xx, const int bb[21], int hh[24] ) { _XSIGNALPROC_FIR20; return (ah<< 4)+(al>>28); }
int xsignalproc_fir_n20_r25x25c31( int xx, const int bb[21], int hh[24] ) { _XSIGNALPROC_FIR20; return (ah<< 1)+(al>>31); }
int xsignalproc_fir_n20_r25x25c28( int xx, const int bb[21], int hh[24] ) { _XSIGNALPROC_FIR20; return (ah<< 4)+(al>>28); }
int xsignalproc_fir_n20_r25x25c25( int xx, const int bb[21], int hh[24] ) { _XSIGNALPROC_FIR20; return (ah<< 7)+(al>>25); }

#define _XSIGNALPROC_FIR40 \
    \
    register int ah=0; register unsigned int al=0; \
    switch( hh[43] ) \
    { \
        case 0: hh[43] = 1; \
                {ah,al} = macs( hh[42], bb[40], ah, al ); hh[42] = hh[38]; \
                {ah,al} = macs( hh[41], bb[39], ah, al ); \
                {ah,al} = macs( hh[40], bb[38], ah, al ); \
                {ah,al} = macs( hh[39], bb[37], ah, al ); \
                {ah,al} = macs( hh[38], bb[36], ah, al ); \
                {ah,al} = macs( hh[37], bb[35], ah, al ); \
                {ah,al} = macs( hh[36], bb[34], ah, al ); \
                {ah,al} = macs( hh[35], bb[33], ah, al ); \
                {ah,al} = macs( hh[34], bb[32], ah, al ); \
                {ah,al} = macs( hh[33], bb[31], ah, al ); \
                {ah,al} = macs( hh[32], bb[30], ah, al ); \
                {ah,al} = macs( hh[31], bb[29], ah, al ); \
                {ah,al} = macs( hh[30], bb[28], ah, al ); \
                {ah,al} = macs( hh[29], bb[27], ah, al ); \
                {ah,al} = macs( hh[28], bb[26], ah, al ); \
                {ah,al} = macs( hh[27], bb[25], ah, al ); \
                {ah,al} = macs( hh[26], bb[24], ah, al ); \
                {ah,al} = macs( hh[25], bb[23], ah, al ); \
                {ah,al} = macs( hh[24], bb[22], ah, al ); \
                {ah,al} = macs( hh[23], bb[21], ah, al ); \
                {ah,al} = macs( hh[22], bb[20], ah, al ); \
                {ah,al} = macs( hh[21], bb[19], ah, al ); \
                {ah,al} = macs( hh[20], bb[18], ah, al ); \
                {ah,al} = macs( hh[19], bb[17], ah, al ); \
                {ah,al} = macs( hh[18], bb[16], ah, al ); \
                {ah,al} = macs( hh[17], bb[15], ah, al ); \
                {ah,al} = macs( hh[16], bb[14], ah, al ); \
                {ah,al} = macs( hh[15], bb[13], ah, al ); \
                {ah,al} = macs( hh[14], bb[12], ah, al ); \
                {ah,al} = macs( hh[13], bb[11], ah, al ); \
                {ah,al} = macs( hh[12], bb[10], ah, al ); \
                {ah,al} = macs( hh[11], bb[ 9], ah, al ); \
                {ah,al} = macs( hh[10], bb[ 8], ah, al ); \
                {ah,al} = macs( hh[ 9], bb[ 7], ah, al ); \
                {ah,al} = macs( hh[ 8], bb[ 6], ah, al ); \
                {ah,al} = macs( hh[ 7], bb[ 5], ah, al ); \
                {ah,al} = macs( hh[ 6], bb[ 4], ah, al ); \
                {ah,al} = macs( hh[ 5], bb[ 3], ah, al ); \
                {ah,al} = macs( hh[ 4], bb[ 2], ah, al ); \
                {ah,al} = macs( hh[ 3], bb[ 1], ah, al ); \
                {ah,al} = macs( xx,     bb[ 0], ah, al ); hh[ 2] = xx; break; \
        \
        case 1: hh[43] = 2; \
                {ah,al} = macs( hh[41], bb[40], ah, al ); hh[41] = hh[37]; \
                {ah,al} = macs( hh[40], bb[39], ah, al ); \
                {ah,al} = macs( hh[39], bb[38], ah, al ); \
                {ah,al} = macs( hh[38], bb[37], ah, al ); \
                {ah,al} = macs( hh[37], bb[36], ah, al ); \
                {ah,al} = macs( hh[36], bb[35], ah, al ); \
                {ah,al} = macs( hh[35], bb[34], ah, al ); \
                {ah,al} = macs( hh[34], bb[33], ah, al ); \
                {ah,al} = macs( hh[33], bb[32], ah, al ); \
                {ah,al} = macs( hh[32], bb[31], ah, al ); \
                {ah,al} = macs( hh[31], bb[30], ah, al ); \
                {ah,al} = macs( hh[30], bb[29], ah, al ); \
                {ah,al} = macs( hh[29], bb[28], ah, al ); \
                {ah,al} = macs( hh[28], bb[27], ah, al ); \
                {ah,al} = macs( hh[27], bb[26], ah, al ); \
                {ah,al} = macs( hh[26], bb[25], ah, al ); \
                {ah,al} = macs( hh[25], bb[24], ah, al ); \
                {ah,al} = macs( hh[24], bb[23], ah, al ); \
                {ah,al} = macs( hh[23], bb[22], ah, al ); \
                {ah,al} = macs( hh[22], bb[21], ah, al ); \
                {ah,al} = macs( hh[21], bb[20], ah, al ); \
                {ah,al} = macs( hh[20], bb[19], ah, al ); \
                {ah,al} = macs( hh[19], bb[18], ah, al ); \
                {ah,al} = macs( hh[18], bb[17], ah, al ); \
                {ah,al} = macs( hh[17], bb[16], ah, al ); \
                {ah,al} = macs( hh[16], bb[15], ah, al ); \
                {ah,al} = macs( hh[15], bb[14], ah, al ); \
                {ah,al} = macs( hh[14], bb[13], ah, al ); \
                {ah,al} = macs( hh[13], bb[12], ah, al ); \
                {ah,al} = macs( hh[12], bb[11], ah, al ); \
                {ah,al} = macs( hh[11], bb[10], ah, al ); \
                {ah,al} = macs( hh[10], bb[ 9], ah, al ); \
                {ah,al} = macs( hh[ 9], bb[ 8], ah, al ); \
                {ah,al} = macs( hh[ 8], bb[ 7], ah, al ); \
                {ah,al} = macs( hh[ 7], bb[ 6], ah, al ); \
                {ah,al} = macs( hh[ 6], bb[ 5], ah, al ); \
                {ah,al} = macs( hh[ 5], bb[ 4], ah, al ); \
                {ah,al} = macs( hh[ 4], bb[ 3], ah, al ); \
                {ah,al} = macs( hh[ 3], bb[ 2], ah, al ); \
                {ah,al} = macs( hh[ 2], bb[ 1], ah, al ); \
                {ah,al} = macs( xx,     bb[ 0], ah, al ); hh[ 1] = xx; break; \
        \
        case 2: hh[43] = 3; \
                {ah,al} = macs( hh[40], bb[40], ah, al ); hh[40] = hh[36]; \
                {ah,al} = macs( hh[39], bb[39], ah, al ); \
                {ah,al} = macs( hh[38], bb[38], ah, al ); \
                {ah,al} = macs( hh[37], bb[37], ah, al ); \
                {ah,al} = macs( hh[36], bb[36], ah, al ); \
                {ah,al} = macs( hh[35], bb[35], ah, al ); \
                {ah,al} = macs( hh[34], bb[34], ah, al ); \
                {ah,al} = macs( hh[33], bb[33], ah, al ); \
                {ah,al} = macs( hh[32], bb[32], ah, al ); \
                {ah,al} = macs( hh[31], bb[31], ah, al ); \
                {ah,al} = macs( hh[30], bb[30], ah, al ); \
                {ah,al} = macs( hh[29], bb[29], ah, al ); \
                {ah,al} = macs( hh[28], bb[28], ah, al ); \
                {ah,al} = macs( hh[27], bb[27], ah, al ); \
                {ah,al} = macs( hh[26], bb[26], ah, al ); \
                {ah,al} = macs( hh[25], bb[25], ah, al ); \
                {ah,al} = macs( hh[24], bb[24], ah, al ); \
                {ah,al} = macs( hh[23], bb[23], ah, al ); \
                {ah,al} = macs( hh[22], bb[22], ah, al ); \
                {ah,al} = macs( hh[21], bb[21], ah, al ); \
                {ah,al} = macs( hh[20], bb[20], ah, al ); \
                {ah,al} = macs( hh[19], bb[19], ah, al ); \
                {ah,al} = macs( hh[18], bb[18], ah, al ); \
                {ah,al} = macs( hh[17], bb[17], ah, al ); \
                {ah,al} = macs( hh[16], bb[16], ah, al ); \
                {ah,al} = macs( hh[15], bb[15], ah, al ); \
                {ah,al} = macs( hh[14], bb[14], ah, al ); \
                {ah,al} = macs( hh[13], bb[13], ah, al ); \
                {ah,al} = macs( hh[12], bb[12], ah, al ); \
                {ah,al} = macs( hh[11], bb[11], ah, al ); \
                {ah,al} = macs( hh[10], bb[10], ah, al ); \
                {ah,al} = macs( hh[ 9], bb[ 9], ah, al ); \
                {ah,al} = macs( hh[ 8], bb[ 8], ah, al ); \
                {ah,al} = macs( hh[ 7], bb[ 7], ah, al ); \
                {ah,al} = macs( hh[ 6], bb[ 6], ah, al ); \
                {ah,al} = macs( hh[ 5], bb[ 5], ah, al ); \
                {ah,al} = macs( hh[ 4], bb[ 4], ah, al ); \
                {ah,al} = macs( hh[ 3], bb[ 3], ah, al ); \
                {ah,al} = macs( hh[ 2], bb[ 2], ah, al ); \
                {ah,al} = macs( hh[ 1], bb[ 1], ah, al ); \
                {ah,al} = macs( xx,     bb[ 0], ah, al ); hh[ 0] = xx; break; \
        \
        case 3: hh[43] = 0; \
                {ah,al} = macs( hh[39], bb[40], ah, al ); \
                {ah,al} = macs( hh[38], bb[39], ah, al ); \
                {ah,al} = macs( hh[37], bb[38], ah, al ); \
                {ah,al} = macs( hh[36], bb[37], ah, al ); \
                {ah,al} = macs( hh[35], bb[36], ah, al ); hh[39] = hh[35]; \
                {ah,al} = macs( hh[34], bb[35], ah, al ); hh[38] = hh[34]; \
                {ah,al} = macs( hh[33], bb[34], ah, al ); hh[37] = hh[33]; \
                {ah,al} = macs( hh[32], bb[33], ah, al ); hh[36] = hh[32]; \
                {ah,al} = macs( hh[31], bb[32], ah, al ); hh[35] = hh[31]; \
                {ah,al} = macs( hh[30], bb[31], ah, al ); hh[34] = hh[30]; \
                {ah,al} = macs( hh[29], bb[30], ah, al ); hh[33] = hh[29]; \
                {ah,al} = macs( hh[28], bb[29], ah, al ); hh[32] = hh[28]; \
                {ah,al} = macs( hh[27], bb[28], ah, al ); hh[31] = hh[27]; \
                {ah,al} = macs( hh[26], bb[27], ah, al ); hh[30] = hh[26]; \
                {ah,al} = macs( hh[25], bb[26], ah, al ); hh[29] = hh[25]; \
                {ah,al} = macs( hh[24], bb[25], ah, al ); hh[28] = hh[24]; \
                {ah,al} = macs( hh[23], bb[24], ah, al ); hh[27] = hh[23]; \
                {ah,al} = macs( hh[22], bb[23], ah, al ); hh[26] = hh[22]; \
                {ah,al} = macs( hh[21], bb[22], ah, al ); hh[25] = hh[21]; \
                {ah,al} = macs( hh[20], bb[21], ah, al ); hh[24] = hh[20]; \
                {ah,al} = macs( hh[19], bb[20], ah, al ); hh[23] = hh[19]; \
                {ah,al} = macs( hh[18], bb[19], ah, al ); hh[22] = hh[18]; \
                {ah,al} = macs( hh[17], bb[18], ah, al ); hh[21] = hh[17]; \
                {ah,al} = macs( hh[16], bb[17], ah, al ); hh[20] = hh[16]; \
                {ah,al} = macs( hh[15], bb[16], ah, al ); hh[19] = hh[15]; \
                {ah,al} = macs( hh[14], bb[15], ah, al ); hh[18] = hh[14]; \
                {ah,al} = macs( hh[13], bb[14], ah, al ); hh[17] = hh[13]; \
                {ah,al} = macs( hh[12], bb[13], ah, al ); hh[16] = hh[12]; \
                {ah,al} = macs( hh[11], bb[12], ah, al ); hh[15] = hh[11]; \
                {ah,al} = macs( hh[10], bb[11], ah, al ); hh[14] = hh[10]; \
                {ah,al} = macs( hh[ 9], bb[10], ah, al ); hh[13] = hh[ 9]; \
                {ah,al} = macs( hh[ 8], bb[ 9], ah, al ); hh[12] = hh[ 8]; \
                {ah,al} = macs( hh[ 7], bb[ 8], ah, al ); hh[11] = hh[ 7]; \
                {ah,al} = macs( hh[ 6], bb[ 7], ah, al ); hh[10] = hh[ 6]; \
                {ah,al} = macs( hh[ 5], bb[ 6], ah, al ); hh[ 9] = hh[ 5]; \
                {ah,al} = macs( hh[ 4], bb[ 5], ah, al ); hh[ 8] = hh[ 4]; \
                {ah,al} = macs( hh[ 3], bb[ 4], ah, al ); hh[ 7] = hh[ 3]; \
                {ah,al} = macs( hh[ 2], bb[ 3], ah, al ); hh[ 6] = hh[ 2]; \
                {ah,al} = macs( hh[ 1], bb[ 2], ah, al ); hh[ 5] = hh[ 1]; \
                {ah,al} = macs( hh[ 0], bb[ 1], ah, al ); hh[ 4] = hh[ 0]; \
                {ah,al} = macs( xx,     bb[ 0], ah, al ); hh[ 3] = xx; break; \
    }

int xsignalproc_fir_n40_r31x31c31( int xx, const int bb[41], int hh[44] ) { _XSIGNALPROC_FIR40; return (ah<< 1)+(al>>31); }
int xsignalproc_fir_n40_r31x31c28( int xx, const int bb[41], int hh[44] ) { _XSIGNALPROC_FIR40; return (ah<< 4)+(al>>28); }
int xsignalproc_fir_n40_r31x31c25( int xx, const int bb[41], int hh[44] ) { _XSIGNALPROC_FIR40; return (ah<< 7)+(al>>25); }
int xsignalproc_fir_n40_r31x28c31( int xx, const int bb[41], int hh[44] ) { _XSIGNALPROC_FIR40; return (ah<< 4)+(al>>28); }
int xsignalproc_fir_n40_r31x28c28( int xx, const int bb[41], int hh[44] ) { _XSIGNALPROC_FIR40; return (ah<< 7)+(al>>25); }
int xsignalproc_fir_n40_r31x28c25( int xx, const int bb[41], int hh[44] ) { _XSIGNALPROC_FIR40; return (ah<<10)+(al>>22); }
int xsignalproc_fir_n40_r31x25c31( int xx, const int bb[41], int hh[44] ) { _XSIGNALPROC_FIR40; return (ah<< 7)+(al>>25); }
int xsignalproc_fir_n40_r31x25c28( int xx, const int bb[41], int hh[44] ) { _XSIGNALPROC_FIR40; return (ah<<10)+(al>>22); }
int xsignalproc_fir_n40_r31x25c25( int xx, const int bb[41], int hh[44] ) { _XSIGNALPROC_FIR40; return (ah<<13)+(al>>19); }
int xsignalproc_fir_n40_r28x31c31( int xx, const int bb[41], int hh[44] ) { _XSIGNALPROC_FIR40; return (ah>> 2);          }
int xsignalproc_fir_n40_r28x31c28( int xx, const int bb[41], int hh[44] ) { _XSIGNALPROC_FIR40; return (ah<< 1)+(al>>31); }
int xsignalproc_fir_n40_r28x31c25( int xx, const int bb[41], int hh[44] ) { _XSIGNALPROC_FIR40; return (ah<< 7)+(al>>25); }
int xsignalproc_fir_n40_r28x28c31( int xx, const int bb[41], int hh[44] ) { _XSIGNALPROC_FIR40; return (ah<< 1)+(al>>31); }
int xsignalproc_fir_n40_r28x28c28( int xx, const int bb[41], int hh[44] ) { _XSIGNALPROC_FIR40; return (ah<< 4)+(al>>28); }
int xsignalproc_fir_n40_r28x28c25( int xx, const int bb[41], int hh[44] ) { _XSIGNALPROC_FIR40; return (ah<< 7)+(al>>25); }
int xsignalproc_fir_n40_r28x25c31( int xx, const int bb[41], int hh[44] ) { _XSIGNALPROC_FIR40; return (ah<< 7)+(al>>25); }
int xsignalproc_fir_n40_r28x25c28( int xx, const int bb[41], int hh[44] ) { _XSIGNALPROC_FIR40; return (ah<< 7)+(al>>25); }
int xsignalproc_fir_n40_r28x25c25( int xx, const int bb[41], int hh[44] ) { _XSIGNALPROC_FIR40; return (ah<<10)+(al>>22); }
int xsignalproc_fir_n40_r25x31c31( int xx, const int bb[41], int hh[44] ) { _XSIGNALPROC_FIR40; return (ah>> 5);          }
int xsignalproc_fir_n40_r25x31c28( int xx, const int bb[41], int hh[44] ) { _XSIGNALPROC_FIR40; return (ah>> 2);          }
int xsignalproc_fir_n40_r25x31c25( int xx, const int bb[41], int hh[44] ) { _XSIGNALPROC_FIR40; return (ah<< 1)+(al>>31); }
int xsignalproc_fir_n40_r25x28c31( int xx, const int bb[41], int hh[44] ) { _XSIGNALPROC_FIR40; return (ah>> 2);          }
int xsignalproc_fir_n40_r25x28c28( int xx, const int bb[41], int hh[44] ) { _XSIGNALPROC_FIR40; return (ah<< 1)+(al>>31); }
int xsignalproc_fir_n40_r25x28c25( int xx, const int bb[41], int hh[44] ) { _XSIGNALPROC_FIR40; return (ah<< 4)+(al>>28); }
int xsignalproc_fir_n40_r25x25c31( int xx, const int bb[41], int hh[44] ) { _XSIGNALPROC_FIR40; return (ah<< 1)+(al>>31); }
int xsignalproc_fir_n40_r25x25c28( int xx, const int bb[41], int hh[44] ) { _XSIGNALPROC_FIR40; return (ah<< 4)+(al>>28); }
int xsignalproc_fir_n40_r25x25c25( int xx, const int bb[41], int hh[44] ) { _XSIGNALPROC_FIR40; return (ah<< 7)+(al>>25); }