bagaimana cara menghitung SNR dari sinyal berisik?

14

Saya mengalami masalah dalam memahami bagaimana melakukannya secara praktis

Saya memiliki file wav yang berisi ucapan murni dan file ave lain yang hanya berisi kebisingan latar belakang (bisa berupa berbagai hal, seperti white noise, noise kerumunan, rekaman angin yang bertiup, dll). Ini bisa murni ucapan atau murni kebisingan. Jadi saya kira saya bisa mendapatkan nilai SNR dari mereka dengan pembagian sederhana sampel yang sesuai (atau rata-rata bingkai sampel) di kedua file. Saya kemudian menggabungkan mereka dalam keberanian untuk mendapatkan file pidato berisik. Saya menduga file ini masih akan memiliki SNR yang sama.

Sekarang saya melewati file ini melalui program pengurangan noise saya dan mendapatkan file lain sebagai hasilnya. Bagaimana cara menghitung SNR dari file "noise reduction" ini?

--- EDIT ---

pertanyaan tindak lanjut yang diposting DI SINI

pengguna13267
sumber

Jawaban:

8

Definisi umum SNR adalah kekuatan sinyal yang diinginkan dibagi dengan kekuatan noise. Misalkan Anda telah mendapatkan sinyal noise dan yang diinginkan sebagai array, perhitungan SNR di Matlab sebelum pengurangan noise dapat dilakukan seperti ini:

snr_before = mean( signal .^ 2 ) / mean( noise .^ 2 );
snr_before_db = 10 * log10( snr_before ) % in dB

Setelah pengurangan noise, noise residual dapat dihitung sebagai perbedaan dari sinyal yang diinginkan dan sinyal aktual. Perhitungan SNR kemudian langsung:

residual_noise = signal - noise_reduced_signal; 
snr_after = mean( signal .^ 2 ) / mean( residual_noise .^ 2 ); 
snr_after_db = 10 * log10( snr_after )
Deve
sumber
1
sinyal dan noise_reduced_signal harus sesuai waktu dalam kasus Anda.
dspGuru
@ DspGuru Benar, saya berasumsi bahwa algoritma pengurangan kebisingan tidak memperkenalkan penundaan waktu.
Deve
@ DspGuru dan Dev: Di tempat-tempat ini, alih-alih mengambil var dan maksud dari keseluruhan sinyal, bagaimana jika saya menentukan beberapa bagian dari sinyal yang pasti berisi ucapan? Sebagai contoh, ganti sinyal dengan sinyal (start_speech: end_speech) di Matlab, karena sinyal saya panjangnya 5 detik dengan jeda di antara kata
user13267
@ user13267 Dari sinyal mana? Sebelum atau sesudah pengurangan kebisingan? Secara umum, semakin lama sinyal yang Anda analisis, semakin baik perkiraan SNR Anda.
Deve
keduanya. Yang saya maksud adalah, sampel suara saya memiliki seseorang yang berbicara kalimat pendek sehingga ketika saya membukanya di audacity saya dapat melihat daerah gelombang intensitas tinggi dan intensitas rendah (kehadiran kata-kata dan keheningan antara kata-kata yang saya pikir). Jadi saya hanya ingin memilih sampel yang mengandung kata-kata dan tidak termasuk sampel yang mengandung keheningan.
user13267
3

Di sisi input:

  1. Hitung DB1 = 10 * log10 (var (noiseSignal))
  2. Hitung DB2 = 10 * log10 (var (cleanSpeechSignal))

SNR adalah = DB2 - DB1

Di sisi output:

  1. Kirim sinyal ucapan bersih melalui algo penindasan kebisingan Anda. Nyatakan output Y1.
  2. Kirim sinyal suara berisik melalui algo penindasan derau Anda. Nyatakan output itu Y2.
  3. Hitung Z = Y2 - Y1
  4. residualNoiseDB = 10 * log10 (var (Z))
  5. speechDB = 10 * log10 (var (Y1))
  6. SNR = speechDB - residualNoiseDB
dspGuru
sumber
Apakah benar-benar perlu untuk lulus sinyal ucapan bersih melalui algoritma pengurangan kebisingan juga? Bukankah sinyal bicaranya harus sama sebelum dan sesudah algoritma pengurangan noise sehingga kita memiliki titik referensi yang sama?
user13267
Itu sepenuhnya tergantung pada algoritma Anda. Kemungkinan besar output tidak akan cocok dengan input bersih karena penundaan dan penyaringan.
dspGuru
Output (ketika pidato bersih dilewatkan melalui algoritma pengurangan kebisingan) memang tidak cocok dengan input, tapi saya cukup yakin algoritma tidak menimbulkan penundaan. Silakan periksa pertanyaan tindak lanjut saya (tautan telah diedit ke pertanyaan ini). Ini memiliki bentuk gelombang bicara yang bersih sebelum (atas gambar) pengurangan kebisingan dan setelah (bawah gambar) pengurangan kebisingan. Tidak ada penundaan tetapi ada amplifikasi yang sangat tinggi dan beberapa pidato telah disaring.
user13267