Está en la página 1de 11

TRANSMISIN DE DATOS 2008/09

Prctica 2: Codificacin PCM


Apellidos, nombre Apellidos, nombre

Grupo Puesto Fecha


3/5/6 de noviembre de 2008

El objetivo de esta prctica es familiarizar al alumno con la codificacin de forma de onda (con prdidas) mediante tcnicas de Modulacin por Impulsos Codificados MIC- (Pulse Code Modulation PCM). Para llevar a cabo la prctica, desarrolle cada ejercicio en un fichero matlab dentro del directorio P2. Se proporcionan dos cdigos Matlab accesibles desde la pgina de la asignatura: o Grabando.m: permite grabar un fichero de audio discreto (muestreado a 8 Khz) de 4 segundos de duracin y almacenarlo en el fichero sample_audio.mat Leyendo.m: Es una funcin que permite leer un fichero de audio discreto (sample_audio.mat) , lo sonifica y dibuja sus grficas caractersticas. Adems devuelve un vector con la secuencia contenida en el fichero.

Todos estos ficheros estn accesibles en el archivo correspondiente a la prctica 2 en la pgina web de la asignatura. Justo antes de finalizar la prctica, comprima todo el directorio P2 en un fichero TxDatosP2GXxx.zip (siendo X el grupo A, B o C- y xx el nmero de pareja), conctese al sistema de entrega de prcticas de la Intranet y entrguelo en el grupo que corresponda (A, B o C). Gurdese adicionalmente una copia personal, para posibles futuras reutilizacin del cdigo en prcticas posteriores.

2.1 Codificacin PCM uniforme


La codificacin PCM uniforme es el mtodo ms sencillo de codificacin por forma de onda y consiste en la aplicacin directa de los conceptos de cuantificacin uniforme. El algoritmo bsico consiste en dividir el rango dinmico en tantos intervalos uniformes como el nmero de niveles proporcionados por el nmero de bits disponibles para codificar cada muestra, y asignar un intervalo a cada muestra. La reconstruccin se hace al valor de reconstruccin de cada intervalo (en este caso al nivel medio de cada intervalo).

2.1.1

Ejercicio 1: Codificador Uniforme simtrico de 8 bits

Implemente una funcin que calcule los ndices (desde 0 hasta el nmero mximo) de intervalo a los correspondientes una coleccin de muestras que respete la siguiente sintaxis:

function [Scuan] = getIndicesUniformes (S,nNiveles,vinf,vsup)1 Recibe: o o o o Devuelve: o Scuan == ndices de los intervalos de cuantificacin calculados para la seal de entrada. S == Secuencia de audio grabada. nNiveles == Nmero de niveles de cuantificacin. vinf == Valor mnimo de la seal. vsup == Valor mximo de la seal.

Haciendo uso de esta funcin escriba el cdigo de una funcin que implemente un cuantificador uniforme simtrico, sin nivel de reconstruccin igual a 0, de n bits, que ser guardado en PCMUniforme.m. La sintaxis de la funcin ser la siguiente:
function [Scuan] = PCMUniforme (S,nbits,v) Recibe: o o o Devuelve: o Scuan == ndices de los intervalos de cuantificacin calculados para la seal de entrada. S == Secuencia de audio grabada. nbits == Nmero de bits a utilizar para la codificacin de cada muestra. v == Valor de sobrecarga.

Implementar una funcin decodificaPCM para llevar a cabo la reconstruccin de una seal cuantificada que respete la siguiente sintaxis:
function [Srecon] = decodificaPCM (Scuan,nbits,v) Recibe: o o o Devuelve: Scuan == ndices de los intervalos cuantificacin calculados para la seal original. nbits == Nmero de bits utilizados en la cuantificacin de la seal original v == Valor de sobrecarga utilizado en la cuantificacin de la seal original.

Srecon == Seal reconstruida.

Recomendaciones: Compruebe la correccin de cada una de las funciones con secuencias cortas de las que pueda calcular analticamente el resultado esperado.

Recuerde comprobar dentro de esta misma funcin que ninguno de los ndices resultantes es mayor que nNiveles-1 ni menor que 0.

Recuerde que la potencia de matlab reside en su capacidad para el calculo matricial (i.e. Puede dividir todos los elementos de una matriz o vector por un escalar con UNA sola operacin).

Dibuje e indique los valores de decisin y reconstruccin de un cuantificador uniforme simtrico (sin nivel de reconstruccin igual a 0) de 2 bits, y valor de sobrecarga V.

Dibuje e indique los valores de decisin y reconstruccin de un cuantificador uniforme simtrico de 3 bits, y valor de sobrecarga V.

Calcule los cdigos, valores de reconstruccin y error de las siguientes muestras: o V1(2)=0.7507 voltios con valor de sobrecarga 2 voltios (cuantificador 2 bits)

V1(3)=0.7507 voltios con valor de sobrecarga 2 voltios (cuantificador 3 bits)

V1(8)=0.7507 voltios con valor de sobrecarga 2 voltios (cuantificador 8 bits)

V2(2)=0.2 voltios con valor de sobrecarga 1 voltio (cuantificador 2 bits)

V1(3)=0.2 voltios con valor de sobrecarga 1 voltio (cuantificador 3 bits)

V1(8)=0.2 voltios con valor de sobrecarga 1 voltio (cuantificador 8 bits)

A partir de las funciones implementadas anteriormente, desarrolle un script Matlab con nombre Ejercicio1.m en el que se lea el fichero de audio sample_audio.mat y se lleve a cabo su cuantificacin y reconstruccin (con 8 bits y valor de sobrecarga adecuado para evitar el error en el proceso de cuantificacin por saturacin) y dibuje las grficas correspondientes a las seales cuantificada y reconstruida, indicando los valores de los ejes. Dibuje las grficas obtenidas: o Seal original
z(t)

Hist z(t)

Seal cuantificada
z(qt)

Hist zq(t)

Seal reconstruida
z(wt)

Hist zw(t)

Seal de error
error(t)

Hist error(t)

Indique la potencia de error ( Perror = sum(error.^2))

Comente los resultados

Codificacin PCM no uniforme


La codificacin PCM no uniforme se basa en dividir el rango en intervalos de anchura variable, de forma que con el mismo nmero de bits (niveles) se pueda dar ms precisin en las zonas donde hay una mayor probabilidad (densidad) de valores, lo que hace disminuir la potencia total de ruido al disminuir el valor de la contribucin de las valores ms probables. Generalmente se implementan mediante tcnicas de compansin (compresin-expansin). Las tcnicas ms usadas son los cuantificadores no uniformes robustos los cuales, en lugar de minimizar la distorsin, buscan lograr una relacin seal-a-ruido(ruido de cuantificacin) constante. Estos cuantificadores tienen funciones de compresin logartmicas. Adicionalmente se implementan como aproximaciones a las funciones (conocidas como leyes) tericas. La norma utilizada en telefona digital fija en Europa sigue la ley-A, aproximada mediante una funcin rectilnea que se especifica en la Recomendacin G.711 de la UIT-UTI. La Recomendacin G.711, divide el rango (simtrico respecto al origen) en 13 segmentos rectilneos. Si nos centramos en la zona positiva, se generan 7 segmentos (realmente 6+1+1). El segmento 7 ocupa la mitad del rango normalizado a 1 (Unidad de Tensin Normalizada UTN-), esto es, de 1 a 0.5. El segmento 6 de 0.5 a 0.25, y as hasta llegar al segmento 1. El segmento 1 se divide en dos segmentos de igual tamao (el 1 y el 0) por lo que suele hablar de 6+1+1 segmentos. Dentro de cada segmento no

uniforme, se cuantifica el rango mediante 16 intervalos de cuantificacin uniformes. La codificacin consiste en asignar un bit al signo (1 si positivo), 3 bits al segmento, y 4 bits al intervalo de cuantificacin.

2.1.2

Ejercicio 2: Codificador G.711

Para el desarrollo del codificador G711 se implementarn por separado las funciones para calcular los valores para el signo, intervalo y segmento. Lleve a cabo la implementacin de dichas funciones como se indica a continuacin:
function [signos] = getSigno (Snorm) Recibe: o Devuelve: Snorm == Secuencia de audio grabada NORMALIZADA.

signos == Signos de las muestras de entrada: Mayor o igual que 0

1 , Menor que 0

0.

Escriba la funcin getSegmento que devuelve los ndices de los segmentos a los que pertenece una coleccin de muestras normalizadas (para ello deber definir a mano dentro de la funcin los lmites para cada segmento)
function [segmentos] = getSegmento (Snorm) Recibe: o Devuelve: o segmentos == Segmentos de las muestras de entrada: de 0 a 7. Snorm == Secuencia de audio grabada NORMALIZADA.

A partir de la informacin de a qu segmento pertenece cada muestra y haciendo uso de la funcin implementada anteriormente getIndicesUniformes implemente la funcin getIntervalo que devolver el resultado de realizar una cuantificacin uniforme con 16 niveles (4 bits) de cada muestra sobre el segmento que le corresponda:
function [intervalos] = getIntervalo (Snorm,segmentos)2 Recibe: o o Devuelve: o intervalos == Intervalos de las muestras de entrada: de 0 a 15. Snorm == Secuencia de audio grabada NORMALIZADA. segmentos == Segmentos de las muestras de entrada: de 0 a 7.

Implemente una funcin que calcule los valores de cuantificacin correspondientes a una coleccin de

Utilice getIndicesUniformes para el clculo de los ndices del intervalo.

muestras mediante el uso de las tres funciones anteriores y que respete la siguiente sintaxis:
function [Scuan] = getCuantificacionG711 (Snorm) Recibe: o Devuelve: Snorm == Secuencia de audio grabada NORMALIZADA.

Scuan == Valores de cuantificacin para la seal de entrada

Escriba el cgigo de una funcin PCMG711 en la que se lleve a cabo el proceso de normalizacin y cuantificacin de una seal mediante las funciones implementadas anteriormente:
function [Scuan] = PCMG711 (S,v) Recibe: o o Devuelve: S == Secuencia de audio grabada. v == Valor de sobrecarga.

Scuan == Valores de cuantificacin para la seal de entrada.

Haciendo uso de los conceptos aplicados para el proceso de codificacin implemente una funcin decodificaG711 que lleve a cabo la decodificacin de una seal cuantificada previamente. En caso de considerarlo necesario implemente las funciones auxiliares que considere oportuno. La sintaxis de la funcin ser la siguiente:
function [Srecon] = decodificaG711 (Scuan,v) Recibe: o o Devuelve: o Srecon == Seal reconstruida. Scuan == ndices de los intervalos de entrada para la seal de entrada. v == Valor de sobrecarga.

Recomendaciones: Elija un par de valores de muestras e inicie el desarrollo probando sobre una seal ficticia de una muestra (cuyo resultado haya calculado tericamente). La secuencia de entrada S se obtendr mediante la funcin Leyendo.m La funcin getCuantificacionG711 espera una seal de entrada que vare entre -1 y 1.

Calcule analticamente los cdigos, valores de reconstruccin y error de las siguientes muestras: o V1(G)=0.7507 voltios con valor de sobrecarga 2 voltios

secuencia de valores 0-255 [signo(1bit) segmento(3bits) intervalo(4bits)]

V1(G)=0.2 voltios con valor de sobrecarga 1 voltio (cuantificador 8 bits)

Desarrolle un script Matlab con nombre Ejercicio2.m en el que se lea el fichero de audio sample_audio.mat y se lleve a cabo su cuantificacin y reconstruccin mediante las funciones implementadas y dibuje las grficas correspondientes a las seales cuantificada y reconstruida, indicando los valores de los ejes. Dibuje las grficas obtenidas: o Seal original
z(t)

Hist z(t)

Seal cuantificada
z(qt)

Hist zq(t)

Seal reconstruida
z(wt)

Hist zw(t)

Seal de error
error(t)

Hist error(t)

Indique la potencia de error

Comente los resultados y comprelos con los del cuantificador uniforme

10

2.2 Transmisin de la Codificacin


En el fichero de la prctica se proporciona la funcin getSecuenciaBits con la siguiente especificacin:
function [secuencia] = getSecuenciaBits (Scuan,nbits) Recibe: o o Devuelve: Scuan == Seal cuantificada. nbits == Nmero de bits por muestra en la cuantificacin.

secuencia == Vector fila en el que cada posicin se corresponde con un bit de la secuencia Scuan en formato binario.

Desarrolle un script Matlab con nombre Ejercicio3.m en el que se lea el fichero de audio sample_audio.mat y se lleve a cabo la codificacin uniforme con 4 y 8 bits y la G711 aplicando la funcin getSecuenciaBits a los resultados obtenidos. Comente los resultados:

11

También podría gustarte