Despues de comenzar a implementar el diseño inicial del reverberador digital nos hemos topado con algun problema en su implementación. Hemos debido de hacer unos pequeños cambios en el diseño y en la concepción del funcionamiento interno de la estrucutura para solventar los problemas con los que nos habiamos encontrado.
La memoria BRAM:
Cambiamos las señales modificando las entradas y salidas ligeramente. Los nuevos cambios son los siguientes:
Port ( lec_esc : in STD_LOGIC; -- señal de lec/esc . Con '0' leemos, con '1' escribimos
en: in std_logic; -- Señal de habilitación para el funcionamiento de la RAM
clk : in STD_LOGIC; -- Señal de reloj
dato_in : in STD_LOGIC_VECTOR (11 downto 0); -- Dato de entrada en la RAM
dato_out : out STD_LOGIC_VECTOR (11 downto 0) -- Dato de salida de la RAM
);
end BRAM;
Además hemos introducido dos punteros internos en esta estructura que se van incrementando en cada ciclo de reloj. Uno apuntando al primer bloque y el otro a la mitad. Ya que de esta forma será como se implemente la reverberación. Tomaremos una memoria de 10000 posiciones, este numero de posiciones marcara el tiempo de reverberación que le aplicaremos a la señal.
Estamos desarrollando el mezclador que sumará las muestras de la señal y aplicará la atenuación (factor) que debe ser un número mayor que 0 y menor que 1. Esto no es implementable en vhdl asi que debemos tomar una clasificación propia del bus en bits enteros y bits de la parte decimal.
El mezclador suma la señal entrante con la señal atenuada de las muestras anteriores para la creación del efecto de reverberación.
Las siguientes modificaciones serán comentadas y expuestas en el blog en el momento en el que nos topemos con ellas.
8. Cambios en el diseño inicial
domingo, 20 de abril de 2008
Publicado por nute en domingo, abril 20, 2008 0 comentarios
7. Modelando con Matlab
martes, 8 de abril de 2008
He hecho un script en matlab:
[x fs]=wavread('gaita.wav');
Ts=1/fs; %Periodo de muestreo.
a=0.80; %Factor por el que multiplicamos la señal desplazada en el tiempo.
x=x./4; %Disminuyo la amplitud de x para que la salida sea <1. y="x;" muestras="2500;">
%*************** BUCLE REVERBERADOR ****************
for z=muestras:muestras:(length(x)-(muestras-1))
y(z:(z+muestras-1),1)=y(z:(z+muestras-1),1)+ a.*y((z-(muestras-1)):z,1);
y(z:(z+muestras-1),2)=y(z:(z+muestras-1),2)+ a.*y((z-(muestras-1)):z,2);
end;
%***************************************************
%Falta implementar que siga con el sonido reverberante cuando se acaba la %señal hasta que este desaparece. sound(y,fs); %Para escuchar la señal con reverberación.
Este scriptgenera una reverberación a un fichero .wav y nos permite escucharlo.
Después de implementar este script, hemos decidido realizar algunos cambios a las funciones que habíamos calculado. Nuestra memoria RAM tendrá 2500 posiciones (este número depende de el tiempo de reverberación que se quiera implementar, pero como se ve puede apreciar en la rutina de matlab, es una buena opción). Pues bien, iremos metiendo muestras en esas 2500 posiciones hasta llenarla. Una vez realizado esto, la muestra 2500 (la primera guardada) la multiplicamos por nuestro factor (en la rutina de matlab a=0.8) y lo sumamos a la muestra entrante, mandando el resultado a la salida y guardándolo en la posición 0. Generando así un bucle mientras tengamos entrada.
Publicado por Adriel en martes, abril 08, 2008 0 comentarios
6. Diagrama de flujo
domingo, 6 de abril de 2008
Para poder empezar a programar nuestro proyrcto en VHDL, siempre ayuda mucho realizar un diagrama de flujo (lo creo imprescindible). Un diagrama de flujo representaría a nivel algorítmico el funcionamiento de lo que estemos describiendo. En nuestro caso quedaría así:
Tengo que añadir una pequeña descripción sobre el último recuadro que llamé "Desplazamiento hacia abajo de los valores de la RAM". Se pretende que el resultado de la suma de las muestras sea así: sum(a^i*pos(i)) siendo a el factor por el que iremos reduciendo las muestras, i toma valores entre 0 y n (son la posición mínima de la memora y la máxima) y pos(i) representaría el valor de la posición de memoria i. De este modo, después de realizar el sumatorio, los valores pasan a estar una posición más para que el nuevo dato entre en la posición 0.
Publicado por Adriel en domingo, abril 06, 2008 0 comentarios
5. Esquema de diseño principal
domingo, 16 de marzo de 2008
En primer lugar, para la implementación del reverberador seguiremos el esquema de generaración de la reverberación más simple pudiendo ser modificado y aumentado más adelante. Los esquemas más complejos de reverberación son montados encima de este esquema inicial, con lo cual si más adelante ampliamos la complejidad no tendremos problemas de diseño puesto que este será incremental. El esquema básico de reverberación:
La UC (Unidad de Control), se trata de una máquina de estados que será la que gobernará el circuito. Mediante la señal de "control" (no especificamos si la señal de control será de tipo bus ni su anchura hasta la implementación en circuito) y la señal "estados" que marcará en que estado se encuentra el dispositivo, conseguiremos la correcta sincronización de las órdenes en cada momento. La UC tendrá los siguientes estados :
1. Inicialización: se reseteará el circuito entero y se inicializará la memoria.
2. Funcionamiento: en el cual la señal de entrada sufrirá el algoritmo de revereberación y saldrá reverberada. El algoritmo de reverberación:
señal_salida(0) = señal_entrada(0),
señal_salida(t) = señal_entrada(t) + retardo, si t>0
siendo: retardo = señal_entrada(t-1)*A
El producto se efectuará desde la muestra primera hasta la penúltima con la atenuación A. Un pequeño ejemplo:
retardo(3) = A^3*señal(0)+A^2*señal(1)+A*señal(2) =>
señal_salida(3) = señal(3) + A*señal(2) + A^2*señal(1) + A^3*señal(0)
sea señal = señal_entrada
Definiremos más adelante el número de muestras de la señal anterior que guardamos en memoria. En principio guardaremos n>40 muestras, guardando la muestra 41 en la posición de la muestra 0.
3. Desconexión: La señal de entrada acaba y el circuito para de funcionar.
El AC97 es el circuito de recepción y emisión de la señal, posee ya integrados unos convertidos A/D para la entrada y D/A para la salida. La señal data_in es una señal que nos marcará la amplitud en ese instante y saldrá bit a bit debiendo ser guardada y enviada a modo de bus por el recibe señal.
La gráfica más detallada del bloque aritmético:El bloque recibe señal y el bloque envía señal están intimamente relacionados con el AC97 y seu forma de enviar la señal, cogeremos 18 muestras de las que salgan del AC97 y las trataremos a modo de bus y en salida cogeremos el bus y lo enviaremos bit a bit.
El Bloque de Decodificación se encarga de gobernar el algoritmo, marcando en que lugar deben ser guardadas las muestras dentro de la BRAM y en que orden deben salir las muestras para ir al generador de retardo.
El bloque generador de retardo crea el retardo de la señal y se la suma a la señal de entrada. En el debe estar especificado la atenuación. Deberemos calcular que factor de atenuación que usaremos en el circuito para que la señal no se atenúe ni demasiado rápido ni que no se aprecie este efecto.
La memoria BRAM almacenará las muestras de la señal en los instantes de tiempo.
Publicado por nute en domingo, marzo 16, 2008 0 comentarios
4. Primer esbozo
lunes, 10 de marzo de 2008
Paso a describir un primer esbozo genérico (una primera idea) de lo que será nuestro sistema digital.
Mediante el AC97 CODEC descrito anteriormente muestrearemos el audio con una precisión de 18 bits por muestra (trabajaremos siempre con este número de bits). A estas muestras las pasaremos a la salida, sumándole a sí misma retardada y atenuada.
Para lograr esto, programaremos en VHDL una unidad de control (máquina de estados) que organice los procesos adecuadamente. Junto con esta, utilizaremos un conjunto de circuitos que se encarguen de ejecutar las acciones mandadas por la UC.
Un esquema un poco más preciso a nivel de señal sería asi:
En un principio empezaremos implementando sólo el efector de reverb, guardándonos la posibilidad de aplicar más efectos dependiendo de la complejidad que vayamos encontrando a la hora de desarrollarlo.
Publicado por Adriel en lunes, marzo 10, 2008 0 comentarios
3. Periféricos a Utilizar
viernes, 7 de marzo de 2008
Para realizar nuestro reverberador digital, utilizaremos un FPGA, concretamente la Virtex II Pro de Xilinx, junto con una placa de desarrollo de la misma compañía, la XUPV2P. Esta placa tiene el AC97 audio codec que la provee de todasl las funcionalidades de audio analógicas que podría tener un ordenador.
- Rango dinámico de más de 90 dB.
- Arquitectura de conversión de 18-bit.
- 18-bit full-duplex, estereo CODEC.
- 4 entradas analógicas estereo (una de ellas utilizada para conectarse con el fpga).
- 2 salidas analógicas estereo.
- Entrada mono para micrófono.
- Muestreo full-duplex variable de 4 khz a 48khz, incrementable en 1 hz.
- Control de volumen de entrada con una ganancia máxima de 12 dB.
Este controlador se conecta al fpga mediante 4 conexiones:
Publicado por Adriel en viernes, marzo 07, 2008 0 comentarios
2. Aplicaciones
domingo, 2 de marzo de 2008
La principal aplicación de un reverberador digital es la creación de efectos dentro de un sistema digital de audio. En un sistema digital para procesamiento de señal de audio y por lo tanto para un reverberador digital, los efectos básicos creados por él son:
- Reverb
- Early Reflections
- Room Simulator
- Echo+Rev
- Early Reflections+Rev
- Chorus+Rev, Symphonic+Rev
- Flange+Rev
- Pitch Change+Rev
- Pan+Rev
Una pequeña explicación de los fenómenos básicos:
El Chorus es el nombre que recibe un efecto de sonido usado en la interpretación o composición musical. El Chorus resulta de mezclar una señal con vibrato con la señal sin procesar. El resultado es similar al de un par de instrumentos que tocan al unísono de modo tal que uno de ellos se desafine ligeramente. Técnicamente se trata de un sistema que retarda la señal aplicando despúes un amplificador/atenuador. La salida es la suma de la señal retardada y amplificada a la señal original.
El Eco es un fenómeno relacionado con la reflexión del sonido. La señal acústica original se ha extinguido, pero aún devuelve sonido en forma de onda reflejada. Se consigue un eco acústico en un sistema digital mediante un sistema de realimentación que retarda la señal le aplica una ganancia y la suma a la señal inicial.
El Flanger es el efecto de sonido que produce un sonido metalizado oscilante sobre todo en frecuencias medias y altas. El efecto flanger se obtiene duplicando la onda sonora original, una de las ondas se mantiene limpia de procesado, la segunda se desfasa moduladamente aumentando o disminuyendo su retraso con una oscilación determinada.
Los controles habituales en los módulos de procesado flanger son los siguientes:
Retraso: Es el umbral máximo de desfase de la onda duplicada respecto a la original, se suele expresar en milisegundos.
Frecuencia: Es la frecuencia de oscilación del desfase de la onda duplicada.
Profundidad: Es la cantidad de onda original que se mezcla con la duplicada.
Los módulos de procesado flanger pueden ser tanto analógicos como digitales, además de software
Phaser, este efecto está comprendido dentro de los que se obtienen modulando un filtro. En este caso se trata de un filtro pasa banda de alto Q .
El Delay es un fecto de sonido que consiste en la multiplicación y retraso modulado de una señal sonora. Una vez procesada la señal se mezcla con la original. El resultado es el clásico efecto de eco sonoro.
En cualquier módulo de delay sencillo se pueden encontrar los siguientes parámetros de control:
Retraso: Es el tiempo que tarda en producirse un eco, suele medirse en milisegundos o estar sincronizado con un tempo.
Feedback o retroalimentación: Es la cantidad de veces que se repite la señal sonora pudiendo ser cualquier valor entre una e infinito.
Mezcla: Es la cantidad de sonido retrasado que se mezcla con el original.
Estos son los parámetros básicos de cualquier módulo de delay, pero no son los únicos posibles. En módulos más avanzados se pueden encontrar controles como la caída de frecuencias en el tiempo, ajustar varios ecos diferentes, sincronización MIDI, filtrado de frecuencias.
Delay síncrono o sincrónico: delay cuyo retardo es una fracción entera del tempo, existiendo delays a blancas, negras, corcheas, semicorcheas, etc.
Existen multitud de modelos diferentes de delay, tanto en forma de módulo analógico, como en forma de módulo digital, pero la mayor creatividad se encuentra en los módulos de delay software disponibles para diversas plataformas (VST, DX, RTAS, AudioUnit ...)
Unos ejemplos de reverberadores digitales de audio Yamaha:
www.ispmusica.com/paginas/yamaha/PDF/Procesadores%20Rev500.pdf
www.ispmusica.com/paginas/yamaha/PDF/Procesadores%20ProR3.pdf
Otro reverberador digital Yamaha (con más información):
Publicado por nute en domingo, marzo 02, 2008 1 comentarios