当前位置:   article > 正文

matlab的findpeaks找峰值函数C++实现_matlabfindpaeks

matlabfindpaeks

网上搜了一圈没有找到想要的C++复现findpeaks函数,由于项目需要,我只要使用findpeaks里的'MinPeakProminence'和'MinPeakWidth',因此本代码的输入参数只包括最小峰值高度'minHeight',最小峰值突出度'MinPeakProminence'和最小峰宽'MinPeakWidth'。

 findpeaks.h文件:

  1. #include <vector>
  2. #include <iostream>
  3. #include <opencv2/opencv.hpp>
  4. using namespace std;
  5. struct Peak {
  6. int index;
  7. double value;
  8. int width; // 峰值宽度
  9. double prominence; // 峰值突出度
  10. };
  11. // 函数声明
  12. void findPeaks(const cv::Mat& data, std::vector<Peak>& peaks, double minHeight, int minWidth, double minProminence);

findpeaks.cpp文件:

  1. #include <iostream>
  2. #include <vector>
  3. #include"findpeaks.h"
  4. // 找峰值的函数定义
  5. void findPeaks(const cv::Mat& data, std::vector<Peak>& peaks, double minHeight, int minWidth, double minProminence) {
  6. peaks.clear(); // 清空峰值数组
  7. for (int i = 1; i < data.cols - 1; ++i) {
  8. // 判断是否为峰值,即比相邻的两个点大,并且大于设定的最小高度
  9. if (data.at<double>(0, i) > minHeight &&
  10. data.at<double>(0, i) > data.at<double>(0, i - 1) &&
  11. data.at<double>(0, i) > data.at<double>(0, i + 1)) {
  12. // 寻找峰值的宽度,即峰值到其两侧的极小值点的距离
  13. int left = i-1;
  14. while (left >= 0 && data.at<double>(0, left) < data.at<double>(0, left + 1)) {
  15. --left;
  16. }
  17. int right = i+1;
  18. while (right < data.cols && data.at<double>(0, right) < data.at<double>(0, right - 1)) {
  19. ++right;
  20. }
  21. // 计算峰值的宽度和突出度
  22. int width = right - left -2;
  23. double prominence = data.at<double>(0, i) - std::max(data.at<double>(0, left+1), data.at<double>(0, right-1));
  24. // 判断峰值的宽度和突出度是否满足设定的条件
  25. if (width >= minWidth && prominence > minProminence) {
  26. peaks.push_back({ i, data.at<double>(0, i), width, prominence });
  27. }
  28. }
  29. }
  30. }

根据自己的数据可以自行更改输入数据类型,我这里是Mat类型。函数输出峰值点的索引index和数值value,和matlab不太一样的是:matlab里‘MinPeakWidth’指的是半宽,这里我的函数指的是全宽。可以利用一个if语句自行改成半宽。测试代码如下:

  1. #include <iostream>
  2. #include <opencv2/opencv.hpp>
  3. #include"findpeaks.h"
  4. using namespace std;
  5. int main3() {
  6. // 创建一个 Mat 对象,代表一维数据
  7. cv::Mat data = (cv::Mat_<double>(1, 11) << 1.0, 3.0, 2.0, 5.0, 2.0, 7.0, 2.0, 2.0, 8.0, 2.0, 1.0);
  8. // 存储峰值的结构体
  9. std::vector<Peak> peakInfo;
  10. // 设定最小峰值高度、最小峰值宽度和最小峰值突出度
  11. double minHeight = 2.0;
  12. int minWidth = 3;
  13. double minProminence = 5.0;
  14. // 调用找峰值的函数
  15. findPeaks(data, peakInfo, minHeight, minWidth, minProminence);
  16. // 输出峰值的索引和值
  17. std::cout << "Peak Indices and Values: ";
  18. for (const Peak& peak : peakInfo) {
  19. std::cout << "(" << peak.index << ", " << peak.value << ") ";
  20. }
  21. return 0;
  22. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/509882
推荐阅读
相关标签
  

闽ICP备14008679号