这个是近期整理到的多年前帮别人做的一个脉搏检测器的毕业设计。
中间的一个核心是对脉搏进行检测。
算法的原理是://http://www.ixueshu.com/document/a460a38fab50393a318947a18e7f9386.html
下面是代码,因为这是很多年前的代码了。写的有点乱。
int plus_dectect(int adc_val)
{
enum
{
Search_Max,
Search_Min,
};
#define PER_ACC_COUNT 15
#define PER_ATTEN 0.98 //每次阈值降低的百分比
static int max_val = 0, min_val = 4096; //初始最大最小值
static int threshold = 3000; //初始阈值较大一点
static long int sumtime = 0;
static u8 sta = Search_Max;
static int per_count = 0; //每隔多少时间降低阈值百分点
if (per_count > PER_ACC_COUNT)
{
threshold *= PER_ATTEN;
per_count = 0;
}
else
per_count++;
if (sta == Search_Max)
{
if (adc_val > max_val)
{//更新MAX值,并记录该点为最大点
max_val = adc_val;
}
else
{//求两者的差值,若小于1/2的阈值不做处理,认为可能是个小坡
if ((max_val - adc_val) > (threshold * 0.55))
{//如果大于1/2,确定之前那个为最大值
sta = Search_Min; //转化到求最小值状态/
/脉冲计数+1
}
}
}
else
{
if (adc_val < min_val)
{//更新MIN值
min_val = adc_val;
}
else
{//求两者的差值,若小于1/2的阈值不做处理,认为可能是个小坡
if ((adc_val - min_val) > (threshold * 0.55))
{//如果大于1/2,确定之前那个为最小值
sta = Search_Max; //转化到求最小值状态
threshold = max_val - min_val; //得到新的阈值
per_count = 0;
//period_count++;
// pulsFreq = 300000 / get_time();
// clear_time();
pulsFreq = time_count;
time_count = 0;
printf("%d ", pulsFreq);
return 1;
}
}
}
return 0;
}