How do I cut the signal into several parts?

조회 수: 11 (최근 30일)
Sh Sh
Sh Sh 2021년 10월 21일
편집: Image Analyst 2021년 10월 22일
Welcome
I have 16-channel sEMG signals. I want to take the signal from each channel, which consists of a set of movements, including A rest movement is followed by a movement, then a rest movement, followed by the same movement, a second attempt, and so on until you complete 6 repetitions of one movement between each repetition and the last rest. I know the number of samples for each movement, so how can I remove the rests between iterations of the EMG signal, which represents zeros samples, and only get the repeats, each iteration alone

채택된 답변

Jon
Jon 2021년 10월 21일
편집: Jon 2021년 10월 21일
You can use logical indexing. So if you wanted to remove the portion of a signal x where it equaled zero you could do something like this
idl = x==0
xnew = x(idl)
or more compactly
xnew = x(x==0)
This just removes the zero portions. If you want individual vectors for each non-zero piece it would take a little more work
Here is a way to do it. It seems like there is probably a more elegant solution but I think this approach will work. Note it assumes that the only time the signal is exactly zero is when at rest. It also assumes that the data starts with movement.
% define an example vector with rest portions where value is zero
x = [1 2 3 4 0 0 0 5 6 9 0 0 2 3 8 0 0 4 9 5];
% get logical indices for non-rest portions
isMotion = x~=0;
% find transitions from rest to movement .. .these will have a value of 1 and -1
% respectively
jmp = diff([0 isMotion 0]); % pad with zeros to ensure transition at begin and end
% find beginning and end of movement segments
iStart = find(jmp == 1);
iEnd = find(jmp == -1)-1;
% assign segments to structure
% (can't put them in an array unless we know all motions have same length)
numSeg = numel(iStart);
xseg(numSeg).x = 0; % preallocate
for k = 1:numel(iStart)
xseg(k).x = x(iStart(k):iEnd(k));
end

추가 답변 (1개)

Image Analyst
Image Analyst 2021년 10월 22일
편집: Image Analyst 2021년 10월 22일
Please post the graph along with annotations about where you want to do things to the signal.
Did you try thresholding?
quietIndexes = y < someValue; % for example someValue could be 0 or 0.001 or whatever.
Then you can use bwlabel() to label quiet stretches or high signal stretches, take 6 of them using ismember(), and get their lengths with regionprops() (if you want).
labeledSignal = bwlabel(~quietIndexes);
first6 = ismember(labeledSignal, 1:6);
props = regionprops(first6, 'Area');
allLengths = [props.Area];
% Remove quiet parts so all signals run together
output = y(first6);

카테고리

Help CenterFile Exchange에서 Descriptive Statistics에 대해 자세히 알아보기

태그

Community Treasure Hunt

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

Start Hunting!

Translated by