📄 filter.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 + -