Counting number of bursts

11 visualizzazioni (ultimi 30 giorni)
Antonio Morales
Antonio Morales il 9 Ago 2016
Commentato: Image Analyst il 16 Gen 2017
How can I count the number of periods of activity above a certain threshold?
I have an EMG signal with some bursts of activity above baseline. I have used the following code to identify those periods of activity (at least 200 points) above a predetermined threshold value that I have chosen:
above_threshold = (EMG_signal > threshold);
spanLocs = bwlabel(above_threshold);
spanLength = regionprops(spanLocs, 'area');
spanLength = [spanLength.Area];
goodSpans = find(spanLength>=200);
allInSpans = find(ismember(spanLocs, goodSpans));
Now I would like to count the number of bursts that have been identified above (i.e. see image attached. In this example, in red are shown the bursts identified).
Any help is much appreciated. Thanks a lot. Antonio

Risposta accettata

Image Analyst
Image Analyst il 9 Ago 2016
Simply call bwareafilt and bwlabel. So get rid of all that and just simply have this:
EMG_signal = [1 2 4 2 0 0 2 2 0 2 0 2 2 2] % Sample signal with 2 bursts
threshold = 1.5
above_threshold = (EMG_signal > threshold)
minAcceptableLength = 3; % or 200 or whatever.
% Find spans that are long enough.
isLongEnough = bwareafilt(above_threshold, [minAcceptableLength, inf])
% Count the number of spans (bursts) that are long enough.
[labeledSpans, numberOfBursts] = bwlabel(isLongEnough)
  4 Commenti
Antonio Morales
Antonio Morales il 16 Gen 2017
No, if a span is not long enough at first, it should not be counted as span even if after getting rid of zeros between spans it becomes long enough. How could that be worked around?
Thank you.
Image Analyst
Image Analyst il 16 Gen 2017
Try this:
EMG_signal = [1 1 2 4 2 0 0 2 2 0 2 0 2 2 2 0 4 4 4 4 1] % Sample signal with 2 bursts
threshold = 1.5
above_threshold = (EMG_signal > threshold)
minAcceptableLength = 3; % or 200 or whatever.
% Find spans that are long enough.
isLongEnough = bwareafilt(above_threshold, [minAcceptableLength, inf])
% Specify the max number of zeros 0's there are that should be filled in.
maxHoleSize = 4;
holes = bwareafilt(~isLongEnough, [0, maxHoleSize])
% Don't take any holes if they are on the front or end of the vector
% because they are not bounded by spans on each side.
firstZero = find(holes, 1, 'first')
lastZero = find(holes, 1, 'last')
holes(1:firstZero) = 0;
holes(lastZero:end) = 0
% Now fill in the hoels by ORing:
isLongEnough = isLongEnough | holes;
% Count the number of spans (bursts) that are long enough.
[labeledSpans, numberOfBursts] = bwlabel(isLongEnough)
% Find the lengths of all the spans
props = regionprops(labeledSpans, 'Area');
allLengths = [props.Area]

Accedi per commentare.

Più risposte (0)

Categorie

Scopri di più su Measurements and Spatial Audio in Help Center e File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by