MATLAB: Finding points of signal

dataSignal Processing Toolbox

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;

Best Answer

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);