Самый простой способ обрезать ненужные точки в октаве / матлабе

У меня есть координаты точек (х, у), хранящихся в 1206x2 матрица называется data, Команда plot(data(:,1),data(:,2)) дает эту картину: график данных

Я нашел максимумы в моих данных с findpeaks команда:

[pks,loc,smth] = findpeaks(data(:,2));

И затем нанесите их на предыдущий график:

plot(mod(:,1),mod(:,2),mod(loc,1),pks,'o')

данные с максимумами

Итак, вопрос: какой самый простой способ обрезать максимумы, которые мне не нужны, я имею в виду максимумы ниже красной линии на этой картинке: третий сюжет UPD: лучший способ, который я нашел на данный момент, это использовать параметр "MinPeakDistance".

3 ответа

Решение

Попробуйте использовать envelope встроенная функция:

% generate signal
x = 1:200;
y = x.*sin(x/5).*sin(3*x);
% get its envelope
npeak = 2;
[yupper,ylower] = envelope(y,npeak,'peak');
plot(x,y,x,yupper)

конверт

и затем вы можете просто добавить / вычесть постоянную из этого конверта, чтобы сместить ее вдоль оси Y.

Для сигнала, который вы показали, это на самом деле довольно просто. Если у меня есть сигнал, похожий на ваш,

Вы можете найти положительные пики, где знак производной равен единице

dy = [NaN, diff(y)];
pks = sign(dy) == 1;
t_pks = t(pks);
y_pks = y(pks);

Самый простой способ пропустить точки на графике - это сделать их NaN, Я собираюсь предположить, что у вас есть переменная redline со значениями Y для всех значений X у вас так, что redline(loc) собирается вернуть отсечку в местах пиков. Вы можете игнорировать peaks за кривой как:

>>pks(pks < redline(loc)) = NaN
>>plot(mod(:,1),mod(:,2),mod(loc,1),pks,'o') 
Другие вопросы по тегам