2020电赛A题(心电波形,lcd显示,心率计算,iir滤波处理)


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

(0)
上一篇 2022年10月5日
下一篇 2022年10月5日

相关推荐

发表回复

登录后才能评论