Подтвердить что ты не робот

Алгоритм реверберации

Я ищу простой или комментируемый алгоритм реверберации, даже в псевдокоде очень поможет.

Я нашел пару, но код имеет тенденцию быть довольно эзотерическим и трудно следовать.

4b9b3361

Ответ 1

Вот очень простая реализация "линии задержки", которая создаст эффект реверберации в существующем массиве (С#, buffer is short[]):

int delayMilliseconds = 500; // half a second
int delaySamples = 
    (int)((float)delayMilliseconds * 44.1f); // assumes 44100 Hz sample rate
float decay = 0.5f;
for (int i = 0; i < buffer.length - delaySamples; i++)
{
    // WARNING: overflow potential
    buffer[i + delaySamples] += (short)((float)buffer[i] * decay);
}

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

Это приведет к истинному эффекту "реверберации", поскольку каждый звук будет слышен многократно с уменьшающейся амплитудой. Чтобы получить более простой эффект эха (где каждый звук повторяется только один раз), вы используете в основном тот же код, только запустите цикл for в обратном порядке.

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

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

Обновление 2: Вот несколько советов для дизайна реверберации с несколькими задержками:

  • Выберите значения задержки, которые не будут позитивно мешать друг другу (в волновом смысле). Например, если у вас есть одна задержка на 500 мс и секунда на 250 мс, будет много точек, которые имеют эхо-сигналы с обеих линий, что создает нереалистичный эффект. Обычно умножать базовую задержку на разные простые числа, чтобы гарантировать, что это перекрытие не произойдет.

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

  • Абсолютный лучший трюк (и я почти чувствую, что я не хочу его отдать, но что, черт возьми) работает, только если ваш звук стерео. Если вы слегка меняете параметры линий задержки между левым и правым каналами (например, 490 мс для левого канала и 513 мс для правого или 0,273 затухания для левого и 0,2631 для правой), вы создадите много более реалистично звучащая реверберация.

Ответ 2

Цифровые ревербераторы обычно бывают двух видов.

  • Convolution Reverbs сворачивают импульсную характеристику и входной сигнал. Импульсный отклик часто представляет собой запись реальной комнаты или другого источника реверберации. Характер реверберации определяется импульсным откликом. Таким образом, сверточные ревербераторы обычно предоставляют ограниченные средства для регулировки характера реверберации.

  • Алгоритмические ревербераторы имитируют реверберацию с сетью задержек, фильтров и обратной связи. Различные схемы будут комбинировать эти основные строительные блоки по-разному. Большая часть искусства заключается в том, чтобы знать, как настроить сеть. Алгоритмические ревербераторы обычно предоставляют конечному пользователю несколько параметров, так что символ реверберации можно настроить в соответствии с потребностями.

Сообщение "Немного о реверберации" на EarLevel - отличное введение в эту тему. Он объясняет различия между сверткой и алгоритмическими ревербераторами и показывает некоторые детали того, как каждый из них может быть реализован.

Физическая обработка аудиосигнала Джулиуса О. Смита имеет главу об алгоритмах реверберации, включая раздел, посвященный алгоритму Freeverb. Это может помочь при поиске некоторых примеров исходного кода.

Блог Шона Костелло Вальхаллы полон интересных реверберационных лакомых кусочков.

Ответ 3

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

Учитывая импульсный вектор длины N, вы можете создать образец выходного аудиосигнала путем векторного умножения входного вектора (состоящего из текущего входного аудиосигнала, объединенного с предыдущими входными выборками N-1) импульсным вектором, с соответствующее масштабирование.

Некоторые люди упрощают это, предполагая, что большинство ответвлений (вплоть до 1) в импульсном ответе равны нулю, и просто используют несколько масштабированных линий задержки для оставшихся эхо-сигналов, которые затем добавляются в выход.

Для еще более реалистичной реверберации вы можете использовать разные импульсные ответы для каждого уха, и реакция немного меняется с положением головы. Движение головы всего на четверть дюйма может изменять положение пиков в импульсном отклике на 1 образец (при скорости 44,1 тыс.).

Ответ 4

Вы можете использовать GVerb. Получите код здесь.GVerb - плагин LADSPA, вы можете пойти здесь, если вы хотите что-то узнать о LADSPA.

Здесь - это вики для GVerb, включая объяснение параметров и некоторые мгновенные настройки реверберации.

Также мы можем использовать его непосредственно в Objc:

ty_gverb        *_verb;
_verb = gverb_new(16000.f, 41.f, 40.0f, 7.0f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f);
AudioSampleType *samples = (AudioSampleType*)dataBuffer.mBuffers[0].mData;//Audio Data from AudioUnit Render or ExtAuidoFileReader
float lval,rval;
for (int i = 0; i< fileLengthFrames; i++) {
     float value = (float)samples[i] / 32768.f;//from SInt16 to float
     gverb_do(_verb, value, &lval, &rval);
     samples[i] =  (SInt16)(lval * 32767.f);//float to SInt16
}

GVerb - моноэффект, но если вы хотите стереозвук, вы можете запускать каждый канал через эффект отдельно, а затем панорамировать и смешивать обработанные сигналы с сухими сигналами по мере необходимости.