如何识别连续数据中多个阈值交叉的时间戳(索引)

时间:2013-10-04 05:58:49

标签: matlab threshold timestamp

来自Matlab中的音频流向量我试图确定在时间序列数据中多次出现的可听事件的开始和结束时间。

我是Matlab的新手,但我编写了识别事件峰值和位置的代码,但是,我需要相对于用户定义的阈值获取事件的开始,该阈值发生在几十毫秒在巅峰之前。

以下是我目前使用的代码:

function [emg] = calcPeaks(EMG, thresh)
%Rectify and downsample data 

emg = resample(abs(hilbert(EMG)),1000,10000); 
%Low Pass Filter 
[b,a]=butter(8,0.01,'low');
emg=filtfilt(b,a,emg);

%Plot the processed vector 
plot (emg); hold on;

%Find maximum for each Peak and Location
[pks,locs] = findpeaks(emg(1:end-2000),'minpeakheight',thresh);

plot(locs, emg(locs), 'ko'); hold on;

%Find Crossings above threshold
[FindCross] = find(emg(1:end-2000) > thresh);
[Gaps] = find(diff(FindCross)> thresh);
plot(FindCross, emg(FindCross), 'ro');
plot(Gaps, emg(Gaps), 'bo');

我试图发布数据的图像,但我没有足够的声誉:(

1 个答案:

答案 0 :(得分:0)

这应该让你接近你想要的东西(尽管两者的相同阈值可能不是你想要的):

[FindCross] = find(emg(1:end-2000) > thresh); %thresh is your minimum volume
[Gaps] = find(diff(FindCross)> thresh2); % thresh2 is related to the timing of events

但是,请注意,这只会在高于噪音级别阈值的区域之间找到间隙,因此无法找到第一个事件(假设数据开始时低于阈值)。

执行此类操作的一种简单方法是阈值,然后使用diff查找阈值数据中的上升沿和下降沿。

emg2 = emg > thresh; %emg2 = 1 and 0 for event / non event
demg = diff(emg2); % contains 0, -1, 1
rise = find(demg>0)+1; %+1 because of how diff works
fall = find(demg<0);
然后

rise应包含emg从低于阈值到高于阈值的位置。如果数据足够嘈杂,则可能包含误报,因此您可能希望使用其他标准过滤这些结果 - 例如检查在上升后数据是否在某个最短时间内保持在阈值之上。


通过您用于查找间隙的方法执行此操作的问题如下。假设您的数据如下所示,其中0低于阈值,高于阈值1:000111000111000。也就是说,我们的第一个事件从索引4开始,在索引6处结束,第二个事件从索引10开始,到索引12结束。

emgT = find(emg > thresh);

这会找到我们的数据= 1的所有位置,因此emgT = [4,5,6,10,11,12]

emgD = diff(emgT); 

这取得emgT(n+1)emgT(n)之间的差异 - 因为最终数据点没有n + 1,输出比emgT小一。我们的输出是[1 1 4 1 1] - 也就是说,它会找到两个事件之间的差距,但不是文件开头和第一个事件之间的差距,或者是最后一个事件和文件结尾之间的差距。