sábado, 24 de mayo de 2008

Actualización (¡por fin!)

En primer lugar, sentimos no haber actualizado el blog, pero es que realmente poco había que actualizar. Estas semanas han estado llenas de pruebas sin éxito del sistema. Hemos tenido que cambiar por completo el diseño inicial del modulador, ya que estaba mal planteado (en un post posterior pondremos el diseño definitivo del sistema completo) ya que en un principio creimos que al DDS se le pasaba la fase instantánea (a una entrada llamada "phase accumulator"), pero no, se le pasa la frecuencia instantánea, con lo que tuvimos que modificar los cálculos como se verá en el diseño definitivo.

A nivel interfaces de usuario, hemos reutilizado dos modelos vhdl disponibles en internet:
  • Para el teclado PS/2, la interfaz disponible en la web de logica programable del Departamento de Tecnología Electrónica de la Universidad de Vigo.
  • Para trabajar con el codec de audio AC97, extrajimos un modelo VHDL de uno de los modelos de ejemplo (concretamente el XUPV2P Demonstration Design) que hay disponibles en la web de Xilinx, para la placa de desarrollo que usamos (la XUPV2P). En el ejemplo se extrae audio de la entrada de línea, se procesa por un banco de filtros y se saca por una pantalla VGA su espectro, además de sacar la señal procesada por la salida pre-amplificada de la placa. Nosotros cogimos la parte de audio que extrae el canal izquierdo de la entrada Line In y lo saca por el canal izquierdo de la salida Amp Out.
Nuestro sistema trabaja finalmente a 48 KHz (coincide con la frecuencia de muestreo, pero no pasa nada ya que el retardo que introduce nuestro sistema, al carecer de filtros es de unos pocos ciclos, imperceptible para el ser humano), reloj que extraemos del reloj HW del codec que incorpora la placa, a partir de un divisor por 256.

A nivel pruebas realizadas, hemos comprobado que la interfaz para el codec de audio funciona y se adapta a nuestros requerimientos. Usar el codec también para la salida, va a limitar nuestro sistema, ya que la salida apenas llega a los 20 Khz, por lo que la frecuencia central de la modulación tendrá que ser inferior (algo que no ocurre en los sistemas reales de FM, pero como nuestro propósito final es el hacer un sintetizador de audio, consideramos irrelevante esta limitación).

Una vez cambiado el diseño del modulador, decidimos probarlo por separado, primero le conectamos un DDS a frecuencia fija, es decir un tono (que se generaba dentro del sistema, por lo que no usabamos la entrada de audio), con valores fijos para los parámetros de FM, y tras varias horas de pequeñas modificaciones, ajustes de cableado -esto nos da muchos problemas- y ajustes de los parámetros de los DDS, conseguimos que funcionase (en otro post explicaremos como comprobamos que el sistema es correcto). Luego quitamos el generador de seno a frecuencia fija y usamos la entrada de audio. A ella conectamos un generador de funciones, y tras algunos problemas de ajuste del cableado, conseguimos que funcionase también. Aquí tuvimos ciertos problemas, ya que la interfaz de audio proporciona muestras PCM de 16 bits y nosotros sólo usamos 8 bits + 1 de signo, y tras algunas pruebas decidimos quedarnos con los 9 bits más significativos (8 + el de signo). Todo esto fue la semana pasada.

Tras conseguir el primer objetivo, le añadimos la interfaz del teclado, para poder variar los parámetros de la modulación. Otra vez problemas con el cableado, lo que nos llevo a muchos engaños y a volver a repetir las pruebas del teclado, porque veiamos el ruido que entrada por el codec modulado y nos engañaba ya que salía un pico centrado en una frecuencia distinta a la central. Finalmente, tras varias horas conseguimos solucionarlo.

Una vez conseguida la práctica básica introdujimos en el sistema todo lo necesario (tras los debidos cambios en el diseño) para poner en marcha el sintetizador FM. Ampliamos la interfaz del teclado para poder usarlo como un teclado de 2 octavas y poder elegir instrumento, añadimos los bloques necesarios para las nuevas operaciones (multiplicadores, retardos, una unidad de control...) y usando un script de matlab diseñamos la memoria que contiene las envolventes de amplitud e índice de modulación de los instrumentos:
En la figura, si nos fijamos una de las envolventes dura 15 segundos (la exponencial, que se corresponde al instrumento campana), eso ocuparía 15 s * 48000 muestras / segundo = 720000 muestras x 8 bits/muestra = 5760 Kbits, lo cual excedería por completo las limitaciones de memoria de la FPGA. Para solucionarlo, lo que hacemos es simplemente guardar una muestra de cada X muestras (en función del pendiente máxima de la función y aprovechando que la resolución esta limitada por los 8 bits) y repetirla, con lo que ahorramos mucha memoria, en el caso del ejemplo la reducimos hasta aproximadamente 8 Kbits.

La carga del sistema ha crecido mucho con la incorporación de todos estos circuitos, y estamos ocupando casi el 40% de los recursos de la FPGA, las primeras pruebas han arrojado unos sonidos nada parecidos a los prometidos por Chowning. Esto nos ha llevado a ponernos otra vez delante del diseño y del artículo de Chowning, y hemos llegado a la conclusión de que hay que modificar el modulador FM original, para poder producir lo que el llama "Reflected Side frecuencies", que son aquellas componentes que salen en el espectro audible al emitir sinusoides de frecuencia negativa (el espectro negativo no tiene sentido fisico, pero al implementarlo, por aliasing las frecuencias del espectro negativo se ven reflejadas con fase invertida en el espectro positivo y audible), que son las que dan la riqueza a los sonidos FM. Para que se de la necesidad de emitir este tipo de señales se tiene que cumplir que la frecuencia de la moduladora sea mas grande que la de la portada (en términos generales, no es la condición exacta, ya que influyen otros parámetros como el índice de modulación o la propia amplitud de la señal, pero es para que se entienda -en la documentación final pondremos una explicación más concreta-). Esto nunca se daría en una modulación, cuyo objetivo es la comunicación, porque en esos casos el aliasing es claramente un problema. Pero en síntesis donde lo que importa es lo bien que suene, la distorsión y el ruido suelen ser buenos. Por esta razón debemos modificar el modulador original para que funcione en ese caso... ¡Y a cruzar las orejas!

No hay comentarios: