光电测量仪(PPG)生物信号处理附matlab代码

简介: 光电测量仪(PPG)生物信号处理附matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。

🍎个人主页:Matlab科研工作室

🍊个人信条:格物致知。

更多Matlab仿真内容点击👇

智能优化算法       神经网络预测       雷达通信      无线传感器        电力系统

信号处理              图像处理               路径规划       元胞自动机        无人机

⛄ 内容介绍

PPG是一种新兴的光学技术,用于检测心脏引起的血容量变化,在身体周边部位的微血管床,如手指、前额、耳垂和脚趾。这项技术是基于使用一个光学传感器,向皮肤发射光,然后接收透射或反射的光、接收透射或反射的光。

因此,PPG检测由心血管系统产生的活动,这些活动是通过自律神经系统介导的。通过自律神经系统。PPG信号是前向传播的和反射的血容量波的总和。

根据朗伯-比尔定律,PPG信号与血液的光吸收率和 与血液对光的吸收率相关,并代表血容量的变化。PPG信号的交流成分 PPG信号的交流成分与动脉内的血量变化有关,并与心跳同步。

在这方面,PPG信号融合了关于心脏周期和血液传输的宝贵信息。因此,这种技术代表了一种有前途的、低成本的技术,可以 应用于心血管监测的各个方面,如检测血氧饱和度、心率、血压、心输出量、呼吸、血管评估、动脉顺应性、动脉老化、内皮功能、静脉评估、微血管血流、自律神经等功能。

⛄ 部分代码

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%         PPG Feature Extraction

% Function Name:

% Last update date:

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


%PPG Feature Point Name

%PPG : O S N D

%VPG : w y z

%APG : a b c d e


%% Turotial 2 : Start Here


%set the search path for the subfunction

addpath(genpath(pwd));

pwd;


clc;

close all;


%% flag

flag_plot_figure = 1;


%% initialization variable

error_code = 0;

sample_time = 0.001; %sencond


%% %%%%%%%%%%%%%%%%%%%%%%%% Code Area %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% Signal Data Index----change as your data path

path.data = '.\DATA\';

path.output = '.\OUTPUT\';

path.T3_data = '..\T3_Classification\DATA\';

path.subject_info = '.\DATA\subject_info\';

D = dir('.\DATA\*.txt');

disp(length(D));


delete([path.output 'BP_PPG_Feature_dataset.csv']);

delete([path.output 'BP_PPG_discard_record.csv']);

for subject_index = 1:1:length(D)

   disp(subject_index);

   error_code = 0;

   filename = D(subject_index).name;

   [subject.num,wavedata] = load_wave(path.data,filename);

   

   subject_data = load([path.subject_info 'PPG_BP.txt']);

   [error_code,subject.info] = read_subject_info(error_code,subject.num,subject_data);

   wave.ppg_raw = zscore(wavedata);

   

   %% Filtering PPG signal

   [wave.ppg,filter_SOS] = filter_home_bandpass(wave.ppg_raw,1,2,1000,0.5,10);

   

   %% Calculate SQI

   S_SQI_ppg = ppg_sqi(wave.ppg);

   [SQI_max_ppg,SQI_window_ppg] = ppg_window_sqi(wave.ppg);

   [SQI_max_ppg,Index_ppg] = max(SQI_window_ppg);

   

   %% vpg, apg, 3rd, 4th

   [wave.vpg,wave.apg,wave.third,wave.fourth] = multi_derivative(wave.ppg);

   

   wave.vpg = zscore(wave.vpg);

   wave.apg = zscore(wave.apg);

   wave.third = zscore(wave.third);

   wave.fourth = zscore(wave.fourth);

   

   %% PPG Feature point extraction

   [error_code,Loc.PPG,Loc.VPG,Loc.APG] = ppg_point_extraction(error_code,wave.ppg,wave.vpg,wave.apg,wave.third);

   

%If you have done this step, you can establish your model to classification or prediction next step.

%Please put the dataset file to the 'T3_Classification\DATA' folder.


%If you want to watch or check the extracted PPG point, you can set 'flag_plot_figure' to be 1 in the start of code.

   %% watch the waveform and SQI value

   if flag_plot_figure == 1

       if error_code == 0

           plot_multi(subject_index,2,3);

           n = 1:1:length(wave.ppg);

           plot(n*sample_time,wave.ppg,'k',n*sample_time,wave.vpg,'b',n*sample_time,wave.apg,'r',...

               ...%n*sample_time,wave.third,'m',...

               ...%n*sample_time,wave.fourth,'c',...

               Loc.PPG*sample_time,wave.ppg(Loc.PPG),'*r',...

               Loc.VPG*sample_time,wave.vpg(Loc.VPG),'*r',...

               Loc.APG*sample_time,wave.apg(Loc.APG),'*r');

           legend('PPG','VPG','APG');

           axis([0 length(wave.ppg)*sample_time -5 5]);

           title(subject.num);

           text(0,4.5,'SQI');

           text(0,4,num2str(SQI_max_ppg));

           text(0.5,4.5,'AGE');

           text(0.5,4,num2str(subject.info(3))); %age

           text(1,4.5,'SBP');

           text(1,4,num2str(subject.info(6))); %SBP

           text(1.25,4.5,'DBP');

           text(1.25,4,num2str(subject.info(7))); %SBP

           text(0,-4,'PASS');

           text(0,-4.5,num2str(error_code));


           %%show the PPG points

           text(Loc.PPG(1)*sample_time,wave.ppg(Loc.PPG(1)),'O');

           text(Loc.PPG(2)*sample_time,wave.ppg(Loc.PPG(2)),'S');

           text(Loc.PPG(3)*sample_time,wave.ppg(Loc.PPG(3)),'N');

           text(Loc.PPG(4)*sample_time,wave.ppg(Loc.PPG(4)),'D');

           text(Loc.PPG(5)*sample_time,wave.ppg(Loc.PPG(5)),'O2');

           text(Loc.PPG(6)*sample_time,wave.ppg(Loc.PPG(6)),'S2');

           

           text(Loc.VPG(1)*sample_time,wave.vpg(Loc.VPG(1)),'w');

           text(Loc.VPG(2)*sample_time,wave.vpg(Loc.VPG(2)),'y');

           text(Loc.VPG(3)*sample_time,wave.vpg(Loc.VPG(3)),'z');

           text(Loc.VPG(4)*sample_time,wave.vpg(Loc.VPG(4)),'w2');

           

           text(Loc.APG(1)*sample_time,wave.apg(Loc.APG(1)),'a');

           text(Loc.APG(2)*sample_time,wave.apg(Loc.APG(2)),'b');

           text(Loc.APG(3)*sample_time,wave.apg(Loc.APG(3)),'c');

           text(Loc.APG(4)*sample_time,wave.apg(Loc.APG(4)),'d');

           text(Loc.APG(5)*sample_time,wave.apg(Loc.APG(5)),'e');

           text(Loc.APG(6)*sample_time,wave.apg(Loc.APG(6)),'a2');

           text(Loc.APG(7)*sample_time,wave.apg(Loc.APG(7)),'b2');

           

           xlabel('t/s');

           ylabel('Normalized value');

           grid on;

           hold on;

       else

           plot_multi(subject_index,2,3);

           n = 1:1:length(wave.ppg);

           plot(n*sample_time,wave.ppg_raw,'k',n*sample_time,wave.ppg,'k',...

               n*sample_time,wave.vpg,'b',n*sample_time,wave.apg,'r',...

               n*sample_time,wave.third,'m',n*sample_time,wave.fourth,'c');

           legend('PPG','VPG','APG');

           axis([0 length(wave.ppg)*sample_time -5 5]);

           title(subject_num);

           text(0,4.5,'SQI');

           text(0,4,num2str(SQI_max_ppg));

           text(0.5,4.5,'AGE');

           text(0.5,4,num2str(subject.info(3))); %age

           text(1,4.5,'SBP');

           text(1,4,num2str(subject.info(6))); %SBP

           text(1.25,4.5,'DBP');

           text(1.25,4,num2str(subject.info(7))); %SBP

           text(0,-4,'FAIL');

           text(0,-4.5,num2str(error_code));

           

           xlabel('t/s');

           ylabel('Normalized value');

           grid on;

           hold on;

       end

   end

end

% Finish to extract ppg feature

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%% Turotials 2 : Stop Here

⛄ 运行结果

⛄ 参考文献

1 Elgendi, M. On the analysis of fingertip photoplethysmogram signals. Current cardiology reviews 8, 14-25 (2012).

2 Alian, A. A. & Shelley, K. H. Photoplethysmography: Analysis of the Pulse Oximeter Waveform.

165-178, doi:10.1007/978-1-4614-8557-5_19 (2014).

3 Shelley, K. H. Photoplethysmography: beyond the calculation of arterial oxygen saturation and

heart rate. Anesthesia and analgesia 105, S31-36, tables of contents,

doi:10.1213/01.ane.0000269512.82836.c9 (2007).

4 Alian, A. A. & Shelley, K. H. Photoplethysmography. Best practice & research. Clinical

anaesthesiology 28, 395-406, doi:10.1016/j.bpa.2014.08.006 (2014).

5 Allen, J. & Murray, A. Age-related changes in peripheral pulse timing characteristics at the ears,

fingers and toes. Journal of human hypertension 16, 711-717, doi:10.1038/sj.jhh.1001478

(2002).

6 Murray, J. A. a. A. Age-related changes in the characteristics of the photoplethysmographic

pulse shape at various body sites. Physiological measurement, 24, 297-307 (2003).

⛳️ 完整代码

❤️部分理论引用网络文献,若有侵权联系博主删除
❤️ 关注我领取海量matlab电子书和数学建模资料


相关文章
|
2月前
|
存储 算法 数据可视化
基于 MATLAB的GUI信号处理界面设计 源码+运行截图
基于 MATLAB的GUI信号处理界面设计 源码+运行截图
98 2
|
1月前
|
运维 算法
基于Lipschitz李式指数的随机信号特征识别和故障检测matlab仿真
本程序基于Lipschitz李式指数进行随机信号特征识别和故障检测。使用MATLAB2013B版本运行,核心功能包括计算Lipschitz指数、绘制指数曲线、检测故障信号并标记异常区域。Lipschitz指数能够反映信号的局部动态行为,适用于机械振动分析等领域的故障诊断。
|
4月前
|
安全
【2023高教社杯】D题 圈养湖羊的空间利用率 问题分析、数学模型及MATLAB代码
本文介绍了2023年高教社杯数学建模竞赛D题的圈养湖羊空间利用率问题,包括问题分析、数学模型建立和MATLAB代码实现,旨在优化养殖场的生产计划和空间利用效率。
226 6
【2023高教社杯】D题 圈养湖羊的空间利用率 问题分析、数学模型及MATLAB代码
|
4月前
|
存储 算法 搜索推荐
【2022年华为杯数学建模】B题 方形件组批优化问题 方案及MATLAB代码实现
本文提供了2022年华为杯数学建模竞赛B题的详细方案和MATLAB代码实现,包括方形件组批优化问题和排样优化问题,以及相关数学模型的建立和求解方法。
141 3
【2022年华为杯数学建模】B题 方形件组批优化问题 方案及MATLAB代码实现
|
3月前
|
机器学习/深度学习 算法
基于心电信号时空特征的QRS波检测算法matlab仿真
本课题旨在通过提取ECG信号的时空特征并应用QRS波检测算法识别心电信号中的峰值。使用MATLAB 2022a版本实现系统仿真,涵盖信号预处理、特征提取、特征选择、阈值设定及QRS波检测等关键步骤,以提高心脏疾病诊断准确性。预处理阶段采用滤波技术去除噪声,检测算法则结合了一阶导数和二阶导数计算确定QRS波峰值。
|
4月前
|
数据采集 存储 移动开发
【2023五一杯数学建模】 B题 快递需求分析问题 建模方案及MATLAB实现代码
本文介绍了2023年五一杯数学建模竞赛B题的解题方法,详细阐述了如何通过数学建模和MATLAB编程来分析快递需求、预测运输数量、优化运输成本,并估计固定和非固定需求,提供了完整的建模方案和代码实现。
111 0
【2023五一杯数学建模】 B题 快递需求分析问题 建模方案及MATLAB实现代码
基于高通滤波器的ECG信号滤波及心率统计matlab仿真
**摘要:** 使用MATLAB2022a,实施高通滤波对ECG信号预处理,消除基线漂移,随后分析心率。系统仿真展示效果,核心代码涉及IIR HPF设计,如二阶滤波器的差分方程。通过滤波后的信号,检测R波计算RR间期,从而得到心率。滤波与R波检测是心电生理研究的关键步骤,平衡滤波性能与计算资源是设计挑战。
|
6月前
|
机器学习/深度学习 数据可视化 算法
探索MATLAB世界:掌握基础知识与实用技能(1. MATLAB环境与基本操作 2. 数据类型与变量 3. 条件与循环,1. 数据分析与统计 2. 图像处理与计算机视觉 3. 信号处理与控制系统)
探索MATLAB世界:掌握基础知识与实用技能(1. MATLAB环境与基本操作 2. 数据类型与变量 3. 条件与循环,1. 数据分析与统计 2. 图像处理与计算机视觉 3. 信号处理与控制系统)
65 0
|
6月前
|
机器学习/深度学习 算法 语音技术
基于语音信号MFCC特征提取和GRNN神经网络的人员身份检测算法matlab仿真
**语音识别算法概览** MATLAB2022a中实现,结合MFCC与GRNN技术进行说话人身份检测。MFCC利用人耳感知特性提取语音频谱特征,GRNN作为非线性映射工具,擅长序列学习,确保高效识别。预加重、分帧、加窗、FFT、滤波器组、IDCT构成MFCC步骤,GRNN以其快速学习与鲁棒性处理不稳定数据。适用于多种领域。
|
7月前
|
数据安全/隐私保护
地震波功率谱密度函数、功率谱密度曲线,反应谱转功率谱,matlab代码
地震波格式转换、时程转换、峰值调整、规范反应谱、计算反应谱、计算持时、生成人工波、时频域转换、数据滤波、基线校正、Arias截波、傅里叶变换、耐震时程曲线、脉冲波合成与提取、三联反应谱、地震动参数、延性反应谱、地震波缩尺、功率谱密度

热门文章

最新文章