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

riseemg次に、しきい値の下からしきい値の上に移動する位置を含める必要があります。データに十分なノイズがある場合、これには誤検知が含まれる可能性があるため、追加の基準でこれらの結果をフィルタリングすることができます。たとえば、データが上昇した後、最小期間しきい値を超えていることを確認します。


ギャップを見つけるために使用している方法でそれを行う際の問題は次のとおりです。データが次のようになっているとします。0 はしきい値未満、1 はしきい値を超えています000111000111000。つまり、最初のイベントはインデックス 4 で開始し、インデックス 6 で終了し、2 番目のイベントはインデックス 10 で開始し、インデックス 12 で終了します。

emgT = find(emg > thresh);

これにより、データ = 1 のすべての場所が検出されるため、emgT = [4,5,6,10,11,12]

emgD = diff(emgT); 

emgT(n+1)これはと-の差を取ります。emgT(n)最終的なデータポイントには n+1 がないため、出力は よりも 1 小さくなりemgTます。出力は次のとおりです[1 1 4 1 1]。つまり、2 つのイベント間のギャップは検出されますが、ファイルの先頭と最初のイベント間のギャップ、または最後のイベントとファイルの末尾間のギャップは検出されません。

于 2013-10-04T10:26:56.447 に答える