iir滤波器c++

C++语言 码拜 9年前 (2016-06-06) 1736次浏览
采用巴特沃斯滤波器对脉搏数据滤波,系数是用matlab算出来的,滤波器阶次为4,为何算出来的结果和matlab调用filter函数差距这么大。
iir滤波器c++

#include "StdAfx.h"
#include "BWFilter.h" 
CBWFilter::CBWFilter()
{
   
    m_pNum = NULL;
    m_pDen = NULL;
    m_px = NULL;
    m_py = NULL;
    m_num_order = 4;
    m_den_order = 4;
}
vector<float>CBWFilter::SmoothFilter(int fs, vector<float> &RawData) 
{
	vector<float> vtData(RawData.begin(),RawData.end());
	vector<float> vtSmoothed(RawData.size(),0);
	 //采样频率选择
	if (fs == 1000)
	{
		//分子系数
		b[0]=0.0552;
		b[1]=0.2209;
		b[2]=0.3313;
		b[3]=0.2209;
		b[4]=0.0552;
		//分母系数
		a[0]=1.0f;
		a[1]=-3.7385;
		a[2]=5.2492;
		a[3]=-3.2803;
		a[4]=0.7698;
	}
    delete[] m_pNum;
    delete[] m_pDen;
    delete[] m_px;
    delete[] m_py;
    m_pNum = new double[m_num_order + 1];
    m_pDen = new double[m_den_order + 1];
    m_px = new double[m_num_order + 1];
    m_py = new double[m_den_order + 1];
	for(int i = 0; i <= m_num_order; i++)
    {
        m_px[i] = vtData[0];
    }
    for(int i = 0; i <= m_den_order; i++)
    {
        m_py[i] =vtData[0];
    }
	 int j, k;
    for(vector<float>::size_type k=4; k!=vtData.size();k++)
    {
        m_px[0] = vtData[k];
        m_py[0] = 0.0f;
        for(j = 0; j <= m_num_order; j++)
        {
             m_py[0] = m_py[0] + b[j] * m_px[j];
        }
        for(j = 1; j <= m_den_order; j++)
        {
            m_py[0] = m_py[0] - a[j] * m_py[j];
        }
        for(j = m_num_order; j >= 1; j--)
        {
            m_px[j] = m_px[j-1];
        }
        for(j = m_den_order; j >= 1; j--)
        {
            m_py[j] = m_py[j-1];
        }
       vtSmoothed[k]=m_py[0];
	}
	return vtSmoothed;
}
解决方案

20

去仔细看 irr 的公式,再和你的程序对比一下。

20

把float类型改为double类型试试,再不行的话,就得检查算法了。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明iir滤波器c++
喜欢 (0)
[1034331897@qq.com]
分享 (0)