サンプル間の局所的なピークを見つける


10

私は地震信号の離散サンプルY [ N ]をy[]ここに画像の説明を入力してください

信号の極大値を見つけたい。

が最大かどうかの単純なテストは次のようになります: y [ n ] m a x i m a  if  y [ n ] > y [ n 1 ]  および  y [ n ] > y [ n + 1 ]y[]

y[]メートルaバツメートルa もし y[]>y[1] そして y[]>y[+1]

ただし、最大値はサンプル間にある可能性があります。たとえば、最大値がある場合があります。=4.25

サンプル間の最大値を見つけるために、を補間する必要があると思います。y[]

  • 補間を使用して最大値を見つけるにはどうすればよいですか?
  • どのような形式の補間を使用する必要がありますか?

ご覧のように、信号はそれほどノイズが多くありませんが、最大値がしきい値を超えて一定の幅(スパイクなし)になるようにメソッドで少しフィルタリングを行うとよいでしょう。

しかし、私の最大の問題は、サンプル間のピークを見つけることだけです。これを行うための良い方法について何か提案はありますか?

どんな答えも事前にありがとう!


1
たぶん、質問1質問2を見てください。
Geerten 2012年

周波数スペクトルのためのいくつかの方法:dspguru.com/dsp/howtos/how-to-interpolate-fft-peak
endolith

その2番目のものには回答がありません@Geerten ;-)
Ivo

1
あ、はは、良い点。さて、この質問についてはこの質問を参照します;)
Geerten

回答:


7

サブサンプル解像度を取得する

(コードサイズの点で)非常に安価なソリューションは、信号をアップサンプリングすることです。matlabでは、これはで行うことができますinterp(y ,ratio)。もう少し複雑な解決策は、単純にピークを検出することです。各ピークについて、放物線をy [peak-1]、y [peak]、y [peak + 1]に当てはめます。次に、この放物線が最大になる点を真のピーク位置として使用します。

ピーク検出について

役立つテクニックの束:

  • ヒルマーが示唆しているように、信号をガウシアンまたはハンウィンドウで畳み込みます。その幅は、検出されたピーク間で確認したい最小間隔の半分にほぼ等しくなります。時間の正確性はアプリケーションにとって不可欠であると思われるため、フィルタリングによって導入される時間遅延を考慮に入れてください。
  • 信号に、それ自体の中央値フィルター処理されたバージョンを減算します(かなり大きな観測ウィンドウを使用)。結果を、標準偏差でフィルタリングされたバージョン自体で除算します。これにより、傾向がなくなり、しきい値を標準偏差の単位で表すことができます。
  • ピークピッキングについては、「トップハット」フィルターを使用して定式化します。信号のトップハットフィルターバージョンをyt [n] = max(y [n-W]、y [n-W + 1]、...、y [n + W-1]、y [nとして定義します+ W]); y [n] == yt [n]およびy [n]>しきい値となるポイントをピークとして使用します。

これらすべては、nlfilterを数回パスするだけで、Matlabで非常に効率的に実装できます。


アップサンプリングと放物線補間の組み合わせは、単独の場合よりもうまく機能する場合があります。
hotpaw2 2012年

3

損失の多いピーク検出器を試してください:

y[n] = max(abs(x[n]),a*y[n-1]);

ここで、「a」は1より小さい数値で、検出器の減衰速度を制御します。これは、単一のピークにスムーズ化することなく、隣接するピークがどれだけ接近できるかを決定します。次に、しきい値の検出を行います。


方程式には、ax [n]とy [n]の両方が含まれています。これは正しいですか、それとも単にy [n]である必要がありますか?
アンディ

x [n]は入力、y [n]は出力です。全体的に悪い答えです。タイプミス(現在修正済み)があり、質問を誤解しました。謝罪
ヒルマー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.