Найти разницу между положительным и отрицательным пиками 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