Шумоподавление для звука

Начало: 25 ноября 2014 года
Конец: 17 декабря 2014 года (23:59)

Автор задания: Алексей Лукин

Цель задания

Цель задания — освоить навыки цифровой обработки сигналов, работы с банками фильтров на примере алгоритма спектрального вычитания для подавления аддитивных стационарных шумов в аудиосигнале.

Описание задачи

Звуковой сигнал, записываемый в реальных акустических условиях, часто содержит нежелательные шумы, которые могут порождаться окружающей средой или звукозаписывающей аппаратурой. Один из классов шумов — аддитивные стационарные шумы.
Аддитивность означает, что шум суммируется с "чистым" сигналом y[t] и не зависит от него: x[t] = y[t] + noise[t].
Стационарность означает, что свойства шума (мощность, спектральный состав) не меняются во времени.
Примерами таких шумов могут являться постоянное шипение микрофона или усилительной аппаратуры, гул электросети. Работа различных приборов, не меняющих звучания по времени (вентиляторы, компьютеры) также может создавать шумы, близкие к стационарным. Не являются стационарными шумами различные щелчки, удары, шелест ветра, шум автомобилей.

Для подавления аддитивных стационарных шумов существует алгоритм спектрального вычитания. Он состоит из следующих стадий:

  1. Разложение сигнала с помощью кратковременного преобразования Фурье (STFT) или другого преобразования, компактно локализующего энергию сигнала (рис. 1, 2).
  2. Оценка спектра шума (рис. 4).
  3. "Вычитание" амплитудного спектра шума из амплитудного спектра сигнала.
  4. Обратное преобразование STFT — синтез результирующего сигнала (рис. 3).

В качестве банка фильтров рекомендуется использовать STFT с окном Ханна $ w[t] = 1 - \cos \frac{2 \pi (t+0.5)}{N} $$ 0 \leq t < N $,  длиной порядка 50 мс и степенью перекрытия 75%. Амплитуду весового окна надо отмасштабировать так, чтобы при выбранной степени перекрытия окон банк фильтров не менял общую амплитуду сигнала в отсутствие обработки.

STFT.png
Рис. 1. Наложение весовых окон Ханна в процессе STFT.

Оценка спектра шума может осуществляться как автоматически, путем поиска участков минимальной энергии в каждой частотной полосе, так и вручную, путем анализа спектра на временном сегменте, который пользователь идентифицировал как шум.

Вычитание амплитудных спектров может осуществляться по формуле $ Y[f,t] = \max \{X[f,t] - k W[f,t], 0 \} $, что эквивалентно следующей функции подавления: $ G[f,t] = \max \{1 - k \frac{W[f,t]}{X[f,t]}, 0 \} $. Здесь X[f,t] и W[f,t] — амплитудные спектры сигнала и шума соответственно, $ Y[f,t] = G[f,t]X[f,t] $ — амплитудный спектр результирующего очищенного сигнала, а k — коэффициент подавления. Фазовый спектр очищенного сигнала полагается равным фазовому спектра зашумленного сигнала.

MusicNoisy.png MusicSimple.png
Рис. 2. Спектрограмма зашумленного сигнала
Music.wav
Рис. 3. После спектрального вычитания
MusicSimple.wav

Одна из проблем метода спектрального вычитания — т.н. "музыкальный шум". Он появляется вследствие того, что коэффициенты STFT шумовых сигналов статистически случайны, что приводит к их неравномерному подавлению. В результате, очищенный сигнал содержит кратковременные и ограниченные по частоте всплески энергии (рис. 3, точки в верхней части), которые на слух воспринимаются как "колокольчики" или "льющаяся вода". В некоторых случаях этот эффект даже менее желателен, чем исходный подавляемый шум.
Для подавления этого артефакта можно применять следующие методы:

  • Завышение оценки шумового порога (увеличение k). Приводит к подавлению слабых компонент полезного сигнала, звук становится глуше.
  • Неполное подавление шума (ограничение G[f,t] снизу константой, отличной от нуля). Часть шума остается в сигнале и отчасти маскирует "музыкальный шум".
  • Сглаживание по времени оценок спектра X[f,t]. Приводит к размытию или подавлению транзиентов (резких всплесков в сигнале: ударов, атак музыкальных инструментов).
  • Адаптивное сглаживание оценок спектра X[f,t] (или отношений X[f,t]/W[f,t]) по времени и частоте. Наиболее качественный, но и трудоемкий метод.

Базовая часть

Нужно реализовать алгоритм спектрального вычитания для белого шума. Программа должна:

  1. открывать указанный пользователем WAV-файл (достаточно поддержки одного формата PCM, 44.1 kHz, 16-bit, mono),
  2. осуществлять разложение сигнала с помощью STFT, размер окна в отсчетах задается пользователем (степени двойки в диапазоне 256–16384),
  3. производить спектральное вычитание, полагая спектр шума белым W[f,t] = const = 1 и позволяя пользователю задавать k (коэффициент подавления) в широких пределах для работы с различными уровнями шума,
  4. синтезировать результирующий сигнал в другой указанный пользователем WAV-файл.

Для программы допускается консольный либо диалоговый интерфейс. В случае консольного интерфейса должна поддерживаться командная строка вида:
denoiser.exe input.wav output.wav -w 2048 -k 12.6 [дополнительные опции]
Здесь 2048 отсчетов — размер окна STFT, а 12.6 — амплитудный коэффициент шума (k).

Дополнительная часть

  • Поддержка стерео WAV-файлов с независимой обработкой каждого канала.
  • Реализация альтернативных функций подавления G[f,t], пользовательский параметр для выбора функции, сравнение результатов (описать в readme-файле).
  • Подавление шумов с произвольным спектром. Пользователь указывает диапазон отсчетов в WAV-файле, содержащий только шум (рис. 4), и программа вычисляет W[f,t], усредняя спектры STFT внутри этого фрагмента.
  • Автоматическое определение спектра шума. Программа должна проанализировать STFT файла и найти наиболее вероятные амплитуды шума в каждой частотной полосе как минимумы усредненной энергии в этой полосе. Следует учесть, что малое время усреднения может привести к неточной оценке уровня шума из-за вариативности шумового спектра, а большое время усреднения может быть неадекватным из-за отсутствия шумовых пауз нужной длины (например, звуки дыхания в файле Speech.wav могут быть ошибочно приняты за шум). В случае реализации автоопределения шума программа должна печатать границы найденного интервала (в отсчетах), с которого производится получение спектра шума.
  • Подавление артефакта "музыкальный шум" путем сглаживания спектра по времени. К STFT-коэффициентам исходного сигнала применяется рекурсивная фильтрация по времени: $ \hat{X}[f,t] = (1 - \alpha) \hat{X}[f,t-1] + \alpha X[f,t] $. Здесь $ 0 < \alpha < 1 $ — константа, управляющая силой сглаживания.
  • Подавление артефакта "музыкальный шум" путем адаптивного двумерного сглаживания спектрограммы. В качестве примера можно реализовать алгоритмы bilateral filter или non-local means.
  • Любые дополнительные идеи, позволяющие повысить качество шумоподавления.
  • Реализация вычисления PSNR в децибелах между двумя WAV-файлами и измерение качества шумоподавления с различными настройками. $ PSNR(x,y) = 10 \lg \frac{M ^ 2 N} { \sum_{i=1}^{N} (x[i] - y[i])^2 } $, где M — максимальная представимая форматом амплитуда сигнала. Для оценки качества шумоподавления нужно взять чистый тестовый фрагмент A.wav, добавить к нему шум (например, в звуковом редакторе Adobe Audition), образовав B.wav, провести шумоподавление, записать результат в C.wav и, наконец, вычислить PSNR между A.wav и C.wav. Очевидно, что в результате шумоподавления должно быть PSNR(A,C) > PSNR(A,B), т.е. очищенный сигнал должен приближаться к исходному. Варьируя настройки шумоподавления, нужно стремиться максимизировать PSNR. Для вычисления PSNR можно сделать отдельную программу или опцию в основной программе.

Пример командной строки в случае реализации двух дополнительных пунктов:
denoiser.exe input.wav output.wav -w 2048 -k 12.6 -n 761000 792000 -a 0.15

NoiseSection.png SpeechNoisy.png
Рис. 4. Нахождение шума
в файле Music.wav
Рис. 5. Окрашенный шум и гудение электросети
в файле Speech.wav

Рекомендуемая литература

Лекция по основам DSP слайды
Методичка "Введение в цифровую обработку сигналов" книга (PDF, 974k)
Статья "Acoustic Noise Suppression for Speech Signals using Auditory Masking Effects" статья (PDF, 458k)

Материалы

Пример использования функций FFT:

#include "FftWrapper.h"
const uint fftSize= 2048;
...
Fft fft;
fft.SetMode( FFT_REAL, fftSize );
...
audio_real *pSignal;
Cmplx *pSpec= new Cmplx[fftSize];
...
fft.FftReal( pSignal, pSpec );
for( uint i=0; i<=fftSize>>1; ++i )
  pMags[i]= sqrtf( pSpec[i].re * pSpec[i].re
                 + pSpec[i].im * pSpec[i].im );
...
fft.InvFftReal( pSpec, pSignal );
// FFT size
 
 
// We will compute FFT for real-valued signals
 
// Pointer to the time-domain signal
// Storage for a complex spectrum
 
// Compute FFT
 
// Compute magnitudes for every bin
 
 
// Compute inverse FFT

 

Оценка

Базовая часть 9 баллов
Поддержка стерео-файлов +1 балл
Альтернативные функции подавления +2 балла
Подавление шумов с произвольным спектром +3 балла
Автоматическое определение спектра шума до +3 баллов
Подавление "музыкального шума" сглаживанием по времени +2 балла
Подавление "музыкального шума" адаптивным 2D сглаживанием +2...+5 баллов
Измерение и оптимизация PSNR до +3 баллов

Базовая проверка качества

  • Если сила шумоподавления стремится к нулю, то результирующий файл должен быть близок к исходному. Допускается сдвиг по времени и искажения в самом начале и конце файла. За заметное изменение средней амплитуды — минус 1 балл. За слышимые искажения — минус 4 балла и более.
  • Проверка банка фильтров. Если в исходном файле нет частот выше N кГц, то в результирующем файле не должно быть частот выше N+1 кГц (от N до N+1 кГц допускается небольшое количество энергии). Если выше N+1 кГц на спектрограмме имеются выраженные вертикальные линии или в результате слышен треск, то оценка за базу снижается на 3 балла и более, в зависимости от силы артефактов.

Внимание: при снижении оценки за базу оценка за дополнительную часть снижается пропорционально. При невозможности проверки базы дополнительная часть не зачитывается.

Оформление

См. Информацию о курсе и FAQ.
Не забудьте положить в архив файл readme.txt. В файле указать следующее:

  • Список реализованных пунктов
  • Наилучшие, с вашей точки зрения, параметры для тестового файла Music.wav
  • В случае реализации дополнительных пунктов — параметры для тестового файла Speech.wav

При реализации дополнительных возможностей, за исключением самых простых, необходимо подробно пояснить в readme-файле примененные алгоритмы и, по возможности, их влияние на результаты (для пояснения можно приводить скриншоты из iZotope RX). В противном случае, вас, скорее всего, пригласят на аппеляцию, чтобы уточнить реализованные возможности.

Результаты работы

Результаты смотрите в интернете. Вопросы можно задать в форуме.
Задание выполняется строго индивидуально. Cовместная работа или обмен кусками кода, при условии, что факт командной работы не был указан в readme.txt, считается плагиатом и оценивается в –5 баллов всем участникам.

Разбор ошибок

База. Тут ставился либо максимальный балл, либо 0, в зависимости от того, реализованы ли все требования.
(штраф за качество: близость к исходному). Снижение балла в базе за то, что при малой силе шумоподавления результат не стремится к исходному файлу (см. первый критерий правильности базы).
(штраф за качество: треск, разрывы). Снижение балла в базе за то, что при большой силе шумоподавления в результате появляются вертикальные линии, слышные как треск (см. второй критерий правильности базы). Это обычно происходит от ошибки с применением весовых окон в банке фильтров: они должны применяться как при анализе, так и при синтезе (в обоих случаях происходит умножение).
За эти ошибки в базе также снижались баллы за дополнительную часть, т.к. это влияет на качество результата и в дополнительной части.
Поддержка стереофайлов. Тут ошибок почти не было.
Альтернативные функции подавления. Баллы снижались, если в readme не было описано, какие альтернативные функции реализованы, либо если что-то не работало, как ожидается.
Подавление шумов с произвольным спектром. Распространённая ошибка — отсутствие должного усреднения шумовых спектров в указанной пользователем области. От этого последующее подавление было неравномерным по частотам, за это баллы снижались. Правильный результат — когда в файле Speech.wav гул на НЧ подавляется вместе с шумом на СЧ и ВЧ. Если подавляется что-то одно, то опция не засчитывается.
Автоматическое определение спектра шума. Ошибка почти такая же: находится очень короткий интервал шума, и усреднение спектра недостаточное. В результате — горизонтальные полосы на спектрограмме, признак неравномерного подавления шума по частоте. За это баллы снижались. Если же неравномерность была слишком сильной, то опция не засчитывалась.
Подавление "музыкального шума" сглаживанием по времени. Ошибка почти у всех: сглаживание применялось к обрабатываемому спектру сигнала (который, кстати, комплексный). На самом же деле сглаженный амплитудный (вещественный!) спектр должен использоваться только для вычисления G. Ведь метод спектрального вычитания заключается в умножении исходного (!) спектра на вещественные (!) амплитудные множители. Это упоминалось и на лекции, и в рекомендованной статье.
Подавление "музыкального шума" адаптивным 2D сглаживанием. Ошибка аналогичная предыдущему пункту. Второй повсеместный недочёт — использование билатерального фильтра в слишком маленьком окне. Для эффективного сглаживания размер фильтра должен быть как минимум 5x5, а лучше — больше.
Измерение и оптимизация PSNR. Баллы снижались в случае, если не было отчёта с измеренными значениями и анализа влияния параметров на PSNR. Также были распространены ошибки в вычислении PSNR. Для реально зашумлённых файлов PSNR должен получаться порядка 40-50 дБ, а никак не 95 (это было бы на уровне шума квантования 16-битного формата WAV).
Штраф. Штрафы за опоздание у нас невелики, и их можно было перекрыть, реализовав пару дополнительных опций. Прощение опоздания предусмотрено только при наличии справки о болезни, представленной на апелляции.

© Лаборатория компьютерной графики при ВМиК МГУ