使用车辆座椅上压电传感器无创检测呼吸和心率(续)附代码验证

50 篇文章 44 订阅
6 篇文章 3 订阅

3. 实验结果

图 4显示了来自频率分析数据处理技术的示例 RR 和 HR 时间过程。虽然从座椅传感器计算的 RR 和 HR 波动大于参考率,但它们通常与预期值一致。在图 4中,RR 在 1000 秒左右下降,座椅传感器能够检测到这一点。
在这里插入图片描述
图 5中的箱线图总结了所有 11 名参与者的数据,显示座椅传感器结果的分布较大,但 30 分钟内的平均值相当。仅显示频率分析的结果。30 分钟内的平均 RR 和 HR 被认为是参与者的静息率。表 2列出了 11 名参与者的静息率,并与图 5中的箱线图相对应。如表 2所示,对于 11 名参与者中的 10 名,座椅传感器和 Neulog 之间在静息 RR 方面的差异低于我们的 4-brpm 目标。对于静息心率,所有参与者的差异均小于我们的 15-bpm 目标,如表 2所示. 静息 RR 和静息 HR 的 Bland-Altman 图如图 6所示。这些图显示了静息 RR 和 HR 差异的下降趋势,这些差异是通过拟合数据线来测试的。RR 拟合线的斜率为 -0.57 ( p = 0.0111),R 2 = 0.53。对于 HR,斜率为 -1.16 ( p = 0.0039),R 2 = 0.62。这些显着的斜率表明存在系统误差,较低的平均值存在正差异,而较高的平均值存在负差异,如图 6所示。将来自座椅传感器 FFT 的静止 RR 回归到来自 Neulog 的静止 RR 的 RMSE 为 1.6 和 R 20.72。对来自 Neulog 的静止 HR 的座椅传感器 FFT 的静止 HR 进行回归,得到 8.4 的 RMSE 和 0.21 的 R 2。
在这里插入图片描述

图 5. 30 分钟数据收集过程中所有 11 名参与者的频率分析技术得出 的呼吸 ( a ) 和心脏 ( b ) 速率箱线图。
在这里插入图片描述
图 6.静息 RR ( a ) 和静息 HR ( b ) 的 Bland-Altman 图。座椅传感器和 Neulog 之间的差异超过了两种测量的平均值。黑色实线显示平均差异,蓝色虚线显示 1.96 标准偏差范围。
表 2. 来自 11 名参与者的座椅和 Neulog 传感器的静息 RR 和 HR
在这里插入图片描述
图 7中的 Bland-Altman 样式图显示了所有时间点的参与者体重和静息率的测量设备之间的差异,这些差异来自所有参与者。每个参与者试验由 1741 个数据点组成,从 1 分钟到 30 分钟每秒计算一次 RR 和 HR。点的大小和颜色代表单个位置中数据点的数量,以说明 0 差线周围点的高密度。RR 和 HR 在体重和静息率方面的差异相对一致。表 3提供了测量设备和所有数据点的简单线性回归模型之间差异的汇总统计数据。如表3所示,频率分析技术导致较低的差异均值或偏差,但较高的差异标准偏差。解释置信区间,我们预计未来 95% 的 FFT 测量的座椅传感器和 Neulog(参考)传感器之间的呼吸速率差异在 -7.5 brpm 和 5.7 brpm 之间。这些值超过了我们的目标值,即座椅传感器 RR 和 Neulog RR 之间的 4-brpm 差异,但是通过随时间的平均测量结果得到了改善。在整个 30 分钟期间,带有座椅传感器的 RR 的偏差或差异均值小于 1 brpm。对于心率,平均值两侧的 1.96 个标准差导致 -39 bpm 和 38 bpm 的差异范围,这大于我们的 15-bpm 目标。
在这里插入图片描述
图 7. Bland-Altman 图显示了体重 ( a ) 和 ( b ) 的可靠性以及从 30 分钟 ( c ) 和 ( d )的平均值得出的过度静息率。每个数据点代表从座椅传感器计算的 RR 或 HR 与每个时间点和每个参与者的 Neulog 之间的差异。大小和颜色代表重叠点的密度。
表 3. 使用所有参与者的所有时间点的 RR 和 HR 的峰值检测和频率分析技术的汇总统计数据。
在这里插入图片描述

均方根误差 (RMSE) 值表示线性模型的绝对拟合,并规定模型斜率可能不完全为 1。RMSE 的好处是这些值采用适当的单位。在这种情况下,模型中 2.8 brpm 和 9.9 bpm 的变化是可以接受的。小的 R 2值表示座椅传感器 RR 和 HR 在使用 1 分钟滑动窗口每秒计算时的可变性。虽然我们在图 7的图中看到 0 差线上的数据点密度很高,但存在许多异常值,尤其是心率数据。但是,在决定座椅传感器 RR 和 HR 值是否足够接近并因此确定 Neulog 值的合适预测器时,重要的是要记住比 R 2是拟合的相对度量。

4、项目总结

由于从肺和心脏到座椅传感器的信号衰减,从乘员分类系统中提取 RR 和 HR 是一项挑战。此外,呼吸和心率信号水平(包括频率和幅度)的差异使检测任务变得困难。这项研究的结果表明,使用生产型车辆乘客座椅传感器测量各种乘员体重和静息率的生理反应(如 RR 和 HR)是可行的。座椅传感器和 Neulog 设备之间的静息或平均 RR 和 HR 值具有可比性。进行了额外的分析以比较整个 30 分钟数据收集过程中的各个时间点。用于评估 Neulog 和座椅传感器设备之间持续差异的主要分析是 Bland-Altman 方法。22 ]。正如预期的那样,与静息率源自 30 分钟数据的模型相比,具有所有数据点的模型的 RMSE 值更高,R 2值更低。这表明在较长时间内对数据进行平均可以提高与参考值的一致性。未来的工作需要提高 RR 和 HR 检测的时间分辨率,以实现连续、实时的应用。
将来,增强峰值检测算法可以改进从总模拟峰值计算 RR 和 HR。不同突出阈值的经验测试可以改善峰值检测。在这项研究中,数据收集包括正常、静息状态、持续呼吸,如图 4所示的少数例外情况a,RR 明显降低,可能是因为嗜睡。虽然 30 分钟数据收集的 RR 和 HR 平均值对于正常的休息状态是合理的,但乘员的生理机能可能在几分钟内发生巨大变化。我们的第一个目标是确认我们可以捕获稳态响应。我们的后续目标是通过使用 1 分钟的数据周期每秒评估 RR 和 HR 来测量瞬态响应。需要额外的工作来评估检测瞬态响应的准确性。滑动窗口的大小(目前为 1 分钟)将是一个有趣的变量,可以在未来的实验中进行测试。FFT 频率分析将以延迟结果为代价受益于更大的时间窗口。
检测行驶中车辆的呼吸和心率中更剧烈和瞬态的变化对于未来驾驶期间实时监控的应用是必要的。乘员 RR 和 HR 的非侵入性测量可能有助于未来对驾驶员状态进行心理生理分类的工作 [ 24]。对基于车辆的评估的补充,该评估使用转向和速度变化等车辆数据来评估驾驶员;生理监测可以提供对驾驶员状态的直接测量。结合基本的生理测量可以帮助自动检测驾驶员的身体损伤,例如疲劳。但是,此应用需要在驾驶员座椅上安装座椅重量传感器,而当前的美国法规要求仅适用于乘客座椅。预测驾驶员状态的能力将对未来驾驶员辅助系统和主动安全技术的设计极为有益。
这项研究的一个主要限制是从车辆上移除测试座椅和座椅传感器。如先前的研究所示,接合的发动机和/或驾驶可能导致来自座椅传感器的 BCG 信号中的低信噪比 [ 6]。虽然驾驶过程中的运动和振动可能会影响 RR 和 HR 的检测,但本研究的目的是展示可行性并测试生产车辆中乘员分类系统的灵敏度。此外,当考虑碰撞后响应时,移动的车辆可能不会成为乘客感应系统的关注点,因为车辆可能会停止。另一个限制是测试不包括不在位的乘员。假设是乘客在感应期间完全就座,这可能意味着使用了安全带,并排除了诸如翻车事故等车辆在碰撞后保持倒置的情况。根据受伤情况和可能的失血情况,碰撞后乘员可能会出现心动过速或心动过缓 [ 25]。异常高或低的 HR 可能会接近当前模型的边界,截止频率为 50 bpm 和 150 bpm。同样,RR 也因受伤而异。当前模型旨在捕获 10 到 40 brpm 的 RR。我们还假设乘员分类系统的性能不会受到碰撞的影响。该研究可以受益于更大、更多样化的人类参与者数据集。理想情况下,座椅传感器能够检测到 5% 的女性(约 50 公斤)和 95% 的男性(约 125 公斤)的 RR 和 HR [ 26]。本研究中使用的参与者池涵盖了体重要求的下限,但本研究中缺乏来自体重超过 91 公斤的参与者的数据。最后,虽然联邦机动车辆安全标准 (FMVSS) 第 208 号规定现代车辆具有用于高级乘客安全气囊系统的乘员分类系统,但每个制造商的技术和技术可能不同 [ 19 ]。为了扩大这项研究,测试来自各种汽车品牌和型号的座椅传感器将是有价值的。
这项研究为使用生产乘用车的座椅传感器测量乘员呼吸和心率提供了有希望的结果。RR 和 HR 的两个计算,峰值检测和频率分析,与参考测量值进行了比较。用于静息 RR 和 HR 的座椅传感器和 Neulog 传感器之间的差异主要分别在我们的 4-brpm 和 15-bpm 目标范围内。理想情况下,该系统还能够随着时间的推移评估 RR 和 HR。将座椅传感器与所有时间点的参考传感器进行比较,频率分析技术产生的平均差或偏差小于峰值检测技术。该数据提供了在实验室环境中对非侵入式座椅传感器的初步验证。未来在行驶中的车辆中进行测试对于乘员监控的应用是必要的。不突兀,

5、代码验证

基本的代码流程实现;
在这里插入图片描述
这里用matlab代码实现了对FFT算法用于对BCG信号呼吸和心率分离进行简单的验证。

Fs = 250;            % 采样率                   
T = 1/Fs;             % 采样周期   
% L = 4500;             % 信号长度
% t = (0:L-1)*T;        % 时间向量 x
Res_filter = designfilt('bandpassfir','FilterOrder',400, ...
         'CutoffFrequency1',0.16,'CutoffFrequency2',0.66, ...
         'SampleRate',500); 
     
HR_filter = designfilt('bandpassfir','FilterOrder',400, ...
         'CutoffFrequency1',0.83,'CutoffFrequency2',2.5, ...
         'SampleRate',250);  
     

     k_end = length(ResMove)/(10*Fs);
for k = 0:1:k_end
    if(length(ResMove) < (k+1)*10*Fs)
       break;
        ResMove5s = ResMove(k*10*Fs+1 : end);
    else
        ResMove5s = ResMove( (k*10*Fs)+1 : ((k+1)*10*Fs) ) ; 
    end
    
     L = length(ResMove5s);
     t = (0:L-1)*T;
 % FFT
    ymh = filtfilt(HR_filter,ResMove5s);
    S3 = fft(ymh);
    P23 = abs(S3/L);
    P13 = P23(1:L/2+1);
    P13(2:end-1) = 2*P13(2:end-1);
    f = Fs*(0:(L/2))/L;

matlab代码和采集数据已上传到我的空间:https://download.csdn.net/download/leva345/85353644

  • 7
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
好的,以下是使用ADS1292连接心率传感器检测心率代码: ```c #include <SPI.h> //ADS1292R Registers #define ADS1292_STATUS 0x00 #define ADS1292_CONTROL 0x01 #define ADS1292_CONFIG1 0x02 #define ADS1292_CONFIG2 0x03 #define ADS1292_LOFF 0x04 #define ADS1292_CH1SET 0x05 #define ADS1292_CH2SET 0x06 #define ADS1292_RLD_SENS 0x07 #define ADS1292_LOFF_SENS 0x08 #define ADS1292_LOFF_STAT 0x09 //ADS1292R Command Definition #define ADS1292_WAKEUP 0x02 #define ADS1292_STANDBY 0x04 #define ADS1292_RESET 0x06 #define ADS1292_START 0x08 #define ADS1292_STOP 0x0A #define ADS1292_RDATAC 0x10 #define ADS1292_SDATAC 0x11 #define ADS1292_RDATA 0x12 const int DRDY = 2; //ADS1292 DRDY pin const int CS = 10; //ADS1292 CS pin const int RST = 9; //ADS1292 RST pin void ADS1292_Init() { pinMode(DRDY, INPUT); pinMode(CS, OUTPUT); pinMode(RST, OUTPUT); digitalWrite(CS, HIGH); //disable ADS1292 digitalWrite(RST, HIGH); //reset ADS1292 delay(100); digitalWrite(RST, LOW); delay(100); digitalWrite(RST, HIGH); delay(100); SPI.begin(); SPI.setClockDivider(SPI_CLOCK_DIV2); //set SPI clock to 8MHz SPI.setDataMode(SPI_MODE1); //set SPI data mode to MODE1 SPI.setBitOrder(MSBFIRST); //set SPI bit order to MSBFIRST ADS1292_SPI_Command(ADS1292_RESET); //reset ADS1292 delay(100); ADS1292_SPI_Command(ADS1292_SDATAC); //stop continuous data mode delay(100); ADS1292_SPI_Command(ADS1292_START); //start ADS1292 delay(100); } void ADS1292_SPI_Command(unsigned char data) { digitalWrite(CS, LOW); delay(1); SPI.transfer(data); delay(1); digitalWrite(CS, HIGH); delay(1); } unsigned char ADS1292_SPI_Read() { unsigned char data; digitalWrite(CS, LOW); delay(1); data = SPI.transfer(0x00); delay(1); digitalWrite(CS, HIGH); delay(1); return data; } void ADS1292_SPI_Read_Data(unsigned char* data, int len) { digitalWrite(CS, LOW); delay(1); for (int i = 0; i < len; i++) { data[i] = SPI.transfer(0x00); delay(1); } digitalWrite(CS, HIGH); delay(1); } int ADS1292_Read_Data() { int ecg_data = 0; unsigned char data[3]; while (digitalRead(DRDY) == HIGH); //wait for DRDY to go LOW ADS1292_SPI_Read_Data(data, 3); //read 3 bytes of ECG data ecg_data = ((data[0] << 16) | (data[1] << 8) | data[2]) >> 8; //convert 24-bit data to 16-bit data return ecg_data; } void setup() { Serial.begin(9600); ADS1292_Init(); } void loop() { int ecg_data = ADS1292_Read_Data(); Serial.println(ecg_data); delay(2); } ``` 这段代码使用Arduino与ADS1292R连接,获取心率传感器的数据,并通过串口输出。需要注意的是,此处只是获取了ECG数据,并未进行心率计算。如果需要计算心率,需要进一步处理ECG数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr Robot

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值