⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 filter.c

📁 一个单片机心电图数据采集带通滤波的算法。
💻 C
字号:
#include "config.h"
#include "Ecgini.h"

//extern int16   g_FilterData[ DISP_MAX_LEN ];
//extern int16   g_uCurData[ DISP_MAX_LEN ];	// 当前采集的心电图数据,压缩格式,17字节为一个点
extern uint32  g_DispWOff;
extern int32   g_Src320Off;
extern GATHERPARA g_PrnPara;

int16* g_SrcDat;

// 滤波参数

static float b_50[3] = {
   7.369218750000e+002F,
  -1.401718750000e+003F,
   7.369218750000e+002F};

//float gain_50=1.354008913040e-003F;
static float a_50[3] = {
   1.354008913040e-003F, 
  -1.897979736328e+000F, 
   9.956054687500e-001F}; 

float w1_50[MAX_DAO];
float w2_50[MAX_DAO];


static  float b_05[3] = {
1,    -1.96529007,              1 };
static  float a_05[3] = {
0.000100485,   -1.997929215,   0.9979330897 
};
  
double w1_05[ MAX_DAO ];
double w2_05[ MAX_DAO ];

float g_gain5 = 0.000100485;   

static char b_25[ 3 ] =
	 {
	1,    2,              1
   };
	    
static float a_25[3] =
	 {
    0.00554272,   -1.778631806,   0.8008026481
     };
     
float w1_25[ MAX_DAO ];
float w2_25[ MAX_DAO ];

static char b_35[  3] = {
   1,    2,              1}; 
   
//static float gain=0.0104324;
static float a_35[ 3] = {
   0.0104324,   -1.690996408,   0.7327260375}; 


float w1_35[ MAX_DAO ];
float w2_35[ MAX_DAO ];
// 实时滤波

double g_temp;   /* scratch variable */

// 滤交流 50HZ
void filter_Bandstop50( int16* pIn, int16* pOut )
{
	uint8 i;
	
	for( i = 0; i < MAX_DAO; i++)
	{
	   	g_temp = ( a_50[0] * pIn[ i ] - a_50[1] * w1_50[ i ] - a_50[2] * w2_50[i] );
		pOut[ i ] = ( b_50[0] * g_temp + b_50[1] * w1_50[ i ] + b_50[2] * w2_50[i] );
	    w2_50[ i ] = w1_50[i];
		w1_50[ i ] = g_temp;
	}	
}

// 滤基线 0.5Hz
void filter_highpass05 ( int16* pIn, int16* pOut )  
{
	uint8 i;
	double temp;
		
	for ( i=0; i < MAX_DAO; i++)
	{	
	   	temp = ( a_05[0] * pIn[ i ] - a_05[1] * w1_05[ i ] - a_05[2] * w2_05[i] ) ;
	   	pOut[ i ] = ( b_05[0] * temp + b_05[1] * w1_05[ i ] + b_05[2] * w2_05[i] );
		   	
	   	if( g_SrcDat != NULL )
		   	pOut[ i ] = g_SrcDat[ i ] - pOut[ i ];
	   	
	    w2_05[ i ] = w1_05[i];
		w1_05[ i ] = temp;				
	}
}


void filter_lowpass25 ( int16* pIn, int16* pOut )  
{
	uint8 i;
	
	for ( i=0; i < MAX_DAO; i++)
	{
	   	g_temp = ( a_25[0] * pIn[ i ] - a_25[1] * w1_25[ i ] - a_25[2] * w2_25[i] );
	   	pOut[ i ] = ( b_25[0] * g_temp + b_25[1] * w1_25[ i ] + b_25[2] * w2_25[i] );
	    w2_25[ i ] = w1_25[i];
	    w1_25[i] = g_temp;
	}
}


void filter_lowpass35 ( int16* pIn, int16* pOut )  
{
	uint8 i;
	
	for ( i=0; i < MAX_DAO; i++)
	{
	   	g_temp = ( a_35[0] * pIn[ i ] - a_35[1] * w1_35[ i ] - a_35[2] * w2_35[i] );
	   	pOut[ i ] = ( b_35[0] * g_temp + b_35[1] * w1_35[ i ] + b_35[2] * w2_35[i] );
	    w2_35[ i ] = w1_35[i];
	    w1_35[i] = g_temp;
	}
}

void FilterInit( void )
{
	uint8 i=0;
	for( i=0; i< MAX_DAO; i++ )	
	{	
		w1_50[i] = 0;
		w2_50[i] = 0;
		w1_05[i] = 0;
		w2_05[i] = 0;
		w1_25[i] = 0;
		w2_25[i] = 0;
		w1_35[i] = 0;
		w2_35[i] = 0;
	}

}
/************************************************
* Filter( ) 滤波
*
**************************************************/
void Filter( int16* pInD, int16* pOutD )
{
	uint8 i;
	int16* pIn = &pInD[ g_DispWOff ];
	int16* pOut = &pOutD[ g_DispWOff ];
	
	if( g_Src320Off >= 0 )
		g_SrcDat = &pInD[ g_Src320Off ];
	else	
		g_SrcDat = NULL;
		
	if( g_PrnPara.filter )
	{										
		if( g_PrnPara.filter & FILTER_JX ) // 基线
		{
			filter_highpass05( pIn, pOut );
			pIn = pOut;
		}
		
		if( g_PrnPara.filter & FILTER_25 )
		{
			filter_lowpass25( pIn, pOut );
		}
		else if( g_PrnPara.filter & FILTER_35 )
		{
			filter_lowpass35( pIn, pOut );
		}
		else if( g_PrnPara.filter & FILTER_JL ) // 交流
		{
			filter_Bandstop50( pIn, pOut );	
		}		
	}
	else
	{
		for ( i=0; i < MAX_DAO; i++)
		   	pOut[ i ] = pIn[ i ];
	}	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -