How to find the zero crossing in x and time data sets?

272 vues (au cours des 30 derniers jours)
vimal kumar chawda
vimal kumar chawda le 9 Juin 2021
How can I find the zero crossing in the data sets?
figure()
plot(x,t)
  3 commentaires
vimal kumar chawda
vimal kumar chawda le 10 Juin 2021
Yes we dont have 0.000000000000 so we have range is 10^-3 so all the value fall under 10^-3 are accepted. Now how can we do it as we have two sets x& t?
Rena Berman
Rena Berman le 25 Août 2021

(Answers Dev) Restored edit

Connectez-vous pour commenter.

Réponse acceptée

Scott MacKenzie
Scott MacKenzie le 9 Juin 2021
Modifié(e) : Scott MacKenzie le 10 Juin 2021
Here's what I put together. The variable fCross is what you are looking for.
% data from posted matlab.mat files
f = readmatrix('testdata1.txt');
t = readmatrix('testdata2.txt');
tiledlayout(3,1);
nexttile;
plot(t,f);
hold on;
axis([1 10 -1.2 1.2]);
nexttile;
fAbove = f .* (f >= 0);
fBelow = f .* (f <= 0);
area(t, fAbove, 'FaceColor', 'r');
hold on;
area(t, fBelow, 'FaceColor', 'g');
axis([1 10 -1.2 1.2]);
nexttile;
fCrossRaw = find(diff(fAbove>0));
fCross = fCrossRaw ./ length(t)*10; % as per axes
plot(fCross, zeros(1,length(fCross)), '*r');
hold on;
axis([1 10 -1.2 1.2]);
xline(fCross, 'color', [.7 .7 .7]);
yline(0, 'color', [.7 .7 .7]);
  2 commentaires
vimal kumar chawda
vimal kumar chawda le 10 Juin 2021
thank you sir.
Scott MacKenzie
Scott MacKenzie le 10 Juin 2021
@vimal kumar chawda You're welcome. I just updated my answer to make the 3rd plot look a bit better.

Connectez-vous pour commenter.

Plus de réponses (2)

Stefan Schuberth
Stefan Schuberth le 27 Juil 2022
Modifié(e) : Stefan Schuberth le 27 Juil 2022
If you have (x,y) data and want to do it without using loops try that:
i=find(y(1:end-1).*y(2:end)<0); % index of zero crossings
m=(y(i+1)-y(i))./(x(i+1)-x(i)); % slope
x0=-y(i)./m+x(i); % x coordinates of zero crossings linear interpolated

Joel Lynch
Joel Lynch le 9 Juin 2021
Modifié(e) : Joel Lynch le 9 Juin 2021
idx = find( f(2:end).*f(1:end-1)<0 )
Will return the left-hand indicies of cross-over points.
To get the exact X-values where the cross-over occurs, you would have to do some linear intepolation (inverted)
t_zero = zeros(size(idx));
for i=1:numel(idx)
j = idx(i); % Need both the index in the idx/t_zero vector, and the f/t vector
t_zero(i) = interp1( f(j:j+1), t(j:j+1), 0.0, 'linear' );
end
Note: this will fail if the cross-over happens on the last i value (i+1 would extend outside the range of the dataset)
  4 commentaires
vimal kumar chawda
vimal kumar chawda le 11 Juin 2021
It worked thanks.
Scott MacKenzie
Scott MacKenzie le 11 Juin 2021
Modifié(e) : Scott MacKenzie le 29 Juin 2021
Yes, Joel's code gives the exact cross-over point. Bear in mind, however, that this is exact for the linearly interpolated data. The actual data are empirical, so it is not possible to know the exact cross-over point.
It probably doesn't matter much in this case, since the data appear to be gathered at a high sampling rate.

Connectez-vous pour commenter.

Produits


Version

R2021a

Community Treasure Hunt

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

Start Hunting!

Translated by