How can I find when a signal stops oscillating more than a certain value?
20 views (last 30 days)
Show older comments
Samuele Bolotta
on 20 Apr 2021
Answered: Mathieu NOE
on 21 Apr 2021
I have one vector for time and one vector for voltage. I need to find out at what ms in time the voltage (as in the image I attached) stopped oscillating more than a certain value. Moreover, I'd like to be able to also find out the value at which it stabilizes. Is this possible?
Thanks
0 Comments
Accepted Answer
Mathieu NOE
on 21 Apr 2021
hello
sure it's doable
use the attached code example to do a first derivative of your data, and then find the first index of the data when the abs of the first derivative is below a given threshold ; I used moveman to not be trapped by a single isolated sample where the derivative would be almost zero.
clc
clearvars
Fs = 10;
dt = 1/Fs;
t = 0:dt:10;
omega = 2*pi*0.25;
tau = 1;
x = sin(omega*t).*(exp(-t/tau)) + (1-exp(-t/tau));
[dxdt, d2xdt2] = firstsecondderivatives(t,x);
dxdtmm = movmean(abs(dxdt),5); % use movmean to discard one isolated time value of low derivative value ; increase window length if needed
threshold = 0.01;
ind = find(dxdtmm < threshold);
t0 = t(ind(1));
x0 = x(ind(1));
% raw data + first derivatives plot
figure(1),
subplot(211),plot(t,x,'b',t0,x0,'dr');
title('Voltage');
xlabel('Time (s)');
ylabel('V');
subplot(212),plot(t,abs(dxdt),'k',t,dxdtmm,'g',t0,dxdtmm(ind(1)),'dr');
title('Voltage first derivative (abs value)');
xlabel('Time (s)');
ylabel('abs(dV/dt)');
disp(['Steady state voltage ' num2str(x0) ' V']);
disp(['Steady state voltage reached at ' num2str(t0) ' s']);
function [dy, ddy] = firstsecondderivatives(x,y)
% The function calculates the first & second derivative of a function that is given by a set
% of points. The first derivatives at the first and last points are calculated by
% the 3 point forward and 3 point backward finite difference scheme respectively.
% The first derivatives at all the other points are calculated by the 2 point
% central approach.
% The second derivatives at the first and last points are calculated by
% the 4 point forward and 4 point backward finite difference scheme respectively.
% The second derivatives at all the other points are calculated by the 3 point
% central approach.
n = length (x);
dy = zeros;
ddy = zeros;
% Input variables:
% x: vector with the x the data points.
% y: vector with the f(x) data points.
% Output variable:
% dy: Vector with first derivative at each point.
% ddy: Vector with second derivative at each point.
dy(1) = (-3*y(1) + 4*y(2) - y(3)) / (2*(x(2) - x(1))); % First derivative
ddy(1) = (2*y(1) - 5*y(2) + 4*y(3) - y(4)) / (x(2) - x(1))^2; % Second derivative
for i = 2:n-1
dy(i) = (y(i+1) - y(i-1)) / (x(i+1) - x(i-1));
ddy(i) = (y(i-1) - 2*y(i) + y(i+1)) / (x(i-1) - x(i))^2;
end
dy(n) = (y(n-2) - 4*y(n-1) + 3*y(n)) / (2*(x(n) - x(n-1)));
ddy(n) = (-y(n-3) + 4*y(n-2) - 5*y(n-1) + 2*y(n)) / (x(n) - x(n-1))^2;
end
0 Comments
More Answers (0)
See Also
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!