як обчислити SNR галасливого сигналу?


14

У мене виникають проблеми в розумінні того, як це зробити практично

У мене є wav-файл, який містить чисту мову та ще один файл ave, який містить лише фоновий шум (це можуть бути різні речі, такі як білий шум, шум натовпу, запис вітру тощо). Це або чисто мова, або чисто шум. Тому я припускаю, що я можу отримати від них значення SNR простим поділом відповідних зразків (або середнім рівнем кадру зразків) в обох файлах. Потім я комбіную їх у зухвалість, щоб отримати шумний файл мови. Я здогадуюсь, що цей файл все ще матиме той самий SNR.

Тепер я передаю цей файл через свою програму зменшення шуму і отримую ще один файл. Як обчислити SNR цього файлу "знижений шум"?

--- редагувати ---

наступне запитання, розміщене ТУТ

Відповіді:


8

Загальне визначення SNR - це сила шуканого сигналу, поділена на потужність шуму. Припустимо, ви отримали шуканий і шумовий сигнал у вигляді масивів, обчислення SNR в Matlab до зниження шуму можна зробити так:

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

Після зменшення шуму залишковий шум може бути розрахований як різниця шуканого сигналу і фактичного сигналу. Розрахунок SNR є простим:

residual_noise = signal - noise_reduced_signal; 
snr_after = mean( signal .^ 2 ) / mean( residual_noise .^ 2 ); 
snr_after_db = 10 * log10( snr_after )

1
сигнал та шум_зменшений_сигнал у вашому випадку мають бути вирівняними за часом.
dspGuru

@dspGuru Щоправда, я припускав, що алгоритм зниження шуму не вводить затримки в часі.
Deve

@DspGuru і Dev: У цих місцях, замість того, щоб приймати значення var і середнього сигналу, що робити, якщо я вкажу якусь частину сигналу, яка безумовно містить мовлення? Для s \ example, замініть сигнал на сигнал (start_speech: end_speech) у Matlab, оскільки мій сигнал триває 5 секунд із паузою між словами
user13267

@ user13267 З якого сигналу? До або після зниження шуму? Як правило, чим довше ви аналізуєте сигнал, тим краще буде ваша оцінка SNR.
Діві

обидва. Я маю на увазі те, що в моєму звуковому зразку є одне, що говорить коротке речення, тож коли я відкриваю його в зухвалість, я можу побачити зони високої інтенсивності та низької інтенсивності сигналу (я думаю, наявність слів і тиша між словами). Тому я просто хочу вибрати ті зразки, які містять слова, а не включати ті зразки, які містять тишу.
user13267

3

З боку входу:

  1. Обчисліть DB1 = 10 * log10 (var (noiseSignal))
  2. Обчисліть DB2 = 10 * log10 (var (cleanSpeechSignal))

SNR = = DB2 - DB1

З боку виходу:

  1. Надішліть чистий мовний сигнал через альго придушення шуму. Позначимо вихід Y1.
  2. Надішліть шумний мовленнєвий сигнал через альго придушення шуму. Позначимо цей вихід Y2.
  3. Обчисліть Z = Y2 - Y1
  4. residualNoiseDB = 10 * log10 (var (Z))
  5. моваDB = 10 * log10 (var (Y1))
  6. SNR = моваDB - залишковаNoiseDB

Чи справді потрібно пропускати чистий мовний сигнал також через алгоритм зниження шуму? Чи не повинен мовленнєвий сигнал бути однаковим до і після алгоритму зменшення шуму, щоб ми мали загальну опорну точку?
user13267

Це повністю залежить від вашого алгоритму. Швидше за все, вихід не буде відповідати чистому входу - через затримку та фільтрацію.
dspGuru

Вихід (коли чиста мова проходить через алгоритм зниження шуму) насправді не відповідає входу, але я впевнений, що алгоритм не вносить затримок. Будь ласка, перевірте моє подальше запитання (посилання було відредаговане в це питання). Він має форми хвилі чистого мовлення до (верхньої частини фігури) зниження шуму та після (знизу фігури) зниження шуму. Затримки немає, але посилення посилено, і частина виступу була відфільтрована.
user13267
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.