我试图用Matlab找到峰值前后的过零点
我从记录的脑电通道中找到了一个峰值的位置,我正试图用Matlab找到该峰值的积分(面积)。但是,我很难找到峰值所在点前后的过零点 我知道如何找到零交叉点的命令,但我似乎无法让它自动返回峰值开始和结束的位置。我最终将不得不对多个峰值执行此操作,并且不希望手动查找每个交叉点 我正在处理的图像如下所示:我试图用Matlab找到峰值前后的过零点,matlab,Matlab,我从记录的脑电通道中找到了一个峰值的位置,我正试图用Matlab找到该峰值的积分(面积)。但是,我很难找到峰值所在点前后的过零点 我知道如何找到零交叉点的命令,但我似乎无法让它自动返回峰值开始和结束的位置。我最终将不得不对多个峰值执行此操作,并且不希望手动查找每个交叉点 我正在处理的图像如下所示: 我假设自您编写 我知道如何找到零交点的命令 我还假设在x0中有最大峰值位置,可能是从 [~,imax]=max(EEGsignal); x0=x(imax); %if your data pairs
我假设自您编写 我知道如何找到零交点的命令 我还假设在
x0
中有最大峰值位置,可能是从
[~,imax]=max(EEGsignal);
x0=x(imax); %if your data pairs are EEGsignal vs x
好的,为了完整性,这里有一种获得零交叉点的方法:
inds=find(diff(sign(EEGsignal))); %find indices of sign change
zerocrosses=(x(inds+1)+x(inds))/2; %in between grid points
这些zerocross
将位于x
网格点之间,以获得最大精度。但是,如果出于某种原因,您希望坚持输入x
值,那么选择x(inds)
就足够了,前提是x
足够密集(似乎就是这样)
然后,您可以在数组中找到这两个零,这两个零按顺序排列x0
ind1=find(zerocrosses<x0,1,'last');
ind2=find(zerocrosses>x0,1,'first');
first_cross=zerocrosses(ind1);
second_cross=zerocrosses(ind2);
ind1=find(zerocrossesx0,1,'first');
第一个交叉=零交叉(ind1);
第二个交叉=零交叉(ind2);
索引ind1
,ind2
将告诉您要查找的zerocross
的特殊索引
注意:一般来说,你必须小心一点:你的峰值可能在第一个零之前,或者在最后一个零之后。对于这种情况,您应该检查
isempty(第一个十字)
还是isempty(第二个十字)
。我的回答中没有包括这一点,因为在这种情况下,您的“峰值”定义不明确,您不应该整合它(因此需要以一种非平凡的方式进行处理)。您可以发布数据的屏幕截图吗?当你说“峰值”时,我假设你指的是一个局部最大值的单点,但你说你想在峰值下积分,这意味着这是一个跨越某个时间范围的信号。我用来查找峰值的命令只会返回最大点的位置,所以这是我必须处理的唯一信息。不过,峰值确实出现在短时间内@布莱恩:好吧,你最好看看零点交叉点,找到你单峰附近的两个交叉点。应该不难做到。但这仅仅是你感兴趣的最高峰吗?也许你应该看看所有的峰值(可能是看信号的一阶/二阶导数)。编辑:单峰示例:如果最大峰值位于x0
,零交叉位于数组zerocross
,那么ind1=find(zerocrossesx0,1,'first')
,那么你的两个零是zerocross(ind1)
和zerocross(ind2)
@stepmoy你可能有机会看看我的答案吗?