0

从 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');

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

4

1 回答 1

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]——也就是说,它会找到两个事件之间的间隙,但不会找到文件开头和第一个事件之间的间隙,或者最后一个事件和文件结尾之间的间隙。

于 2013-10-04T10:26:56.447 回答