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