FIR IIR 數字濾波器 C++實現

 FIR實現,已驗證
class CFilter_FIR  
{
public:
	CFilter_FIR();
	virtual ~CFilter_FIR();
private:
	double *m_pB;

	double *m_pdata_buf;

	int m_nB_order;

	int m_nFirIndex;
public:
	void reset();
	
	/*brief:×¢Ò⣺BÊý×éΪnB_order¸ö
	*/
	void setPara(double B[], int nB_order);

	double filter(double data);
	void filter(double data[], int len);
	void filter(double data_in[], double data_out[], int len);

};
 cpp文件
CFilter_FIR::CFilter_FIR()
{
	m_pB = NULL;
	m_pdata_buf = NULL;
	m_nB_order = 0;

	m_nFirIndex = 0;
}

CFilter_FIR::~CFilter_FIR()
{
	if (m_pdata_buf)
	{
		delete m_pdata_buf;
		m_pdata_buf = NULL;
	}
	if (m_pB)
	{
		delete m_pB;
		m_pB = NULL;
	}
}
/** \brief ½«Â˲¨Æ÷µÄÄÚ²¿×´Ì¬ÇåÁã
 * \return
 */
void CFilter_FIR::reset()
{
    for(int i = 0; i < m_nB_order; i++)
    {
		m_pdata_buf[i] = 0.0;
    }
	m_nFirIndex = 0;
}

/** \brief 
 * 
 * \return 
 */  
void CFilter_FIR::setPara(double B[], int nB_order)
{
	m_nB_order = nB_order;

	if (m_pB)
	{
		delete m_pB;
	}
	if (m_pdata_buf)
	{
		delete m_pdata_buf;
	}

    m_pB = new double[nB_order ];
    m_pdata_buf = new double[nB_order ];

    for(int i = 0; i < nB_order; i++)
    {
        m_pB[i] = B[i];
        m_pdata_buf[i] = 0.0;
    }	
}

/** \brief Â˲¨º¯Êý
 * 
 * \param data ´«ÈëÊäÈëÊý¾Ý 
 * \return Â˲¨ºóµÄ½á¹û 
*/  
double CFilter_FIR::filter(double data)
{
	int k;
	double fOut = 0.0;
    
	int i = 0;
	m_pdata_buf[m_nFirIndex%m_nB_order] = data;
	fOut = 0.0f;
	
	for (i = 0; i < m_nB_order; ++i)
	{
		fOut += m_pdata_buf[(m_nFirIndex +i+1)%m_nB_order]*m_pB[i];
	}
	
	m_nFirIndex++;
	return fOut;
}


/** \brief Â˲¨º¯Êý
 * 
 * \param data[] ´«ÈëÊäÈëÊý¾Ý£¬·µ»Øʱ¸ø³öÂ˲¨ºóµÄ½á¹û 
 * \param len data[] Êý×éµÄ³¤¶È 
 * \return 
 */  
void CFilter_FIR::filter(double data[], int len)
{
   int k;
   double fOut = 0.0;
    for(k = 0; k < len; k++)
    {
		int i = 0;
		m_pdata_buf[m_nFirIndex%m_nB_order] = data[k];
		fOut = 0.0f;
		
		for (i = 0; i < m_nB_order; ++i)
		{
			fOut += m_pdata_buf[(m_nFirIndex +i+1)%m_nB_order]*m_pB[i];
		}
		m_nFirIndex++;

		data[k] = fOut;
    
	}
}
/** \brief Â˲¨º¯Êý
* 
* \param data_in[] ÊäÈëÊý¾Ý 
* \param data_out[] ±£´æÂ˲¨ºóµÄÊý¾Ý 
* \param len Êý×éµÄ³¤¶È 
* \return 
*/  
void CFilter_FIR::filter(double data_in[], double data_out[], int len)
{
    int k;
    for(k = 0; k < len; k++)
    {
		int i = 0;
		m_pdata_buf[m_nFirIndex%m_nB_order] = data_in[k];
		data_out[k] = 0.0f;
		
		for (i = 0; i < m_nB_order; ++i)
		{
			data_out[k] += m_pdata_buf[(m_nFirIndex +i+1)%m_nB_order]*m_pB[i];
		}
		m_nFirIndex++;
    }
}






 IIR實現,驗證過的

class CFilter_IIR_I  
{
public:
	CFilter_IIR_I();
	virtual ~CFilter_IIR_I();
	
private:
	double *m_pNum;
	double *m_pDen;
	double *m_px;
	double *m_py;
	int m_num_order;
	int m_den_order;
public:
	void reset();
	
	/*brief:×¢Ò⣺numÊý×éΪnum_order¸ö£¬denÊý×éΪden_order¸ö
	*/
	void setPara(double num[], int num_order, double den[], int den_order);

	void resp(double data_in[], int m, double data_out[], int n);
	double filter(double data);
	void filter(double data[], int len);
	void filter(double data_in[], double data_out[], int len);
	
};

cpp文件

CFilter_IIR_I::CFilter_IIR_I()
{
    m_pNum = NULL;
    m_pDen = NULL;
    m_px = NULL;
    m_py = NULL;
    m_num_order = -1;
    m_den_order = -1;
}

CFilter_IIR_I::~CFilter_IIR_I()
{

}
/** \brief ½«Â˲¨Æ÷µÄÄÚ²¿×´Ì¬ÇåÁ㣬Â˲¨Æ÷µÄϵÊý±£Áô 
 * \return
 */
void CFilter_IIR_I::reset()
{
    for(int i = 0; i < m_num_order; i++)
    {
        m_pNum[i] = 0.0;
    }
    for(i = 0; i < m_den_order; i++)
    {
        m_pDen[i] = 0.0;
    }
}

/** \brief 
 * 
 * \param num ·Ö×Ó¶àÏîʽµÄϵÊý£¬ÉýÐòÅÅÁÐ,num[0] Ϊ³£ÊýÏî 
 * \param m ·Ö×Ó¶àÏîʽµÄ½×Êý 
 * \param den ·Öĸ¶àÏîʽµÄϵÊý£¬ÉýÐòÅÅÁÐ,den[0] Ϊ³£ÊýÏî 
 * \param m ·Öĸ¶àÏîʽµÄ½×Êý 
 * \return 
 */  
void CFilter_IIR_I::setPara(double num[], int num_order, double den[], int den_order)
{
    delete[] m_pNum;
    delete[] m_pDen;
    delete[] m_px;
    delete[] m_py;
    m_pNum = new double[num_order ];
    m_pDen = new double[den_order ];
    m_num_order = num_order;
    m_den_order = den_order;
    m_px = new double[num_order ];
    m_py = new double[den_order ];
    for(int i = 0; i < m_num_order; i++)
    {
        m_pNum[i] = num[i];
        m_px[i] = 0.0;
    }
    for(i = 0; i < m_den_order; i++)
    {
        m_pDen[i] = den[i];
        m_py[i] = 0.0;
    }
}

/** \brief Â˲¨º¯Êý£¬²ÉÓÃÖ±½ÓIÐͽṹ 
 * 
 * \param data ´«ÈëÊäÈëÊý¾Ý 
 * \return Â˲¨ºóµÄ½á¹û 
 */  
double CFilter_IIR_I::filter(double data)
{
    m_py[0] = 0.0; // ????????
    m_px[0] = data;
    for(int i = 0; i < m_num_order; i++)
    {
        m_py[0] = m_py[0] + m_pNum[i] * m_px[i];
    }
    for(i = 1; i < m_den_order; i++)
    {
        m_py[0] = m_py[0] - m_pDen[i] * m_py[i];
    }
    for(i = m_num_order-1; i >= 1; i--)
    {
        m_px[i] = m_px[i-1];
    }
    for(i = m_den_order-1; i >= 1; i--)
    {
        m_py[i] = m_py[i-1];
    }
    return m_py[0];
}


/** \brief Â˲¨º¯Êý£¬²ÉÓÃÖ±½ÓIÐͽṹ 
 * 
 * \param data[] ´«ÈëÊäÈëÊý¾Ý£¬·µ»Øʱ¸ø³öÂ˲¨ºóµÄ½á¹û 
 * \param len data[] Êý×éµÄ³¤¶È 
 * \return 
 */  
void CFilter_IIR_I::filter(double data[], int len)
{
    int i, k;
    for(k = 0; k < len; k++)
    {
        m_px[0] = data[k];
        data[k] = 0.0;
        for(i = 0; i < m_num_order; i++)
        {
            data[k] = data[k] + m_pNum[i] * m_px[i];
        }
        for(i = 1; i < m_den_order; i++)
        {
            data[k] = data[k] - m_pDen[i] * m_py[i];
        }
        // we get the y value now
        m_py[0] = data[k];
        for(i = m_num_order-1; i >= 1; i--)
        {
            m_px[i] = m_px[i-1];
        }
        for(i = m_den_order-1; i >= 1; i--)
        {
            m_py[i] = m_py[i-1];
        }
    }
}
/** \brief Â˲¨º¯Êý£¬²ÉÓÃÖ±½ÓIÐͽṹ 
 * 
 * \param data_in[] ÊäÈëÊý¾Ý 
 * \param data_out[] ±£´æÂ˲¨ºóµÄÊý¾Ý 
 * \param len Êý×éµÄ³¤¶È 
 * \return 
 */  
void CFilter_IIR_I::filter(double data_in[], double data_out[], int len)
{
    int i, k;
    for(k = 0; k < len; k++)
    {
        m_px[0] = data_in[k];
        m_py[0] = 0.0;
        for(i = 0; i < m_num_order; i++)
        {
            m_py[0] += m_pNum[i] * m_px[i];
        }
        for(i = 1; i < m_den_order; i++)
        {
            m_py[0] -= m_pDen[i] * m_py[i];
        }
        for(i = m_num_order-1; i >= 1; i--)
        {
            m_px[i] = m_px[i-1];
        }
        for(i = m_den_order-1; i >= 1; i--)
        {
            m_py[i] = m_py[i-1];
        }
        data_out[k] = m_py[0];
    }
}
/** \brief ¼ÆËã IIR Â˲¨Æ÷µÄʱÓòÏìÓ¦£¬²»Ó°ÏìÂ˲¨Æ÷µÄÄÚ²¿×´Ì¬ 
 * \param data_in ΪÂ˲¨Æ÷µÄÊäÈ룬0 ʱ¿Ì֮ǰµÄÊäÈëĬÈÏΪ 0£¬data_in[M] ¼°Ö®ºóµÄÊäÈëĬÈÏΪdata_in[M-1] 
 * \param data_out Â˲¨Æ÷µÄÊä³ö 
 * \param M ÊäÈëÊý¾ÝµÄ³¤¶È 
 * \param N Êä³öÊý¾ÝµÄ³¤¶È 
 * \return 
 */  
void CFilter_IIR_I::resp(double data_in[], int M, double data_out[], int N)  
{  
    int i, k, il;  
    for(k = 0; k < N; k++)  
    {  
        data_out[k] = 0.0;  
        for(i = 0; i < m_num_order; i++)  
        {  
            if( k - i >= 0)  
            {  
                il = ((k - i) < M) ? (k - i) : (M - 1);  
                data_out[k] = data_out[k] + m_pNum[i] * data_in[il];  
            }  
        }  
        for(i = 1; i < m_den_order; i++)  
        {  
            if( k - i >= 0)  
            {  
                data_out[k] = data_out[k] - m_pDen[i] * data_out[k - i];  
            }  
        }  
    }  
}  

IIR參考http://blog.csdn.net/liyuanbhu/article/details/38849897#comments

發佈了18 篇原創文章 · 獲贊 26 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章