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";
  }
}

実際には、データに 2 つ以上のピークがあることに注意してください。

ピーク: 1
ピーク: 91
ピーク: 1
ピーク: 2
ピーク: 89
ピーク: 79
ピーク: 1

それらが実際にはピークではない場合 (データの単なるノイズ)、いくつかの方法でそれを修正できます。

  1. データの量子化。
  2. 平滑化 - つまり、各値を変更して、何らかの方法で隣接する値に近づけます。
  3. しきい値。符号だけでなく、大きさも記録します。特定のサイズより小さい変更を無視します。
于 2012-06-01T23:24:52.967 に答える