Escuela Técnica Superior de Ingenierı́a de Telecomunicación
Grado en Tecnologı́a Digital y Multimedia
27 de Noviembre de 2023
Codificación de la Información
1º Acto de Evaluación - Prácticas
NOMBRE:
Duración 1 horas. Justifique c laramente t odas s us respuestas.
Cuestión 1 (2 Ptos.)
Después de ejecutar las instrucciones:
import codinf as ci
import numpy as np
import matplotlib.pyplot as plt
fs, x = ci.lee audio(’audio.wav’)
m=x.size
1. ¿Qué información contiene la variable ‘m’ ?
2. Si el archivo ‘audio.wav’ contiene un archivo de audio estéreo, escriba la instrucción
o instrucciones para obtener y visualizar por pantalla la duración del archivo en
segundos a partir de las variables obtenidas anteriormente.
3. Complete la siguiente instrucción para representar gráficamente la forma de onda
del canal derecho de la señal de audio respecto del tiempo en segundos:
plt.plot( , )
4. Escriba cómo normalizar la forma de onda respecto del máximo valor representable,
suponiendo que las muestras de la secuencia usan un formato de representación
int16 y calcule la potencia media de la señal normalizada.
SOLUCION:
1. (0.5p) Tenemos el número total de muestras contenidas en x (sumando las de cada
canal (o eje o dimensión), cuando hay más de un canal).
2. (0.5p) print(’Duración del archivo en segundos:’,(m/2)/fs)
3. (0.5p) plt.plot(np.arange(int(m/2))/fs),x[:,1])
4. (0.5p) xn=x/(2**15)
print(’Potencia media:’,np.mean(np.square(xn)))
1
Cuestión 2 (2 Ptos.)
Dada una secuencia en la variable x que contiene un mensaje generado por una fuente
discreta, escriba una función en Python que calcule la longitud mı́nima de un código de
longitud fija (CLF) con el que codificar dicho mensaje sin pérdidas.
Sı́rvase del siguiente código para completar la función:
import numpy as np
def calculaCLF(x):
’ ’ ’ Calcula en L el valor de la longitud del CLF para codificar x ’ ’ ’
*Nota: Comente cada instrucción indicando el propósito de la misma. Si no recuerda
exactamente la sintaxis de cada instrucción, al menos comente la finalidad que pretende
y qué contendrı́an las variables devueltas por la misma.
SOLUCIÓN:
import numpy as np
def calculaCLF(x):
’ ’ ’ Calcula en L el valor de la longitud del CLF para codificar x ’ ’ ’
A = np.unique(x) # obtenemos el alfabeto de x, puesto que el CLF solo depende
del número de elementos de dicho alfabeto
L=np.ceil(np.log2(np.size(A)))
return L
Cuestión 3 (2 Ptos.)
Complete el siguiente código que calcula la tasa binaria en bits por muestra de una
secuencia de valores enteros con signo contenida en la variable x y codificada en código
Rice-k
def tasa rice(x,k):
bits = 0
for i in range( , ):
if x[i] >= 0:
eh=
else:
eh=
q = e h //
bits = bits +
return bits/(len(x)-1)
2
SOLUCIÓN:
def tasa rice(x,k):
bits = 0
for i in range(1,len(x)):
if x[i] >= 0:
e h =2*x[i]
else:
e h = 2*abs(x[i])-1
q = e h // 2**k
bits = bits + k + q +1
return bits/(len(x)-1)
Cuestión 4 (2 Ptos.)
Si en la variable x tenemos el valor de una muestra de una determinada secuencia
discreta:
1. Escriba las instrucciones necesarias para calcular el valor con el que se cuantificarı́a
x si se emplea un cuantificador uniforme de medio paso, y paso de cuantificación
Delta.
2. ¿Y si el cuantificador anterior sólo admitiese M intervalos de cuantificación, siendo
M impar?
3. ¿Y si los ı́ndices de cuantificación se deben codificar usando un código de longitud
fija de B bits?
SOLUCIÓN:
1. (0.5p) import numpy as np
y=Delta*np.rint(x/Delta)
2. (0.75p) import numpy as np
y = np.rint(x/Delta)
y = np.clip(y,-(M-1)/2,(M-1)/2)
y= Delta*y
3. (0.75p) import numpy as np
M=2**B+1
y = np.rint(x/Delta)
y = np.clip(y,-(M-1)/2,(M-1)/2-1)
y= Delta*y
3
Cuestion 5 (2 Ptos.)
1. Escriba la instrucción (o instrucciones) que permiten calcular el paso de cuantifica-
ción de un cuantificador uniforme de medio paso que permita reducir la tasa binaria
de una señal de audio originalmente codificada en int16 (con 16 bpm), hasta 5bpm.
2. Si en k tenemos los ı́ndices de cuantificación obtenidos tras aplicar el cuantificador
anterior a una señal de audio, explique qué realizamos con la siguiente instrucción
y por qué es necesaria:
k = np.clip(k,-2**(4),2**(4)-1)
SOLUCIÓN:
1. (1p) Delta=2**(16-5)
2. (1p) Puesto que con 5bpm sólo podremos representar 2**5 ı́ndices de cuantifica-
ción diferentes (los comprendidos entre -2**(5-1) y 2**(5-1)-1), debemos saturar los
ı́ndices obtenidos entre dichas cantidades. Realmente, tras la cuantificación, no ob-
tendremos ningún ı́ndice por debajo de -2**4, pero sı́ es posible que encontremos el
ı́ndice 2**4, que no podremos representar, por lo que en dicho caso se representarı́a
el ı́ndice inferior 2**(4)-1 que es el máximo valor entero con signo representable con
5 bits.