#include <stdlib.h>
#include <stdio.h>
#include <wfdb/ecgcodes.h>
#include "bdac.h"
#define MATCH_LENGTH BEAT_MS300
#define MATCH_LIMIT 1.2
#define COMBINE_LIMIT 0.8
#define MATCH_START (FIDMARK-(MATCH_LENGTH/2))
#define MATCH_END (FIDMARK+(MATCH_LENGTH/2))
#define MAXPREV 8
#define MAX_SHIFT BEAT_MS40
int NoiseCheck(int *beat) ;
double CompareBeats(int *beat1, int *beat2, int *shiftAdj) ;
double CompareBeats2(int *beat1, int *beat2, int *shiftAdj) ;
void UpdateBeat(int *aveBeat, int *newBeat, int shift) ;
void BeatCopy(int srcBeat, int destBeat) ;
int MinimumBeatVariation(int type) ;
void AnalyzeBeat(int *beat, int *onset, int *offset, int *isoLevel,
int *beatBegin, int *beatEnd, int *amp) ;
void AdjustDomData(int oldType, int newType) ;
void CombineDomData(int oldType, int newType) ;
int BeatTemplates[MAXTYPES][BEATLGTH] ;
int BeatCounts[MAXTYPES] ;
int BeatWidths[MAXTYPES] ;
int BeatClassifications[MAXTYPES] ;
int BeatBegins[MAXTYPES] ;
int BeatEnds[MAXTYPES] ;
int BeatsSinceLastMatch[MAXTYPES] ;
int BeatAmps[MAXTYPES] ;
int BeatCenters[MAXTYPES] ;
double MIs[MAXTYPES][8] ;
extern int PostClass[MAXTYPES][8] ;
extern int PCRhythm[MAXTYPES][8] ;
int TypeCount = 0 ;
void ResetMatch(void)
{
int i, j ;
TypeCount = 0 ;
for(i = 0; i < MAXTYPES; ++i)
{
BeatCounts[i] = 0 ;
BeatClassifications[i] = UNKNOWN ;
for(j = 0; j < 8; ++j)
{
MIs[i][j] = 0 ;
}
}
}
#define MATCH_START (FIDMARK-(MATCH_LENGTH/2))
#define MATCH_END (FIDMARK+(MATCH_LENGTH/2))
double CompareBeats(int *beat1, int *beat2, int *shiftAdj)
{
int i, max, min, magSum, shift ;
long beatDiff, meanDiff, minDiff, minShift ;
double metric, scaleFactor, tempD ;
max = min = beat1[MATCH_START] ;
for(i = MATCH_START+1; i < MATCH_END; ++i)
if(beat1[i] > max)
max = beat1[i] ;
else if(beat1[i] < min)
min = beat1[i] ;
magSum = max - min ;
i = MATCH_START ;
max = min = beat2[i] ;
for(i = MATCH_START+1; i < MATCH_END; ++i)
if(beat2[i] > max)
max = beat2[i] ;
else if(beat2[i] < min)
min = beat2[i] ;
scaleFactor = magSum ;
scaleFactor /= max-min ;
magSum *= 2 ;
for(shift = -MAX_SHIFT; shift <= MAX_SHIFT; ++shift)
{
for(i = FIDMARK-(MATCH_LENGTH>>1), meanDiff = 0;
i < FIDMARK + (MATCH_LENGTH>>1); ++i)
{
tempD = beat2[i+shift] ;
tempD *= scaleFactor ;
meanDiff += beat1[i]- tempD ;
}
meanDiff /= MATCH_LENGTH ;
for(i = FIDMARK-(MATCH_LENGTH>>1), beatDiff = 0;
i < FIDMARK + (MATCH_LENGTH>>1); ++i)
{
tempD = beat2[i+shift] ;
tempD *= scaleFactor ;
beatDiff += abs(beat1[i] - meanDiff- tempD) ;
}
if(shift == -MAX_SHIFT)
{
minDiff = beatDiff ;
minShift = -MAX_SHIFT ;
}
else if(beatDiff < minDiff)
{
minDiff = beatDiff ;
minShift = shift ;
}
}
metric = minDiff ;
*shiftAdj = minShift ;
metric /= magSum ;
metric *= 30 ;
metric /= MATCH_LENGTH ;
return(metric) ;
}
double CompareBeats2(int *beat1, int *beat2, int *shiftAdj)
{
int i, max, min, shift ;
int mag1, mag2 ;
long beatDiff, meanDiff, minDiff, minShift ;
double metric ;
max = min = beat1[MATCH_START] ;
for(i = MATCH_START+1; i < MATCH_END; ++i)
if(beat1[i] > max)
max = beat1[i] ;
else if(beat1[i] < min)
min = beat1[i] ;
mag1 = max - min ;
i = MATCH_START ;
max = min = beat2[i] ;
for(i = MATCH_START+1; i < MATCH_END; ++i)
if(beat2[i] > max)
max = beat2[i] ;
else if(beat2[i] < min)
min = beat2[i] ;
mag2 = max-min ;
for(shift = -MAX_SHIFT; shift <= MAX_SHIFT; ++shift)
{
for(i = FIDMARK-(MATCH_LENGTH>>1), meanDiff = 0;
i < FIDMARK + (MATCH_LENGTH>>1); ++i)
meanDiff += beat1[i]- beat2[i+shift] ;
meanDiff /= MATCH_LENGTH ;
for(i = FIDMARK-(MATCH_LENGTH>>1), beatDiff = 0;
i < FIDMARK + (MATCH_LENGTH>>1); ++i)
beatDiff += abs(beat1[i] - meanDiff- beat2[i+shift]) ; ;
if(shift == -MAX_SHIFT)
{
minDiff = beatDiff ;
minShift = -MAX_SHIFT ;
}
else if(beatDiff < minDiff)
{
minDiff = beatDiff ;
minShift = shift ;
}
}
metric = minDiff ;
*shiftAdj = minShift ;
metric /= (mag1+mag2) ;
metric *= 30 ;
metric /= MATCH_LENGTH ;
return(metric) ;
}
void UpdateBeat(int *aveBeat, int *newBeat, int shift)
{
int i ;
long tempLong ;
for(i = 0; i < BEATLGTH; ++i)
{
if((i+shift >= 0) && (i+shift < BEATLGTH))
{
tempLong = aveBeat[i] ;
tempLong *= 7 ;
tempLong += newBeat[i+shift] ;
tempLong >>= 3 ;
aveBeat[i] = tempLong ;
}
}
}
int GetTypesCount(void)
{
return(TypeCount) ;
}
int GetBeatTypeCount(int type)
{
return(BeatCounts[type]) ;
}
int GetBeatWidth(int type)
{
return(BeatWidths[type]) ;
}
int GetBeatCenter(int type)
{
return(BeatCenters[type]) ;
}
int GetBeatClass(int type)
{
if(type == MAXTYPES)
return(UNKNOWN) ;
return(BeatClassifications[type]) ;
}
void SetBeatClass(int type, int beatClass)
{
BeatClassifications[type] = beatClass ;
}
int NewBeatType(int *newBeat )
{
int i, onset, offset, isoLevel, beatBegin, beatEnd ;
int mcType, amp ;
for(i = 0; i < TypeCount; ++i)
++BeatsSinceLastMatch[i] ;
if(TypeCount < MAXTYPES)
{
for(i = 0; i < BEATLGTH; ++i)
BeatTemplates[TypeCount][i] = newBeat[i] ;
BeatCounts[TypeCount] = 1 ;
BeatClassifications[TypeCount] = UNKNOWN ;
AnalyzeBeat(&BeatTemplates[TypeCount][0],&onset,&offset, &isoLevel,
&beatBegin, &beatEnd, &) ;
BeatWidths[TypeCount] = offset-onset ;
BeatCenters[TypeCount] = (offset+onset)/2 ;
BeatBegins[TypeCount] = beatBegin ;
BeatEnds[TypeCount] = beatEnd ;
BeatAmps[TypeCount] = amp ;
BeatsSinceLastMatch[TypeCount] = 0 ;
++TypeCount ;
return(TypeCount-1) ;
}
else
{
mcType = -1 ;
if(mcType == -1)
{
mcType = 0 ;
for(i = 1; i < MAXTYPES; ++i)
if(BeatCounts[i] < BeatCounts[mcType])
mcType = i ;
else if(BeatCounts[i] == BeatCounts[mcType])
{
if(BeatsSinceLastMatch[i] > BeatsSinceLastMatch[mcType])
mcType = i ;
}
}
AdjustDomData(mcType,MAXTYPES) ;
for(i = 0; i < BEATLGTH; ++i)
BeatTemplates[mcType][i] = newBeat[i] ;
BeatCounts[mcType] = 1 ;
BeatClassifications[mcType] = UNKNOWN ;
AnalyzeBeat(&BeatTemplates[mcType][0],&onset,&offset, &isoLevel,
&beatBegin, &beatEnd, &) ;
BeatWidths[mcType] = offset-onset ;
BeatCenters[mcType] = (offset+onset)/2 ;
BeatBegins[mcType] = beatBegin ;
BeatEnds[mcType] = beatEnd ;
BeatsSinceLastMatch[mcType] = 0 ;
BeatAmps[mcType] = amp ;
return(mcType) ;
}
}
/
void BestMorphMatch(int *newBeat,int *matchType,double *matchIndex, double *mi2,
int *shiftAdj)
{
int type, i, bestMatch, nextBest, minShift, shift, temp ;
int bestShift2, nextShift2 ;
double bestDiff2, nextDiff2;
double beatDiff, minDiff, nextDiff=10000 ;
if(TypeCount == 0)
{
*matchType = 0 ;
*matchIndex = 1000 ;
*shiftAdj = 0 ;
return ;
}
for(type = 0; type < TypeCount; ++type)
{
beatDiff = CompareBeats(&BeatTemplates[type][0],newBeat,&shift) ;
if(type == 0)
{
bestMatch = 0 ;
minDiff = beatDiff ;
minShift = shift ;
}
else if(beatDiff < minDiff)
{
nextBest = bestMatch ;
nextDiff = minDiff ;
bestMatch = type ;
minDiff = beatDiff ;
minShift = shift ;
}
else if((TypeCount > 1) && (type == 1))
{
nextBest = type ;
nextDiff = beatDiff ;
}
else if(beatDiff < nextDiff)
{
nextBest = type ;
nextDiff = beatDiff ;
}
}
if((minDiff < MATCH_LIMIT) && (nextDiff < MATCH_LIMIT) && (TypeCount > 1))
{
bestDiff2 = CompareBeats2(&BeatTemplates[bestMatch][0],newBeat,&bestShift2) ;
nextDiff2 = CompareBeats2(&BeatTemplates[nextBest][0],newBeat,&nextShift2) ;
if(nextDiff2 < bestDiff2)
{
temp = bestMatch ;
bestMatch = nextBest ;
nextBest = temp ;
temp = minDiff ;
minDiff = nextDiff ;
nextDiff = temp ;
minShift = nextShift2 ;
*mi2 = bestDiff2 ;
}
else *mi2 = nextDiff2 ;
beatDiff = CompareBeat
复件 match.rar_心电_心电 分析
版权申诉
42 浏览量
2022-09-24
12:27:41
上传
评论
收藏 3KB RAR 举报
朱moyimi
- 粉丝: 65
- 资源: 1万+
最新资源
- 稽查监控平台标准化设计数据模型设计
- 一款极好用的 Office/WPS/Word/Excel/PPT/PDF工具箱软件 OfficeUtils 2.7
- 基于STM32的家庭环境参数检测系统设计
- 夺宝答题王答题小程序源码 开源可二开 Thinkphp内核
- Linux 系统下 Hadoop 安装配置教程.md
- 用于 CH32 MCU 的 CMake 实用程序(基于 STM32-CMake Proejct
- Linux 系统下 Hadoop 安装配置教程.md
- 基于ESO的 PMSM无传感器控制仿真-Matlab 2021b
- Python Programming - Hans-Petter Halvorsen
- Oracle 安装教程.md
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈