54 lines
2.1 KiB
C++
54 lines
2.1 KiB
C++
#ifndef POLY2FINDPEAKS_H
|
||
#define POLY2FINDPEAKS_H
|
||
|
||
#include <algorithm>
|
||
#include <cmath>
|
||
#include <vector>
|
||
|
||
class Poly2FindPeaks {
|
||
public:
|
||
// 峰值结构体,存储峰值特征
|
||
typedef struct {
|
||
int index; // 峰值在数据中的索引
|
||
double position; // 峰值的精确位置(插值计算)
|
||
double height; // 峰值高度(相对于基线)
|
||
double amplitude; // 峰值的绝对幅度
|
||
double fwhm; // 半高宽(Full Width at Half Maximum)
|
||
} Peak;
|
||
|
||
// 滑动平均平滑(去噪预处理)
|
||
static std::vector<double> SmoothData(const std::vector<double>& data, int window_size);
|
||
|
||
// 计算基线(使用百分位法,假设大部分数据为基线)
|
||
static double calculateBaseline(const std::vector<double>& data, double percentile = 0.1);
|
||
|
||
// 检测峰值
|
||
static std::vector<Peak> findPeaks(
|
||
const std::vector<double>& data,
|
||
double height_threshold = 0.0, // 峰值高度阈值(相对于基线)
|
||
int min_distance = 3, // 峰之间的最小距离(索引)
|
||
int smooth_window = 3 // 平滑窗口大小
|
||
);
|
||
};
|
||
|
||
/*******************************************************************************
|
||
算法说明
|
||
核心功能:
|
||
1、对原始数据进行平滑去噪(滑动平均)
|
||
2、自动计算基线(区分信号和背景)
|
||
3、检测局部最大值作为峰值候选
|
||
4、过滤假峰(通过高度阈值和最小峰间距)
|
||
5、精确计算峰值特征(位置、高度、半高宽)
|
||
关键参数:
|
||
* heightThreshold:峰值相对于基线的最小高度(过滤小噪声峰)
|
||
* minDistance:两个峰值之间的最小距离(避免同一峰被多次检测)
|
||
* smoothWindow:平滑窗口大小(越大去噪效果越好,但可能模糊窄峰)
|
||
峰值特征:
|
||
* position:峰值的精确位置(通过抛物线插值优化)
|
||
* height:峰值相对于基线的高度
|
||
* amplitude:峰值的绝对幅度
|
||
* fwhm:半高宽(反映峰的宽窄,用于峰的进一步分类)
|
||
*******************************************************************************/
|
||
|
||
#endif // POLY2FINDPEAKS_H
|