Как рассчитать SNR шумового сигнала?

14

У меня проблемы с пониманием, как это сделать практически

У меня есть WAV-файл, который содержит чистую речь и другой Ave-файл, который просто содержит фоновый шум (это могут быть разные вещи, такие как белый шум, шум толпы, запись ветра и т. Д.). Это либо чисто речь, либо чисто шум. Таким образом, я полагаю, что я могу получить от них значение SNR простым делением соответствующих выборок (или среднего значения кадра выборок) в обоих файлах. Затем я объединяю их в дерзости, чтобы получить шумный речевой файл. Я предполагаю, что этот файл будет иметь тот же SNR.

Теперь я пропускаю этот файл через свою программу шумоподавления и в результате получаю другой файл. Как рассчитать SNR этого файла с уменьшенным шумом?

--- РЕДАКТИРОВАТЬ ---

дополнительный вопрос размещен ЗДЕСЬ

user13267
источник

Ответы:

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
signal и noise_reduced_signal должны быть выровнены по времени в вашем случае.
dspGuru
@dspGuru Правда, я предположил, что алгоритм шумоподавления не вводит задержку по времени.
Дев
@DspGuru и Dev: В этих местах, вместо того, чтобы брать переменную и среднее значение всего сигнала, что если я укажу некоторую часть сигнала, которая определенно содержит речь? Например, замените сигнал на сигнал (start_speech: end_speech) в Matlab, так как мой сигнал длится 5 секунд с паузой между словами
user13267
@ user13267 Какой сигнал? До или после шумоподавления? Как правило, чем дольше анализируемый сигнал, тем лучше будет ваша оценка ОСШ.
Дев
оба из них. Я имею в виду, что в моем звуковом образце есть кто-то, говорящий коротким предложением, поэтому, когда я открываю его в дерзости, я могу видеть области высокой и низкой интенсивности формы волны (я думаю, что присутствуют слова и тишина между словами). Поэтому я просто хочу выбрать те образцы, которые содержат слова, а не те образцы, которые содержат тишину.
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. speechDB = 10 * log10 (var (Y1))
  6. SNR = speechDB - residualNoiseDB
dspGuru
источник
Действительно ли необходимо передавать чистый речевой сигнал через алгоритм шумоподавления? Разве речевой сигнал не должен быть одинаковым до и после алгоритма шумоподавления, чтобы у нас была общая контрольная точка?
user13267
Это полностью зависит от вашего алгоритма. Скорее всего, выход не будет соответствовать чистому входу из-за задержки и фильтрации.
dspGuru
Вывод (когда чистая речь проходит через алгоритм шумоподавления) действительно не соответствует вводу, но я совершенно уверен, что алгоритм не вносит каких-либо задержек. Пожалуйста, проверьте мой следующий вопрос (ссылка была отредактирована в этом вопросе). Он имеет формы чистой речи до (вверху рисунка) шумоподавления и после (внизу рисунка) шумоподавления. Задержки нет, но усиление очень высокое, и часть речи отфильтрована.
user13267