Finding points of signal

Illustration
Harper - 2020-12-28T13:04:32+00:00
Question: Finding points of signal

I have some data labelled x_v[n] and I am trying to locate the starting and ending points of the peaks from my data. Till now I obtained x_v[n] and then I performed template matching. I require to find the starting and ending points of the peaks on x_v[n] Any idea as to how I can do that please? Here is my code till now:   fs = 256; N = length(EOG_Data); T = 1/fs; Time = [0:(N - 1)] * T; figure(); plot(Time, EOG_Data); title('x_v[n]'); [pks, locs] = findpeaks(R, 'MinPeakHeight',10e6); %finding peaks figure(); plot(Time, R); hold on; plot(EOG_Time(locs), pks, '*r') hold off;

Expert Answer

Profile picture of John Michell John Michell answered . 2025-11-20

Well you could start at a peak and go forward and backward until the signal begins to turn upward.
Or you could just use the widths returned by findpeaks(), which is about half way up. I have a demo for this:
 
clc;    % Clear the command window.
close all;  % Close all figures (except those of imtool.)
clear;  % Erase all existing variables. Or clearvars if you want.
workspace;  % Make sure the workspace panel is showing.
format long g;
format compact;
fontSize = 22;
fprintf('Beginning to run %s.m ...\n', mfilename);

EOG_Data = load('EOG_Data.mat');
EOG_Data_v = double(EOG_Data.EOG_Data_4ch(1,:)) - double(EOG_Data.EOG_Data_4ch(2,:));

fs = 256;
N = length(EOG_Data_v);
T = 1/fs;
EOG_Time = [0:(N - 1)] * T;

subplot(2, 1, 1);
plot(EOG_Time, EOG_Data_v);
title('x_v[n]', 'FontSize', fontSize);
grid on; 

Blink = EOG_Data_v(500:720); %template

[R, lags] = xcorr(EOG_Data_v, Blink); %cross-correlation
R = R(lags>=0);
lags = lags(lags>=0);

[peakValues, indexesOfPeaks, widths, proms] = findpeaks(R, 'MinPeakHeight',10e6); %finding peaks
subplot(2, 1, 2);
plot(EOG_Time, R);
title('Occurance of Blinks from Cross-Correlation plot', 'FontSize', fontSize);
xlabel('Time in seconds', 'FontSize', fontSize); 
ylabel('Voltage in mV', 'FontSize', fontSize); 
grid on; 
axis tight;
hold on;
plot(EOG_Time(indexesOfPeaks), peakValues, '*r')
% Plot widths
valleyIndexes = zeros(length(widths), 2);
for k = 1 : length(widths)
	% Get the indexes.
	valleyIndexes(k, 1) = floor(indexesOfPeaks(k) - widths(k)/2);
	valleyIndexes(k, 2) = ceil(indexesOfPeaks(k) + widths(k)/2);
	% Get the times.
	t1 = EOG_Time(valleyIndexes(k, 1));
	t2 = EOG_Time(valleyIndexes(k, 2));
	% Draw vertical lines on the plot.
	xline(t1, 'Color', 'm', 'LineWidth', 2);
	xline(t2, 'Color', 'm', 'LineWidth', 2);
end
hold off;
% Maximize figure window.
g = gcf;
g.WindowState = 'maximized'
fprintf('Done running %s.m.\n', mfilename);

finding points of signal


Not satisfied with the answer ?? ASK NOW

Get a Free Consultation or a Sample Assignment Review!