#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 ];
}
}
ECG.zip_ECG_ecg 单片机_单片机心电图_滤波算法
版权申诉
5星 · 超过95%的资源 116 浏览量
2022-09-22
20:36:43
上传
评论 1
收藏 5KB ZIP 举报
林当时
- 粉丝: 95
- 资源: 1万+
最新资源
- ### 词向量的介绍、使用技巧和优缺点的文章
- 基于STM32F103CBT6单片机GC65+MP2625+CC1101 GPSTrack模块板硬件(原理图+PCB)工程文件
- ### 通道处理过程模拟概念、优缺点和使用技巧
- ### MyBatis动态SQL介绍说明、使用技巧和优缺点
- 上传下载仿163网盘无刷新文件上传 for Jsp-fileupload-jsp.rar
- VMware Workstation业界非常稳定且安全的桌面虚拟机软件-计算机上运行多个操作系统,支持Windows、DOS等
- 基于STM8L101F3P6单片机+LY2508A33P+CC1100遥控器硬件(原理图+PCB)工程文件.zip
- 上传下载WAP图铃下载系统-unimg.rar
- YTX-0.1.0-Win
- 上传下载ExtJS 2.2 开源网络硬盘系统-dogdisk.rar
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
评论2