필터 지우기
필터 지우기

Finding points of signal

조회 수: 2 (최근 30일)
Rudy Steel
Rudy Steel 2020년 12월 14일
편집: Rudy Steel 2020년 12월 15일
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;

채택된 답변

Image Analyst
Image Analyst 2020년 12월 15일
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);
  댓글 수: 7
Image Analyst
Image Analyst 2020년 12월 15일
편집: Image Analyst 2020년 12월 15일
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);
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.
Rudy Steel
Rudy Steel 2020년 12월 15일
Your first response was actually good I had a mix up in the variables but now it is working as intended. I changed xline to actual plots having '*r*' and I also managed to erase the data between the starting and ending points and get my desired result. Thanks a lot!

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Signal Analysis에 대해 자세히 알아보기

태그

Community Treasure Hunt

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

Start Hunting!

Translated by