Intervalo de muestreo y efecto alias

Te presento una serie de ejercicios numéricos que, pretenden complementar las explicaciones y demostraciones matemáticas referentes al teorema de muestreo y al efecto alias. En la figura 0 te muestro una señal sinusoidal y una cuadrada, ambas tienen una frecuencia fundamental de 1 Hz. ¿Qué frecuencia de muestreo debería usar para digitalizarlas? Si respondiste que en AMBOS CASOS debería usar 2 Hz o al menos 2 Hz, este material es para ti.

Señales sinusoidal y cuadrada con frecuencia fundamental de 1 Hz.
Figura 0. Señales sinusoidal y cuadrada con frecuencia fundamental de 1 Hz.

Realicé los experimentos que te muestro usando Octave 4.0.0 en una computadora de 64 bits con Ubuntu 16.04. Puedes instalar el Octave desde una cuenta de administrador con la instrucción:

sudo apt install octave

NOTA: consideraremos que la función sin de Octave es una representación fiel de una señal sinusoidal analógica (recuerda que una señal analógica es continua en duración y amplitud, por lo que no existe en las computadoras digitales).

EXPERIMENTO 1. Evaluar en diferentes instantes, y a diferentes frecuencias, la función sin para simular el muestreo de una señal sinusoidal.
Paso 1: Crear un vector de tiempo t que indique el momento en que se tomarían las muestras de una señal analógica.
Paso 2: Simular el muestreo de una señal sinusoidal evaluando la función sin en los instantes indicados por el vector t.
Paso 3: Graficar “las muestras” obtenidas.

Simulación del muestreo de dos señales analógicas sinusoidales.
Figura 1. Simulación del muestreo de dos señales analógicas sinusoidales. En todos los casos la frecuencia fundamental de la sinusoidal es de 1 Hz. En los casos a y b hay 10 muestras por segundo. En los casos c y d hay 100 muestras por segundo. En a y c dibujé un punto por muestra; para b y d uní los puntos de muestra con una línea recta.

En la figura 1 te muestro las gráficas que obtuve con el código siguiente:

t=0:1/10:1-1/10;
s=sin(2*pi*t);
subplot(221)
 plot(t,s,'.')
 grid
 title("a)","fontsize",16)
 xlabel("tiempo (s)","fontsize",16)
subplot(222)
 plot(t,s)
 grid
 title("b)","fontsize",16)
 xlabel("tiempo (s)","fontsize",16)
t=0:1/100:1-1/100;
s=sin(2*pi*t);
subplot(223)
 plot(t,s,'.'), grid
 title("c)","fontsize",16)
 xlabel("tiempo (s)","fontsize",16)
subplot(224)
 plot(t,s), grid
 title("d)","fontsize",16)
 xlabel("tiempo (s)","fontsize",16)

En caso de que no estés familiarizado con Octave:

  • Puedes usar el comando help para obtener información de otros comandos, teclea por ejemplo:

help plot

  • Desde aquí puedes descargar un manual de iniciación a Octave (en español). Esta otra liga te lleva al manual de Octave (en inglés).
  • Línea 1: Genero el vector de tiempo t. Después del signo = hay 3 constantes separadas por los signos :, éstas representan el valor inicial, el incremento y el valor final de t. Si tecleas esa orden en la ventana de comandos del Octave y omites el ; final obtendrás:
t=0:1/10:1-1/10
Columns 1 through 10:
0.00000    0.10000    0.20000    0.30000    0.40000    0.50000    0.60000    0.70000    0.80000    0.90000
  • Línea 2: Evalúo la función sin para todos los instantes indicados por t. La constante pi está predefinda.
  • Línea 3. Dividir la pantalla de dibujo y seleccionar una sección para trabajar. 2 divisiones en lo vertical, 2 en lo horizontal, sección 1 de 4.
  • Línea 4. Dibujar una gráfica usando los valores de t en el eje horizontal, los de s en el vertical, y pintando un punto en cada coordenada.
  • Líneas 5 y 10. Dibujar rejillas.
  • Líneas 6, 7, 11 y 12. Escribir textos.
  • Línea 14. Hacer una gráfica como la de la línea 4, pero trazando lineas rectas entre puntos.

EXPERIMENTO 2. Formar una señal parecida a una cuadrada sumando sinusoides.
Paso 1: Crear un vector de tiempo que indique el momento en que se evaluarán las funciones sinusoidales, o se tomarían las muestras de una señal analógica.
Paso 2: Evaluar las funciones sin y en su caso sumarlas.
Paso 3: Graficar.
Paso 4: Repetir los dos pasos anteriores aumentando el número de funciones sin evaluadas y sumadas.

Gráficas que se obtienen al sumar señales sinusoidales de diferentes amplitudes y frecuencias.
Figura 2. Gráficas que se obtienen al sumar señales sinusoidales de diferentes amplitudes y frecuencias. De arriba a abajo se muestran las gráficas después de cada pausa en el código: una señal sinusoidal (en azul), la suma de dos sinusoidales (en rojo), la suma de cuatro sinusoidales (en verde), y la suma de 25 sinusoidales (en negro).

En la figura 2 te muestro las gráficas que se obtienen con el código Experimento2.m:

t=0:1/1000:1-1/1000;
s=sin(2*pi*t);
plot(t,s), grid, hold on
pause
s=sin(2*pi*t)+sin(2*pi*t*3)/3;
plot(t,s,'r')
pause
s=sin(2*pi*t)+sin(2*pi*t*3)/3+sin(2*pi*t*5)/5+sin(2*pi*t*7)/7;
plot(t,s,'g')
pause
c=zeros(1,1000);
for f=1:2:50, c=c+sin(2*pi*t*f)/f; end
plot(t,s,'k')
hold off

Respecto a Octave observa que:

  • Hasta la línea 12 de Experimento2.m NO habíamos usado la sentencia for. De forma automática las variables se comportan como arreglos de datos (vectores o matrices, en este caso vectores).
  • El operador + es capaz de sumar datos individuales o arreglos.
  • El comando hold permite dibujar sobre gráficas anteriores.
  • Usé la función zeros para hacer una vector de 1000 elementos con valor 0.

Respecto al experimento:

  • En cada iteración del for, añado un componente de mayor frecuencia y menor amplitud a la señal c.
  • A mayor cantidad de componentes la resultante se parece más a una señal cuadrada.
  • Espero que ahora tengas una idea más clara de a qué se refieren las explicaciones del teorema de muestreo cuando dicen: tomar muestras cuando menos al doble de la frecuencia máxima que contiene la señal analógica. Otra forma común de explicar el teorema dice al doble del ancho de banda, por eso el experimento 3.

EXPERIMENTO 3. Observar el contenido de frecuencias empleando la transformada de Fourier.

Contenido espectral o espectro de frecuencias de las señales obtenidas en el experimento 2.
Figura 3. Contenido espectral o espectro de frecuencias de las señales obtenidas en el experimento 2. Observa que ahora el eje horizontal representa frecuencias y que limité la gráfica hasta 100 Hz.

Experimento3.m es el código para obtener la figura 3 y contiene las instrucciones siguientes:

t=0:1/1000:1-1/1000;
subplot(221)
 s=sin(2*pi*t*940);
 S=abs(fft(s))/500;
 stem(0:100,S(1:101),'.')
 grid
 title("a)","fontsize",16)
 xlabel("frecuencia (Hz)","fontsize",16)
subplot(222)
 s=sin(2*pi*t)+sin(2*pi*t*3)/3;
 S=abs(fft(s))/500;
 stem(0:100,S(1:101),'.')
 grid
 title("b)","fontsize",16)
 xlabel("frecuencia (Hz)","fontsize",16)
subplot(223)
 s=sin(2*pi*t)+sin(2*pi*t*3)/3+sin(2*pi*t*5)/5+sin(2*pi*t*7)/7;
 S=abs(fft(s))/500;
 stem(0:100,S(1:101),'.'), grid
 title("c)","fontsize",16)
 xlabel("frecuencia (Hz)","fontsize",16)
subplot(224)
 c=zeros(1,1000);
 for f=1:2:50, c=c+sin(2*pi*t*f)/f; end
 C=abs(fft(c))/500;
 stem(0:100,C(1:101),'.'), grid
 title("d)","fontsize",16)
 xlabel("frecuencia (Hz)","fontsize",16)
hold off

Respecto a Octave:

  • La función fft implementa una forma rápida de obtener la transformada de Fourier.
  • La función abs devuelve el valor absoluto de un número real o la magnitud de un número complejo.
  • Usé la función stem para graficar. Observa que ésta dibuja una linea vertical con una altura igual al valor de cada dato que procesa.

Respecto al experimento:

  • Usamos la transformada de Fourier para encontrar los componentes sinusoidales que pueden representar a una señal. Ya que en este caso construí la señal a partir de la suma de unas cuantas sinusoides, el resultado de la transformada (o espectro de frecuencias) sólo muestra algunas lineas aisladas y su altura es proporcional a la magnitud de las funciones sin que usé.
  • Si graficas la transformada completa, observarás que ésta es simétrica en torno a la frecuencia de muestreo dividida entre 2. Será muy útil que hagas este ejercicio y asocies tus observaciones a lo que dice el teorema de muestreo.
  • Simula que muestreas una señal de más de 500 Hz y observa que pasa. Por ejemplo, si NO cambias otra cosa en el código más que la frecuencia de la función sin del renglón 3, y en lugar del 1 implícito usas 940 Hz, observaras un pico en 60 Hz – es decir observarás 940 Hz alias 60 Hz.
  • ¿Alias significa lo mismo que en las películas de detectives?
  • ¿Estás de acuerdo en que el experimento simula una frecuencia de muestreo de 1000 Hz?

EXPERIMENTO 4. Producir señales audibles bien muestreadas y con efecto alias.

  • Usaremos una frecuencia de muestreo (o evaluación de la función sin) de 8000 Hz.
  • Procesaremos señales de 400, 800 y 7600 Hz.
  • Crearemos vectores de 3 s y los almacenaremos en archivos con formato wav que podrás escuchar desde tu navegador, desde tu PC con Octave y descargar a tu dispositivo.

El código Experimento4.m es:

t=0:1/8000:3-1/8000;
s400=sin(2*pi*t*400);
s800=sin(2*pi*t*800);
salias=sin(2*pi*t*7600); % NO cumple con el teorema del muestreo
wavwrite(s400,8000,16,"s400.wav");
wavwrite(s800,8000,16,"s800.wav");
wavwrite(salias,8000,16,"salias.wav");
% Para escucharlas directamente desde Octave puedes usar:
sound(s400,8000,16);
sound(s800,8000,16);
sound(salias,8000,16);

Escucha la señal de 400 Hz

Escucha la señal de 800 Hz

Escucha la señal mal digitalizada ¿7600 ó 400 Hz?

Respecto a Octave:

  • La función wavwrite genera un archivo wav. Sus argumentos son: vector con los datos que se desea almacenar en el archivo, frecuencia de muestreo, número de bits a usar en la representación digital y nombre del archivo a generar.
  • La función sound produce un sonido. Sus argumentos son: vector con los datos que se desea escuchar, frecuencia de muestreo y número de bits a usar en la conversión digital – analógica (salida a las bocinas).

Respecto al experimento:

  • ¿Puedes distinguir entre el sonido de las señales de 400 Hz y 7600 Hz mal digitalizada?
  • ¿Dejó de ser el concepto de alias algo abstracto?
  • Obtén una buena representación de la señal de 7600 Hz y escúchala, prueba con una fm = 4100 Hz.

Espero que el material de esta entrada te haya servido como guía para realizar una serie de experimentos, que a su vez, te lleven a comprender mejor el significado de todas las ecuaciones que se usan en las explicaciones del teorema de muestreo. Hasta la próxima.

 

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *