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..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.测量心率的函数
核心技术 随缘更新
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/290647.html