STM32心电波形显示 心率计算
1.硬件部分
心率信号收集的硬件部分采用了ADS1292模块(淘宝就有卖),这个芯片也是TI的要求使用芯片。
除了ADS1292的另外一块芯片的作用是电源隔离
购买模块的时候 商家会给ADS1292收集心电信号的例程,在这个基础上改写
2.心电仪产生的心电信号收集与显示
这是心电仪信号(不是人体信号)并且尚未进行滤波处理的显示
3.IIR滤波处理 与 简单平滑处理的效果展示
IIR效果
IIR代码实现
假如有一个500点的数组 那么直接 for(i=0;i<500;i++) 滤波后的数据[i]=filterloop(滤波钱的数据[i]);
float filterloop(float baroOffset);
float xv[NZEROS+1], yv[NPOLES+1];
float filterloop(float baroOffset)
{ xv[0] = xv[1];
xv[1] = xv[2];
xv[2] = baroOffset/ 0.3513235 ;
yv[0] = yv[1]; yv[1] = yv[2];
yv[2] = ( -1 * xv[0] + xv[2]) + ( -0.29735293* yv[0]) + ( +1.288421 * yv[1]);
return yv[2];
}
系数是要自己设计的 根据需要的截止频率
请看这个https://blog.csdn.net/tap880507/article/details/78930469
这是别人写的
简单平滑滤波处理
在心电仪信号的情况下看样子和IIR差不多。但是如果是人体心电信号的话,这个简单的平滑就不行了
简单平滑处理代码实现
和IIR函数一样输入 需要处理的一组数据,返回值是得到处理过后的结果
u16 baroAlt=0;
u16 filter(u16 baroOffset)
{ u16 baro;
baro = 0.8 * baroOffset + (1.0f - 0.8) * baroAlt;
baroAlt = baro;
return baro;
}
4.LCD显示函数
不知道大家用STM32做实时显示波形的时候是什么方法。我最开始是描点画图然后清屏,但是太闪了。所以后来用了下面这种方法。将之前的波形用底色重新画一遍,达到清屏效果。
void DrawOscillogram(void)//画波形图
{
u16 i = 0;
POINT_COLOR=RED;
for(i=50;i<430;i++)
{
LCD_DrawLine(i,data[i],i+1,data[i+1]);
}
}
void DrawOscillogram_Clear(void)//用底色画之前的波形图达到清屏效果
{
u16 i = 0;
POINT_COLOR = BLACK;
for(i =50;i <449;i++)
{
LCD_Fast_DrawPoint(i,(data1[i]),BLACK);
}
for(i=50;i<449;i++)
{
LCD_DrawLine(i,data1[i],i+1,data1[i+1]);
}
}
//在主函数中的位置关系 data[i]是每次要更新的图像 储存在data1[i]中进行下一次的清屏
DrawOscillogram_Clear();
for(i=0;i<500;i++)
data1[i]=data[i];
DrawOscillogram();
5.测量心率的函数
核心技术 随缘更新