How to mark step changes of various sizes
8 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
Justin
el 10 de Mayo de 2024
Comentada: William Rose
el 12 de Mayo de 2024
This is my code for part of a project im doing:
time_run2 = transpose((1:numel(second_run_data(:, 1))') / 60);
figure(3);
plot(time_run2, second_run_data(:, 1))
whish is used to plot a section of data from a larger set. This data follows a step pattern however each step is brocken up into a bunch of little steps and then a section of flat followed by another step and more flat. some of the steps are slightly curved so i cant simply use the ischange() function to find them becasue it wil find multiple changes in each step. My task is too mark each step with a circle or an x whatever but im only allowed to have 1 mark per step. Is there any way of doing this becasue I have no idea
0 comentarios
Respuesta aceptada
William Rose
el 10 de Mayo de 2024
You may want to differentiate your signal with diff(), and then use findpeaks(). Differentiation amplifies high frequency noise, so it can produce spurious peaks. Therefore some smoothing may be required as well. You can use Matlab's smooth(), or some other lowpass filter. If the smoothing is by a linear filter (and smooth(), with the default method, is linear), then it does not matter whether you smooth then differentiate, or vice versa. I have used this approach to identify changes in heart rate in noisy data.
You say "some of the steps are curved" which makes me wonder if there is a bit of judgement involved in the definition of a step. It is OK if there is - that can be incorporated in code - but you have to give some examples for guidance. It would help if you would post the data for which you want to identify changes - maybe with a hand drawing of where you think the steps are.
Good luck.
4 comentarios
William Rose
el 12 de Mayo de 2024
@Justin, you are welcome.
d=importdata('FT02_run_2 (1).csv');
t=d.data(:,1); % time [min]
q=d.data(:,2); % flow [mL/min]
N=length(t); % number of samples
fs=(N-1)/(t(end)-t(1)); % sampling rate [1/min]
Find transition times
% Define constants
Tw=0.9; % segment width [min]
Ts=0.03; % separation between before and after segments [min]
nw=round(Tw*fs); % segment width [samples]
ns=round(Ts*fs); % segment separation [samples]
deltaQmin=0.1; % minimum flow change [L/min]
sdmax=0.05; % max st dev of flow within a segment [L/min]
Look for transitions
j=0; % number of transitions found so far
for i=ns+nw:N-nw
s1=std(q(i-ns-nw+1:i-ns)); % seg 1 SD
s2=std(q(i+1:i+nw)); % seg 2 SD
m1=mean(q(i-ns-nw+1:i-ns)); % seg 1 mean
m2=mean(q(i+1:i+nw)); % seg 2 mean
if s1<sdmax && s2<sdmax && abs(m1-m2)>deltaQmin
j=j+1;
tc(j)=i/fs;
end
end
ntrans=length(tc); % number of transitions found
Display and plot results
fprintf('Found %d transitions.\n',ntrans)
% plot the data
figure
plot(t,q,'-r.')
grid on; xlabel('Time (min)'); ylabel('Flow (mL/min'); ylim([9,14])
hold on
xline(tc,'b')
It is far from perfect, but it is an example of something you could build on.
Good luck.
Más respuestas (0)
Ver también
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!