0

我面临一个挑战,想征求你的建议。

我正在用 c/c++ 编码,我有一个如下所示的数组。

A[40]={0,0,1,0,2,7,18,45,80,85,88,91,88,65,12,3,0,1,0,2,1,2,5,45,88,89,78,79,65,12,5,2,1,0,0,1,0,0,1}

如您所见,有 2 个上升,我们也可以称它们为曲线。该数组存储实时信号相对于时间的值。它像队列一样工作,并为每个新值刷新自身。

我想检测和计算上升,到目前为止我已经尝试了一些方法,但还没有找到一致的解决方案。

我的问题是:如何检测这些曲线并判断数组 A 中有 2 条曲线?

你知道有什么好的方法可以连贯地检测它们吗?或者有没有一种方法或东西来处理这种信号作品?

我真的需要答案来推进我的项目,所以欢迎您的所有答案。提前致谢。

4

1 回答 1

2

您可以通过在比较相邻值时查找符号翻转的点来发现数据中的峰值:

#include <vector>
#include <algorithm>
#include <iterator>
#include <iostream>

namespace {
  int diff(const int& a, const int& b) {
    if (b-a > 0) 
      return 1;
    else if (b-a < 0) 
      return -1;
    return 0;
  }
}

int main() {
  const int A[]={0,0,1,0,2,7,18,45,80,85,88,91,88,65,12,3,0,1,0,2,1,2,5,45,88,89,78,79,65,12,5,2,1,0,0,1,0,0,1};
  std::vector<int> delta;
  std::transform(A, A+((sizeof A/sizeof *A) - 1), A+1, std::back_inserter(delta), diff);
  for (std::vector<int>::const_iterator it = ++delta.begin(); it != delta.end(); ++it) {
    if (*it < 0 && *it != *(it - 1))
      std::cout << "Peak at: " << A[it-delta.begin()] << "\n";
  }
}

请注意,您的数据中实际上有两个以上的峰值:

峰值:1
峰值:91
峰值:1
峰值:2
峰值:89
峰值:79
峰值:1

如果它们不是真正的峰值(只是数据中的噪音),那么您可以通过以下几种方式解决它:

  1. 数据量化。
  2. 平滑 - 即以某种方式将每个值更改为更像其邻居。
  3. 临界点。不仅要记录符号,还要记录大小。忽略小于特定大小的更改。
于 2012-06-01T23:24:52.967 回答