martes, 27 de mayo de 2008
Interfaz teclado (lo prometido es deuda)
En el último post se hacía referencia a que en breves pondríamos una descripción más exhaustiva de la interfaz de teclado, y aquí estamos.
Inicialmente vamos a explicar el uso que le vamos a dar el teclado en nuestro proyecto, para posteriormente indagar más en este bloque así como las entradas y salidas de dicha interfaz.
Nuestro sistema como ya se ha mencionado en múltiples ocasiones tiene la capacidad de funcionar tanto como modulador fm de cualquier tipo de señal, así como un sintetizador fm. La posibilidad de operar en distintos modos, nos obliga a darle distintas funcionalidades a las teclas dependiendo del modo, así como la necesidad de definir una tecla para conmutar el modo (se usará BLOQ MAYUS):
Modo Modulador
Este modo nos va a permitir cambiar los valores de la frecuencia central de la modulación, así como los valores de la beta. La variación de estos parámetros nos va a permitir definir distintos tipos de modulación para una misma señal de entrada.
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjM9G8Ucb0AJavGkBJs_eapacV059hMvIFitEc5fHPOwi360e3rXPsRGVFNqV20yWLj9GJ2dIvtDth4ohArMQ8Va0p0B-JHWqu54h-VBvNlX3w7lBmBWwwtM3UzhZ_99r1Dh9bT5_Gsc7s/s400/MODULADOR.GIF)
En esta imagen del teclado podemos ver las teclas útiles en el modo modulador.
- BLOQ MAYUS: como ya se dijo es la tecla que nos va a permitir cambiar a modo sintetizador.
- Teclas Función: son las que nos permiten elegir la frecuencia central de la modulación (fc).
- F1: 6Khz
- F2: 7Khz
- F3: 8Khz
- F4: 9 Khz
- F5: 10Khz
- F6: 11Khz
- F7: 12Khz
- F8: 13 Khz
- F9: 14 Khz
- F10: tecla especial que nos permite poner la salida a cero.
- Teclas Numericas: nos permiten seleccionar un conjunto de valores para beta
- 1: beta=1
- 2: beta=2
- 3: beta=3
- 4: beta=4
- 5: beta=5
- 6: beta=6
- 7: beta=7
- 8: beta=8
- 9: beta=9
Modo Sintentizador
En este modo pretendemos usar las teclas del teclado para definir dos octavas de la escala musical, así como un conjunto de teclas que nos permita cambiar el instrumento que vayamos a sintetizar.
En esta imagen del teclado podemos ver las teclas útiles en el modo sintetizador.
- BLOQ MAYUS: esta tecla mantiene la funcionalidad de cambiar de modo, en este caso para pasar a modo modulador.
- Teclas Función: nos permiten seleccionar el instrumento que queremos sintetizar.
- F1: brass-like.
- F2: fagot.
- F3: campana.
- F4: tambor.
- Teclas Verdes: son la octava inferior del instrumento.
- Teclas Azules: son la octava superior del instrumento.
- Z y Q: Do
- S y 2: Do#
- X y W: Re
- D y 3: Re#
- C y E: Mi
- V y R: Fa
- G y 5: Fa#
- B y T: Sol
- H y 6: Sol#
- N y Y: La
- J y 7: La#
- M y U: Si
Una vez explicadas las funcionalidades del teclado en nuestro proyecto y más especialmente en cada uno de los modos de operación. Vamos a centarnos en el aspecto más técnico de la interfaz apoyándonos en el esquema:
- Salidas:
- Tecla, tecla_antes, valido y nota: son señales auxiliares muy útiles para conocer los posibles estados de la máquina de estados de la unidad de control, así como para verificar condiciones de tránsitos entre los estados de la misma.
- tecla: se activa si se recibe una nueva tecla por teclado.
- tecla_antes: se activa si se recibió una nueva tecla en el último flanco de reloj.
- valido: activo si la última tecla pulsada fue una tecla de las válidas en modo sintetizador.
- nota: activo si la útlima tecla pulsada fue una nota, estando en modo sintetizador.
- Instrumento: 15 bits que nos permiten definir a cada uno de los instrumentos. De estos bits, los 2 más significativos nos indican el instrumento que es (de los 4 posibles) mientras que los 13 bits restantes nos indican la posición de memoria donde empiezan las muestras de dicho instrumento.
- Beta: nos devuelve el valor de la beta cuando operamos en modo modulador.
- Fc: esta salida son 15 bits y hay que diferenciar si estamos en modo modulador, en cuyo caso devuelve ya la frecuencia central de la modulación, o si por contra estamos en modo sintetizador. En este último modo de operación lo devuelto por la interfaz de teclado es un código numérico indicándonos la nota pulsada y también si dicha nota pertenece a la octava inferior o a la octava superior del instrumento que se está sintetizando (octava inferior: desde "00001" hasta "01100" y octava superior: desde "10001" hasta "11100")
- Entradas:
- Reset: inicializa los valores de salida.
- Clk: reloj del sistema.
- Clk_teclado: es una entrada para el reloj del teclado, que necesita una frecuencia mayor que los 48khz que estamos utilizando nosotros para nuestro sistema.
- Kbdata y Kbclk: son las entradas propias del teclado y que nos van a permitir capturar los códigos scan de las teclas pulsadas.
sábado, 24 de mayo de 2008
Diseño del Sistema
A continuación se muestra como quedaría el sistema tras el error que como ya se dijo encontramos en el diseño inicial de nuestro modulador. Aunque la mayor parte del sistema permanece inalterada (el cambio fue principalmente en el bloque de modulador) aprovechamos para detallar más el sistema completo y hacer una breve descripción de cada uno de sus bloques así como una mayor indagación con otros diagramas de apoyo para explicar con mayor claridad cada una de las partes.
En primer lugar vamos a mostrar el diseño general del sistema, mostrando en él los bloques más importantes así como la interconexión entre ellos. Hacer notar que el sistema es completamente síncrono y que por esta razón obviamos la presencia del reloj (clk) en los bloques.
En primer lugar vamos a mostrar el diseño general del sistema, mostrando en él los bloques más importantes así como la interconexión entre ellos. Hacer notar que el sistema es completamente síncrono y que por esta razón obviamos la presencia del reloj (clk) en los bloques.
Los bloques que podemos observar son los siguientes:
- Modulador.
- Calcula entradas modulador.
- Interfaz teclado.
- ROM instrumentos.
- ROM envolventes.
- Unidad control.
- Modulador amplitud.
- Controlador códec
Modulador
Este bloque es el pilar base de nuestro sistema y junto a la interfaz del teclado y el códec de audio forman la práctica básica. Como se dijo en el último post, tras mucho tiempo de pruebas sin éxito, tuvimos que rehacer todo este bloque, al comprender mal lo que había que pasarle al DDS. Este es el diseño definitivo del modulador:
Vemos que la estructura interna del bloque es distinta, sin embargo, la interfaz del bloque no cambió respecto al diseño inicial:
- Entradas:
- fc: 15 bits sin signo.
- fm: 15 bits sin signo.
- beta: 8 bits sin signo de los cuales los 4 menos significativos son decimales.
- señal: 8 bits decimales más un bit de signo.
- Salida:
- salida: 9 bits con signo que representan ya nuestra señal modulada.
Los multiplicadores y el sumador son síncronos. El bloque de "Mover frecuencias negativas" es un bloque cuya función sólo va a servir en caso de tener a nuestro sistema funcionando como sintetizador. La misión de este bloque es la de generar las "Reflected Side frecuencies" (de las que se habló en el último post) básicamente lo que se hace, es que a aquellas frecuencias que llegan a este bloque como negativas, las hacemos aparecer en el espectro positivo con la fase invertida.
Calcula entradas modulador
Este bloque es el encargado de obtener los parámetros de entrada del modulador, tanto para el caso de que nuestro sistema esté funcionando como modulador, como para el caso en el que esté funcionando como sintetizador. Para ello tendrá que hacer los cálculos oportunos para cada una de las situaciones y después hacer una multiplexación de las dos posibles salidas hacia las entradas del modulador. Aquí observamos el diagrama de este bloque, el cual pasaremos a comentar justo a continuación:
- Entradas:
- Instrumento: 2 bits sin signos que determinan el instrumento seleccionado en modo sintetizador.
- Sintetizador: 1 bit determina el modo de funcionamiento (modulador o sintetizador).
- fc teclado: 15 bits sin signo.
- m/c: 8 bits sin signo de los cuales 7 representan decimales.
- beta teclado: 8 bits sin signo de los cuales 4 representan decimales.
- max_I: 8 bits sin signo de los cuales 4 representan decimales.
- I(t): 8 bits decimales sin signo.
- señal codec: 8 bits decimales más un bit de signo.
- Salida:
- fc: 15 bits sin signo.
- fm: 15 bits sin signo
- beta: 8 bits sin signo de los cuales 4 representan decimales.
- señal: 8 bits decimales más un bit de signo.
Queremos resaltar un pequeño detalle de la señal instrumento antes de que os pueda resultar extraño en la descripción del resto de bloques. La dimension del instrumento que capturamos del teclado es de 15 bits, sin embargo realmente se pueden diferenciar los dos primeros bits de instrumento que nos indican el instrumento en concreto que vamos a sintetizar, mientras que los 13 siguiente nos indican la dirección de memoria a partir de la cual se encuentran las muestras de dicho instrumento.
Interfaz teclado
Bloque que nos permite obtener la tecla pulsada en un teclado PS/2 e interpretarla según los intereses de nuestro sistema y el modo de funcionamiento. En una publicación posterior se explicará con más detalle el modo de uso de dicho teclado y las teclas útiles para nuestro sistema.
De este bloque sale la señal instrumento con sus 15 bits como se comentó antes y la señal sintetizador que indica si nuestro sistema está trabajando como modulador o como sintetizador.
Esta interfaz como se comentó en el último post está basada en la interfaz disponible en la web de logica programable del Departamento de Tecnología Electrónica de la Universidad de Vigo.
De este bloque sale la señal instrumento con sus 15 bits como se comentó antes y la señal sintetizador que indica si nuestro sistema está trabajando como modulador o como sintetizador.
Esta interfaz como se comentó en el último post está basada en la interfaz disponible en la web de logica programable del Departamento de Tecnología Electrónica de la Universidad de Vigo.
ROM instrumentos
-> m/c: nos permite conocer la relación entre fm y fc del instrumento.
-> max_I: es el máximo valor que adquiere la beta para el instrumento.
-> duración: es la longitud en muestras de cada una de las notas del instrumento.
-> repetición: es el número de veces que se repite cada una de las muestras. Como se comentó ya con anterioridad, esto se hace para ahorrar espacio evitando guardar muestras casi iguales.
Se trata de una memoria ROM que consta únicamente de cuatro registros, uno para cada uno de los instrumentos que sintetiza nuestro sistema: trompeta, fagot, campana y tambor. Cada uno de estos registros consta de 46 bits y como se podía apreciar en el esquema principal cada uno de ellos está formado por cuatro campos distintos:
-> max_I: es el máximo valor que adquiere la beta para el instrumento.
-> duración: es la longitud en muestras de cada una de las notas del instrumento.
-> repetición: es el número de veces que se repite cada una de las muestras. Como se comentó ya con anterioridad, esto se hace para ahorrar espacio evitando guardar muestras casi iguales.
ROM envolventes
Memoria ROM en la cual se almacenan todas las muestras de los cuatro instrumentos. Cada una de las muestras es de 8 bits.
Unidad de control
Máquina de estados cuya misión es la de mantener un puntero a la ROM de envolventes apuntando en cada instante a la dirección que corresponda atendiendo a la duración, y a la repetición de las muestras de cada uno de los instrumentos. Una explicación más exhaustiva de dicha máquina de estados se podrá obtener en la documentación del proyecto.
Modulador Amplitud
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhaqwsiKETsG6MFNTUKERb2TysJzPHDFMqFLZee8DNKbaVt5djevq0zmAN1ZEHIGZpCZZM377N1HniUrNSwA_uJROrr6TREDuXR4gOah_PhUruL5LiquurPIIB369jpoKLxWOcQmQlJbyI/s400/Gr%C3%A1fico1.GIF)
Este bloque es el encargado de modular en amplitud la señal una vez modulada en frecuencia. Esto sólo es necesario en caso de estar sintetizando, con lo que si estamos trabajando en modo modulador no tendremos que modular la amplitud. El diagrama de este bloque es el siguiente:
Podemos apreciar que en caso de estar funcionando nuestro sistema como modulador la señal se ve multiplicada por un 1. Este bloque incluye un retardo que nos va a permitir sincronizar la muestra de la memoria que usaremos para modular la amplitud, con la muestra de la señal modulada en frecuencia correspondiente.
Controlador codec
Este bloque nos permite trabajar con la entrada y salida de audio, está basado en un modelo de xilinx. Como entrada podemos utilizar todo tipo de audio, sin embargo, nosotros usamos por regla general un generador de señales que nos permite hacer pruebas más concretas y de lo cual se puede saber si los resultados obtenidos son correctos. Por otra parte, la salida de audio, en caso de estar funcionando el sistema como modulador, va conectada a un osciloscopio con el fin de ver exactamente las señales moduladas, sin embargo, cuando el sistema esté funcionando como modulador es preferible conectarle un altavoz, o unos cascos.
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:
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!
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.
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:
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNYWlgDGvawQES_5iWeNtUEV9ep1kuCQ4WXmWrUOr3w4dK2VFNBJU5G3ZfIieACAmnxKvku9pa1sippftjXm9L3-UuF_QVTSojz08iKquEUWHhEh-Yi-W_8yqS8pNELEGC6XyeGICgekQ/s400/envelopes.jpg)
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!
Suscribirse a:
Entradas (Atom)