[免费开源]基于freescale单片机的心电信号采集与处理

 本文的工程可访问:https://gitee.com/pidanQwQ/dsp    (包含两套不同的方案,可自行下载对比)

 或者在CSDN中(仅一套):【免费】基于Freescal单片机的心电信号采集与处理资源-CSDN文库

功能要求:

⑴实现ADS1292获取心电信号原始数据,并能通过串口或其他接口传输到PC电脑;

⑵实现PC电脑中通过MATLAB或者Python对原始数据进行时域和频域分析;

⑶实现PC电脑中通过MATLAB或者Python对原始数据进行降噪和提取心率;

⑷实现单片机中对原始数据进行降噪和提取心率;

⑸TFT屏幕中绘制心电信号曲线和显示心率数值;

技术指标:

⑴0频处的缓变直流衰减不低于30dB;

⑵降噪滤波器以35Hz为3dB通带截止频率,过渡带不超过10Hz,阻带衰减不低于40dB;

⑶心率估算误差不超过10%;

其他发挥(不限于):

        例如用其他MCU/FPGA等实现部分或完整功能;尝试IIR滤波器降噪;PC和MCU同步显示波形;改变ADS1292采样频率或者模拟放大倍数;读取ADS1292内部测试方波信号;测量心率波形的峰值电压等。

1需求分析

1.1 基本设计要求

(1)实现ADS1292获取心电信号原始数据,并能通过串口传输到PC电脑;

①分析:通过查询数据手册,如表1.1所示,可以得知采集的心电信号是通过补码的方式存储的,因此为了还原ADS1292采样的信号需要对其进行反变化得到真实的原始信号。同时为了方便单片机进行后续的运算,需要舍弃低八位。

表1.1 ADS1292采集信号的数据格式

②方案:通过SCI0串口发送原始数据给电脑,然后使用MATLAB进行码反变化。具体操作为:单片机发送2个八位无符号整形数,其中第一个为高位、一个为低位。数据还原时需要对高位乘以256,而低位乘以1,两者相加,若其大于2的15次方,则说明为补码,需要用2的16次减去此数。

(2)实现PC电脑中通过MATLAB或者Python对原始数据进行时域和频域分析;

①分析:经过(1)得到原始数据可以使用MATLAB容易画出其时域和频域并对其进行分析。

②方案:使用signalAnalyzer工具或者使用Plot、fft函数进行画图分析。

(3)实现PC电脑中通过MATLAB或者Python对原始数据进行降噪和提取心率;

①分析:对原始数据进行降噪可以使用FIR或者IIR。本次课程设计将同时实现对原始心电信号进行FIR滤波以及IIR滤波。考虑到计算效率以及稳定性,需要着重考虑滤波器的结构。对于FIR滤波器,如图1.1所示为直接型结构。直接型结构代码简单易懂,但对于高阶结构时会导致误差累积,计算会相对复杂。如图1.2所示,为线性相位结构,相比直接型,最大的有点即是减少了运算量。通过理论计算可知,对于N阶滤波器,直接型需要N+1次乘法,而线性相位结构仅仅需要(N+1)/2次乘法,计算量几乎减少了一半。这对于高阶滤波器十分重要。

图1.1 FIR直接型结构

图1.2 FIR线性相位结构

    对于IIR滤波器,当考虑其有限字长效应时容易导致其不稳定,由于直接型不方便调制其零极点,这种现象在直接型上体现尤其明显。因此,需要考虑误差更小的,可以使用级联型。为了进一步减少对存储单元的使用,可以将输入和输出公用一个延迟单元(即直接Ⅱ型)。如图1.3所示,为级联型IIR滤波器。

图1.3 IIR级联型结构

对于心率检测的基本思想即寻找每个周期的心电信号的峰值,由此可计算得到周期长度,进而得到心率。

②方案:通过分析,FIR使用运算量更加少的线性相位结构。对于IIR滤波器,采用稳定性更高、误差更小的级联型结构。对于心率测量可以采用如下步骤:首先,随机采样得到一个周期心电信号数据,再寻找此周期内信号的最大值,再将此最大值乘一个系数得到阈值。其次,在整段信号中寻找峰值,判断条件为当前信号的值大于前一信号、大于后一信号且大于阈值,满足上述3个条件即判定为峰值,然后记录下此时位置,根据如下公式计算出心率。

                                                          HearRate=fs/count×60

其中HeartRate为最终的心率,单位为次/min,fs为采用频率。

(4)实现单片机中对原始数据进行降噪和提取心率;

①分析:通过(3)过程对数据进行仿真分析,并且验证其可行性,最终会移植到单片机程序中。但由于MATLAB仿真分析时不需要考虑算力同时由于仿真时思维方式为“数据帧”的方式,而单片机的思维方式为“数据流”的方式,因此部分方案在单片机上可能行不通,需要做部分的调整。

②方案:将MATLAB仿真时用的for循环删去,改而在单片机主程序的for循环使用,同时将过分冗余的算法简化,以便不影响单片机的采样。为了能够在单片机上测量心率,可采用如下方案:设置一个门限电平,达到门限开始计数,直到下一个门限电平,这时候可以读取两个门限电平之间的点数,又已知ADS1292的采样频率,可以容易算出心率值。

(5)TFT屏幕中绘制心电信号曲线和显示心率数值;

①分析:绘制曲线可以使用自带的库函数LCD_DrawLine函数,但是考虑到单片机性能,绘图时不能采用帧方式,而应该采用流方式。即来一个点画一个点,同时需要用背景色绘制曲线,以便删除掉上一循环此刻位置的曲线。显示心率数值可以使用LCD_ShowNum函数。

②方案:使用自带库函数LCD_DrawLine和LCD_ShowNum。

1.2 提高设计要求

(1)测量心率波形的峰值电压;

①分析:改测量需要一个基准值,后续只需要根据该基准值进行列表查找即可。

②方案:以ADS1292内部方波信号为基准来测量其他信号的幅值。

(2)改变ADS1292的模拟放大倍数以及读取ADS1292的内部测试方波信号。

①分析:通过手册查找对应的寄存器,修改其值即可得到想要的信号。

②方案:查手册,修改寄存器的值。

2总体方案设计

3联合调试与总体测试

以下为部分结果展示,注意幅值测量不一定准确,请读者自行测量和修改:

  • 25
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值