Referencia: Leon-Couch, 3–8 Modulación Delta, p.192 ; Delta-sigma_modulation Wikipedia
La modulación Sigma-Delta (∑Δ ) 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.
CODIFICADOR Sigma-Delta
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): x = np.sin(2*np.pi*fs*t) 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 Sigma-Delta
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.0000000e+00 3.0000000e-01 6.0000000e-01 9.0000000e-01 1.2000000e+00 9.0000000e-01 1.2000000e+00 9.0000000e-01 6.0000000e-01 3.0000000e-01 -1.1102230e-16 -3.0000000e-01 -6.0000000e-01 -9.0000000e-01 -1.2000000e+00 -9.0000000e-01 -1.2000000e+00 -9.0000000e-01 -6.0000000e-01 -3.0000000e-01 -1.1102230e-16 3.0000000e-01 6.0000000e-01 9.0000000e-01 1.2000000e+00 9.0000000e-01 1.2000000e+00 9.0000000e-01 6.0000000e-01 3.0000000e-01 -1.1102230e-16 -3.0000000e-01 -6.0000000e-01 -9.0000000e-01 -1.2000000e+00 -9.0000000e-01 -1.2000000e+00 -9.0000000e-01 -6.0000000e-01 -3.0000000e-01]
realizado usando 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 archivodatos = 'sigmadelta_datos.txt' archivoparam = 'sigmadelta_parametros.txt' # PROCEDIMIENTO # Lectura de datos desde archivos yentrada = np.loadtxt(archivodatos,dtype=int) datos = np.loadtxt(archivoparam,dtype=float) deltaT = datos[0] # Tamaño delta en eje tiempo deltaY = datos[1] # Tamaño delta en eje Y # número de muestras k = len(yentrada) xdigital = np.zeros(k, dtype=float) punto = np.zeros(k, dtype=int) # número de muestra 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]') # rango en el eje y xmax = np.max(xdigital)+0.1*np.max(xdigital) 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.