Menemukan puncak lokal di antara sampel

10

Saya memiliki sampel terpisah dari sinyal seismik : y [ n ]ny[n]masukkan deskripsi gambar di sini

Saya ingin mencari maxima lokal di sinyal.

Tes naif untuk jika adalah maksimum adalah: y [ n ] : m a x i m a  jika  y [ n ] > y [ n - 1 ]  dan  y [ n ] > y [ n + 1 ]y[n]

y[n]:maxima if y[n]>y[n1] and y[n]>y[n+1]

Namun maxima mungkin terletak di antara sampel, misalnya mungkin ada maksimum di .i=4.25

Untuk menemukan maksimum di antara sampel, saya percaya bahwa saya perlu menginterpolasi .y[n]

  • Bagaimana cara menemukan maxima menggunakan interpolasi?
  • Apa bentuk interpolasi yang harus saya gunakan?

Seperti yang Anda lihat sinyal saya tidak terlalu berisik, namun akan lebih baik jika metode ini juga melakukan sedikit penyaringan sehingga maxima melebihi treshold dan memiliki lebar tertentu (tidak ada paku).

Namun masalah terbesar saya adalah hanya untuk menemukan puncak di antara sampel. Ada saran untuk cara yang baik untuk melakukan ini?

Terima kasih sebelumnya atas jawaban apa pun!

Andy
sumber
1
Mungkin lihat pertanyaan 1 dan pertanyaan 2 .
Geerten
Beberapa metode untuk spektrum frekuensi: dspguru.com/dsp/howtos/how-to-interpolate-fft-peak
endolith
Yang kedua tidak punya jawaban @ Geerten ;-)
Ivo Flipse
1
Oh..haha, poin bagus. Yah saya akan merujuk kembali ke pertanyaan ini pada pertanyaan itu;)
Geerten

Jawaban:

7

Mendapatkan resolusi sub-sampel

Solusi yang sangat murah (dalam hal ukuran kode) hanya untuk mengganti sinyal Anda. Di matlab, ini bisa dilakukan dengan interp(y ,ratio). Solusi yang sedikit lebih rumit terdiri dari pendeteksian puncak secara naif; dan untuk setiap puncak, paskan parabola melalui y [puncak - 1], y [puncak], y [puncak + 1]; kemudian gunakan titik di mana parabola ini maksimal sebagai posisi puncak sebenarnya.

Mengenai deteksi puncak

Banyak teknik yang membantu:

  • Seperti yang disarankan oleh Hilmar, menggabungkan sinyal dengan jendela Gaussian atau Hann, yang lebarnya kira-kira sama dengan setengah interval minimum yang ingin Anda lihat di antara puncak yang terdeteksi. Karena akurasi temporal tampaknya penting untuk aplikasi Anda, pastikan Anda memperhitungkan waktu tunda yang diperkenalkan oleh penyaringan!
  • Kurangi sinyal Anda dengan versi median yang disaring sendiri (dengan jendela pengamatan yang cukup besar); dan bagilah hasilnya dengan versi standar deviasi yang difilter sendiri. Ini menghilangkan tren dan memungkinkan ambang batas untuk dinyatakan dalam satuan standar deviasi.
  • Untuk pengambilan puncak, saya merumuskannya menggunakan filter "top-hat". Tentukan versi top-hat yang disaring dari sinyal Anda sebagai yt [n] = maks (y [n - W], y [n - W + 1], ..., y [n + W - 1], y [n + W]); dan gunakan sebagai titik puncak di mana y [n] == yt [n] dan y [n]> ambang batas.

Semua ini dapat diimplementasikan dengan sangat efisien di Matlab dengan beberapa pass nlfilter.

pichenettes
sumber
Kombinasi upsampling plus interpolasi parabola dapat bekerja lebih baik daripada keduanya saja.
hotpaw2
3

Coba pendeteksi puncak lossy:

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

di mana "a" adalah angka yang lebih kecil dari 1 yang mengontrol seberapa cepat detektor meluruh. Ini menentukan seberapa dekat puncak tetangga bisa tanpa berciuman menjadi satu pun. Kemudian lakukan deteksi ambang batas.

Hilmar
sumber
Anda memiliki kapak [n] dan y [n] dalam persamaan Anda. Apakah ini benar atau hanya y [n]?
Andy
x [n] adalah input, y [n] adalah output. Jawaban buruk secara keseluruhan, ada kesalahan ketik (diperbaiki sekarang) dan saya salah paham pertanyaannya. Permintaan Maaf
Hilmar