基于MATLAB设计IIR滤波器之BH1790GLC心率传感器

IIR滤波器 心率传感器
川楠
发布时间: 2019-01-12
阅读: 3385

大家好,前段时间,得到了一个很有意思的传感器,BH1790GLC心率传感器,这个传感器是ROHM生产的,一个日本的厂家。

         其他的不说,就说说这个传感器吧。

11.jpg

         作为一名硬件开发设计人员,我拿到这个模块第一反映是去官网下载其数据手册,通过数据手册去了解这个传感器的特性。

22.jpg

         当有一个脉搏信号传递过来时,会造成血管的体积发生变化,如上图所示。传感器就通过采集血管的变化来检测脉搏。

         整个传感器框图如下:

        33.jpg

         传感器需要外接两个绿色的LED灯珠,这个LED普通的还真不行,模块使用的是SML-M13MT这个型号,它与普通的LED的区别是,其通过反射的方式,将光强在一定范围内实现等效分布。

         芯片内部有绿色LED的驱动电路,另外在传感器的外部,有一组IRCUT滤波器,将外部的其它光线以及红外光线滤除,让绿光通过IRCUT,进入ADC去采集。最后数据通过IIC传输出来。

         整个传感器也没有几个用到几个器件,但是我查了,这个模块还真不便宜,网上报价是在100左右。

         模块的电路如下:

         44.jpg

         其他参数就不多少了,详情可以查看传感器的数据手册,

         整个传感器的寄存器也没有几个,除了ID寄存器外,剩下就是控制寄存器,采集到的数据也是保存到DATOUT_LEDON DATOUT_OFF这两组数据寄存器中。

         还在手册上有测量控制说明,不至于让我感到太迷茫:

        55.jpg

         按照这个时序,我对0x41 – 0x43寄存器进行了如下设置。

        66.jpg

最后按照时序要求就,读出DATOUT_LEDON DATOUT_OFF

         我将读出的DATOUT_LEDON DATOUT_OFF值通过串口打印出来,并画了线。

        77.jpg

         下图为我手指没有放上去的时候的数据波形:

        88.jpg

         DATAOUT_LEDOFF(红色)、DATAOUT_LEDON(蓝色)的值几乎保持稳定,在室内数据处在260左右。

      

         放上手指,波形马上发生了变化。

        99.jpg

         DATAOUT_LEDOFF(红色)马上下降到20附近、而DATAOUT_LEDON(蓝色)有了很明显跳动,跳动的幅度很小,而且DATAOUT_LEDON(蓝色)值一直上升。

   a1.jpg

    这样的一个波形,当然如何去提取出脉搏数据?

    又需要一个怎样的算法?


    IIR滤波器应该是比较适合的一种方案。

        

说到IIR滤波器,那就不得不说FIR滤波器,这两个都是一种数字的线性滤波器,其两者最大的区别是:

1、在相同的技术指标下, IIR滤波器由于存在着输出对输入的反馈,因而可用比FIR滤波器需要更少的参数和资源。

2FIR滤波器可得到严格的线性相位, IIR滤波器则做不到这一点。

3IIR滤波器可以设计成标准低通、高通、带通、带阻、全通滤波器,而FIR滤波器则要灵活得多,可以设计出理想正交变换器、理想微分器、线性调频器等

 

         所以在我们的应用中,考虑IIR滤波器就可以了。相位移位对我来说,没有任何问题。

         针对上图中,当手指按下时的波形,需要对这个波形进行低通+高通的滤波。人体的脉搏正常范围在60-100之间。考虑到极端情况下,所以设置一个3.5HZ的低通滤波器和0.5HZ的高通滤波器,只需要截取0.5HZ - 3.5HZ范围的信号。

 

先说说IIR滤波器,我这里选择的是直接IIIR滤波器,其基于二阶Biquad级联的方式来实现的。每个Biquad由一个二阶的滤波器组成:

y[n] = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] + a1 * y[n-1] + a2 * y[n-2]

直接 I 型算法每个阶段需要 5 个系数和 4 个状态变量,如下图。

a2.jpg

x[n]就是输入变量,y[n]就是基于IIR滤波之后的输出值。

按照这样的公式,就是可以实现一个1阶的IIR滤波器,如果你在这个滤波器后面多加几个这样的滤波器,就可以实现多阶的IIR滤波器。

a3.jpg

公式有了,但是上面公式中的b0 b1 b2a1a2这些参数当怎么确定??

 

答案是:使用MATLAB

 

使用fdatool打开滤波器设计工具箱

a4.jpg

设置滤波器参数:

a5.jpg

注意的是:我们配置的BH1790GLC心率传感器输出数据是按照32HZ的,所以滤波器的采样频率是32HZ,截至频率是3.5HZ

滤波器参数使用MATLAB输出如下:

 a6.jpg

得到了滤波器的参数,开始写代码吧。

 

定义IIR滤波器参数结构体:

a7.jpg

IIR滤波器初始化

a8.jpg

IIR滤波器计算实现代码如下:

a9.jpg

关于滤波器的部分基本上 就是这么回事。

 

剩下的就是使用IIR滤波器。

程序按照32HZ的频率去读取传感器的数据。

b1.jpg

pw_GetMeasureData(&s_pwData);读取传感器的数据保存到s_pwData

pwCalc(&s_pwData, &pw);      数据经过IIR滤波之得到PW数据

滤波方式如下:

b2.jpg

首先原始数据先经过滑动求平均之后,经过高通滤波器之后,在经过低通滤波器,最后输出dataOut

 

现在我将原始数据和滤波之后的数据通过串口传出来,波形显示如下:

b3.jpg

红色DATAOUT_LEDON,蓝色DATAOUT_LEDOFF,以及经过IIR滤波之后的数据 pw绿色

PW波形放大之后:

b4.jpg

可以看到,经过IIR滤波之后,pw几乎呈现很规律的正弦波,这样就可以很方便的统计出传感器的脉搏心跳。

最后统计心跳,通过串口显示如下:

b5.jpg

当前心率为71,反复测试几次,数值都在70-75,看来一致性还是不错。


原创作品,未经权利人授权禁止转载。详情见转载须知 举报文章

点赞 (1)
川楠 擅长:单片机综合应用 硬件设计
评论(0)

登录后可评论,请 登录注册

相关文章推荐
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回

我要举报该内容理由

×
请输入您举报的理由(50字以内)