sonido sinonimo reverberación reverb reflexion múltiple hall ejemplos control anti c++ signal-processing music

c++ - sinonimo - Algoritmo de reverberación



reverberación sinonimo (4)

Estoy buscando un algoritmo de reverberación simple o comentado, incluso en pseudocódigo ayudaría mucho.

He encontrado una pareja, pero el código tiende a ser bastante esotérico y difícil de seguir.


Las reverberaciones digitales generalmente vienen en dos sabores.

  • La convolución Las reverberaciones generalmente funcionan mediante la convolving una respuesta de impulso y una señal de entrada. La respuesta de impulso es normalmente una grabación de una sala real u otra fuente de reverberación. El carácter de la reverb se define por la respuesta de impulso. Como tal, las reverberaciones de convolución generalmente proporcionan medios limitados para ajustar el carácter de reverberación.

  • Las reverberaciones algorítmicas imitan la reverberación con una red de retardos, filtros y retroalimentación. Diferentes esquemas combinarán estos bloques de construcción básicos de diferentes maneras. Gran parte del arte consiste en saber cómo sintonizar la red. Las reverberaciones algorítmicas generalmente exponen varios parámetros al usuario final, por lo que el carácter de reverberación puede ajustarse para adaptarse.

La publicación " earlevel.com/main/1997/01/19/a-bit-about-reverb " en EarLevel es una excelente introducción al tema. Explica las diferencias entre las reverberaciones de convolución y algorítmicas y muestra algunos detalles sobre cómo se puede implementar cada una.

Procesamiento físico de señales de audio por Julius O. Smith tiene un capítulo sobre algoritmos de reverberación, que incluye una sección dedicada al algoritmo Freeverb. Omitir sobre eso podría ayudar al buscar algunos ejemplos de código fuente.

El blog Valhalla Sean Costello está lleno de interesantes reverb tidbits.


Lo que necesita es la respuesta de impulso de la sala o cámara de reverberación que desea modelar o simular. La respuesta de impulso completa incluirá todos los ecos de múltiples y múltiples rutas. La duración de la respuesta al impulso será aproximadamente igual a la cantidad de tiempo (en muestras) que se necesita para que un sonido de impulso disminuya completamente por debajo del umbral audible o del nivel de ruido determinado.

Dado un vector de impulso de longitud N, puede producir una muestra de salida de audio por vector multiplicando el vector de entrada (compuesto por la muestra de entrada de audio actual concatenada con las muestras de entrada N-1 anteriores) por el vector de impulso, con la escala apropiada.

Algunas personas simplifican esto al suponer que la mayoría de los toques (hasta todos menos 1) en la respuesta al impulso son cero, y solo se usan unas pocas líneas de retardo escaladas para los ecos restantes que luego se agregan a la salida.

Para una reverberación aún más realista, es posible que desee utilizar diferentes respuestas de impulso para cada oído y que la respuesta varíe un poco con la posición de la cabeza. Un movimiento de la cabeza de tan solo un cuarto de pulgada puede variar la posición de los picos en la respuesta al impulso en 1 muestra (a tasas de 44.1 k).


Puedes usar GVerb. Obtenga el código here .GVerb es un complemento de LADSPA, puede ir here si desea saber algo sobre LADSPA.

Here está la wiki para GVerb, que incluye la explicación de los parámetros y algunos ajustes de reverberación instantánea.

También podemos usarlo directamente en 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 es un efecto mono, pero si desea un efecto estéreo, puede ejecutar cada canal a través del efecto por separado y luego panoramizar y mezclar las señales procesadas con las señales secas según sea necesario.


Aquí hay una implementación muy simple de una "línea de retardo" que producirá un efecto de reverberación en una matriz existente (C #, el buffer es 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); }

Básicamente, toma el valor de cada muestra, lo multiplica por el parámetro de decaimiento y agrega el resultado al valor en el búfer de delaySamples . delaySamples .

Esto producirá un verdadero efecto de "reverb", ya que cada sonido se escuchará varias veces con una amplitud decreciente. Para obtener un efecto de eco más simple (donde cada sonido se repite solo una vez) usas básicamente el mismo código, solo ejecuta el bucle for en sentido inverso.

Actualización: la palabra "reverberación" en este contexto tiene dos usos comunes. El ejemplo de mi código anterior produce un efecto de reverberación clásico común en las caricaturas, mientras que en una aplicación musical el término se usa para referirse a la reverberación, o más generalmente a la creación de efectos espaciales artificiales.

Una razón importante por la que la literatura sobre la reverberación es tan difícil de entender es que la creación de un buen efecto espacial requiere algoritmos mucho más complicados que los de mi método de muestra aquí. Sin embargo, la mayoría de los efectos espaciales electrónicos se construyen utilizando múltiples líneas de retardo, por lo que este ejemplo ilustra los aspectos básicos de lo que está sucediendo. Para producir un efecto realmente bueno, puede (o debería) también enturbiar la salida de la reverberación con FFT o incluso con un desenfoque simple.

Actualización 2: aquí hay algunos consejos para el diseño de reverberación de múltiples líneas de retardo:

  • Elija valores de retardo que no interfieran positivamente entre sí (en el sentido de onda). Por ejemplo, si tiene un retraso a 500 ms y un segundo a 250 ms, habrá muchos puntos que tienen ecos de ambas líneas, lo que produce un efecto poco realista. Es común multiplicar una demora base por diferentes números primos para ayudar a asegurar que esta superposición no ocurra.

  • En una habitación grande (en el mundo real), cuando haga un ruido, tenderá a escuchar algunos ecos agudos inmediatos (de unos pocos milisegundos) que son relativamente sin distorsión, seguidos por una "nube" de ecos más grande y más débil. Puede lograr este efecto a bajo costo usando unas pocas líneas de retardo que se ejecutan hacia atrás para crear los ecos iniciales y unas pocas líneas de reverberación completas más algunas distorsiones para crear la "nube".

  • El mejor truco absoluto (y casi siento que no quiero renunciar a este, pero qué demonios) solo funciona si tu audio es estéreo. Si varía ligeramente los parámetros de sus líneas de retardo entre los canales izquierdo y derecho (por ejemplo, 490 ms para el canal izquierdo y 513 ms para el derecho, o .273 decaimiento para el izquierdo y .2631 para el derecho), producirá una gran cantidad de Una reverberación más realista.