Los sistemas de convolución: teoría
El marketing alaba los sistemas basados en la convolución y sus colecciones de respuestas impulsivas que prometen clonar con gran detalle entornos y equipos reales. ¿Quieres saber cómo funcionan?
Tratamos el tema en dos entregas. Esta primera es un tanto teórica, aunque esquivando la matemática, y quizá sólo interese a algunos. En la segunda, de interés más general, damos algunas recomendaciones sobre cómo aprovechar los sistemas de convolución, sus usos y límites, las posibilidades de combinación de la convolución con otras técnicas, o aplicaciones un tanto ‘esotéricas’ como la convolución para realizar ‘hibridaje’ entre instrumentos.
Vivimos en un mundo convolucionado
La convolución, más allá de su representación matemática, corresponde a un tipo de acción que se presenta a menudo en el mundo real. Existen tanto la convolución continua (para señales continuas –‘analógicas’ si lo entendéis así mejor-) como discreta (para señales ‘digitales’). Nosotros nos centraremos en el caso discreto, porque es el que es más fácil de representar y entender y porque en la práctica los sistemas audio basados en convolución que se han popularizado son de tipo ‘digital’.
En nuestro mundo audio/música abunda la convolución. Un ejemplo fácil de asimilar por todos es el del eco en una montaña o un frontón. El sonido que yo produzco se devuelve y lo oigo de nuevo retrasado.
Si digo una palabra aislada y corta como ‘hola’, la repetición se oye separadamente al original gracias al largo tiempo que lleva el viaje de ida y vuelta del sonido. Mucho mayor que la duración del propio evento sonoro. Pero si lo que hago es leer un discurso empezamos a tener un solapamiento que hace difícil entender qué se está diciendo. Esa amalgama de repeticiones es la esencia de la convolución.
La respuesta impulsiva
Ni las paredes ni las montañas están solas. Si hay más de una, habrá rebotes en cada una de las paredes, habrá sonido rebotando entre una pared y otra y por tanto generando sucesivas réplicas, etc. En una situación real el número, distribución y nivel de esas repeticiones puede seguir un patrón bastante complejo. Basta una pared más, un pequeño cambio en la posición de la fuente o del oyente/micrófono y el patrón resultante de las repeticiones cambia enormemente.
Pero para un entorno determinado y una determinada posición de escucha, el patrón de esas repeticiones es fijo, puede caracterizarse. Si represento o registro de alguna manera ese patrón de repeticiones tengo la ‘huella dactilar’ de cada combinación de entorno y punto de escucha. Basta que someta cualquier señal a ese mismo patrón de repeticiones para que aparente estar siendo reproducida en ese espacio.
Un caso sencillo: eco único
El caso de un eco único es demasiado simple, pero nos permite avanzar paso a paso. La señal se replica retrasada y se superpone a sí misma
Aunque hayamos presentado separadas y coloreado diferente la señal original y su réplica para que se aprecien mejor, realmente lo que acabamos obteniendo y oyendo es la suma de ambas, en la que ya no es nada sencillo escindirlas.
Para avanzar en entender cómo funciona un sistema de convolución, pensad que la repetición de la palabra o frase puede también entenderse como la repetición (con un mismo patrón de eco) de cada una de las letras sucesivas. La ‘E’ está sometida a un patrón de eco que es el mismo que recibe la ‘n’, etc.
Podemos a la postre tratar ‘instantáneamente’ el eco. Es equivalente pensar que la señal se replica, o que cada instante de la señal se replica más tarde y se suma con la señal original.
Lo que nos lleva inmediatamente a pensar en implementaciones discretas (digitalizadas), que, con tal de que garanticen una suficiente velocidad de muestreo, cumpliendo el criterio de Nyquist, son una representación correcta de las señales continuas originales. Pero antes de hablar de la implementación, avancemos un paso más allá del mero retardo simple.
Reverberación y convolución
Todas las características de una determinada reverberación quedan perfectamente descritas en su patrón de rebotes. Pero la amalgama de reflexiones, muchas y muy próximas, es tan densa que no podemos discernirlas y se produce esa cola de ‘emborronamiento’ característica. Llega a configurar la señal final de una forma tal que puede ser difícil apreciar en ella la señal original, desdibujada ante la avalancha de superposiciones. Para poder obtener la salida en un instante tengo que sumar las contribuciones que en ese instante realizan todas y cada una de las réplicas.
Disponiendo de ese patrón de rebotes, podemos ‘recrear’ cualquier reverberación. Y aunque la relación entre la salida final y la señal original puede llegar a ser muy compleja, tanto como la propia colección de rebotes, lo relevante aquí es que el proceso por el que se llega a construir sí es ‘sencillo’: sumar una colección de réplicas de la señal original. Eso es precisamente lo que hace un sistema de convolución: combinar muchas repeticiones.
Convolución: rebotes en acción
Un equipo o software que haga convolución puede llegar a emular con enorme detalle entornos y sistemas reales si cuenta con la ‘huella’ adecuada que describe la distribución de los rebotes.
Volvamos a la cuestión de la implementación, porque nos ayudará a entender cómo funciona. Un sistema de convolución, ya sea hard/plugin o lo que queráis, no es más que una máquina de producir rebotes. Eso sí, una máquina en la que podemos ser nosotros quienes definamos el patrón de los rebotes. La definición del retardo y nivel de cada uno de esos rebotes será la que determine la actuación final de sistema: ya sea un eco más o menos complejo, una reverberación, o (tal como veremos) un filtrado o ecualización, etc.
Puede concebirse conceptualmente como un ‘multitap delay’, pero a lo bestia. Un retardo de duración suficiente para poder recrear el rebote más tardío de todos, y con suficientes ‘taps’ o ramas para poder generar tantos rebotes como sea necesario.
Con esa idea en la cabeza, avancemos un poco más en cuanto a arquitectura de lo que hay realmente. Si tanto la señal como el patrón de repeticiones están bien muestreados, la realización digital equivale plenamente a lo que sucede en el caso continuo. Como siempre la velocidad de muestreo debe al menos duplicar la anchura de banda.
La señal se puede digitalizar en un A/D y llevar las muestras a una memoria FIFO (first in, first out) que hace que cada nueva muestra que llega ‘empuje’ a las demás (perdiéndose por el otro extremo la más antigua), de forma que en todo momento tengamos el fragmento más reciente de la señal almacenado en esa memoria, con una duración igual al patrón de rebotes deseado. Si en una segunda memoria (‘fija’ en cuanto a su contenido) tenemos el patrón de rebotes deseado, podemos multiplicar una por una las celdas de ambas memorias y sumar el resultado de todas esas multiplicaciones. Como resultado tenemos la posibilidad de calcular muestra a muestra la combinación de todos esos rebotes que podemos llevar a un D/A para obtener la señal de salida.
Aunque la idea de esa arquitectura nos es útil para comprender cómo actúa, la implementación es, las más de las veces, en forma de programa. Pensad que montar tantísimos multiplicadores en hardware implica construir un dinosaurio. En vez de una memoria FIFO se usa una memoria convencional y se simula el comportamiento FIFO con punteros, y la sucesión de multiplicaciones y sumas también se realiza por programa, en algún procesador, usando reiteradamente un único multiplicador.
Una única arquitectura puede variar su comportamiento según la forma de la respuesta impulsiva. El mismo sistema o software de convolución podrá servirnos para realizar reverberación, filtrado o ecualización arbitrariamente complejo, imitar la respuesta de otros equipos, etc. Basta para ello cargar en la memoria el patrón de rebotes o ‘forma’ necesaria. En definitiva, siempre un mismo soft, pero acompañado de una amplia colección de ficheros con las ‘formas’ necesarias y entre las que pueda escoger cuál usar en cada caso.
Convolución: más allá de los rebotes individuales
Hay en lo que he ilustrado hasta ahora una pequeña simplificación (que ahora deshacemos): para que se entendiera mejor, he mostrado siempre patrones en los que podemos discernir rebotes individuales y cada uno de ellos es un perfecto clon de la señal original, salvo por su nivel o amplitud.
Volviendo al ejemplo de los ecos y reverberaciones, la absorción de las paredes y del aire y otras diversas cuestiones pueden hacer que las repeticiones sean cada vez más opacas, o al contrario, que pierdan graves. En términos más generales, las repeticiones pueden ser versiones ‘filtradas’ de la señal original. Pero (como trataremos luego) filtrar es algo que también puede realizarse por convolución. Lo ilustro (no lo demuestro) con un ejemplo.
Pensad que nuestra señal fuera una cuadrada, y que como ‘forma’ para el patrón pusiéramos no una colección de rebotes individuales sino una curva de tipo caída exponencial (continua o discreta nos da lo mismo, ya hemos comentado la equivalencia de ambas soluciones si la frecuencia de muestreo es suficiente).
Aquí tenéis varios instantes de lo que sucedería. Para simplificar pensad en que fuera una cuadrada unipolar (no centrada en cero). A medida que la parte ‘activa’ del pulso cuadrado comienza a entrar en la memoria, empezamos a observar una salida que va creciendo progresivamente. Ese incremento gradual suaviza la transición, realizando por tanto un filtrado (en este caso de tipo paso bajo). De forma parecida la ‘salida’ del pulso cuadrado da lugar a una desaparición progresiva. El resultado es ‘redondeado’ o ‘suavizado’, con pérdida de altas frecuencias, una versión filtrada paso bajo de la señal cuadrada de origen.
Frente a los casos mostrados hasta ahora, con rebotes individuales, este ejemplo lo es del caso en el que tenemos una especie de ‘dispersión’ de la señal (definida aquí con esa forma exponencial). Y ‘dispersar’ señales es lo que hacen los filtros.
Convolución y filtrado
No sólo el caso que hemos ilustrado, cualquier filtro puede ‘pensarse’ en términos de convolución. El truco está, como en el ejemplo anterior, en que el patrón de rebotes ya no presenta ecos individuales perfectos (los ‘rebotes’ aislados que hemos venido mencionando), sino una forma más continua, como esa exponencial u otras cualesquiera. Un patrón que ya no es de ‘rebotes’ individuales sino de una ‘dispersión’ más continua.
¿Recordáis cuando pensábamos en los efectos de la caja de resonancia de un violín o guitarra? Hay en su interior una acción que recuerda a la reverberación. Las distancias son tan cortas y los rebotes tantos y tan cercanos que no podemos discernirlos. También podríamos decir lo mismo sobre un altavoz o sobre un micrófono cuyo cuerpo rodea al transductor. El resultado es más el de una ‘dispersión’. Ya hemos hablado en los artículos de síntesis de cómo se al sonar dentro de esa caja, se impone un patrón de resonancias característico (frecuencias realzadas / rebajadas, desplazamientos de fase), resultado precisamente de la combinación de la señal original y los rebotes en las paredes del cuerpo del instrumento.
Cada instrumento, cada altavoz, micrófono, o previo, cada filtro, etc. implica una determinada ‘forma’ con la que dispersa en el tiempo el sonido original. Y a causa de esa dispersión (revisad artículos anteriores) hay cambio de nivel y/o fase de unas componentes frecuenciales frente a otras, esto es, una acción de filtrado. En definitiva, los filtros son sistemas que podemos caracterizar y ‘reconstruir’ por la vía de la convolución. No sólo podemos definirlos a través de su acción en frecuencia. También mediante una ‘forma’ de dispersión, esto es, en términos de convolución. Y es que realmente hablar de convolución y de filtrado es una misma cosa. No sólo reverberaciones, también se puede emular por un filtro o un ecualizador.
Cuando describimos un filtro solemos hacerlo centrándonos en su respuesta en frecuencia, en cómo afecta a cada posible frecuencia. Que si realza esta banda, que si rechaza esta otra, etc. Cuando hablamos de convolución nos centramos en una descripción más de tipo temporal: qué ecos o réplicas deseamos superponer a una señal. Que ‘forma’ tiene el emborronamiento, la dispersión. Pero son dos caras de una misma realidad. Entendemos con mayor facilidad los ecos de la montaña (tan distantes entre sí) como un patrón de repeticiones espaciadas en el tiempo. Entendemos con mayor facilidad la actuación de un filtro como subir o bajar tales o cuales frecuencias. Pero sería factible describir el eco de la montaña como un filtro (con una respuesta en frecuencia complicada) y sería factible describir un ecualizador en términos de un patrón de rebotes o una forma de emborronamiento que genere ese preciso realce de unas u otras frecuencias.
Si ataco la entrada de un filtro con un impulso (una señal infinitamente corta) y registro lo que se produce a la salida, tengo la ‘respuesta al impulso’, su forma de dispersión. Y esa forma es una huella dactilar del filtro y puedo usarla para recrear el efecto del filtro mediante convolución. Habría que acudir al detalle matemático para demostrarlo, pero creed que hay una relación directa entre cada posible acción de un filtro y su correspondiente respuesta impulsiva.
Obtener la respuesta impulsiva
Volvamos al caso de las montañas o de una sala. Hay formas mucho más precisas de hacerlo, pero si doy una palmada y registro en qué momentos y con qué niveles se producen el sonido original y las sucesivas repeticiones en una sala, tengo esa caracterización realizada. Lo que acabamos de decir es lo que en términos de ingeniería se llama ‘respuesta impulsiva’: qué es lo que sucede en ese sistema cuando la excitación o señal con la que lo ataco es un impulso, un chasquido brevísimo. En lugar de la palmada hay quien prefiere explotar un globo porque se parece más a un impulso ideal.
Nada desconocido para los luthiers, que golpean de forma seca las tablas que formarán el instrumento a fin de localizar su ‘sonido’ y poderlo corregir si es necesario limando y rebajando la madera aquí o allá o bien disponiendo barras u otros elementos adheridos a las tablas que modifiquen sus resonancias naturales.
Es también algo que acostumbro a hacer al entrar a un aula o sala nueva. En silencio doy una palmada y se puede perfectamente ‘oír’ cómo va a colorear el sonido, qué frecuencias se enfatizan, etc. Se puede escuchar cómo cambiará el sonido según dónde ubiques la fuente dando palmadas en diferentes posiciones y localizar frecuencias y puntos críticos propensos a exponerlas.
Para obtener la respuesta impulsiva de un filtro se actuaría de forma parecida, sólo que ahora son la entrada y la salida del filtro los puntos que tomamos como excitación y observación.
Si fuera capaz de generar un sonido infinitamente corto esa medición sería una caracterización perfecta de cómo actúa ese entorno o sistema. Si lo que queremos estudiar es un sistema digital, la cosa está fácil: podemos atacarlo con una señal que sea silencio perfecto salvo en una única muestra. Ya tenemos el impulso ideal (más corto no lo hay en digital).
Si vamos a sistemas analógicos, o a los rebotes en los espacios naturales, intentar aplicar la medición con el impulso ultracorto para obtener la respuesta impulsiva y usarla en un sistema de tipo convolución tiene algunas pegas. Un impulso ultracorto tiene tan poca energía, que, salvo que sea de un nivel descomunal -como una explosión con lo que saturaría y haría inútil cualquier intento de medida- quedaría oculto entre el ruido de fondo y no serviría para medir nada útil. Como un impulso infinitamente corto es en definitiva una entelequia matemática, y un impulso de gran nivel saturaría cualquier sistema, hay otras técnicas que sí pueden emplearse para obtener la respuesta impulsiva.
Un impulso de duración infinitesimal corresponde a un espectro plano, es decir, energía igual en todas las frecuencias. Tiene su gracia que sea a esos efectos tan parecido a un ruido blanco, si no fuera porque el ruido blanco persiste y el impulso dura un infinitésimo.
Gracias a la dualidad entre la representación temporal y la espectral, la respuesta impulsiva (que es una caracterización temporal) puede obtenerse a través de una señal de tipo barrido en frecuencia que tiene también ese carácter ‘blanco’ de visitar todas y cada una de las zonas del espectro. Algo así como ir probando cómo responde el sistema bajo estudio a cada una de las frecuencias, con lo que tenemos la posibilidad de establecer su ‘respuesta en frecuencia’. A partir de ella la transformada de Fourier (o la FFT inversa en la práctica) nos puede devolver la respuesta impulsiva. Cuanto más detallada sea la prueba (cuantas más frecuencias visite) más detallada será la respuesta impulsiva obtenida.
No voy a entrar en los detalles, no estamos en un curso de ingeniería. Pero toda respuesta impulsiva equivale a un filtrado (una respuesta en frecuencia) y viceversa. Cualquier sistema lineal e invariante (y lo son los filtros, ecualizadores, ecos, reverberaciones, etc. cuando no son variables en el tiempo) puede implementarse en forma de convolución y existen formas de obtener su respuesta impulsiva. De hecho algunos productos comerciales de convolución cuentan con rutinas para generar señales de prueba, registrar las respuestas y calcular automáticamente la respuesta impulsiva. Generalmente usan un barrido de tono.
El camino está trazado
La convolución no es magia, es una técnica conocida hace mucho y plenamente madura. La realización digital de la convolución (con una frecuencia de muestreo y precisión en bits suficiente) permite emular con tanta precisión como se desee un sistema que sea lineal e invariante, categoría en la que se encuentran los ecualizadores y filtros fijos (que actúan sin mover su frecuencia, Q u otros parámetros), y todo tipo de ecos y reverberaciones nuevamente fijos (no sometidos a modulación). Por la misma razón, puede modelar también la respuesta en frecuencia (en cuanto a amplitud y fase) de cualquier sistema ya sea un micrófono, un previo, un canal, un altavoz, etc. Con algo de imaginación se le pueden dar otros usos (incluso en síntesis).
Pero todo tiene sus límites. La segunda parte tratará cuestiones más prácticas en relación con el uso de la convolución como su consumo de CPU, formas de usarla ‘razonablemente’, varios usos convencionales y no tanto, o los límites de la convolución a la hora de imitar sistemas y equipos (nunca hay que olvidar que no incluye la respuesta no lineal del sistema emulado).