本文的工程可访问: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联合调试与总体测试
以下为部分结果展示,注意幅值测量不一定准确,请读者自行测量和修改:
文章来源:https://www.toymoban.com/news/detail-810495.html
文章来源地址https://www.toymoban.com/news/detail-810495.html
到了这里,关于[免费开源]基于freescale单片机的心电信号采集与处理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!