Laboratorio de Procesado Digital de Señal (Curso 2005/2006) PRACTICA 3 Diezmado e Interpolación A. Entorno MATLAB 1. Cargue la señal v1.wav del directorio de trabajo en un vector x, visualícela y reprodúzcala a la frecuencia de muestreo con que fue grabada. 2. Puede visualizar el contenido en frecuencia de esta señal en función del tiempo con la instrucción specgram(x). El eje vertical son las frecuencias discretas normalizadas entre 0 y 1 (al proceder de muestreo se corresponde con las frecuencias analógicas 0 y fs/2), y el eje horizontal equivale a tiempo (cada muestra es una ventana de análisis espectral). 3. Para ver el espectro promedio, podemos promediar este espectrograma de la siguiente forma: >> P = mean(abs(specgram(x)’)); OJO: no olvidar poner la ‘ para que promedie frecuencias (en horizontal) y no muestras (en vertical). Dibujando P (plot(P)) vemos el espectro promedio de esta señal de voz. • INTERPOLACIÓN 4. Para realizar una interpolación de orden 3, primero debemos introducir 2 ceros entre cada dos muestras. Genere en un vector z la señal que contiene cada 3 muestras las muestras de x, con dos ceros intermedios. 5. Escuche la nueva señal z con la nueva frecuencia de muestreo: sound(z,24000); La distorsión que se escucha se debe a los ceros intermedios. Compruebe el aspecto de un mismo tramo de 10 milisegundos en ambas señales dibujando con la función stem (OJO: las frecuencias de muestreo son diferentes). 6. El efecto introducido en frecuencia consiste en repeticiones del espectro original entre -π y π, que ahora aparece entre -π/3 y π/3 y sus repeticiones. Represente el espectro promedio de la señal z como se hizo en el apartado 3, asegurándose de comprender plenamente la figura representada. 7. Para obtener finalmente la señal interpolada correctamente, debemos por tanto filtrar para evitar las repeticiones de la señal banda base. La frecuencia de corte del filtro ideal sería π/3 (frecuencia normalizada 1/3=0.3333…). Como trabajamos con filtros reales, elegimos frecuencia de corte normalizada 0.3. Para filtrar, usaremos la función filter, donde pondremos a=1 (filtroFIR), y calculamos b con la función fir1, con frecuencia normalizada 0.3 y orden N a elegir. Dpto. Ingeniería Audiovisual y Comunicaciones, EUITT-UPM. - P3.1 - Laboratorio de Procesado Digital de Señal (Curso 2005/2006) Seleccione un orden del filtro que permite evitar la presencia de repeticiones espectrales, lo que se comprueba escuchando la señal filtrada y viendo su espectro promedio. Para compensar la pérdida de energía, multiplique a la señal resultante por 3 (factor de interpolación). 8. Compruebe nuevamente el mismo tramo de 10 ms. con las tres señales (original, con ceros intermedios, y la interpolada). • DIEZMADO 9. Vamos a realizar ahora un diezmado de la señal interpolada por un factor 10. En primer lugar lo haremos de forma incorrecta, es decir, eliminaremos directamente 9 de cada 10 muestras sin realizar previamente el prefiltrado a π/10. 10. Para evitar la distorsión en forma de voz “metálica” que aparece, debida al aliasing, vamos a realizar primero un prefiltrado a π/10 (frecuencia normalizada 1/10). Nuevamente, elegimos la frecuencia de corte ligeramente inferior y de valor 0.09. Elija nuevamente el orden correcto del filtro para evitar aliasing al diezmar. Compruebe que la selección es correcta escuchando nuevamente el fichero diezmado (después de filtrar) y observando los espectros promedios de la señal interpolada de partida, xi, la señal prefiltrada, xif, y la señal diezmada, xifd. 11. Represente ahora el mismo tramo de 10 milisegundos de las señales original, interpolada y diezmada. Dpto. Ingeniería Audiovisual y Comunicaciones, EUITT-UPM. - P3.2 - Laboratorio de Procesado Digital de Señal (Curso 2005/2006) B. Entorno Tarjeta de Procesado EZ-KIT Lite • ALIASING PRODUCIDO POR DIEZMADO En este ejercicio vamos a comprobar el aliasing espectral que se produce en una secuencia cuando se reduce M veces su frecuencia de muestreo sin haber realizado previamente un filtrado paso bajo. El fichero donde está implementado el código se encuentra en: \Mi PC\Documentos compartidos\Laboratorio PDS-TDS\ Ficheros de la tarjeta EZ-Kit Lite\DNSAMPLE.DSP Cópielo, antes de usar, a su directorio de trabajo. Dpto. Ingeniería Audiovisual y Comunicaciones, EUITT-UPM. - P3.3 - Laboratorio de Procesado Digital de Señal (Curso 2005/2006) El diezmado se lleva a cabo multiplicando las secuencias de entrada (canal L y canal R del codec AD1847) por un tren de impulsos de periodo M, es decir, una muestra de valor unitario (0x7fff) seguida de M-1 muestras nulas. La secuencia resultante es por tanto la secuencia z(n), tal como fue definida en el libro de apuntes de la asignatura (véase el mismo las características de esta secuencia). Es decir, la nueva secuencia de salida re-muestreada será: z(n) = x(n)s(n). La secuencia de salida z(n) solo conserva una muestra de cada M de la entrada x(n). Por tanto, el periodo de muestreo se incrementa M veces y, por consiguiente, la frecuencia de muestreo se reduce M veces. f 's = 1 1 1 = = fs T ' MT M El aliasing será tanto más audible cuanto mayor sea M. Este solapamiento será producido por aquellas componentes espectrales de la señal de entrada superiores a la frecuencia Nyquist (fs’/2). Dpto. Ingeniería Audiovisual y Comunicaciones, EUITT-UPM. - P3.4 - Laboratorio de Procesado Digital de Señal (Curso 2005/2006) En el código DNSAMPLE.DSP se utiliza un solo periodo de s(n). Este periodo se encuentra almacenado en un buffer circular denominado s de M registros de memoria, cuyos valores han sido inicializados a [1, 0, 0, -----, 0]. Téngase en cuenta que el valor unitario es realmente el valor máximo positivo representable en un registro de 16 bits, es decir, 0x7fff (expresión en hexadecimal). Al principio del programa, antes de que se empiecen a recoger muestras del codec para ser procesadas, es necesario inicializar este buffer con las siguientes instrucciones: La primera instrucción define la constante M de diezmado, que también nos servirá para inicializar la longitud del buffer (array) en la siguiente instrucción. La sentencia: .var/dm/cir s[M]; nos reserva una variable (var) en la memoria de datos del procesador (dm) y con acceso circular (circ), siendo el nombre de la variable s. En s(0) está el primer dato, en s(1) el segundo, y así sucesivamente hasta llegar al último, es decir, hasta s(M-1). A los datos de un buffer se accede mediante tres registros: I, L, M. El registro I es el registro índice o puntero, en el registro L se almacena la longitud del buffer y el registro M almacena el paso incremental del registro índice (I). Existen 8 juegos de registros (I, L, M) disponibles en el procesador para trabajar con otros tantos buffers, numerados del 0 al 7. Consulte el manual de Orfanidis para más ver un estudio más detallado de su operativa. En la figura siguiente, se muestra el acceso a los datos de un buffer circular con los registros (i2, m2, l2). El valor guardado en el registro modificador m2 es d (incremento de i2) y la longitud del buffer es w (valor guardado en L2). Dpto. Ingeniería Audiovisual y Comunicaciones, EUITT-UPM. - P3.5 - Laboratorio de Procesado Digital de Señal (Curso 2005/2006) Volviendo a las instrucciones de inicialización, después de definir el buffer s(M) se define una constante A que corresponde al valor máximo positivo. A continuación se inicializan los registros que van a acceder a los datos del buffer (i5, m5, l5). La dirección de memoria de la primera posición del buffer corresponde siempre a una sentencia del tipo: ^ nombre_del_buffer La longitud del buffer corresponde siempre a una sentencia del tipo: % nombre_del_buffer El registro modificador se inicializa a 1 (incremento unitario, m5=1;). Seguidamente, se encuentran tres instrucciones para implementar un lazo repetitivo que se encargue de inicializar a cero el buffer. En el procesador ADSP-2181 existe un registro contador (cntr) que se decrementa cada vez que se ejecuta una instrucción del tipo do. Al principio se carga el registro contador con el valor M (longitud del buffer). La segunda instrucción indica que debe realizarse la instrucción con la etiqueta zero_s hasta que el contador expire (se anule). Y la tercera instrucción va inicializando el valor de cada registro del buffer: dm(i5, m5)=0; Esta es la forma de acceder a los registros de un buffer: i5 guarda la dirección de memoria del dato del buffer y m5 incrementa esta dirección para la siguiente iteración. Por último, con las dos instrucciones restantes se inicializa la primera posición del buffer con el valor máximo positivo. Una vez inicializado el buffer, se está en disposición de realizar el diezmado. La idea es muy simple: dejar una muestra en la salida por cada M muestras que aparezcan en la entrada; el resto de muestras han de ser nulas. Para ello, cada vez que se produzca una interrupción del codec (periodo de muestreo inicial) se trae un dato del buffer circular y se comprueba si es nulo o vale uno (0x7ff). En el primer caso se no se envía nada al codec (valor nulo) y en el segundo caso se envía al codec el mismo dato que acaba de entrar (bypass). Para comprobar esta condición se tienen las siguientes instrucciones: Dpto. Ingeniería Audiovisual y Comunicaciones, EUITT-UPM. - P3.6 - Laboratorio de Procesado Digital de Señal (Curso 2005/2006) Se carga en el registro del AR de la unidad aritmético lógica (ALU) el valor correspondiente del tren de impulsos de periodo M. Para comprobar si este valor es nulo tenemos que hacer una operación en la propia ALU, aunque esta sea un simple paso del dato (pass), para que se activen los flags de estado, y comprobar si el resultado de esta operación es distinto a cero (ne: not equal zero). El resto del programa se deja a interpretación del alumno, incluyendo la ganancia opcional que ha de darse a la salida cuando se diezma una secuencia. Repásese la teoría del diezmado. Ejercicio Modifique este fichero y renómbrelo para trabajar con el, tal como se hizo en la práctica anterior. Una vez hecho esto, cambie el valor de M desde 2 a 16 (incluyendo si ha lugar la ganancia del diezmado) para una frecuencia de muestreo inicial de 48.000 Hz (modifique la variable que determina la frecuencia de muestreo). Ejecute el programa para cada uno de los valores de M para señal sinusoidal de entrada de frecuencia 16XXX Hz (XXX últimos 3 dígitos del DNI del alumno) generada con el editor de audio Cool Edit Pro. La señal de salida grábela con el mismo editor de audio (abriendo una nueva sesión del mismo) y compruebe si aparece una o más sinusoides y de que valores de frecuencia. Justifique el resultado analizando la transformada de Fourier que presenta una señal diezmada (z(n), según la nomenclatura de los apuntes de la asignatura). Utilice a continuación una señal de audio y escuche los efectos de aliasing para distintos valores de M (2 a 16). Dpto. Ingeniería Audiovisual y Comunicaciones, EUITT-UPM. - P3.7 -