List オブジェクトのピークを見つけるアルゴリズムに取り組んでいます。私はこれを行うための良い(または十分に良い)アルゴリズムだと思うものを考え出しました。ポイントとその近隣を調べ、それがピークである場合は結果リストに追加しました。しかし、最近のいくつかの結果を考えると、この方法が最初に期待したほどうまく機能しているとは思えません。(現在使用しているコードを以下に含め、置き換えたいと考えています)。私は以前に LabView で少し作業を行ったことがありますが、LabView のモジュールが山/谷を見つける方法が、私が行う必要があることに対して機能することを知っています。LabViewがこれをどのように行うかについて調査したところ、次のことがわかりました。
「このピーク検出器 VI は、2 次多項式を連続するデータ ポイントのグループに適合させるアルゴリズムに基づいています。適合に使用されるデータ ポイントの数は、幅によって指定されます。
ピークまたは谷ごとに、2 次適合がしきい値に対してテストされます。しきい値よりも低い高さのピーク、またはしきい値よりも高い谷のある谷は無視されます。ピークと谷は、VIがピークまたは谷の位置を超えて約幅/2データポイントを処理した後にのみ検出されます。この遅延は、リアルタイム処理にのみ影響します。」
さて、私はC#で似たようなことをしようとしましたが、すべての検索で、二次多項式をデータに適合させることは確かに簡単ではないようです. この問題は何度も何度も調査されたものだと思いますが、これをうまく行うアルゴリズムを取得したり、それを行うライブラリを見つけたりすることに失敗しました。
この問題に関するヘルプは大歓迎です。ありがとう。
元の/現在のコード:
public static List<double> FindPeaks(List<double> values, double rangeOfPeaks)
{
List<double> peaks = new List<double>();
int checksOnEachSide = (int)Math.Floor(rangeOfPeaks / 2);
for (int i = checksOnEachSide; i < values.Count - checksOnEachSide; i++)
{
double current = values[i];
IEnumerable<double> window = values;
if (i > checksOnEachSide)
window = window.Skip(i - checksOnEachSide);
window = window.Take((int)rangeOfPeaks);
if (current == window.Max())
peaks.Add(current);
}
return peaks;
}