检测阵列中的上升。 (密度值)

时间:2012-06-01 23:00:24

标签: c++ arrays signals blob

我正面临挑战,想要征求您的意见。

我在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}

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

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

我的问题是:如何检测这些曲线并告诉阵列A中有2条曲线?

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

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

1 个答案:

答案 0 :(得分: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";
  }
}

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

Peak at: 1
Peak at: 91
Peak at: 1
Peak at: 2
Peak at: 89
Peak at: 79
Peak at: 1

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

  1. 数据量化。
  2. 平滑 - 即以某种方式将每个值更改为其邻居。
  3. 阈值。不仅记录符号,还记录幅度。忽略小于特定大小的更改。