33 views (last 30 days)

Show older comments

How can I find the zero crossing in the data sets?

figure()

plot(x,t)

Scott MacKenzie
on 9 Jun 2021

Edited: Scott MacKenzie
on 10 Jun 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]);

Scott MacKenzie
on 10 Jun 2021

@vimal kumar chawda You're welcome. I just updated my answer to make the 3rd plot look a bit better.

Joel Lynch
on 9 Jun 2021

Edited: Joel Lynch
on 9 Jun 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)

Scott MacKenzie
on 11 Jun 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.

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

Start Hunting!