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