domingo, febrero 28, 2010

Sistema para la Afinación Automática de Sonidos Polifónicos (I)

Este texto recoge la descripción fundamental del procedimiento ideado para la afinación automática (asistida por computador) de sonidos polifónicos.


Motivación.

Todos conocemos de la existencia de plug-in’s y otros softwares de ordenador que nos permiten afinar en tiempo real o por postprocesado una línea melódica, ya sea voz humana u otro instrumento musical como puede ser una guitarra o un violín. No obstante aún no existe un sistema comercial de afinación polifónica. Pensemos en que en un estudio de grabación se recoge como línea de entrada una secuencia de acordes de guitarra. Por algún avatar del destino, algunos de los acordes están desafinados y no podemos volver a grabar dicha secuencia y, sin embargo, queremos respetarla porque su ausencia provocaría un vacío en la pieza musical. La solución radicaría en la afinación asistida por ordenador del acorde o acordes en cuestión. El sistema que se presenta a continuación vendría a auxiliar en caso de que este problema se diese.

Otra utilidad similar podría venir dada por la necesidad de mejora de afinación en una canción u obra que se desea remasterizar. En muchos casos de remasterización de audio, no se dispone de la disgregación de pistas necesarias como para tratar cada línea por separado. El sistema de afinación de una obra en conjunción vendría de nuevo a auxiliar este problema.


Descripción de la solución.

La clave de la solución ofertada por este sistema radica en el trabajo realizado en el dominio de la frecuencia ya que, de otro modo, a priori resultaría casi imposible la afinación de polifonía en el dominio del tiempo. Mostraremos una aproximación mediante la generación de un acorde ideal bastante limpio únicamente conformado por los tonos fundamentales y sus respectivos armónicos atenuados exponencialmente. Presentamos a continuación el diagrama de bloques, procediendo seguidamente a su desglose y descripción:

Figura 1. Diagrama de bloques del sistema afinador.

El sonido polifónico desafinado debe ser recogido en primera instancia por el bloque Estimador de Tonos Fundamentales. En esta primera etapa se determinan los tonos fundamentales que componen el sonido polifónico mediante el estudio de máximos del espectro. A tal fin, sea el acorde desafinado en el dominio del tiempo el conjunto de N muestras y(n), obtenemos el espectro del mismo mediante la operación de DFT de la forma:

 

Seguidamente trabajamos con el módulo de la transformada pues, recordemos que la información sonora relevante se encuentra en el módulo del espectro y no en la fase. Por tanto, calculamos las muestras del módulo (suponemos ahora mismo por simplicidad que disponemos también de N muestras de la DFT) como:


Una vez calculado habremos de obtener un conjunto representativo de posiciones de las muestras que son máximos. Estos máximos han de corresponderse con los picos de los tonos y armónicos que conforman el acorde desafinado. Como no sabemos, a priori, el número de tonos fundamentales (o no tenemos porqué saberlo), podemos curarnos en salud tomando las posiciones de un conjunto amplio de máximos aunque, con la experiencia, podremos ir adquiriendo un compromiso que maximice la eficiencia de tal modo que el programa cumpla su cometido a la perfección en el menor tiempo posible.

Mediante un algoritmo de recorrido y comparación entre todas las posiciones de los máximos obtenidos, clasificamos los tonos fundamentales y desechamos los armónicos. El desechado de los armónicos se realiza mediante comparación por cociente entre el potencial armónico y el potencial tono fundamental. De este modo, si uno de los máximos se corresponde con un armónico, el cociente, idealmente, debe ser un número natural n. Como puede haber cierta desviación, de nuevo, mediante una base de datos estocástica determinaremos el mejor épsilon que discierna entre un armónico del que no lo es. En principio, épsilon = 0.05, algo más que suficiente.

Una vez estimados todos los tonos fundamentales, la etapa devolverá un vector de tonos fundamentales (los cuales se presuponen desafinados).

A continuación, el bloque Clasificador Lineal se encargará, mediante un sistema de decisión lineal, de determinar cuál es el tono fundamental al cual se debe afinar cada uno de los sonidos componentes de la polifonía desafinada. Esto lo hace linealmente adaptando previamente la escala exponencial frecuencial a una función logarítmica. Recordemos que la percepción auditiva del ser humano no es lineal con la frecuencia, sino que la sensación de linealidad proviene del crecimiento exponencial de la frecuencia. Recurriendo a la siguiente expresión:

 
Donde log(2) hace referencia al logaritmo neperiano de 2. Nos interesa que la función sólo sea dependiente de n, donde n corresponde a la siguiente asociación:

 
Como es lógico, para terminar de caracterizar la nota necesitaremos especificar la octava en la que esta se encuentra, y de ello se encarga la variable o. Podemos dejar expresada la octava, o, en función de la frecuencia como:

 

En consecuencia, la función resulta:


La función anterior resulta en un decisor lineal, de modo que, por redondeo, podremos establecer la nota a la cual, respetando la percepción auditiva, se aproxima más la nota desafinada. Se deduce inmediatamente que si n = 1,2,…,12, la nota componente está perfectamente afinada y no será necesario realizar ninguna afinación por desplazamiento de espectro.

El Estimador de Tonos Fundamentales enviará el vector de tonos al Clasificador Lineal, de tal modo que, por ejemplo, imaginemos que uno de los tonos fundamentales se situase según lo estimado a 450Hz (f = 450Hz). Aplicando la anterior expresión deducida:


Como 0.3891 < 0.5, n = 10 y, por tanto, se correspondería con un La 4 (a 440Hz). Podemos modificar la tabla decisoria de forma que la afinación no se correspondiese con distancias de medio tono, sino que agrupase armonías concretas, siendo ello mera particularización de lo expuesto. Notar también que consideramos un Do# igual a un Reb, aunque ello no sea estrictamente ortodoxo en la práctica.

            El bloque Filtro se encarga de filtrar todo el espectro correspondiente al acorde desafinado de entrada, únicamente respetando las componentes asociadas a cada uno de los tonos, por separado, estimados por el bloque Estimador de Tonos Fundamentales. Realizando esta separación, lo que logramos es simplificar el problema, llevándolo posteriormente a una mera afinación de un sonido aislado por desplazamiento del espectro y finalmente sumando todas las muestras afinadas en el dominio del tiempo reconstruyendo la polifonía ya arreglada.

El filtro se genera para cada caso particular según cada una de las frecuencias estimadas. Este filtro no es más que la superposición en el dominio del tiempo del tono fundamental estimado y todos los armónicos audibles con una dispersión de 2Hz, para tratar de no modificar altamente el timbre del instrumento en cuestión. Aplicando la operación de DFT anteriormente descrita, obtenemos la respuesta del filtro en el dominio de la frecuencia, de modo que la convolución en el dominio del tiempo del filtro con el acorde se transforma en el producto de los espectros del filtro y del acorde, seleccionando así una sola nota de las que componen el sonido polifónico:


Por tanto, este bloque se encargaría de, para cada una de las frecuencias fundamentales estimadas, devolver el espectro de las M notas componentes, donde, en consecuencia, i = 1,2,...,M.

Ahora, con ayuda del Clasificador Lineal, el bloque Afinador por Desplazamiento de Espectro se encargará de afinar cada una de las notas componentes a partir de los espectros proporcionados por el Filtro. Este bloque aprovecha el conocimiento de la frecuencia fundamental estimada y la real o ideal para definir el parámetro alpha = frecuencia ideal/frecuencia estimada.

Aprovechamos la propiedad de escalado temporal de la transformada de Fourier que nos dice:


En consecuencia, cada uno de los espectros devueltos por el Filtro, Xi(k), lo transformaremos en:


Donde los índices de muestas k/alpha se deben redondear al entero más cercano (el prototipo trabaja con una muestra por hertzio, aunque mejoraría mucho su funcionamiento si lo hiciese con una mayor resolución, únicamente escalando los anteriores resultados).

Una vez afinada la nota i-ésima por desplazamiento de espectro componente del sonido polifónico, esta se pasa ya convertida mediante DFT inversa al bloque Buffer Sumador en el Dominio del Tiempo:


Aquí esperan todas las notas componentes hasta que están todas listas, momento en el que son superpuestas para conformar el sonido polifónico ya afinado.

En la próxima entrada colocaré un ejemplo práctico del sistema ideado y presentaré los problemas que aún quedan por solventar.