我怎么能计算平均值的峰值振幅和曲线下的面积?
38视图(30天)
显示旧的评论
你好,
我希望有人能帮助我与我的问题。作为一个医疗专业,我缺乏基本的了解数据编程和数学。
我有一个记录,如何吸收的变化,从一个红外photoplethysmography体内获得的信号。数据导入Matlab是列向量。我已经设法将低通和带通滤波器应用到原始信号,分离的不同组件进一步分析。从带通滤过的信号(下图),我需要——对于一些给定的时间点(用绿色箭头说明):
- - - - - -
确定峰值振幅峰值(局部最小值)。
- - - - - -
确定曲线下的面积(AUC)——从最小值峰值。
- - - - - -
振幅和AUC应该与一些中值估计,例如+ / - 5秒从给定的时间点或+ / - 5的山峰。我不知道哪个是最好的方法?
有人可能的解决方案有什么建议吗?万博 尤文图斯
我很欣赏你可以提供的任何帮助。
轴:光吸收在任意单位,轴:时间,基于采样率(100赫兹)——每一秒= 100单位
接受的答案
明星黾
2023年2月15日
总是有帮助的一个信号,所以我找到了一个从先前pulse-plethysmograph帖子,我使用它。(所有信号的预处理步骤可能不是必要的,但是他们对于这一个。他们还演示如何预处理生理信号。)
这样的尝试
分= readmatrix (“//www.tianjin-qmedu.com/matlabcentral/answers/uploaded_files/103608/p3_sit.csv”);%使用PPG信号从Previoous回答
分=分(分> = 1 e + 6);%去除文物(仅这个信号)
L =大小(分,1)
Fs = 960;
Fn = f / 2;
t = linspace (0 L - 1升)/ Fs;%的时间向量
t = t (:);%力列向量
NFFT = 2 ^ nextpow2(左)
FT_PPG = fft ((PPG-mean (PPG)。*损害(L), NFFT);
阵线= linspace (0, 1, NFFT / 2 + 1) * Fn;
4 = 1:元素个数(艘);
图
情节(阵线、abs (FT_PPG (Iv) * 2))
网格
xlim (10 [0])
分=低通滤波器(分5 Fs,“ImpulseResponse”,“信息检索”);%去除高频噪声(仅这个信号)
PPGmax = max (PPG);
PPGmin = min (PPG);
[pks, plocs] = findpeaks(分,“MinPeakProminence”(PPGmax-PPGmin) * 0.05);%的山峰
[v, vlocs] = findpeaks(分“MinPeakProminence”(PPGmax-PPGmin) * 0.05);%的山谷
为k = 1:元素个数(vlocs) 1
idxrng = vlocs (k): vlocs (k + 1);%这个脉冲指数范围
idxlim = [vlocs (k);vlocs (k + 1)];% Inmdex限制
电视= t (idxrng);%脉冲' t '向量
sv = PPG (idxrng);%脉冲分的向量
ts (k) = t (vlocs (k));%的脉搏开始时间
te (k) = t (vlocs (k + 1));%普尔;se结束时间
:kv (k) = k;%峰值计数器
B = [t (idxlim)的(2,1)]\ PPG (idxlim);%线性消除趋势回归参数
dtsv = [t (idxrng)的(大小(t (idxrng)))) * B;%线性趋势分离向量
svc = sv - dtsv;%去趋势信号
p2p (k) = max (svc);%峰振幅
AUC (k) = trapz(电视、svc);%脉冲面积
结束
PPG_Statistics =表(kv, ts, te、p2p AUC,“VariableNames”,{“高峰”,“t_start”,“t_end”,“PeakToPeak”,“AUC”})
图
惠普{1}=情节(t,分,“DisplayName的”,的数据分);
持有在
惠普{2}=情节(t (plocs),“^ r”,“DisplayName的”,“高峰”);
惠普{3}=情节(t (vlocs), -vys,“虚拟现实”,“DisplayName的”,“山谷”);
惠普{4}=情节((t (plocs(1:元素个数(p2p))) * [1])。”,[繁荣正义党(1:元素个数(p2p)党(1:元素个数(p2p) p2p]。,“- k”,“DisplayName的”,的最大峰值);
惠普{5}=情节(t (vlocs), -vys,“g”,“DisplayName的”,“Inter-Valley基线”);
持有从
网格
传奇([惠普{1}(1),惠普{2}(1),惠普{3}(1),惠普{4}(1),惠普{5}(1)]。“位置”,“最佳”)
xlim (10 [0])%放大看细节
我不知道原来的单位是这个信号,然而得到的值统计数据似乎是正确的。
试试我的代码和你的信号。如果有任何问题,我将帮助我的代码适应它。
。
6个评论
明星黾
2023年2月16日
我认真考虑麻醉学,因为我做了一个选择性在医学院,喜欢它。我更喜欢内科,在内分泌学我的实习做了一个项目后,尽管我从不参加董事会。(我宁愿重症监护医学内分泌学,不过这只是开始可用。)相反,我回到研究生院,获得了在生物医学工程硕士,因为个人电脑变得可用,我想学习如何充分利用技术在医学背景。(这是我的一个最好的生活决定。)我后续的职业生涯最终结合这两个学科。
答案(1)
阿曼
2023年2月15日
你好,
我知道你有一个功能,你想找出其全球最大值。然后你想找到最近的局部最小值的两侧全球最大值之间的区域,然后计算两个局部最小值。
寻找全球最大值可以使用”
马克斯
”功能。在全球最大值可以使用”
islocal
”功能,让所有的局部最小值,得到所有的局部最小值你可以找到最近的局部最小值的全局最大值。一旦任何一方的局部最小值你可以找到它们之间的分段,然后使用“
trapz
”功能,得到它们之间的区域。你可以参考下面的例子:
x = 1:10 0;
= (1-cos(2 *π* 0.01 * x))。*罪(2 *π* 0.15 * x);%目标函数
[maxVal, indx] = max (A);%全球最大值
TF = islocalmin(一个);%所有局部最小值
为我= indx: 1:1
如果(TF (i))
localMinLeft =我;
localMinLeftVal =(我);%局部最小值的全局最大值
打破;
结束
结束
为i = indx: 100
如果(TF (i))
localMinRight =我;
localMinRightVal =(我);%局部最小值的全局最大值
打破;
结束
结束
分段= (localMinLeft: localMinRight);%分段之间的局部最小值
情节(x);
持有在;
情节(localMinRight localMinRightVal,的r *);
情节(localMinLeft localMinLeftVal,的r *);
情节(x (indx) (indx),“波”);
情节(localMinLeft: localMinRight小节);
持有从;
disp (的曲线下的面积是+ trapz(分段));%分段选择下的面积
希望这可以帮助!