findpeaksを使うにはtoolboxが必要です。環境によっては使えない可能性があります。
全てのピークを見つけしかるべき順序付けするだけであれば自分で簡単に作れます。
離散的な時系列に対して、ある点が局所的に最大であるとは、
「その点の後ろの値との差分が正、前の値との差分が負」
と言い換えることができます。
プログラムは簡単です。
以下、境界点は局所最大でも最小でもないと仮定しています。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 信号の例
t = 0:1000;t=t(:);
y = sin(t/20)+2cos(t/6)-1/2sin(t/12)-cos(t/2000);
%y = randn(size(t));
% ピーク検出
dy = y(2:end)-y(1:end-1);
fd= [dy;0];% t(1),t(2),..,t(end-1),t(end)における前進差分.t(end)における前進差分は0と仮定
bd=[0;dy];%t(1),t(2),t(3),...,t(end)における後退差分を計算. t(1)における後退差分は0と仮定
idx =find( (fd < 0)&(bd > 0) );% local max = df<0 かつ bd>0
lt=t(idx);%局所最大点 を与える時刻を lt に保存
ly=y(idx);%局所最大点を保存
% ピークの並び替え
[ly, id] = sort(ly,'descend');%局所最大点を降順に並び替え
lt=lt(id);% ltの並び替え
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
正しい結果が得られているかグラフを書いて確認してください。
plot(t,y,'.-')
hold on
plot(lt, ly,'o')
% ついでのピークの順位も表示
for k=1:length(lt)
text(lt(k), ly(k)+0.1,num2str(k)) % ピークの上に順位を表示
end
hold off
ちなみに
idx =find( (fd > 0)&(bd < 0) );
とすれば局所最小点が求まります。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/11/30 05:07
2016/11/30 05:14