# findpeaks

## 语法

``pks = findpeaks(data)``
``[pks,locs] = findpeaks(data)``
``[pks,locs,w,p] = findpeaks(data)``
``[___] = findpeaks(data,x)``
``[___] = findpeaks(data,Fs)``
``[___] = findpeaks(___,Name,Value)``
``findpeaks(___)``

## 说明

``pks = findpeaks(data)` 返回一个向量，其中包含输入信号向量 `data` 的局部最大值（峰值）。局部峰值数据样本的值或者大于其两个相邻样本，或者等于 `Inf`。峰值按出现的顺序输出。非 `Inf` 信号端点将被排除。如果是平峰，则函数将只返回具有最小索引的点。`

``[pks,locs] = findpeaks(data)` 还返回出现峰值的索引。`

``[pks,locs,w,p] = findpeaks(data)` 还以向量 `w` 的形式返回峰值的宽度，以向量 `p` 的形式返回峰的相对高差。`

``[___] = findpeaks(data,x)` 将 `x` 指定为位置向量，并返回上述语法中的任何输出参量。`locs` 和 `w` 以 `x` 的形式表示。`

``[___] = findpeaks(data,Fs)` 指定数据的采样率 `Fs`。`data` 的第一个采样假定在时间零处采集。`locs` 和 `w` 将转换为时间单位。`

``[___] = findpeaks(___,Name,Value)` 支持上述语法中的任何输入参量，且可使用名称-值参量指定选项。`

``findpeaks(___)` 不带输出参量时用于绘制信号并叠加峰值。`

## 示例

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

`pks = findpeaks(data)`
```pks = 1×3 15 10 20 ```

`findpeaks(data)`

```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)`

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

```findpeaks(PeakSig,x) text(locs+.02,pks,num2str((1:numel(pks))'))```

```[psor,lsor] = findpeaks(PeakSig,x,'SortStr','descend'); findpeaks(PeakSig,x) text(lsor+.02,psor,num2str((1:numel(psor))'))```

```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)`

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

```[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 ```

```load sunspot.dat year = sunspot(:,1); avSpots = sunspot(:,2); findpeaks(avSpots,year)```

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

```[pks,locs] = findpeaks(avSpots,year,'MinPeakDistance',6); meanCycle = mean(diff(locs))```
```meanCycle = 10.9600 ```

```ty = datetime(year,3,20); [pk,lk] = findpeaks(avSpots,ty,'MinPeakDistance',years(6)); plot(ty,avSpots,lk,pk,'o')```

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

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

`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 ```

```load mtlb select = mtlb(1001:1200);```

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

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

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

`findpeaks(select,Fs,'MinPeakProminence',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;```

```bnd = 0.32; s(s>bnd) = bnd; plot(t,s) xlabel('Time (s)')```

```[pk,lc] = findpeaks(s,t); hold on plot(lc,pk,'x')```

```[pkt,lct] = findpeaks(s,t,'Threshold',1e-4); plot(lct,pkt,'o','MarkerSize',12)```

```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```

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

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

## 输入参数

### 名称-值参数

• `'none'` 按照峰值在输入数据中出现的顺序返回峰值。

• `'ascend'` 按升序或递增顺序（从最小值到最大值）返回峰值。

• `'descend'` 按降序（从最大值到最小值）返回峰值。

• 如果指定位置向量 `x`，则 `'MinPeakDistance'` 必须以 `x` 的形式表示。如果 `x``datetime` 数组，则将 `'MinPeakDistance'` 指定为 `duration` 标量或以天表示的数值标量。

• 如果指定采样率 `Fs`，则 `'MinPeakDistance'` 必须以时间单位表示。

• 如果既未指定 `x`，也未指定 `Fs`，则 `'MinPeakDistance'` 必须以采样单位表示。

• `'halfprom'` 将参考线定位在峰值下方，垂直距离等于峰值相对高差的一半。有关详细信息，请参阅相对高差

• `'halfheight'` 将参考线定位在峰值高度的一半处。如果参考线的任何截距点落在了 `'MinPeakHeight'``'MinPeakProminence'``'Threshold'` 设置所确定的峰值的边界之外，则该参考线将被截断。峰值之间的边界由峰值之间最低波谷的水平位置确定。高度小于零的峰值将被丢弃。

• 如果指定位置向量 `x`，则 `'MinPeakWidth'` 必须以 `x` 的形式表示。如果 `x``datetime` 数组，则将 `'MinPeakWidth'` 指定为 `duration` 标量或以天表示的数值标量。

• 如果指定采样率 `Fs`，则 `'MinPeakWidth'` 必须以时间单位表示。

• 如果既未指定 `x`，也未指定 `Fs`，则 `'MinPeakWidth'` 必须以采样单位表示。

• 如果指定位置向量 `x`，则 `'MaxPeakWidth'` 必须以 `x` 的形式表示。如果 `x``datetime` 数组，则将 `'MaxPeakWidth'` 指定为 `duration` 标量或以天表示的数值标量。

• 如果指定采样率 `Fs`，则 `'MaxPeakWidth'` 必须以时间单位表示。

• 如果既未指定 `x`，也未指定 `Fs`，则 `'MaxPeakWidth'` 必须以采样单位表示。

• `'peaks'` 绘制信号并注释每个峰值的位置和数值。

• `'extents'` 绘制信号并注释每个峰值的位置、数值、宽度和相对高差。

## 输出参量

• 如果指定位置向量 `x`，则 `locs` 将包含峰值索引处 `x` 的值。

• 如果指定采样率 `Fs`，则 `locs` 是由间隔为 1/`Fs` 的连续采样时间组成的数值向量。

• 如果既未指定 `x`，也未指定 `Fs`，则 `locs` 是由整数索引组成的向量。

• 如果指定位置向量 `x`，则宽度以 `x` 的形式表示。

• 如果指定采样率 `Fs`，则宽度以时间单位表示。

• 如果既未指定 `x`，也未指定 `Fs`，则宽度以采样单位表示。

## 详细信息

### 相对高差

1. 在峰值上放一个标记。

2. 从峰值向左右延伸一条水平线，直到该线出现以下情况之一：

• 穿过信号，因为出现更高的峰值

• 到达信号的左端或右端

3. 找出步骤 2 中定义的两个区间中每个区间内的信号最小值。此点是波谷或信号端点之一。

4. 在两个区间的最小值中，较高者即为参考水平。在此水平以上的峰值高度就是其相对高差。

`findpeaks` 对端点之外的信号行为不做假设，无论其高度如何。因此，步骤 2 和 4 会忽略端点以外的信号行为，该行为通常会影响参考水平的值。例如，假设此信号的峰值如下：

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