我如何在向上和向下的斜坡上设置动作电位的阈值来定义宽度?

8次浏览(最近30天)
Roksana哈立德
Roksana哈立德 2021年2月1日
评论道: 马修•诺伊 在2021年2月3日
你好,
我做的动作电位分析,在目前我使用的ginput用于分析宽度手动定义我的阈值,但是我想为曲线的宽度的分析设定相同的y值。现在,我放大到数字,试图设置x和y的积分获得AP的宽度。
我的用于制造图和用于定义的变量手动设置ginput值的代码:
% Roksana的脚本来绘制。smr AP数据
% 20210127
%用于故障诊断分析-清理工作空间
清晰的
关闭全部
%进口数据
加载(“C: \ xyz.mat”
%定义信道到情节
数据= xyz;
VM = data.values;
百分比x轴按间隔
T = linspace(0, length(vm)*data.interval,length(vm));
情节(t, vm)
包含('时间(s)'
ylabel ('压(MV)'
标题(膜电位的
%在图中选择的2个点之间找到最大Vm值
[x, y] = ginput(2);
%报告AP宽度的值
xfirst = x (1, 1)
xsecond = X(2,1)
用于参数计算的舍入值
xpt1 = ROUND(X(1));
xpt2 = ROUND(X(2));
ypt1 =圆形(Y(1));
ypt2 =圆(y (2));
在x轴上第一和第二点之间找一个点
Isin = (t >= xpt1 & t <= xpt2);
找出x轴上两点之间的峰值
% =最大峰值(vm(型号)
峰= max (vm)
%显示槽(MV);从基线
APtrough =分钟(VM(ISIN))
%%显示AP振幅(毫伏)
APamp =(峰值+(ypt1 *( - 1)))
% %显示半振幅(mV)
APhalfamp = ((peak-APtrough) * 0.5)
%%%区曲线和从阈值宽度值下 - 需要放大%%%
%暂停脚本直到按下按钮用于放大
变焦
暂停();
变焦离开
%在图中选择的2个点之间找到最大Vm值
[A,B] = ginput(2);
%报告AP宽度的值
thresholdt1 = (1,1)
thresholdt2 = A(2,1)
thresholdValue1 = b (1)
thresholdValue2 = B(2)
% %显示宽度(女士)
宽度= (thresholdt2 - thresholdt1)*1000%%%%需要用阈值来定义
% %显示半角(女士)
APhalfwidth =(宽/ 2)
7评论

登录评论。

接受的答案

明星黾
明星黾 2021年2月2日
编辑:明星黾 2021年2月2日
我不确定这有多可靠,因为我们只有一个记录。然而,如果它们是相似的,它可能很容易适应其他记录。
D =负载(“xyz.mat”);
F =字段名(D);
C = struct2cell (D);
Ch1s = C {1} .values;%信号向量
L1 = numel(Ch1s);%的长度
。Ch1t = linspace(0,L1,L1)'* C {1} .interval;%的时间向量
(CPL, m, b) = ischange (Ch1s,“线性”“阈值”10);%要求R2017b或更高版本
if ((m>1) = 1,'第一的');
CP2 =查找((M <1),1,“最后一次”);
数字
情节(Ch1t Ch1s)
持有
%的阴谋(Ch1t, m)
情节(Ch1t (cp1) Ch1s cp1 (),'^ R'
图(Ch1t(CP2),Ch1s(CP2)“虚拟现实”
持有离开
网格
包含('时间(s)'
ylabel ('压(MV)'
标题(膜电位的
pw = Ch1t(cp2) - Ch1t(cp1);%脉冲宽度
文本(Ch1t(CP1),Ch1s(CP1)“\ rightarrow”“HorizontalAlignment”“对”“VerticalAlignment”'中间'“FontWeight”'胆大'
文本(Ch1t(CP2),Ch1s(CP2),sprintf的('\\leftarrow Width = %.4f',PW)“HorizontalAlignment”'剩下'“VerticalAlignment”'中间'“FontWeight”'胆大'
生产这种情节:
编辑- (2021年2月2日19:28)
我的代码使用新发布的 “AP2.mat”
我的代码,否则不变,除了导入新的数据文件,以及增加的精度 sprintf 数字领域。
4评论

登录评论。

答案(1)

马修•诺伊
马修•诺伊 2021年2月2日
这是我第一次以使其完全自动化的尝试
基于这个优秀的提交(附加函数):分段线性插值
所以我试着用5段线性段来匹配你的数据,剩下的就会自动生成
其它方法也工作(例如,基于衍生物,但是这可能是对噪声敏感)
% Roksana的脚本来绘制。smr AP数据
% 20210127
%用于故障诊断分析-清理工作空间
清晰的
关闭全部
%进口数据
加载(“xyz.mat”
%定义信道到情节
% data = xyz;
% vm = data.values;
%S2C1_17082020_WM_apomorphine_20uM_Ch1 =
带有字段的% struct:
%的标题:“电压”
% comment: 'No comment'
%间隔:4.0000e-05
%规模:0.0153
%抵消:0
%单位:“mV”
%启动:0
%长度:1122
%值:[1122×1 double]
vm = S2C1_17082020_WM_apomorphine_20uM_Ch1.values;
样品=长度(vm);
dt = S2C1_17082020_WM_apomorphine_20uM_Ch1.interval;
t_final = * dt样品;
百分比x轴按间隔
% t = linspace(0, length(vm)*data.interval,length(vm));
T = linspace(0, t_final,samples);
图(1);
情节(t, vm)
包含('时间(s)'
ylabel ('压(MV)'
标题(膜电位的
%五个直线段近似
%首先选择5个点中的3个:开始,峰值(最大值),结束
[vm_max,IND] = MAX(VM);
x_vm_max = t(印第安纳州);
fminsearch的初始化
Xdata = t(:);ydata = vm(:);
A =(MAX(XDATA)-min(XDATA))/ 4;B = A * 2;
全球的外部数据YDATA x_vm_max vm_max
x0 = [a, b];
X = fminsearch(@obj_fun, x0);
a_sol = x (1);b_sol = x (2);
ξ= [min (xdata)、a_sol x_vm_max, b_sol,马克斯(xdata)];1-D查表“x”点的%向量
YI = lsq_lut_piecewise(XDATA,YDATA,XI);%获取一维查表“y”点的向量
%情节适合
图(2);
情节(xdata ydata,“。”习,咦,'+ - '
传奇('的实验数据(X,Y(X))'“附近地区分(XI, YI)”
标题(分段一维查表最小二乘估计
% selected threshold = x = a_sol和x = b_sol对应的y值的最大值
vm1 = interp1 (XI,咦,a_sol);
VM2 = interp1(XI,YI,b_sol);
阈值=装天花板(max (vm1, vm2));让我们把它四舍五入到上一个整数值
%最后,选中的高于“阈值”的y值为
印第安纳州=找到(vm >阈值);
vm_select = vm(印第安纳州);
t_select = t(印第安纳州);
图(3);
情节(t, vm, t_select vm_select,'+ - '
传奇(的实验数据“选择数据”
包含('时间(s)'
ylabel ('压(MV)'
标题(膜电位的
%%显示AP振幅(毫伏)
APamp =(vm_max - (VM1 + VM2)/ 2)%计算峰值和“基线”在同一x位置的差= vm1和vm2的平均值
% %显示半振幅(mV)
% APhalfamp = ((peak- ap槽)*0.5)%不确定在这里做什么
% %%%曲线下的区域和阈值的宽度-需要缩放%%%
面积= trapz (t_select vm_select-min (vm_select))%单位吗?mV *年代;NB:要计算面积,必须对y进行偏移,使y的最小值为零
% %显示宽度(女士)
这是a_sol和b_sol之间的x距离
Xwidth = 1000 *( - a_sol + b_sol)%单位:毫秒
%宽度=(thresholdt2 - thresholdt1)* 1000只%%%%需要由阈值限定
% % %显示半角(女士)
%APhalfwidth =(宽度/ 2)
APhalfwidth = (Xwidth / 2)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
功能ERR = obj_fun(x)的
全球的外部数据YDATA x_vm_max vm_max
ξ= [min (xdata) x (1) x_vm_max, x(2),马克斯(xdata)];1-D查表“x”点的%向量
YI = lsq_lut_piecewise(XDATA,YDATA,XI);%获取一维查表“y”点的向量
Yint = interp1(XI,YI,XDATA);
呃= ((Yint-ydata) ^ 2)总和;
结束
3评论
马修•诺伊
马修•诺伊 在2021年2月3日
你好
我再次测试了我的代码与LUT与你的新数据,得到了“正常”行为不像你
??
总之,我最后做了非常简单的数学运算,不再需要花哨的函数了
我发现最好的IMO结果是通过在数据的一阶导数上使用一个固定阈值的规则(不再平滑,也不再LUT等等),也许这个固定值(大约4e3 mV/s)对你来说有一些物理意义;
我用两个提供的数据集进行了测试,我对结果非常满意!
你只需要 firstsecondderivatives 功能
下面的代码:
%进口数据
%的负载(“xyz.mat”)
加载(“AP2.mat”
vm = S2C1_17082020_WM_apomorphine_20uM_Ch1.values;
样品=长度(vm);
dt = S2C1_17082020_WM_apomorphine_20uM_Ch1.interval;
t_final = * dt样品;
百分比x轴按间隔
T = linspace(0, t_final,samples);
上的数据计算%一阶导数
[dvm, ddvm] = firstsecondderivatives(t,vm);
图(1);
副区(2,1,1),图(吨,VM,“b”);
ylabel (“V (mV)”);
副区(2,1,2),图(吨,DVM,“b”);
ylabel (“dV / dt (mV / s)”);
包含('时间(s)');
标题(膜电位的
%第一拐点具有最大斜率的斜率约为1 / N个(正的阈值,正斜率)
% 2膝点的斜率约为最大斜率的1/N(负阈值,正斜率)
% a_pos1 = 150;
% pos_slope_max = max(dvm(dvm>=0));
%pos_slope_trigger = pos_slope_max / a_pos1;%4E3
pos_slope_trigger = 4E3;
% a_pos2 = 25;
%neg_slope_max =分钟(DVM(DVM <= 0));
%neg_slope_trigger = neg_slope_max / a_pos2;%-4e3
neg_slope_trigger = 4 e3;
indpos =查找(DVM> = pos_slope_trigger)
t0_pos1 = t (indpos (1));
indneg =查找(DVM <= neg_slope_trigger)
t0_pos2 = T(indneg(结束));
t0_pos1 vm_knee1 = interp1 (t,虚拟机,“线性”);
t0_pos2 vm_knee2 = interp1 (t,虚拟机,“线性”);
图(2);
情节(t,虚拟机,“b”t0_pos1 vm_knee1,'+ R't0_pos2 vm_knee2,“+ g”
ylabel (“V (mV)”
包含('时间(s)'
标题(膜电位的

登录评论。

社区寻宝

在MATLAB中心找到宝藏,并发现社区如何可以帮助你!

开始狩猎!