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

嵌入式技术

1368人已加入

描述

      一个很有意思的传感器,BH1790GLC心率传感器,这个传感器是ROHM生产的,一个日本的厂家。其他的不说,就说说这个传感器吧。

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

传感器

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

整个传感器框图如下:

传感器

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

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

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

模块的电路如下:

传感器

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

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

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

传感器

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

传感器

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

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

传感器

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

传感器

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

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

传感器

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

传感器

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

又需要一个怎样的算法?

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

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

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

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

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

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

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

先说说IIR滤波器,我这里选择的是直接I型IIR滤波器,其基于二阶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 个状态变量,如下图。

传感器

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

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

传感器

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

答案是:使用MATLAB

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

传感器

设置滤波器参数:

传感器

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

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

传感器

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

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

传感器

IIR滤波器初始化

传感器

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

传感器

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

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

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

传感器

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

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

滤波方式如下:

传感器


 

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

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

传感器

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

将PW波形放大之后:

传感器

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

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

传感器

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

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分