[ muestras ] [ alias ] [ ejemplo ] [ algoritmo ] [ ejercicio alias ]
..
1. Muestras de una señal
Referencia: McClellan 4.1 p123
Una señal discreta en tiempo x[n], representa como una secuencia ordenada de números que puede ser almacenada para su uso y procesamiento posterior. Las muestras de una señal contínua o analógica x(t) se encuentran espaciadas en el tiempo separadas por un tiempo Ts.
x[n] = x(nTs) =x(n/fs) ; -∞ <n < ∞
Cada valor de x[n] se denomina una muestra de la señal contínua x(t). Ts también se expresa como frecuencia de muestreo fs = 1/Ts en muestras/s.
1.1 Muestreo de una señal sinusoidal
Para obtener muestras de una señal x(t) = A cos(ωt+φ) se tiene que:
x[n] = x(nTs) = A cos(ωnTs +φ)
= A cos( (ωTs )n+φ)
= A cos(ωrad n+φ)
donde se tiene la frecuencia en radianes normalizada.
La frecuencia normalizada es un parámetro adimensional al quitar la unidad de tiempo de x(t), siendo ‘n‘ el índice de posición en la secuencia de muestras.
1.2. Ejemplo
Referencia: McClellan Figura 4.3 p126
Una señal tipo coseno de 100 Hz se toman muestras con una tasa fs = 500 muestras/s. Realice y observe las gráficas de t y n correspondientes
x(t) = cos(2π(100)t)
muestreo: 11 tamaño ki: 11 tamaño ti: 101 fs: 500 ; dt: 0.002 ; fs_veces: 10 x(t): cos(100*t*(2*pi)) x[n]: cos(n*(2*pi)/5)
De la gráfica se puede observar que sin sobreponer la forma de onda x(t) sobre x[n] no es sencillo discernir la forma exacta de la forma de onda original. Para una mejor observación se sobre-muestrea 10 veces la señal para que sea más semejante a la forma contínua de x(t).
1.3 Algoritmo
# ejercicio figura 4.1 p126 Muestreo de señales sinusoidales # telg1034 DSP fiec-espol edelros@espol.edu.ec import numpy as np import matplotlib.pyplot as plt import sympy as sym import telg1034 as dsp # variables continuas from telg1034 import t,A,w,f,p,pi,DosPi,I,equivalentes # variables discretas n = sym.Symbol('n', integer=True, nonnegative=True) # INGRESO # señal continua x = sym.cos(100*DosPi*t + 0) fs = 500 # muestreo discreto fs_veces = 10 # sobremuestreo para x(t) muestrasN = 10 + 1 # para x[n] # PROCEDIMIENTO xn = x.subs(t,n/fs) # muestreo x[n] dt = 1/fs ki = np.arange(0,muestrasN,1,dtype=int) # muestreo x(t) dtc = dt/fs_veces # para x(t) ti = np.arange(0,ki[muestrasN-1]*dt + dtc, dtc) tki = ki*dt xt = sym.lambdify(t,x, modules=equivalentes) xki = xt(tki) xti = xt(ti) # SALIDA print('muestreo:',muestrasN) print(' tamaño ki:',len(ki)) print(' tamaño ti:',len(ti)) print('fs:',fs,' ; dt:',dt, ' ; fs_veces:',fs_veces) print('x(t):',x) print('x[n]:',xn) # GRAFICA x(t) y x[n] plt.subplot(211) # x(t) contínua plt.plot(ti,xti, color='gray',label='x(t)') plt.stem(tki,xki,linefmt = 'C0:', label='x[n]') plt.xlabel('t') plt.ylabel('amplitud') plt.title('x(t) vs x[n]') plt.legend() plt.subplot(212) # x[n] discreta plt.stem(xki,linefmt = 'C0:',label='x[n]') #plt.xticks(ki) plt.xlabel('n') plt.ylabel('amplitud') plt.legend() plt.show()
[ muestras ] [ alias ] [ ejemplo ] [ algoritmo ] [ ejercicio alias ]
..
2. Concepto de alias
Una definición simple de «alias» es de dos nombres para dos personas: «Pancho» y «Francisco». Dos señales diferentes en su forma discreta pueden tener la misma secuencia de valores.
..
2.1 Ejemplo
Referencia: McClellan 4.1.2 p127
Considere las siguientes señales y compare sus gráficas.
x1[n] = cos(0.4π n)
x2[n] = cos(2.4π n) = cos(0.4π n + 2π n ) = cos(0.4π n)
dado que 2πn es un número entero de periodos de la señal coseno.
Con Python se realiza las gráficas obteniendo las muestras usando fs para observar los puntos sobre x1(t) de ω=0.4π. Para suavizar la curva x(t) se usa fs_veces como sobremuestreo de la señal y crear la linea azul.
Se compara con x2(t) realizando el mismo proceso, que al unificar las gráficas se observa que los puntos de muestra son válidos para ambas señales x1(t), x2(t).
muestreo: 13 tamaño ki: 13 tamaño ti: 145 fs: 60 ; dt: 0.016666666666666666 ; fs_veces: 12 cos(0.4*pi*n) cos(7.5398223686155*n)
La gráfica permite mostrar que las muestras son iguales en cada dt=1/fs para ambas señales.
[ muestras ] [ alias ] [ ejemplo ] [ algoritmo ] [ ejercicio alias ]
..
2.2 Instrucciones en Python
# ejercicio 4.2 p128 Muestreo de señales sinusoidales # telg1034 DSP fiec-espol edelros@espol.edu.ec import numpy as np import matplotlib.pyplot as plt import sympy as sym import telg1034 as dsp # variables continuas from telg1034 import t,A,w,f,p,pi,DosPi,I,equivalentes # variables discretas from telg1034 import n # INGRESO # usar np.pi para evitar frecuencia fundamental automatica de sympy x1 = sym.cos(0.4*pi*n) x2 = sym.cos(2.4*np.pi*n) x_senales = [x1,x2] x_etiqueta = ['x1[n]','x2[n]'] fs = 60 # muestreo discreto fs_veces = 12 # sobremuestreo para x(t) muestrasN = 12 + 1 # para x[n] # PROCEDIMIENTO x_conteo = len(x_senales) # muestreo x[n] dt = 1/fs ki = np.arange(0,muestrasN,1,dtype=int) # muestreo x(t) dtc = dt/fs_veces # para x(t) ti = np.arange(0,ki[muestrasN-1]*dt+dtc,dtc) x_muestras = {} for k in range(0,x_conteo,1): unasenal = x_senales[k] xtk = unasenal.subs(n,t*fs) xt = sym.lambdify(t,xtk, modules=equivalentes) xki = xt(ki*dt) xti = xt(ti) x_muestras[k] = {'ki':ki,'xki':xki, 'ti':ti,'xti':xti,} # SALIDA print('muestreo:',muestrasN) print(' tamaño ki:',len(ki)) print(' tamaño ti:',len(ti)) print('fs:',fs,' ; dt:',dt, ' ; fs_veces:',fs_veces) for unasenal in x_senales: print(unasenal) # GRAFICA for i in range(0,len(x_muestras),1): color_i = dsp._graf_lineacolor_i(i) estilo_i = ':' # estilo de la línea if i%2 == 0: #es impar estilo_i = '--' # muestreo x[n] ki = x_muestras[i]['ki'] xki = x_muestras[i]['xki'] puntofmt = color_i + estilo_i plt.stem(ki*dt, xki, linefmt = puntofmt, label='x'+str(i)+'[n]') # muestreo x(t) ti = x_muestras[i]['ti'] xti = x_muestras[i]['xti'] plt.plot(ti,xti, '-', color = color_i, label='x'+str(i)+'(t)') plt.axhline(0,color='black') plt.xlabel('t') plt.ylabel('amplitud') plt.title('muestreo y alias') plt.legend() plt.show()
[ muestras ] [ alias ] [ ejemplo ] [ algoritmo ] [ ejercicio alias ]
..
3. Ejercicios con alias
Referencia: McClellan ejercicio 42 p128
Muestre que x2[n] es un alias de x1[n] y encuentre dos frecuencias que sean alias de 0.4π rad.
x1[n] = 7 cos(0.4π n – 0.2π)
x2[n] = 7 cos(8.4π n – 0.2π) = cos(0.4π n + 4(2π n) – 0.2π ) = cos(0.4π n- 0.2π)
Usando el algoritmo del numeral anterior se realiza la gráfica.
Para los alias se usa la frecuencia normalizada en radianes: ωrad , considerando que si se suma varias veces 2π se obtiene un alias.
ωalias= 0.4π + 2π k ; donde k = 0,1,2,3…
El alias principal se define como la frecuencia única en e intervalo entre
-π <ωalias < π , que para el ejercicio es 0.4π por lo que se propone usar como alias:
x3[n] = 7 cos((0.4π + 2π )n – 0.2π)
x4[n] = 7 cos((0.4π + 2(2π) )n – 0.2π)
El bloque de ingreso para el algoritmo del ejercicio es:
# INGRESO # usar np.pi para evitar frecuencia fundamental automatica x1 = 7*sym.cos(0.4*np.pi*n - 0.2*pi) x2 = 7*sym.cos(8.4*np.pi*n - 0.2*pi) x3 = 7*sym.cos((0.4*np.pi+2*pi*(1))*n - 0.2*pi ) x4 = 7*sym.cos((0.4*np.pi+2*pi*(2))*n - 0.2*pi) ##x_senales = [x1,x2] ##x_etiqueta = ['x1[n]','x2[n]'] x_senales = [x1,x3,x4] x_etiqueta = ['x1[n]','x3[n]','x4[n]'] fs = 60 # muestreo discreto, freq_sampling fs_veces = 40 # sobremuestreo para x(t) muestrasN = 5 + 1 # para x[n]
[ muestras ] [ alias ] [ ejemplo ] [ algoritmo ] [ ejercicio alias ]