我正面临挑战,想要征求您的意见。
我在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条曲线?
你知道有什么好的方法来连贯地检测它们吗?或者有一种方法或东西来处理这种信号的工作原理?
我真的需要答案来推进我的项目,所以欢迎你的答案。提前致谢。
答案 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
如果它们不是真正达到峰值(只是数据中的噪音),那么您可以通过以下几种方式解决这个问题: