Find the second signal points (x, y location) exactly the same place of the first signal peak (x, y) matlab
You are now following this question
- You will see updates in your followed content feed.
- You may receive emails, depending on your communication preferences.
An Error Occurred
Unable to complete the action because of changes made to the page. Reload the page to see its updated state.
Show older comments

Hi all, I have two signals where I find the negative peak of one signal and need to find the corresponding x,y points for the other signal. I was thinking of drawing a "vertical line" where the first signal peak is detected and then take the intersection point of the second signal. I think there are better straight forward methods to achieve this. In my example (please refer to the figure) x,y values are 413 and -6.18. I need to find the "y" value for the other signal (red signal) in the same location.
For your reference, I have attached the sample plot and the signal.
Kind regards
Accepted Answer
Mathieu NOE
on 27 Apr 2021
hello
hope this helps you see function attached
load('Value.txt');
x = Value(:,1);
y = Value(:,2);
t = 1:length(x);
threshold = min(y); %
[t0_pos,s0_pos,t0_neg,s0_neg]= crossing_V7(x,t,threshold,'linear'); % positive (pos) and negative (neg) slope crossing points
% ind => time index (samples)
% t0 => corresponding time (x) values
% s0 => corresponding function (y) values , obviously they must be equal to "threshold"
figure(1)
plot(t,x,t,y,t0_pos,s0_pos,'+r',t0_neg,s0_neg,'+g','linewidth',2,'markersize',12);grid on
legend('signal x','signal y','positive slope crossing points','negative slope crossing points');
% the point we are looking for is the last 'positive slope crossing points'
xx = t0_pos(end)
yy = threshold
9 Comments
Ganesh Naik
on 27 Apr 2021
Edited: Ganesh Naik
on 27 Apr 2021
Hi Mathieu, thanks for your answer. I need to find x and y values for the other signal (red signal in my plot) excatly the same location of the first one. I mean for the first signal (x,y) values are (447.3275, -6.1870), now I need to find (y) value for the other signal (red) in the same location (I tried to draw a vertical line and try to use intersection point but could not be able to do it successfully). Could you please help me with it. Thanks and regards
hello again
ok so this is not exactly the same request in your original post you speak of intersecting the line with a horizontal line
I was thinking of drawing a horizontal line where the first signal peak is detected and then take the intersection point of the second signal.
I am a bit confused which point of the second signal you're exactly looking for ....
because first time you speak of (x,y) first line point at 413 and -6.18, now you speak of (447.3275, -6.1870)
so which one of the 3 green points is the one you're chasing ?

Ganesh Naik
on 27 Apr 2021
Edited: Ganesh Naik
on 27 Apr 2021
Hi Mathieu, sorry there was typo with my previous message. I am looking for the "y" value with respect to (x,y) 413 and -6.18. In fact I am looking for the "y" value, first green dot (left side), "vertical line" just below the red dot. I should have mentioned it as "vertical line", which i have corrected (now).
Sorry for the confusion.
Regards
hello again
so the red cross is the point you're looking for; has same x coordinate as the "reference" point on the other signal ; notice the search for the min value search does not give you the "corner" point ? I would expecte that thas would be your "true" reference point (might need a bit of data smoothing )

clc
clearvars
% data = importdata('data.txt');
load('Value.txt');
x = Value(:,1);
y = Value(:,2);
t = 1:length(x);
% the point you are looking for has following coordinates
[val,ind] = min(y); %
tx = t(ind);
xx = x(ind);
figure(1)
plot(t,x,t,y,tx,val,'+g',tx,xx,'+r','linewidth',2,'markersize',12);grid on
legend('signal x','signal y');
Hi Mathieu, thanks for your answer. This is what I was looking for. I do agree with your comments regarding true reference point. I will consider some data smoothing options for that. Is there any way can I display/label both (x,y) values for both the signlas?I am going to accept the answer!!
here the figure code updated for the x,y coordinates display
the +35 x axis offset is to improve the clarity of the plot , up to you to change that
figure(1)
plot(t,x,t,y,tx,val,'+g',tx,xx,'+r','linewidth',2,'markersize',12);grid on
text(tx+35,val,['(' num2str(tx) ',' num2str(val) ')'])
text(tx+35,xx,['(' num2str(tx) ',' num2str(xx) ')'])
below some example of smoothing
I guess the sgolay method should work fine in your case
clc
close all
Fs = 1000;
samples = 1000;
dt = 1/Fs;
t = (0:samples-1)*dt;
y = square(2*pi*3*t) + 0.1*randn(size(t));
% %%%%%%%%%%%%%%%%
figure(1)
N = 10;
ys = slidingavg(y, N);
plot(t,y,t,ys);legend('Raw','Smoothed');
title(['Data samples at Fs = ' num2str(round(Fs)) ' Hz / Smoothed with slidingavg' ]);
% %%%%%%%%%%%%%%%%
figure(2)
N = 10;
ys = medfilt1(y, N,'truncate');
plot(t,y,t,ys);legend('Raw','Smoothed');
title(['Data samples at Fs = ' num2str(round(Fs)) ' Hz / Smoothed with medfilt1' ]);
grid on
%%%%%%%%%%%%%%%%
figure(3)
N = 10;
ys = sgolayfilt(y,3,51);
plot(t,y,t,ys);legend('Raw','Smoothed');
title(['Data samples at Fs = ' num2str(round(Fs)) ' Hz / Smoothed with sgolayfilt' ]);
grid on
%%%%%%%%%%%%%%%%
NN = 4;
Wn = 0.1;
[B,A] = butter(NN,Wn);
figure(4)
ys = filtfilt(B,A,y);
plot(t,y,t,ys);legend('Raw','Smoothed');
title(['Data samples at Fs = ' num2str(round(Fs)) ' Hz / Smoothed with butterworth LP' ]);
grid on
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function out = slidingavg(in, N)
% OUTPUT_ARRAY = SLIDINGAVG(INPUT_ARRAY, N)
%
% The function 'slidingavg' implements a one-dimensional filtering, applying a sliding window to a sequence. Such filtering replaces the center value in
% the window with the average value of all the points within the window. When the sliding window is exceeding the lower or upper boundaries of the input
% vector INPUT_ARRAY, the average is computed among the available points. Indicating with nx the length of the the input sequence, we note that for values
% of N larger or equal to 2*(nx - 1), each value of the output data array are identical and equal to mean(in).
%
% * The input argument INPUT_ARRAY is the numerical data array to be processed.
% * The input argument N is the number of neighboring data points to average over for each point of IN.
%
% * The output argument OUTPUT_ARRAY is the output data array.
%
% © 2002 - Michele Giugliano, PhD and Maura Arsiero
% (Bern, Friday July 5th, 2002 - 21:10)
% (http://www.giugliano.info) (bug-reports to michele@giugliano.info)
%
% Two simple examples with second- and third-order filters are
% slidingavg([4 3 5 2 8 9 1],2)
% ans =
% 3.5000 4.0000 3.3333 5.0000 6.3333 6.0000 5.0000
%
% slidingavg([4 3 5 2 8 9 1],3)
% ans =
% 3.5000 4.0000 3.3333 5.0000 6.3333 6.0000 5.0000
%
if (isempty(in)) | (N<=0) % If the input array is empty or N is non-positive,
disp(sprintf('SlidingAvg: (Error) empty input data or N null.')); % an error is reported to the standard output and the
return; % execution of the routine is stopped.
end % if
if (N==1) % If the number of neighbouring points over which the sliding
out = in; % average will be performed is '1', then no average actually occur and
return; % OUTPUT_ARRAY will be the copy of INPUT_ARRAY and the execution of the routine
end % if % is stopped.
nx = length(in); % The length of the input data structure is acquired to later evaluate the 'mean' over the appropriate boundaries.
if (N>=(2*(nx-1))) % If the number of neighbouring points over which the sliding
out = mean(in)*ones(size(in)); % average will be performed is large enough, then the average actually covers all the points
return; % of INPUT_ARRAY, for each index of OUTPUT_ARRAY and some CPU time can be gained by such an approach.
end % if % The execution of the routine is stopped.
out = zeros(size(in)); % In all the other situations, the initialization of the output data structure is performed.
if rem(N,2)~=1 % When N is even, then we proceed in taking the half of it:
m = N/2; % m = N / 2.
else % Otherwise (N >= 3, N odd), N-1 is even ( N-1 >= 2) and we proceed taking the half of it:
m = (N-1)/2; % m = (N-1) / 2.
end % if
for i=1:nx, % For each element (i-th) contained in the input numerical array, a check must be performed:
if ((i-m) < 1) & ((i+m) <= nx) % If not enough points are available on the left of the i-th element..
out(i) = mean(in(1:i+m)); % then we proceed to evaluate the mean from the first element to the (i + m)-th.
elseif ((i-m) >= 1) & ((i+m) <= nx) % If enough points are available on the left and on the right of the i-th element..
out(i) = mean(in(i-m:i+m)); % then we proceed to evaluate the mean on 2*m elements centered on the i-th position.
elseif ((i-m) >= 1) & ((i+m) > nx) % If not enough points are available on the rigth of the i-th element..
out(i) = mean(in(i-m:nx)); % then we proceed to evaluate the mean from the element (i - m)-th to the last one.
elseif ((i-m) < 1) & ((i+m) > nx) % If not enough points are available on the left and on the rigth of the i-th element..
out(i) = mean(in(1:nx)); % then we proceed to evaluate the mean from the first element to the last.
end % if
end % for i
end
Hi Mathieu, thank you so much for your help with finding the corresponding values and displaying them on the plot. I appreciate your help with filtering signals, I will go through it in detail. Thanks again and kind regards!!!
you're welcome
glad I could be of some help !
More Answers (0)
Categories
Find more on Descriptive Statistics in Help Center and File Exchange
Tags
See Also
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)