/******************************************************************************/ /******************************************************************************/ #define pi 3.1415926535897932384626433832795 #define IIR_FILTERTYPE_UNKNOWN 0x00000000 #define IIR_FILTERTYPE_LOWPASS 0x00000001 #define IIR_FILTERTYPE_HIGHPASS 0x00000002 #define IIR_FILTERTYPE_BANDPASS 0x00000003 #define IIR_FILTERTYPE_BANDSTOP 0x00000004 /******************************************************************************/ typedef struct _sComplex { double pRealData, pImagData; } Complex; class CIIRCoeff { public: CIIRCoeff(unsigned Na=0, unsigned Nb=0) { Init(Na, Nb); } ~CIIRCoeff() { if(m_pak!=0) delete [] m_pak; if(m_pbk!=0) delete [] m_pbk; } void Init(unsigned Na=0, unsigned Nb=0) { m_pak= 0; m_pbk= 0; m_Na = Na; m_Nb = Nb; m_aScale = 1.0; m_bScale = 1.0; if(Na!=0) m_pak = new double[Na+1]; if(Nb!=0) m_pbk = new double[Nb+1]; } double *m_pak, m_aScale; unsigned m_Na; double *m_pbk, m_bScale; unsigned m_Nb; }; /******************************************************************************/ int IIRCalcPartFilterCoeff1(CIIRCoeff *pCoeff, double fg, double fa, double Qi, unsigned filterType); int IIRCalcPartFilterCoeff2(CIIRCoeff *pCoeff, double fg, double fa, double Qi, unsigned filterType); int IIRCalcFilterCoeff(double fg, double fa, double Qi, unsigned N, CIIRCoeff *pCoeff, unsigned filterType); double IIRBilTrans(double fg, double fa); double IIRCalcQp(unsigned p, unsigned N); unsigned IIRMulPolynom(double *pA, unsigned orderA, double *pB, unsigned orderB, double *pProduct); void IIR(double *xn, double *yn, CIIRCoeff *pCoeff, unsigned numPoints); void IIRPrintCoeff(FILE *pFile, CIIRCoeff *pCoeff, unsigned N); void ScaleCoeff(CIIRCoeff *pCoeff); double MinMag(double val1, double val2); double MaxMag(double val1, double val2); /******************************************************************************/