Main Content

findpeaks

説明

pks = findpeaks(data) は、入力信号ベクトル data から局所的最大値 (ピーク) をもつベクトルを返します。"局所的なピーク" は、2 つの隣接するサンプルよりも大きいか、Inf と等しいデータ サンプルです。ピークは発生順に出力されます。Inf でない信号の端点は除外されます。ピークが平坦である場合、関数は最小のインデックスをもつ点のみを返します。

[pks,locs] = findpeaks(data) はさらに、ピークが発生するインデックスを返します。

[pks,locs,w,p] = findpeaks(data) は、さらにベクトル w としてピーク幅を、ベクトル p としてピークのプロミネンスを返します。

[___] = findpeaks(data,x)x を位置ベクトルとして指定し、前の構文の出力引数のいずれかを返します。locs および wx で表されます。

[___] = findpeaks(data,Fs) は、データのサンプルレート Fs を指定します。data の最初のサンプルは時間ゼロでとられたものと想定されます。locs および w は時間の単位に変換されます。

[___] = findpeaks(___,Name,Value) は、前の構文の入力引数に加えて、名前と値の引数を使用してオプションを指定します。

出力引数を指定しない findpeaks(___) は信号をプロットし、ピーク値を重ね合わせます。

すべて折りたたむ

3 つのピークをもつベクトルを定義し、プロットします。

data = [25 8 15 5 6 10 10 3 1 20 7];
plot(data)

Figure contains an axes object. The axes object contains an object of type line.

局所的最大値を求めます。ピークは発生順に出力されます。最初のサンプルは最大であっても含まれません。平坦なピークの場合、関数は最も低いインデックスをもつ点のみを返します。

pks = findpeaks(data)
pks = 1×3

    15    10    20

出力引数なしで findpeaks を使用してピークを表示します。

findpeaks(data)

Figure contains an axes object. The axes object contains 2 objects of type line.

ベル型曲線の和を構成する信号を作成します。各曲線の位置、高さ、幅を指定します。

x = linspace(0,1,1000);

Pos = [1 2 3 5 7 8]/10;
Hgt = [3 4 4 2 2 3];
Wdt = [2 6 3 3 4 6]/100;

for n = 1:length(Pos)
    Gauss(n,:) = Hgt(n)*exp(-((x - Pos(n))/Wdt(n)).^2);
end

PeakSig = sum(Gauss);

個々の曲線とその和をプロットします。

plot(x,Gauss,'--',x,PeakSig)

Figure contains an axes object. The axes object contains 7 objects of type line.

既定の設定で findpeaks を使用して信号のピークとそれらの位置を求めます。

[pks,locs] = findpeaks(PeakSig,x);

findpeaks を使用してピークをプロットし、それにラベルを付けます。

findpeaks(PeakSig,x)

text(locs+.02,pks,num2str((1:numel(pks))'))

Figure contains an axes object. The axes object contains 8 objects of type line, text.

最も高いピークから低いピークに並べ替えます。

[psor,lsor] = findpeaks(PeakSig,x,'SortStr','descend');

findpeaks(PeakSig,x)

text(lsor+.02,psor,num2str((1:numel(psor))'))

Figure contains an axes object. The axes object contains 8 objects of type line, text.

余弦 1 周期の区間を進むベル型曲線の和から構成される信号を作成します。各曲線の位置、高さ、幅を指定します。

x = linspace(0,1,1000);

base = 4*cos(2*pi*x);

Pos = [1 2 3 5 7 8]/10;
Hgt = [3 7 5 5 4 5];
Wdt = [1 3 3 4 2 3]/100;

for n = 1:length(Pos)
    Gauss(n,:) =  Hgt(n)*exp(-((x - Pos(n))/Wdt(n)).^2);
end

PeakSig = sum(Gauss)+base;

個々の曲線とその和をプロットします。

plot(x,Gauss,'--',x,PeakSig,x,base)

Figure contains an axes object. The axes object contains 8 objects of type line.

findpeaks を使用して 4 以上のプロミネンスをもつピークの場所を特定しプロットします。

findpeaks(PeakSig,x,'MinPeakProminence',4,'Annotate','extents')

Figure contains an axes object. The axes object contains 4 objects of type line. These objects represent signal, peak, prominence, width (half-prominence).

最も高いピークと最も低いピークだけが条件を満たすピークです。

すべてのピークのプロミネンスおよびプロミネンスの半分の幅を表示します。

[pks,locs,widths,proms] = findpeaks(PeakSig,x);
widths
widths = 1×6

    0.0154    0.0431    0.0377    0.0625    0.0274    0.0409

proms
proms = 1×6

    2.6816    5.5773    3.1448    4.4171    2.9191    3.6363

黒点は周期的現象です。その数は、おおよそ 11 年ごとにピークを迎えることが知られています。

sunspot.dat ファイルを読み込みます。このファイルには、1700 年から 1987 年までに観測された太陽黒点数の毎年の平均が含まれています。最大値を求めてプロットします。

load sunspot.dat

year = sunspot(:,1);
avSpots = sunspot(:,2);

findpeaks(avSpots,year)

Figure contains an axes object. The axes object contains 2 objects of type line.

サイクル期間の推定は、相互の距離が非常に近いピークを無視することで精度が上がります。再度ピークを求めてプロットしますが、今回は受け入れることができるピーク間の離隔距離を 6 年よりも大きな値に制限します。

findpeaks(avSpots,year,'MinPeakDistance',6)

Figure contains an axes object. The axes object contains 2 objects of type line.

findpeaks で返されたピークの位置を使用して最大値間の平均間隔を計算します。

[pks,locs] = findpeaks(avSpots,year,'MinPeakDistance',6);

meanCycle = mean(diff(locs))
meanCycle = 10.9600

年データを使用して datetime 配列を作成します。黒点は毎年春分近くの 3 月 20 日にカウントされたと仮定します。黒点数がピークとなる年を求めます。関数 years を使用して、最小ピーク離隔距離を duration として指定します。

ty = datetime(year,3,20);

[pk,lk] = findpeaks(avSpots,ty,'MinPeakDistance',years(6));

plot(ty,avSpots,lk,pk,'o')

Figure contains an axes object. The axes object contains 2 objects of type line.

datetime の機能を使用して、平均黒点サイクルを計算します。

dttmCycle = years(mean(diff(lk)))
dttmCycle = 10.9600

データを使用して timetable を作成します。時間変数を年で指定します。データをプロットします。timetable の最後の 5 つのエントリを表示します。

TT = timetable(years(year),avSpots);
plot(TT.Time,TT.Variables)

Figure contains an axes object. The axes object contains an object of type line.

entries = TT(end-4:end,:)
entries=5×1 timetable
      Time      avSpots
    ________    _______

    1983 yrs     66.6  
    1984 yrs     45.9  
    1985 yrs     17.9  
    1986 yrs     13.4  
    1987 yrs     29.3  

7418 Hz でサンプリングされた音声信号を読み込みます。200 サンプルを選択します。

load mtlb
select = mtlb(1001:1200);

最小分離間隔 5 ms でピークを検出します。

この制約を適用するため、findpeaks は信号の最も高いピークを選択し、5 ms 以内のすべてのピークを排除します。次に、関数は残りのピークの中で最も高いピークを選択するためにこの手順を繰り返し、考慮すべきピークがなくなるまで反復します。

findpeaks(select,Fs,'MinPeakDistance',0.005)

Figure contains an axes object. The axes object contains 2 objects of type line.

1 V 以上の振幅をもつピークを検出します。

findpeaks(select,Fs,'MinPeakHeight',1)

Figure contains an axes object. The axes object contains 2 objects of type line.

隣接するサンプルよりも 1 V 以上高いピークを検出します。

findpeaks(select,Fs,'Threshold',1)

Figure contains an axes object. The axes object contains 2 objects of type line.

より高い値に信号が達する前にいずれかの側に 1 V 以上ドロップしているピークを検出します。

findpeaks(select,Fs,'MinPeakProminence',1)

Figure contains an axes object. The axes object contains 2 objects of type line.

データが指定した飽和点より大きい場合、センサーはクリップした読み取り値を返します。これらのピークを無意味なものとして無視するか、あるいは解析に組み込むように選択できます。

分散 0.1² のホワイト ガウス ノイズに含まれる、周波数が 5 Hz と 3 Hz の三角関数の積で構成された信号を生成します。信号は、100 Hz のレートで 1 秒間サンプリングされます。再現可能な結果が必要な場合は、乱数発生器をリセットします。

rng default

fs = 1e2;
t = 0:1/fs:1-1/fs;

s = sin(2*pi*5*t).*sin(2*pi*3*t)+randn(size(t))/10;

0.32 の指定範囲より大きいすべての読み取り値を切り捨てることで、飽和した測定値をシミュレートします。飽和した信号をプロットします。

bnd = 0.32;
s(s>bnd) = bnd;

plot(t,s)
xlabel('Time (s)')

Figure contains an axes object. The axes object contains an object of type line.

信号のピークの位置を特定します。findpeaks は、平らなピークのそれぞれの立ち上がりエッジのみをレポートします。

[pk,lc] = findpeaks(s,t);

hold on
plot(lc,pk,'x')

Figure contains an axes object. The axes object contains 2 objects of type line.

'Threshold' の名前と値のペアを使用して平らなピークを除外します。ピークとその両隣との間には、最小振幅差として 10-4 が必要です。

[pkt,lct] = findpeaks(s,t,'Threshold',1e-4);

plot(lct,pkt,'o','MarkerSize',12)

Figure contains an axes object. The axes object contains 3 objects of type line.

ベル型曲線の和を構成する信号を作成します。各曲線の位置、高さ、幅を指定します。

x = linspace(0,1,1000);

Pos = [1 2 3 5 7 8]/10;
Hgt = [4 4 2 2 2 3];
Wdt = [3 8 4 3 4 6]/100;

for n = 1:length(Pos)
    Gauss(n,:) =  Hgt(n)*exp(-((x - Pos(n))/Wdt(n)).^2);
end

PeakSig = sum(Gauss);

個々の曲線とその和をプロットします。

plot(x,Gauss,'--',x,PeakSig)
grid

Figure contains an axes object. The axes object contains 7 objects of type line.

プロミネンスの半分を基準として使用してピーク幅を測定します。

findpeaks(PeakSig,x,'Annotate','extents')

Figure contains an axes object. The axes object contains 4 objects of type line. These objects represent signal, peak, prominence, width (half-prominence).

今度は基準として高さの半分を使用して幅を再測定します。

findpeaks(PeakSig,x,'Annotate','extents','WidthReference','halfheight')
title('Signal Peak Widths')

Figure contains an axes object. The axes object with title Signal Peak Widths contains 6 objects of type line. These objects represent signal, peak, height, width (half-height), border.

入力引数

すべて折りたたむ

ベクトルとして指定される入力データ。data は実数で要素数が 3 以上でなければなりません。

データ型: double | single

位置。ベクトルまたは datetime 配列で指定されます。x は単調増加で data と同じ長さでなければなりません。x を省略した場合、data のインデックスが位置として使用されます。

データ型: double | single | datetime

サンプルレート。正のスカラーで指定します。サンプルレートは単位時間あたりのサンプル数です。時間の単位が秒の場合、サンプルレートの単位は Hz です。

データ型: double | single

名前と値の引数

オプションの引数のペアを Name1=Value1,...,NameN=ValueN として指定します。ここで、Name は引数名で、Value は対応する値です。名前と値の引数は他の引数の後に指定しなければなりませんが、ペアの順序は重要ではありません。

R2021a より前は、名前と値をそれぞれコンマを使って区切り、Name を引用符で囲みました。

例: 'SortStr','descend','NPeaks',3 では、信号の最も高いピークを 3 つ求めます。

返されるピークの最大数。正の整数スカラーとして指定します。findpeaks は入力データの最初の要素から演算を開始し、ピークの数が 'NPeaks' の値に達すると終了します。

データ型: double | single

ピークの並べ替え。次のいずれかの値として指定します。

  • 'none' は入力データの発生順でピークを返します。

  • 'ascend' はピークを最小値から最大値への昇順、つまり増加順で返します。

  • 'descend' はピークを最大値から最小値への降順で返します。

ピーク高の最小値。実数スカラーとして指定します。この引数を使用して、findpeaks'MinPeakHeight' よりも高いピークのみを返すようにします。最小ピーク高を指定することで処理時間が短縮されます。

データ型: double | single

最小ピークのプロミネンス。実数スカラーとして指定します。この引数を使用して、findpeaks が少なくとも 'MinPeakProminence' の相対的な重要性をもつピークのみを返すようにします。詳細については、プロミネンスを参照してください。

データ型: double | single

ピークとその隣接値との高さの最小差異。非負の実数スカラーとして指定します。findpeaks はこの引数を使用して、隣接値を少なくとも 'Threshold' の値分を上回るピークのみを返します。

データ型: double | single

最小ピーク離隔距離。正の実数スカラーとして指定します。'MinPeakDistance' に値を指定した場合、アルゴリズムは信号の最も高いピークを選択し、信号の 'MinPeakDistance' 以内のすべてのピークを無視します。次に、関数は残りのピークの中で最も高いピークを選択するためにこの手順を繰り返し、考慮すべきピークがなくなるまで反復します。

  • 位置ベクトル x を指定した場合、'MinPeakDistance' は必ず x で表されます。xdatetime 配列の場合は、'MinPeakDistance'duration スカラーまたは日単位で表される数値スカラーとして指定します。

  • サンプルレート Fs を指定した場合、'MinPeakDistance' は必ず時間の単位で表されます。

  • xFs のどちらも指定しない場合、'MinPeakDistance' は必ずサンプルの単位で表されます。

この引数を使用して、findpeaks により大きなピークの近傍で発生する小さなピークを無視させます。

データ型: double | single | duration

幅の測定値の基準の高さ。'halfprom' または 'halfheight' のいずれかとして指定します。findpeaks は降順の信号が水平の基準線を横切る点の間の距離としてピーク幅を推定します。線の高さは 'WidthReference' で指定されている基準を使用して選択されます。

  • 'halfprom' はピークのプロミネンスの半分に等しい垂直距離にあるピークの下に基準線を配置します。詳細については、プロミネンスを参照してください。

  • 'halfheight' はピーク高さの 1/2 の位置に基準線を配置します。この線は、任意のインターセプト ポイントが 'MinPeakHeight''MinPeakProminence' および 'Threshold' の設定によって選択されたピークの境界を超えた場合に打ち切られます。ピーク間の境界は、ピーク間の最も低い谷の水平位置で定義されます。高さがゼロ未満のピークは破棄されます。

インターセプト ポイントの位置は、線形内挿で計算されます。

最小ピーク幅。正の実数スカラーとして指定します。この引数を使用して、'MinPeakWidth' 以上の幅をもつピークだけを選択します。

  • 位置ベクトル x を指定した場合、'MinPeakWidth' は必ず x で表されます。xdatetime 配列の場合は、'MinPeakWidth'duration スカラーまたは日単位で表される数値スカラーとして指定します。

  • サンプルレート Fs を指定した場合、'MinPeakWidth' は必ず時間の単位で表されます。

  • xFs のどちらも指定しない場合、'MinPeakWidth' は必ずサンプルの単位で表されます。

データ型: double | single | duration

最大ピーク幅。正の実数スカラーとして指定します。この引数を使用して、最大 'MaxPeakWidth' の幅をもつピークだけを選択します。

  • 位置ベクトル x を指定した場合、'MaxPeakWidth' は必ず x で表されます。xdatetime 配列の場合は、'MaxPeakWidth'duration スカラーまたは日単位で表される数値スカラーとして指定します。

  • サンプルレート Fs を指定した場合、'MaxPeakWidth' は必ず時間の単位で表されます。

  • xFs のどちらも指定しない場合、'MaxPeakWidth' は必ずサンプルの単位で表されます。

データ型: double | single | duration

プロットのスタイル。次のいずれかの値として指定します。

  • 'peaks' は信号をプロットし、各ピークの位置と値の注釈を付けます。

  • 'extents' は信号をプロットし、各ピークの位置、値、幅およびプロミネンスに注釈を付けます。

この引数は出力引数で findpeaks を呼び出している場合に無視されます。

出力引数

すべて折りたたむ

局所的最大値。信号値のベクトルで返されます。局所的最大値がない場合、pks は空です。

ベクトルとして返されるピークの位置。

  • 位置ベクトル x を指定した場合、locs はピークのインデックスに x の値を含めます。

  • サンプル レート Fs を指定した場合、locs は連続するサンプル間の時間差が 1/Fs となる時点の数値ベクトルです。

  • xFs のどちらも指定しない場合、locs は整数インデックスのベクトルです。

ピーク幅。実数のベクトルとして返します。各ピークの幅は、WidthReference で指定された高さの基準線に信号が交差する、ピークの左右の点の間の距離を計算します。点自体は線形内挿で検出されます。

  • 位置ベクトル x を指定した場合、幅は x で表されます。

  • サンプルレート Fs を指定した場合、時間の単位で表されます。

  • xFs のどちらも指定しない場合、幅はサンプル単位で表されます。

ピークのプロミネンス。実数のベクトルとして返します。ピークのプロミネンスとは、信号がピークよりも高いレベルに戻るか、端点に到達する前にピークのいずれかの側に信号が下降して到達する必要のある最小垂直距離です。詳細については、プロミネンスを参照してください。

詳細

すべて折りたたむ

プロミネンス

ピークの "プロミネンス" はピークの固有の高さと、他のピークとの相対的な位置によって、そのピークがどの程度突出しているかを測定します。低い位置で孤立しているピークが、より高い位置であってもその周囲から突出していないピークと比べた場合、プロミネンスの度合いがより高くなる場合があります。

ピークのプロミネンスは以下により測定します。

  1. ピーク上にマーカーを配置します。

  2. ピークの水平線を以下のいずれかの状態になるまで左右に伸ばします。

    • より高いピークと信号が交差

    • 信号の左端または右端への到達

  3. 手順 2 で定義した 2 つの区間のそれぞれで信号の最小値を見つけます。このポイントは、谷または信号端点の 1 つのいずれかです。

  4. 2 つの区間の最小値の高い方の値が基準レベルを規定します。この基準レベルより上のピーク高がプロミネンスです。

findpeaks は、その信号の両端点を超えた動作については、高さに関係なく仮定を行いません。このため、手順 2 および 4 では信号の両端点を超えた動作が無視され、基準レベルの値に影響を与えることがよくあります。この信号のピークが以下のような場合を考えてみましょう。

Signal with nine peaks, numbered 1 through 9 from left to right. The valleys between each pair of peaks are labeled from left to right with the letters a through i. In decreasing order of height, the peaks are 2, 6, 1, 8, 4, which is equal to 8, 7, 3, 9, and 5. In decreasing order of height, the valleys are a, g, c, i, f, b, which is equal to f, e, d, and h. For this signal, peak 6 has the highest prominence, even though it is lower than peak 2.

ピークの番号ピークからの左区間の端点ピークからの右区間の端点左区間の最低点右区間の最低点基準レベル (最高極小)
1左端ピーク 2 によるクロッシング左の端点aa
2左端右端左の端点h左の端点
3ピーク 2 によるクロッシングピーク 4 によるクロッシングbcc
4ピーク 2 によるクロッシングピーク 6 によるクロッシングbdb
5ピーク 4 によるクロッシングピーク 6 によるクロッシングdee
6ピーク 2 によるクロッシング右端dhd
7ピーク 6 によるクロッシングピーク 8 によるクロッシングfgg
8ピーク 6 によるクロッシング右端fhf
9ピーク 8 によるクロッシング左の端点によるクロッシングhii

拡張機能

C/C++ コード生成
MATLAB® Coder™ を使用して C および C++ コードを生成します。

バージョン履歴

R2007b で導入