从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');
我试着贴一张数据的图片,但是我没有足够的声誉:
发布于 2013-10-04 10:26:56
这应该会让你接近你想要的(尽管两者的阈值可能不是你想要的):
[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]
--也就是说,它将发现两个事件之间的差距,而不是文件开始和第一个事件之间的差距,或者最后一个事件与文件结束之间的差距。
https://stackoverflow.com/questions/19174304
复制相似问题