Android GPS からいくつかのデータを記録しました。これらのグラフのピークを見つけようとしていますが、特定のものを見つけることができませんでした。為に。いくつかの MatLab 関数を見つけましたが、それを実行する実際のアルゴリズムが見つかりません。これは Java で行う必要がありますが、他の言語のコードを翻訳できるはずです。
ご覧のとおり、多くの「ミニ ピーク」がありますが、メインのピークだけが必要です。
Android GPS からいくつかのデータを記録しました。これらのグラフのピークを見つけようとしていますが、特定のものを見つけることができませんでした。為に。いくつかの MatLab 関数を見つけましたが、それを実行する実際のアルゴリズムが見つかりません。これは Java で行う必要がありますが、他の言語のコードを翻訳できるはずです。
ご覧のとおり、多くの「ミニ ピーク」がありますが、メインのピークだけが必要です。
ソリューションは、データで何をしたいかによって異なります。非常に深刻なことをしたい場合は、おそらく (Fast) Fourier Transformsを使用し、そこから位相と周波数の両方の出力を抽出する必要があります。しかし、これは非常に計算量が多く、プログラミングに時間がかかります。多くの計算リソースを必要としない単純なことをしたいだけなら、ここに提案があります:
その正確な問題のために、数時間前に以下のアルゴリズムを実装しました。私は自分でアルゴリズムを発明したので、すでに名前があるかどうかはわかりませんが、非常にノイズの多いデータでうまく機能しています。
ピーク間の平均距離を決定し、それを PtP と呼ぶ必要があります。その測定は好きなように行ってください。あなたの場合のグラフから判断すると、約35のようです。私のコードには、それを自動的に行うために発明した別のアルゴリズムがあります。
次に、グラフでランダムな開始インデックスを選択します。それ以降、すべての新しいデータポイントをポーリングし、グラフが開始インデックス レベルから PtP の約 70% 上昇または下降するまで待ちます。それが落下だった場合、それはタックです。それが上昇だった場合、それはダニです。そのレベルを最後のティックまたはトックの高さとして保存します。このインデックスで「tick」または「tock」イベントを生成します。
データを進めます。ティックの後、データがその時点以降も上昇し続ける場合は、そのレベルを新しい「ティックの高さ」として保存しますが、新しいティック イベントは生成しません。トックの後、データがその時点以降も低下し続ける場合は、そのレベルを新しい「トックの深さ」として保存しますが、新しいトック イベントは生成しません。
最後のイベントがトックの場合はティックを待ち、最後のイベントがティックの場合はトックを待ちます。
ティックを検出するたびに、それがピークになるはずです! 幸運を。
あなたがやりたいことは、これをある種のローパスフィルターに通すことだと思います。このデータセットから正確に何を取得したいかによっては、単純な「ボックス カー」フィルターで十分な場合があります。各ポイントで、そのポイントを中心とする N 個のサンプルの平均をとり、その平均をフィルター処理された値として取得します。N が大きいほど、フィルタリングされたデータはより積極的に平滑化されます。
特に厄介でノイズの多いデータでは、通常、平滑化を使用します。平滑化の最も簡単な例は移動平均です。次に、その移動平均でピークを見つけることができます。次に、元のデータに戻り、移動平均で見つけたピークに最も近いピークを取得します。
たくさんのポイントがあると思います...それらの平均値を計算し、それをすべてのポイントの値から差し引き、ポイントが同じ符号を持つ各範囲から最高のポイント値 (負または正) を取得します。私は私が明確であることを願っています...
ピーク検出についていくつか調べてみましたが、データが動作しない場合、アルゴリズムが台無しになる可能性があると言えます。思いつきで試してみてください: しきい値を選択します。つまり、しきい値 = 250 です。データがしきい値を超えている場合は、その期間の最大値を見つけます。これは、あなたが持っているデータの平均が約 230 であることを前提としています。それが役立つことを願っています。