Cara terbaik untuk mengevaluasi "kualitas" autokorelasi?

9

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:

  1. Tingkat kebisingan (biasanya) lebih tinggi pada "anak-anak bermasalah"
  2. Tingkat audio (hampir selalu) lebih rendah pada "anak bermasalah"
  3. "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.

Daniel R Hicks
sumber
Sejauh ukuran 'kekuatan' korelasi, apa yang perlu Anda lakukan adalah menormalkan dua sinyal Anda yang berkorelasi, sebelum melakukan korelasi. (Setelah normalisasi, jumlah masing-masing sinyal harus 1). Maka puncak korelasi akan selalu ada antara -1 dan 1. Ini adalah kekuatan Anda. Saya tidak yakin tentang sisa pertanyaan Anda, mungkin Anda bisa mengedit sedikit.
Spacey
Saya berurusan dengan autokorelasi, jadi dua sinyal adalah satu dan sama, dan, menurut definisi "dinormalisasi" relatif satu sama lain. Yang saya maksud dengan "kekuatan" adalah seberapa banyak autokorelasi yang ada.
Daniel R Hicks
Saya tidak mengerti apa yang Anda inginkan, tetapi saya pikir Anda ingin mengukur nilai maksimum dari puncak autokorelasi, bukan nilai RMS dari semuanya.
Endolith
@ endolith Saya pikir dia mungkin bertanya tentang ukuran 'puncaknya' fungsi autokorelasi Anda, itu untuk membedakan sinyal dengan satu delta, (autokorelasi suara) dari sinyal banyak puncak? (Autokorelasi sinyal dengan harmonisa). Mungkin menggunakan ukuran kerataan-spektral juga dapat digunakan di sini ...
Spacey
Kedengarannya seperti kerataan spektral yang diinginkannya. Daniel: Apakah Anda ingin menentukan seberapa berbeda sinyalnya dari white noise?
Emre

Jawaban:

3

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:

[snd1,fs1]=mp3read('snoring - brobar.mp3'); % use wavread if you converted manually
[s1,f,t,p1]=spectrogram(mean(snd1,2),hann(8192));
sf1=10*log10(geomean(p1)./mean(p1)); % spectral flatness
plot(linspace(0,length(snd1)/fs1,length(sf1)),sf1); axis tight

Kerataan spektral dari dengkuran brobar

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):

stem(linspace(0,length(snd1)/fs1,length(sf1)),median(sf1)-sf1>2*std(sf1)); axis tight

Kerataan spektral diklasifikasikan dari mendengkur brobar

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.

[snd,fs]=wavread('recordedFile20120408010300_first_ten_minutes');
cmp=compand(snd,255,1);
wavwrite(cmp,'companded'); % used for listening purposes
[s,f,t,p]=spectrogram(snd,hann(8192));
sf=10*log10(geomean(p)./mean(p));
plot(linspace(0,600,length(sf)),sf);

Kerataan spektral dari file yang bising

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 .

Emre
sumber
Sekarang Anda sudah tahu apa yang saya hadapi. Sampel itu adalah kualitas "sedang" di antara sampel yang harus saya kerjakan - ada jauh lebih buruk. Dan saya dapat membaca sampel itu dengan cukup baik dengan algoritma yang ada.
Daniel R Hicks
Algoritma apa itu?
Emre
Singkatnya: Suara dijalankan melalui FFT 8 kali per detik, spektrum diiris menjadi 5 pita frekuensi, kekuatan dan perbedaan spektral untuk setiap pita dihitung, kemudian hasilnya diberi skor dengan cara yang memberi bobot lebih pada pita yang muncul menjadi bervariasi pada tingkat yang tepat.
Daniel R Hicks
@Emre Saya mengikuti tautan Anda, membuat akun soundcloud, tetapi tidak bisa melihat persis bagaimana Anda mengunduh dengkuran itu. Tidak ada tombol unduh di sebelahnya atau di mana pun.
Spacey
@Mohammad: Saya memberikan tautan unduhan.
Emre
1

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.

Spacey
sumber
Saya mendapat kesan bahwa autokorelasi akan lebih baik membedakan sinyal (ritmik) dari noise (acak) - noise akan autokorelasi mendekati nol. DFT, OTOH, akan merepresentasikan noise sebagai noise - spektrum penyebaran. Setidaknya ini adalah "teori" seperti yang saya pahami.
Daniel R Hicks
Silakan lihat hasil edit saya.
Spacey