Teorema de muestreo explicado con numpy
Posted on mar 19 febrero 2013 in Tutorial Python • 3 min read
El teorema demuestra que la reconstrucción exacta de una señal periódica continua en banda base a partir de sus muestras, es matemáticamente posible si la señal está limitada en banda y la tasa de muestreo es superior al doble de su ancho de banda. En el artículo se mostrará una tasa de muestreo a diferentes frecuencias, desde el valor doble a la frecuencia base, luego a un valor menor.
Algo más de teoría: El teorema de muestreo de una señal continua que x (t) limitada en banda a B Hz pueden ser recuperados de sus muestras x [n] = x (n * T), donde n es un número entero, si T es mayor que o igual a 1 / (2B) sin pérdida de ninguna información. Y llamamos 2B la tasa de Nyquist.
El muestreo a una tasa inferior a la tasa de Nyquist se denomina submuestreo, se produce el efecto aliasing.
Si se desea más información sobre el Teorema de Muestreo se puede consultar a wikipedia.
Este artículo se basa en un artículo en Inglés "The sampling theorem explained with numpy".
El código se muestra a continuación:
#!/usr/bin/env python
#De numpy se importa lo necesario para graficar la
#funcion seno
from numpy import linspace,sin,cos,pi,ceil,floor,arange
#De pylab se importa plot, show y axis. Lo necesario para crear
#la grafica
from pylab import plot,show,axis
#Muestreo de una seganl de ancho de banda 40 hz
# con velocidad de muestreo de 80 Hz
f = 40; # Hz
#Tiempo minimo y maximo
tmin = -0.3;
tmax = 0.3;
#Se define el tiempo de la segnal.
t = linspace(tmin, tmax, 400);
#Se define la segnal de muestreo
x = cos(2*pi*t) + cos(2*pi*f*t)
#Se grafica el tiempo y la segnal.
plot(t, x)
# sampling the signal with a sampling rate of 80 Hz
# in this case, we are using the Nyquist rate.
#Muestreo de la segnal con una velocidad de muestreo de 80 Hz.
#Periodo de muestreo
T = 1/80.0;
#Tiempo minimo
nmin = ceil(tmin / T);
#Tiempo maximo
nmax = floor(tmax / T);
#Tiempo de la segnal.
n = arange(nmin,nmax);
#Segnal a la velocidad de muestreo
x1 = cos(2*pi*n*T) + cos(2*pi*f*n*T);
#Se grafica la segnal.
plot(n*T, x1, 'bo')
#Muestreo de la segnal con una velocidad de muestreo de 35Hz.
#Note que 35Hz esta por debajo de la velocidad de Nyquist.
T = 1/35.0;
nmin = ceil(tmin / T);
nmax = floor(tmax / T);
n = arange(nmin,nmax);
x2 = cos(2*pi*n*T) + cos(2*pi*f*n*T);
plot(n*T, x2, '-r.',markersize=15)
axis([-0.3, 0.3, -1.5, 2.3])
show()
La gráfica generada es la siguiente:
Con puntos azules se tiene el muestreo a 80Hz, con puntos rojos se tiene el muestreo a 35 Hz, se nota que el muestreo a 80 Hz es suficiente para capturar la oscilación de la señal.
En la siguiente gráfica se tiene un muestreo a 10 Hz que está por debajo de la frecuencia base de la señal (40 Hz).
Ahora se muestra la frecuencia de muestreo a 20 Hz:
Para terminar se muestra la frecuencia de muestreo a 30 Hz:
Para terminar se muestra la gráfica a una frecuencia de muestreo de 320 Hz:
Como puede notarse, mientras menor es la frecuencia de muestreo con respecto a la frecuencia base de la señal no se puede generar la señal original a partir de la muestra, mientras se va a aumentando la señal hasta llegar a la frecuencia base, se nota que se tiene más muestras para dicha recuperación pero sigue sin ser suficiente, es a partir del doble de la frecuencia base que la muestra puede ser generada.
¡Haz tu donativo! Si te gustó el artículo puedes realizar un donativo con Bitcoin (BTC) usando la billetera digital de tu preferencia a la siguiente dirección: 17MtNybhdkA9GV3UNS6BTwPcuhjXoPrSzV
O Escaneando el código QR desde la billetera: