![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/461320/image.png)
Finding points of signal
2 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
Rudy Steel
am 14 Dez. 2020
Bearbeitet: Rudy Steel
am 15 Dez. 2020
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;
0 Kommentare
Akzeptierte Antwort
Image Analyst
am 15 Dez. 2020
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);
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/461320/image.png)
7 Kommentare
Image Analyst
am 15 Dez. 2020
Bearbeitet: Image Analyst
am 15 Dez. 2020
Oh, sorry to hear that. When I did it, it worked pretty well, I thought, though I'm not exactly sure where you think the "base" of the peaks in R should be. But anyway, try 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) % For each peak...
% Get the indexes.
thisPeakIndex = indexesOfPeaks(k);
% Fall down the left side of this peak.
for k2 = (thisPeakIndex - 1) : -1 : 2
if R(k2) < R(k2-1)
leftPeak(k) = k2-1;
break;
end
end
% Fall down the right side of this peak.
for k2 = (thisPeakIndex + 1) : length(R)
if R(k2) > R(k2-1)
rightPeak(k) = k2-1;
break;
end
end
% Get the times.
t1 = EOG_Time(leftPeak(k));
t2 = EOG_Time(rightPeak(k));
% 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);
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/462150/image.png)
If you'd rather do it on EOG_Data_v instead of R, you could of course do that with the obvious modifications, though you might need to smooth EOG_Data_v a bit or put some threshold on how much the signal has to turn upwards.
Weitere Antworten (0)
Siehe auch
Kategorien
Mehr zu Signal Analysis finden Sie in Help Center und File Exchange
Produkte
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!