Grouping using for loops (signal processing)

4 次查看(过去 30 天)
I am working with a signal data that consist of consecutive dips as shown below. I am only interested in the portion of the signal that lies below a certain point d (the red line). I am trying to write a code which sorts the contents of each dip into one separate group.
And here is the grouping that I need:
For instance, the following code is one of my attempts which didn't work. It generates 310 groups instead of the desired 12 groups.
k=0; % Group number
for i = 1 : length(signal)
if signal(i) < d
k=k+1;
while signal(i) < d
NewSignal(i, k) = signal(i);
i = i + 1;
end
end
end
Any explanations or suggestions would be greatly appreciated.
P. S. I've included an attachement of my data which can be accessed as follows:
M = csvread('DS0007.csv');
time = M(:,1)*1.00e-03;
waveform = M(:,2)*2.00e-01;
waveform = sgolayfilt(waveform,9,21);
  3 个评论
Sordin
Sordin 2019-4-27
Hi dpb, I've attached my sample data. I did try findpeaks(...), but functions like these find more than one peak per dip. To follow your suggestion I would need something that only pinpoints the absolute lowest point of each dip. Besides, I would prefer not to use the signal processing toolbox because some of the computers I am working with are not equiped with that.
dpb
dpb 2019-4-27
You're already using it...
>> which sgolayfilt
C:\ML_R2017\toolbox\signal\signal\sgolayfilt.m
>>
But, it appears the signal is noise-free enough that it shouldn't be hard to find the locations with a much larger difference between ordinal positions than the next point once you've separated out those less than the threshold.
Use find to return the positions from the logical vector
ix=find(waveform<d);
peakarray=waveform(ix);
dx=diff(ix);

请先登录,再进行评论。

回答(0 个)

产品


版本

R2019a

Community Treasure Hunt

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

Start Hunting!

Translated by