to get the file

Anuncio
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 -
Descargar