Ini adalah perjalanan samping dari aplikasi mendengkur saya .
Saya memiliki celah dalam menghasilkan autokorelasi sinyal audio, untuk melihat apakah itu "berkorelasi" dengan mendengkur / bernafas dengan sangat baik. Saya memiliki algoritma sederhana yang berjalan (menghasilkan 1.0 sebagai elemen nol, yang merupakan pertanda baik), tetapi saya bertanya-tanya bagaimana cara mengevaluasi hasil untuk menentukan apakah autokorelasi kuat, dan, mungkin lebih jauh, bagaimana menggunakannya untuk memisahkan berbagai sumber suara yang mungkin.
Pertanyaan # 1: Apakah RMS autokorelasi (melewatkan elemen nol) sama bagusnya dengan metrik "kualitas", atau adakah yang lebih baik?
Untuk menguraikan: Saya hanya ingin cara numerik (vs "melihat" pada grafik) untuk membedakan sinyal yang sangat autokorelasi dari yang kurang autokorelasi.
(Saya benar-benar tidak cukup tahu untuk mengetahui pertanyaan lain apa yang harus diajukan.)
Beberapa hasil awal: Dalam beberapa kasus autokorelasi (baik RMS atau puncak) menunjukkan lompatan dramatis pada dengkuran - tepatnya respons yang ingin saya lihat. Dalam kasus-kasus lain tidak ada gerakan sama sekali dalam langkah-langkah ini (dan ini bisa menjadi dua dengkuran berturut-turut dengan dua tanggapan), dan dalam situasi dengan kebisingan tinggi pengukuran sebenarnya menurun (sedikit) selama mendengkur.
Pembaruan - 22 Mei: Saya akhirnya punya waktu untuk mengerjakan ini lagi. (Saya menggunakan aplikasi lain yang benar - benar menyebalkan.) Saya memasukkan output dari autokorelasi ke dalam FFT dan hasilnya agak menarik - ini menunjukkan puncak yang cukup dramatis di dekat titik asal ketika dengkur mulai.
Jadi sekarang saya dihadapkan dengan masalah bagaimana mengukur puncak ini. Anehnya, puncak tertinggi, dalam hal besarnya absolut, terjadi di lain waktu, tetapi saya mencoba rasio puncak ke rata-rata aritmatika dan yang melacak cukup baik. Jadi apa sajakah cara yang baik untuk mengukur "peakedness" dari FFT. (Dan tolong jangan katakan bahwa saya perlu mengambil FFT - hal ini sudah hampir menelan ekornya sendiri. :))
Juga, terpikir oleh saya bahwa kualitas FFT mungkin sedikit meningkat jika saya mencerminkan hasil autokorelasi yang dimasukkan, dengan nol (yang menurut definisi besarnya 1,0) di tengah. Ini akan menempatkan "ekor" di kedua ujungnya. Apakah ini (mungkin) ide yang bagus? Haruskah gambar cermin tegak atau terbalik? (Tentu saja, saya akan mencobanya terlepas dari apa yang Anda katakan, tapi saya pikir mungkin saya bisa mendapatkan beberapa petunjuk tentang detailnya.)
Mencoba kerataan--
Kasing uji saya dapat dibagi secara kasar ke dalam kategori "berperilaku baik" dan kategori "anak bermasalah".
Untuk kasus uji "berperilaku baik", kerataan FFT autokorelasi menurun secara dramatis dan rasio puncak dengan rata-rata autokorelasi naik selama mendengkur. Rasio kedua angka tersebut (rasio puncak dibagi dengan kerataan) sangat sensitif, menunjukkan pendakian 5-10x selama napas / dengkuran.
Namun, untuk "anak-anak bermasalah", angka-angka mengarah tepat ke arah yang berlawanan. Rasio puncak / rata-rata sedikit menurun sementara kerataan sebenarnya meningkat 50-100%
Perbedaan antara dua kategori ini adalah (sebagian besar) berlipat tiga:
- Tingkat kebisingan (biasanya) lebih tinggi pada "anak-anak bermasalah"
- Tingkat audio (hampir selalu) lebih rendah pada "anak bermasalah"
- "Anak-anak bermasalah" cenderung terdiri dari lebih banyak bernapas dan mendengkur yang sebenarnya kurang (dan saya perlu mendeteksi keduanya)
Ada ide?
Pembaruan - 25/5/2012: Agak terlalu dini untuk memiliki tarian kemenangan, tetapi ketika saya merefleksikan autokorelasi tentang suatu poin, mengambil FFT tentang itu, dan kemudian melakukan kerataan spektral, skema rasio gabungan saya menunjukkan lompatan yang baik dalam beberapa lingkungan berbeda. Mencerminkan autokorelasi tampaknya meningkatkan kualitas FFT.
Namun satu titik minor adalah bahwa, karena "komponen DC" dari "sinyal" yang dipantulkan adalah nol, hasil FFT nol selalu selalu nol, dan ini agak memecah rata-rata geometrik yang mencakup nol. Tetapi melewatkan elemen nol tampaknya berhasil.
Hasil yang saya dapatkan masih jauh dari cukup untuk mengidentifikasi dengkuran / nafas dengan sendirinya, tetapi tampaknya ini merupakan "konfirmasi" yang cukup sensitif - jika saya tidak mendapatkan "lompatan" maka itu mungkin bukan dengkuran / nafas.
Saya belum menganalisisnya dengan cermat, tetapi saya curiga bahwa yang terjadi adalah suara siulan terjadi di suatu tempat selama napas / dengkuran, dan peluit itulah yang terdeteksi.
sumber
Jawaban:
Persiapan
Demonstrasi ini lebih mudah dengan audioread paket MATLAB , yang memungkinkan membaca / menulis file MP3. Atau, Anda dapat mengonversi file MP3 dalam contoh ke WAV secara manual.
Kasing mudah
Sebelum kami memeriksa file bermasalah Anda, mari kita menuju ke SoundCloud dan mengambil mendengkur yang layak sehingga kami tahu apa yang diharapkan ketika SNR tinggi. Ini adalah stereo 52s 44.1KHz MP3. Unduh ke folder di jalur MATLAB.
Sekarang mari kita menghitung spektrogram (saya memilih jendela Hann 8192-sampel) dan kerataan spektral:
Kemiringan besar dalam kerataan spektral (yaitu, penyimpangan dari white noise) berteriak "Saya mendengkur". Kita dapat dengan mudah mengklasifikasikannya dengan melihat penyimpangan dari garis dasar (median):
Kami memiliki lebih dari dua standar deviasi ruang kepala. Variasi standar itu sendiri, untuk referensi, adalah 6.8487 .
Hard case
Sekarang mari kita lihat file Anda . Ini file 10 menit, 8KHz WAV. Karena levelnya sangat rendah, ada baiknya untuk mengompensasi sinyal.
Lihat celupan bagus yang menyertai setiap dengkuran? Saya juga tidak. Bagaimana dengan puncak yang bagus? Mereka tidak mendengkur, tetapi suara subjek bergerak. Deviasi standar adalah sangat kecil 0,9388
Kesimpulan
Anda perlu mendapatkan sinyal yang lebih bersih jika Anda ingin mengandalkan kerataan spektral! Saya telah memaksa hanya untuk mendengar apa pun. Jika SNR rendah terdeteksi, desak pengguna untuk menempatkan ponsel lebih dekat atau menggunakan mikrofon seperti telepon yang menyertai headset.
Berita baiknya adalah mungkin untuk mendeteksi dengkuran bahkan dalam kasus yang bermasalah. Namun, karena pertanyaan ini bukan hanya tentang deteksi mendengkur, saya akan berhenti di sini, dan menjelaskan bagaimana melakukannya dalam pertanyaan Anda yang lain .
sumber
Autokorelasi berhubungan langsung dengan DFT terbalik dari kerapatan spektral daya sinyal Anda. Dalam hal itu, informasi apa pun yang terkandung dalam besarnya kuadrat DFT Anda juga terkandung dalam fungsi autokorelasi.
Namun demikian, satu hal yang dapat memberitahu autokorelasi kepada Anda adalah adanya harmonik. (Jarak dari puncak pusat ke yang tertinggi berikutnya). Mungkin mendengkur VS bernapas memiliki harmonik fundamental yang berbeda, dan jika demikian, 'metode autokorelasi' tentu akan menjadi titik awal yang baik sehingga fitur, (dalam hal ini harmonik), dapat diekstraksi.
Dengan demikian, autokorelasi white noise, akan menjadi fungsi delta, dan tidak akan memiliki puncak sekunder (atau puncak lainnya dalam hal ini) dari puncak pusatnya. Sebaliknya, jika sinyal memang memiliki harmonik, maka fungsi autokorelasi akan berisi puncak sekunder dan tersier, sepadan dengan hadir harmonik mendasar. Jarak dari puncak utama (tengah) ke puncak sekunder periode frekuensi dasar Anda.
EDIT:
Saya pikir apa yang Anda kejar adalah ukuran - angka - kodifikasi seberapa mirip fungsi autokorelasi dengan delta, VS fungsi autokorelasi yang tampak seperti memiliki banyak puncak di dalamnya. Untuk itu, ukuran kerataan spektral mungkin berlaku, atau dalam kasus yang lebih umum, pengukuran rata-rata geometrik Anda ke rata-rata aritmatika.
sumber