Sigma-Delta con audio en Python

Usando los conceptos descritos para abrir un archivo de audio .wav, realice en python lo siguiente:

a) Codificador: Realice la codificación en ∑Δ para el audio del ejemplo, y crear el archivo correspondiente al resultado.

b) Decodificador: Reconstruya la señal de audio a partir del archivo del literal anterior, de ∑Δ a .wav, y pruebe su resultado ejecutando el archivo con un programa como windows media player.

c) Realice las observaciones correspondientes al proceso realizado.

Trabajo extra, opcional

d) Cree un archivo de audio en formato .wav dictando una frase como la mostrada, y repita el proceso anterior.

e) Realice las observaciones correspondientes al proceso realizado.


Codificador Sigma-Delta

Se adjunta un algoritmo en python de referencia al que hay que añadir la parte de manejo del audio.

– En el bloque de ingreso complete las instrucciones para leer el archivo. Observe los nombres de las variables.

# Modulacion Delta - Codificador de audio
# entrada x(t), salida: ysalida[n]
# propuesta: edelros@espol.edu.ec
import numpy as np
import matplotlib.pyplot as plt
import scipy.io.wavfile as waves
import scipy.signal as senal

# INGRESO
# archivo=......
# fsonido, sonido = ......

# PROCEDIMIENTO

# Analógica de referencia
deltaT  = 1/(2*np.pi*fsonido)
xanalog = sonido[:,0] # Canal izquierdo
xmax    = np.max(xanalog)
nsonido = len(xanalog)
t0 = 0
tn = nsonido*deltaT
t  = np.arange(0,tn,deltaT)

# Codificacion Sigma-Delta
salto  = 1 #usa todas las muestras sin saltar
deltaY = xmax//10
nd = nsonido//salto
td = np.arange(0,nd,1) # eje tiempo[n] digital
xdigital = np.zeros(nd,dtype=float)
ysalida  = np.zeros(nd,dtype=int)
muestra  = xanalog[0]
i = 1
while not(i >= nd):
    muestra = xanalog[i*salto] # referencia analógica
    diferencia = muestra-xdigital[i-1]
    if (diferencia>0):
        bit = 1
    else:
        bit = -1
    xdigital[i] = xdigital[i-1]+bit*deltaY
    ysalida[i]  = bit
    i = i + 1
fsalida = fsonido/salto
parametros = np.array([deltaT,deltaY,fsalida])

# SALIDA
print(ysalida)
print(parametros)

# Graba archivo
np.savetxt('sigmadelta_datos.txt',ysalida,fmt='%i')
np.savetxt('sigmadelta_parametros.txt',parametros)

# Grafico
# Escala y RANGO ejex del gráfico
a = int(nsonido*0.35)
b = int(nsonido*0.355)

plt.figure(1)       # define la grafica
plt.suptitle('Codificador Sigma-Delta Audio.wav')

# grafica de 3x1 y subgrafica 1
plt.subplot(311)
plt.ylabel('x(t)')
# rango en el eje y
xmax = np.max(xanalog)+0.1*np.max(xanalog)
xmin = np.min(xanalog)-0.1*np.max(xanalog)
plt.axis((a*deltaT, b*deltaT, xmin, xmax))
plt.plot(t[a:b],xanalog[a:b], 'g')
plt.ylabel('xanalogica[n]')

# grafica de 3x1 y subgrafica 2
plt.subplot(312) 
plt.ylabel('xdigital[n]')
# rango en el eje
mxa=np.max(xdigital[a:b])
mna=np.min(xdigital[a:b])
plt.axis((a,b,mxa,mna))
#plt.plot(td,xdigital,'bo')
plt.step(td[a:b],xdigital[a:b], where='post',color='m')

# grafica de 3x1 y subgrafica 3
plt.subplot(313) 
plt.ylabel('ysalida[n]')
plt.axis((a,b,-1.1,1.1))
plt.step(td[a:b],ysalida[a:b], where='post',color='b')
plt.show()

Decodificador Sigma-Delta

El resultado gráfico al decodificar el archivo de ∑Δ se muestra, se debe añadir la instrucción para generar el archivo de audio y poder escucharlo.

modifique la seccion de #Salida para crear el arhivo de audio con nombre: ‘sigmadeltaaudio.wav’.

# Modulacion Sigma-Delta Decodificador
# entrada yentrada[n], salida: x[t]
# propuesta:edelros@espol.edu.ec
import numpy as np
import matplotlib.pyplot as plt
import scipy.io.wavfile as waves

# INGRESO
archivodatos = 'sigmadelta_datos.txt'
archivoparam = 'sigmadelta_parametros.txt'

# PROCEDIMIENTO
# lectura de archivo
yentrada = np.loadtxt(archivodatos,dtype=int)
datos    = np.loadtxt(archivoparam,dtype=float)
deltaD   = datos[0]
deltaY   = datos[1]
fsonido  = datos[2]
# muestras para gráfica
k = len(yentrada) 

# Arreglos para datos
xdigital = np.zeros(k, dtype='int16')
punto    = np.zeros(k, dtype=int)
td       = np.zeros(k, dtype=float) # eje n digital

# calcula los valores para digital
xdigital[0] = yentrada[0]
punto[0] = 0
td[0]    = 0
for i in range(1,k):
    punto[i] = i
    td[i]    = deltaD*i
    xdigital[i] = xdigital[i-1]+yentrada[i]*deltaY

# SALIDA
print(xdigital)
#Archivo de audio
# CREAR EL ARCHIVO DE AUDIO ***********************

#Gráfico
a = int(k*0.25) # RANGO ejex del gráfico
b = int(k*0.252)

plt.figure(1) # define la grafica
plt.suptitle('Decodifica Sigma_Delta')

plt.subplot(211) # grafica de 2x1 y subgrafica 1
plt.ylabel('entrada: y[n]')
plt.axis((a,b,-1.1,1.1))
#plt.plot(punto[a:b],yentrada[a:b],'b')
plt.step(punto[a:b],yentrada[a:b], where='post', color='b')

plt.subplot(212) # grafica de 2x1 y subgrafica 2
plt.ylabel('salida: x[t]')
xmax = np.max(xdigital[a:b]) # rango en el eje
xmin = np.min(xdigital[a:b])
plt.axis((a*deltaD,b*deltaD,xmin,xmax))
#plt.plot(td[a:b],xdigital[a:b],'m')
plt.step(td[a:b],xdigital[a:b], where='post', color='m')
plt.show()

La gráfica muestra solo el intervalo de tiempo entre a=0.25 y b=0.252 del total de tiempo del audio, el propósito es la observacion visual complementará a la de escuchar el audio resultante.