# algorithm-ampd **Repository Path**: thewon/algorithm-ampd ## Basic Information - **Project Name**: algorithm-ampd - **Description**: AMPD(Automatic Multi-Scale Peak Detection) 峰值检测算法 - **Primary Language**: C++ - **License**: LGPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-08-13 - **Last Updated**: 2025-08-14 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # algorithm-ampd #### 介绍 AMPD(Automatic Multi-Scale Peak Detection) 峰值检测算法。 本仓库收藏了多种峰值检测算法。AMPD 是其中的一种。 在测试过程中,发现了它们的一些应用局限性及优势。 #### AMPD 算法说明 AMPD 算法是一种多尺寸峰值检测算法,希望从一定长度的样本数据中检测出若干峰值。 假设样本数量为 N 首先构造若干个不同尺寸(1 - N/2)的窗口,使用不同大小的窗口在样本数据上,从左往右滑动,比较 `[i - k]` `[i]` `[i + k]` 三个值的关系。理论上、峰值的位置,公式 `[i - k] <= [i] && [i] >= [i + k]` 在所有窗口尺寸上均成立,而其它位置部分成立。因此,对每个尺寸窗口成立次数计数,计数最大的那个就是窗口最合适的,也就是峰值所在的位置(计数次数值)。 算法缺陷: 1. 算法假定样本数据只包含半个周期数据(只有一个峰值,且在数据中间位置),对于挨近数据两头的峰值反而检测不出来 2. 样本数据包含半个周期数据,且初始相位在 0 度(或 180 度)附近时,检测结果最理想。如果是 90 到 -90 度半个周期,或者 -90 到 90 度半个周期,将检测不到任何峰值。 3. 在所有采样数据流上,为了保证做到检测出所有峰值。样本数据必须足够长,同时,更新数据时必须保留部分旧数据(可能存在峰值,但是未检测出来)。因此有部分数据重复参与算法,算法效率降低。 #### 自定义的峰值检测算法 鉴于上述 AMPD 算法的缺陷,设计出来一种新的算法。 算法假定,样本数据是平滑的、稳定的。虽然长时间数据有漂移,但是短期内认为数据在某个值附近波动,波动峰值比较稳定(集中),周期变化也不大。 首先,采集一定数量样本数据,计算出一个平均值,并假定接下来的一段时间内数据的均值变化不是很大,可以用这个平均值近似认为是下一段时间的均值。 然后,遍历数据流,以平均值为基准,将数据划分成正周波和负周波,查找当前周波的最大(最小)值。同时累计下一个波形周期的平均值。 等价于,平均值将数据划分成一段一段的,每一段数据只包含半个周期数据(或只包含正周波,或只包含负周波)。进而,在每半个周期内查找到的极值点认为是峰值点。 算法有点: 1. 此方法只需要遍历一遍样本数据,因此可以不需要创建样本缓存。占用内存少,速度快; 2. 理论上对于任意大小周期都能检测出来。 算法缺陷: 1. 对数据波动比较敏感,假如某个点出现数据跳变,这个跳变点可能被错认为是峰值点。