フィルターのクリア

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 Center および File ExchangeSignal Analysis についてさらに検索

タグ

Community Treasure Hunt

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

Start Hunting!

Translated by