Perhitungan derivatif

9

Saya memiliki serangkaian data (array tunggal). Jika saya mengambil data ini dan memplotnya, saya dapat melihat bahwa ada beberapa puncak. Namun, jika saya memperbesar bagian data, saya melihat bahwa ada kebisingan yang substansial.

Saya suka mendeteksi berapa banyak puncak dalam data menggunakan sedikit waktu dan energi CPU. Saya berpikir untuk mendeteksi kemiringan puncak ini (bisa tajam atau mulus naik atau turun) dan melihat jumlah lereng untuk menentukan jumlah puncak. (2 lereng positif dan negatif untuk setiap puncak)

Adakah petunjuk bagaimana saya bisa menghitung lereng di hadapan kebisingan?

Kode akan masuk ke sistem tertanam, memori terbatas jadi sebaiknya saya ingin menerapkan sesuatu yang tidak memerlukan salinan data yang signifikan.

Ktuncer
sumber
1
Anda terdengar seperti di toko yang meminta sesuatu yang Anda butuhkan
2
Jika derau frekuensinya relatif tinggi maka Anda dapat menyaring data dengan rendah
Paul R
4
Bisakah Anda memposting satu atau lebih contoh plot data Anda? Itu akan membantu kita melihat seperti apa bentuknya. Deteksi puncak biasanya tidak dilakukan melalui estimasi turunan, karena menghitung turunan dari sinyal sangat sensitif terhadap noise (ini adalah operasi jalan pintas). Mungkin ada karakteristik dengan sinyal minat yang dapat Anda manfaatkan. Juga, selalu ada tradeoff antara probabilitas mendeteksi puncak dengan benar dan probabilitas menyatakan puncak yang benar-benar tidak menarik. Mana yang lebih penting bagi aplikasi Anda?
Jason R
2
Jika Anda dapat menghasilkan plot, itu akan sangat membantu.
Jason R
1
Anda ingin mendeteksi puncak, Anda mungkin ingin mencari deteksi puncak (lihat dsp.stackexchange.com/questions/1302/peak-detection-approach ).
Geerten

Jawaban:

1

Itu tergantung pada jenis kebisingan dan jenis sinyal. Perlihatkan contoh jika Anda menginginkan jawaban yang bagus. Tapi, yang mengatakan, secara umum Anda mungkin ingin menyaring sinyal low-pass. Jika saya jadi Anda, saya akan menggunakan spektrum daya Fourier untuk melihat apakah sebagian besar kebisingan adalah frekuensi tinggi, dan sinyal yang paling saya pedulikan adalah pada kisaran yang lebih rendah. Jika mereka tumpang tindih, oh well itu hidup. Saya harus berpikir lebih banyak tentang berbagai hal.

Satu filter low-pass yang bagus untuk sinyal berisik dalam banyak kasus adalah filter Savitzky-Golay. Ini dijelaskan dalam Numerical Recipes, dan untuk Python ada fungsi di Python Numpy Cookbook. Ini hanyalah konvolusi dengan kernel kecil. Anda memilih ukuran jendela berdasarkan lebar puncak atau fitur lainnya, cukup lebar untuk menghilangkan kebisingan, tetapi tidak lebih lebar dari fitur. Itu bisa kecil, katakan lima poin, atau lebih besar seperti lusinan, seratus mungkin.

Anda juga memilih urutan polinomial - biasanya saya menggunakan 2 atau 4. Pesanan 2 baik untuk ketika jendela kecil, <10 poin atau rentang kurang dari setengah siklus (jika sinyal Anda menyerupai sinus) sedangkan pesanan 4 adalah lebih baik dalam mencocokkan bentuk puncak terdistorsi, tetapi suka memiliki sekitar 9 poin atau lebih. Tetapi banyak tergantung pada bentuk dan frekuensi kebisingan.

Seperti yang lain katakan di komentar, menemukan turunan mungkin bukan strategi terbaik, tetapi jika Anda tetap ingin mencari turunan, filter Savitzky-Golay dapat melakukan itu - secara bersamaan menghaluskan dan melaporkan turunan alih-alih sinyal.

DarW
sumber