How to mark step changes of various sizes

8 visualizaciones (últimos 30 días)
Justin
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

Respuesta aceptada

William Rose
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
Justin
Justin el 12 de Mayo de 2024
perfect thank you so much really appreciate it
William Rose
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)
Found 26 transitions.
% 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.

Iniciar sesión para comentar.

Más respuestas (0)

Etiquetas

Productos


Versión

R2023b

Community Treasure Hunt

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

Start Hunting!

Translated by