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.