#ifndef _FILTER_H
#define _FILTER_H


//---------------------------------------------------------------
//	Filter
//		Abstract: IIR filter 
//		Inputs:	  	order of the filter n
//					numerator coefficients num[n+1]
//					denominator coefficients den[n+1], den[0]=1.0
//					input signal sample x
//		Outputs:	filtered output y  
//---------------------------------------------------------------

class IIRFilter {
	int const n;
	double const * const num;
	double const * const den;
	double       * const q;

public:
	IIRFilter( int _n, double* _num, double* _den)
	:	n(_n), num(_num), den(_den), q(new double[_n+2]) 
	{  
		reset();
	}

	double operator ()( double x){
		double y = num[0]*x + q[1];
		for( int i = 0; i <= n; ++i )
			q[i] = num[i]*x - den[i]*y + q[i+1];
		return y;
	}

	void   reset(void){
		for( int i = 0; i < n+2; ++i )	q[i] = 0.0;
	}	
};

#endif