Modulación Delta Sigma

La modulación Delta-Sigma (∑Δ ) codifica una señal analógica a digital generando una secuencia de +1 y -1 (impulsos) que representan la diferencia entre la señal analógica muestreada y la señal digital acumulada. Tiene aplicaciones en sintetizadores de frecuencia, fuentes de poder conmutadas y controladores de motor.

El sistema en diagrama de bloques en simulink se muestra en la figura:

La señal de entrada (Sine Wave) se cuantifica en (Zero-Order Hold).
Luego se obtiene el signo (sign) de la diferencia entre la señal de entrada y la señal digital acumulada (∑) que genera la secuencia de +1 y -1 en la salida del codificador.
El valor de la ganancia Δ=0.3 representa el valor del escalón de subida o bajada de la señal digital acumulada, representada en color magenta.

La secuencia de salida +1 y -1, de nuevo acumulada en el decodificador, permite obtener una versión digital cercana a la señal analógica inicial.

Simulación usando Python: CODIFICADOR

La señal de entrada para el ejemplo tiene frecuencia fs=1 Hz, Δ=deltaY=0.3, rango [0,tn] hasta 2 segundos con divisiones k=40 en el rango de tiempo.

>>> 
rango [0,tn]:2
Secciones en el rango k:40
[ 0  1  1  1  1 -1  1 -1 -1 -1 -1 -1 -1 -1 -1  1 -1  1  1  1  1  1  1  1  1 -1  1 -1 -1 -1 -1 -1 -1 -1 -1  1 -1  1  1  1]
[  0.05   0.3   40.  ]

El script genera la gráfica y los archivos para datos y parámetros en formato texto.

La señal de entrada y los valores pueden ser modificados en el script adjunto:

# Modulacion Delta - Codificador
# entrada x(t), salida: y[n]
# propuesta:edelros@espol.edu.ec
import numpy as np
import matplotlib.pyplot as plt

# Definir la funcion de Entrada
def entradax(t,fs):
    # función matemática CAMBIAR AQUI
    x=np.sin(2*np.pi*fs*t)
    # función matemática CAMBIAR AQUI
    return(x)

# PROGRAMA para la modulación
# INGRESO
t0=0
tn=float(input('rango [0,tn]:'))
k=int(input('Secciones en el rango k:'))

# PROCEDIMIENTO
# Analógica Referencia
fs=1
m=500  # puntos en eje t para gráfico analógica
dm=(tn-t0)/m
t=np.arange(0,tn,dm)  # eje tiempo analógica
xanalog=np.zeros(m, dtype=float)
for i in range(0,m):
    xanalog[i]=entradax(t[i],fs)

# Codificar Sigma-Delta
deltaY=0.3          # Tamaño delta en eje Y
deltaT=(tn-t0)/k    # Tamaño delta en eje tiempo
td=np.arange(0,tn,deltaT)    # tiempo muestreo
muestra=np.zeros(k, dtype=float)    # analógica para comparar
xdigital=np.zeros(k, dtype=float)   # digital
ysalida=np.zeros(k, dtype=int)      # Salida de +1|-1

td[0]=t0
muestra[0]=entradax(td[0],fs)
ysalida[0]=0
for i in range(1,k):
    muestra[i]=entradax(td[i],fs) # referencia analógica
    diferencia=muestra[i]-xdigital[i-1]
    if (diferencia>0):
        bit=1
    else:
        bit=-1
    xdigital[i]=xdigital[i-1]+bit*deltaY
    ysalida[i]=bit
parametros=np.array([deltaT,deltaY,k])

# SALIDA
print(ysalida)
print(parametros)
np.savetxt('sigmadelta_datos.txt',ysalida,fmt='%i')
np.savetxt('sigmadelta_parametros.txt',parametros)
# Graficar
plt.figure(1)       # define la grafica
plt.suptitle('Codificador Sigma-Delta')
plt.subplot(211)    # grafica de 2x1 y subgrafica 1
plt.ylabel('x(t), x[n]')
xmax=np.max(xanalog)+0.1*np.max(xanalog) # rango en el eje y
xmin=np.min(xanalog)-0.1*np.max(xanalog)
plt.axis((t0,tn,xmin,xmax)) # Ajusta ejes
plt.plot(t,xanalog, 'g')
plt.axis((t0,tn,xmin,xmax))
plt.plot(td,xdigital,'bo')  # Puntos x[n]
plt.step(td,xdigital, where='post',color='m')
plt.subplot(212)    # grafica de 2x1 y subgrafica 2
plt.ylabel('y[n]')
plt.axis((0,k,-1.1,1.1))
plt.plot(ysalida, 'bo')     # Puntos y[n]
puntos=np.arange(0,k,1)     #posicion eje x para escalon
plt.step(puntos,ysalida, where='post')
plt.show()

DECODIFICADOR

Para observar el resultado, se decodifican los datos y se obtiene el siguiente resultado:

>>> 
entrada: [ 0  1  1  1  1 -1  1 -1 -1 -1 -1 -1 -1 -1 -1  1 -1  1  1  1  1  1  1  1  1 -1  1 -1 -1 -1 -1 -1 -1 -1 -1  1 -1  1  1  1]
salida: 
[  0.00000000e+00   3.00000000e-01   6.00000000e-01   9.00000000e-01
   1.20000000e+00   9.00000000e-01   1.20000000e+00   9.00000000e-01
   6.00000000e-01   3.00000000e-01  -1.11022302e-16  -3.00000000e-01
  -6.00000000e-01  -9.00000000e-01  -1.20000000e+00  -9.00000000e-01
  -1.20000000e+00  -9.00000000e-01  -6.00000000e-01  -3.00000000e-01
  -1.11022302e-16   3.00000000e-01   6.00000000e-01   9.00000000e-01
   1.20000000e+00   9.00000000e-01   1.20000000e+00   9.00000000e-01
   6.00000000e-01   3.00000000e-01  -1.11022302e-16  -3.00000000e-01
  -6.00000000e-01  -9.00000000e-01  -1.20000000e+00  -9.00000000e-01
  -1.20000000e+00  -9.00000000e-01  -6.00000000e-01  -3.00000000e-01]

realizadousando el siguiente script de python:

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

# INGRESO
# Lectura de datos desde archivos
yentrada=np.loadtxt('sigmadelta_datos.txt',dtype=int)
datos=np.loadtxt('sigmadelta_parametros.txt',dtype=float)

# PROCEDIMIENTO
deltaT=datos[0] # Tamaño delta en eje tiempo
deltaY=datos[1] # Tamaño delta en eje Y
k=len(yentrada) # número de muestras
xdigital=np.zeros(k, dtype=float)
punto=np.zeros(k, dtype=int)      # número de muestra
td=td=np.zeros(k, dtype=float)    # tiempo muestreo
# DECOdifica Sigma-Delta
xdigital[0]=yentrada[0]
punto[0]=0
td[0]=0
for i in range(1,k):
    punto[i]=i
    td[i]=deltaT*i
    xdigital[i]=xdigital[i-1]+yentrada[i]*deltaY

# SALIDA
print('entrada:', yentrada)
print('salida:',xdigital,)
# Graficar
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((0,k-1,-1.1,1.1)) # Ajusta ejes
plt.plot(punto,yentrada,'bo') # Puntos y[n]
plt.step(punto,yentrada, where='post')
plt.subplot(212)    # grafica de 2x1 y subgrafica 2
plt.ylabel('salida: x[t]')
xmax=np.max(xdigital)+0.1*np.max(xdigital)# rango en el eje y
xmin=np.min(xdigital)-0.1*np.max(xdigital)
plt.axis((0,td[k-1],xmin,xmax)) # Ajusta ejes
plt.plot(td,xdigital,'bo')
plt.step(td,xdigital, where='post', color='m')
plt.show()

Tarea: Realice observaciones cambiando:
a) la frecuencia de la señal de entrada,
b) el valor para deltaY
c) el rango tnd) el número de secciones en el tiempo
e) la forma de la señal de entrada a triangular, diente de sierra, exponencial periódica, etc.