Найти разницу между положительным и отрицательным пиками MATLAB

Мне нужно найти разницу между положительными и отрицательными пиками, где разница больше +-3.

я использую findpeaks функция в MATLAB, чтобы найти положительные и отрицательные пики данных. В примере моего кода:

[Ypos, Yposloc] =  findpeaks(YT0);
[Yneg, Ynegloc] =  findpeaks(YT0*-1);
Yneg = Yneg*-1; 

Yposloc а также Ynegloc вернуть расположение положительных и отрицательных пиков в данных.

Я хочу объединить Ypos а также Yneg на основе порядка пиков.

Например, мои пики

Ypos = [11 6 -10 -10 6 6 6 6 6 -5]
Yneg = [-12 -14 -11 -11 -11 5 5 5 -6]

Места в YT0

Yposloc = [24 63 79 84 93 95 97 100 156]
Ynegloc = [11 51 78 81 85 94 96 99 154]

В этом случае, когда оба Yposloc а также Ynegloc 9x1, я могу сделать следующее;

nColumns = size(Yposs,2);
YTT0 = [Yneg, Ypos]';
YTT0 = reshape(YTT0(:),nColumns,[])';
YTT0 = diff(YTT0)
YT0Change = numel(YTT0(YTT0(:)>=3 | YTT0(:)<=-3));

Всего изменений, которые меня интересуют 6

Тем не менее, мне нужно объединить Yneg а также Ypos автоматически, в зависимости от их местоположения. Так что я думаю, что мне нужно сделать if заявление, чтобы выяснить, если мои положительные или отрицательные пики на первом месте? Тогда я не уверен, как решить проблему, когда Ypos а также Yneg разные размеры.

Я запускаю этот скрипт несколько раз, когда данные меняются, а порядок отрицательного / положительного пика постоянно меняется. Есть ли простой способ сравнить местоположения пиков или я на правильном пути?

2 ответа

Я бы проверял каждый минимум как с предыдущим, так и со следующим максимумами. Для этого вы можете сначала объединить положительные и отрицательные пики в соответствии с их порядком:

Y = zeros(1, max([Yposloc, Ynegloc]));
Yloc = zeros(size(Y));
Yloc(Yposloc) = Yposloc;
Yloc(Ynegloc) = Ynegloc;
Y(Yposloc) = Ypos; % I think you inserted one extra '6' in your code!
Y(Ynegloc) = Yneg;
Y = Y(Yloc ~= 0) % this is the combined signal
Yloc = Yloc(Yloc ~= 0) % this is the combined locations

% Y =
%
%   -12   11  -14    6  -11  -10  -11  -10  -11    6    5    6    5    6    5    6   -6   -5
%
% Yloc =
%
%    11   24   51   63   78   79   81   84   85   93   94   95   96   97   99  100  154  156

А затем рассчитайте разницу:

diff(Y)

% ans =
%
%    23  -25   20  -17    1   -1    1   -1   17   -1    1   -1    1   -1    1  -12    1

Если вы хотите изменения не менее 6 единиц:

num = sum(abs(diff(Y)) > 6)

% num =
%
%     6
Ypos = [11 6 -10 -10 6 6 6 6 -5];
Yneg = [-12 -14 -11 -11 -11 5 5 5 -6];
Yposloc = [24 63 79 84 93 95 97 100 156];
Ynegloc = [11 51 78 81 85 94 96 99 154];

TOTAL=[Yposloc Ynegloc;Ypos Yneg];
%creatin a vector with positions in row 1 and values in row 2
[~,position]=sort(TOTAL(1,:));

%resort this matrix so the values are in the orginial order
TOTAL_sorted=TOTAL(:,position);
%look at the changes of the values
changes=diff(TOTAL_sorted(2,:));

if changes(1)>0
    disp('First value was a Minimum')
else
    disp('First value was a MAximum')
end
%same structure at the TOTAL matrix
%abs(changes)>3 produces a logical vector that shows where the absolute values was bigger
%than 3, in my opinon its rather intresting where the end is then were the start is
% thats why i add +1
Important_changes=TOTAL_sorted(:,find(abs(changes)>3)+1);

plot(TOTAL_sorted(1,:),TOTAL_sorted(2,:))
hold on
plot(Important_changes(1,:),Important_changes(2,:),...
    'Marker','o','MarkerSize',10, 'LineStyle','none');
hold off
Другие вопросы по тегам