{ "cells": [ { "cell_type": "markdown", "metadata": { "id": "h-GL6Yi7IwSw" }, "source": [ "# **Primer parcial**\n", "\n", "El parcial tiene cuatro grandes partes:\n", "\n", "I) En la primera parte comenzaremos a trabajar con el concepto de Modulación, que sumado a lo visto en el Taller 3 completa los temas fundamentales/básicos de un sistema de comunicación. En particular en esta parte trabajaremos con Modulación AM. - Ejercicio 1 a incluir en el informe (entrega 12/05).\n", "\n", "II) En la parte dos exploraremos las implicancias del Teorema de Muestreo. - Ejercicio 2 a incluir en el informe (entrega 12/05)\n", "\n", "III) La parte tres **es la más importante del parcial**, en ésta trabajaremos en Modulación/Demodulación FM. Ejercicios 3 y 4 (entrega intermedia 24/04), a incluir en el informe luego de corrección (entrega 12/05) . Ejercicio 5 e información sobre modulación en frecuencia a incluir en el informe (entrega 12/05).\n", "\n", "IV) Finalmente, en la última parte nos familiarizaremos con el uso de los equipos SDR y exploraremos parte del espectro radioeléctrico. - Ejercicio 6 Parte a y f a incluir en el informe (entrega 12/05)\n", "\n", "\n", "\n", "\n", "\n", "\n", "Notas (leer con atención):\n", "\n", "NOTA 1 **IMPORTANTE**: Para alcanzar una nota de suficiencia en el parcial (60/100) el requisito mínimo es que el demodulador de FM funcione correctamente. Ver PARTE III Ejercicio 5.\n", "\n", "NOTA 2: Existe una entrega intermedia **OBLIGATORIA** el 24/4 23:59 hs (Ver parte III, Ejercicios 3 y 4); se aconseja realizar el notebook en orden (de arriba hacia abajo) dejando los ejercicios 1 y 2 para el informe a realizar luego de finalizados los ejercicios 3 y 4.\n", "\n", "NOTA 3: Tanto la entrega intermedia, como la entrega final son grupales. Sólo un integrante del equipo hará la entrega por el EVA.\n", "\n", "NOTA 4: La entrega final el 12/05 a las 23:59 hs, el formato de entrega se especifica al final del notebook.\n" ] }, { "cell_type": "markdown", "metadata": { "id": "oM-6bO_z9qNU" }, "source": [ "# **PARTE I**\n", "\n", "## Introducción a la modulación. Modulación AM\n", "Hemos visto que usando un filtro pasabajos configurado a cierta frecuencia de corte logramos que (aunque quizá se escuche no del todo bien) la señal tenga el ancho de banda que queremos. Por ejemplo, las radio AM tienen un ancho de banda de 10 kHz.\n", "Pero si las radios AM transmitieran cada una el audio por la antena lo que podríamos recibir es todos los audios mezclados de todas las radios y no serviría de mucho. Para que podamos separar cada radio, cada estación de radio transmite en una cierta frecuencia ese audio, que llamaremos frecuencia portadora $f_c$. Es decir que lo que hace la radio es mover el espectro de frecuencia del audio que genera para que en lugar de estar entre 0 y 10 khz, esté entre $f_c$ y $f_c$ + 10 kHz .\n", "A continuación veremos este proceso de mover el espectro a una frecuencia deseada que hacen las radios AM, este proceso se llama modular en amplitud.\n", "\n", "\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "2XJqdDs4lzpr" }, "outputs": [], "source": [ "# comenzaremos cargando un archivo de audio .wav que Ustedes deseen desde su disco a google colab\n", "# NOTA: puede usar alguna otra forma de las vistas en el Taller 3 para subir el .wav a su disco de google colab.\n", "from google.colab import files\n", "uploaded = files.upload()\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "t_A51RsU6nSN" }, "outputs": [], "source": [ "import librosa\n", "from IPython.display import Audio\n", "# Ahora será necesario leer e archivo wav que haya subido a Colab\n", "# Para leer un archivo wav puede hacerlo de la siguiente forma:\n", "# Deben sustituir Jaime_24.wav por el nombre del wav que ustedes hayan subido\n", "data, fs = librosa.load('Jaime_24.wav')# le devuelve un numpy array con las muestras y la frecuencia de muestreo que utiliza esa canción.\n", "\n", "#Escuche el archivo para ver como suena\n", "Audio(data,rate=fs)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "n-4M0RW6p_Xz" }, "outputs": [], "source": [ "# Repetimos aquí por comodidad el código para hacer el gráfico de la representación en frecuencia de una señal ya que lo utilizaremos para\n", "# ver el espectro del archivo de música que acabamos de subitr.\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "def plot_frec(x,fs,fmax,m): #esta función permite graficar las frecuencias de una señal x muestreada a tasa fs, el rango que grafica va hasta fmax, y m la cantidad de puntos que toma para calcular la FFT .\n", " puntos = int(fmax/fs*m)\n", " lx = len(x)\n", " nt = (lx + m - 1)//m\n", " xp = np.append(x,np.zeros(-lx+nt*m))\n", " xmw = np.reshape( xp, (m,nt), order='F')\n", " xmf = np.fft.fft(xmw,len(xmw),axis=0)/m\n", " xf = np.linspace(0, int(fs/2.0), int(m/2))\n", " plt.plot(xf[0:puntos],np.abs(xmf[0:int(m/2),0:int(lx/m-1)]).mean(1)[0:puntos])\n", " plt.yscale('log')\n", " plt.show()\n", "\n", "print(\"frecuencia de muestreo: \",fs)\n", "plot_frec(data,fs,10000,4096)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "kI7vfVWNrsVB" }, "outputs": [], "source": [ "import numpy as np\n", "#Repetimos aquí el código de los filtros que utilizaremos a continuación\n", "import wave\n", "import scipy.signal as signal\n", "def filtro_pasabajo(x,f_corte,fs):\n", "\ttaps = signal.firwin(151,f_corte,nyq=fs/2.0)\n", "\tfiltered_x = signal.lfilter(taps, 1.0, x)\n", "\treturn(filtered_x)\n", "\n", "def filtro_pasaalto(x,f_corte,fs):\n", "\ttaps = signal.firwin(151,f_corte, pass_zero=False,nyq=fs/2.0)\n", "\tfiltered_x = signal.lfilter(taps, 1.0, x)\n", "\treturn(filtered_x)\n", "\n", "def filtro_pasabanda(x,f_corte1,f_corte2,fs):\n", "\ttaps = signal.firwin(151, [f_corte1, f_corte2], pass_zero=False,nyq=fs/2.0)\n", "\tfiltered_x = signal.lfilter(taps, 1.0, x)\n", "\treturn(filtered_x)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "Lwa7QSh0rzzC" }, "outputs": [], "source": [ "#Las radios AM para asegurarse que lo que transmiten no tenga un ancho mayor a 10 kHz y por lo tanto que no se superponga con las emisoras que tiene\n", "# al lado, filtran previo a transmitir el audio con un filtro pasa bajo de 10 kHz.\n", "#Nosotros vamos a filtrar el audio a 3 kHz, o sea vamos a pasar el audio por un filtro pasabajo de frecuencia de corte 3000 Hz.\n", "data_filt = filtro_pasabajo(data,3000,fs)\n", "# Graficaremos la señal filtrada y la escucharemos.\n", "plot_frec(data_filt,fs,12000,4096)\n", "Audio(data_filt,rate=fs)\n" ] }, { "cell_type": "markdown", "metadata": { "id": "FFYK7_-6yJ2k" }, "source": [ "Explique qué diferencias nota en el espectro de frecuencia de la señal filtrada y también de lo que se escucha respecto de la señal original." ] }, { "cell_type": "markdown", "metadata": { "id": "wt-s7s7aywi7" }, "source": [ "Ahora vamos en modular en AM este audio, es decir lo vamos a mover para llevarlo a una frecuencia portadora $f_c$. Para eso comenzaremos haciendo una operación que es multiplicar la señal de audio filtrada por un coseno centrado en la frecuencia portadora $f_c$ que para nuestro caso la tomaremos arbitrariamente en 6 kHz.\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "hLGoZlSPznQP" }, "outputs": [], "source": [ "# En primer lugar generaremos un coseno de 10 KHz muestreado a una frecuencia de muestreo fs igual a la del audio filtrado que es de 24 kHz.\n", "# Cuando vamos a multiplicar dos señales muesreadas en este caso el audio y el coseno ambos deben estar a la misma tasa de muestreo y\n", "# tener la misma cantidad de muestras\n", "f0 = 6000.0 # es la frecuencia portadora de nuestra radio AM\n", "t=np.array([i for i in range(len(data_filt))])# genero un vector de tiempo\n", "coseno = np.cos( 2*np.pi*f0/fs *t)\n", "data_am = data_filt*coseno\n", "plot_frec(data_am,fs,15000,4096)" ] }, { "cell_type": "markdown", "metadata": { "id": "GCi8ZoXC3Ty4" }, "source": [ "Lo que sucede es que el espectro de la señal al multiplicarla por un coseno de frecuencia $f_c$ se traslada a la frecuencia $f_c$. En la figura observamos que el espectro que en el audio original estaba de 0 a 3 kHz ahora está de $f_c$ a $f_c$+3kHz. Esto se llama modular en AM a la frecuencia $f_c$. Habrá observado que al modular la señal aparece un espectro aproximadamente simétrico en torno a la frecuencia de modulación $f_c$. Es decir que además del espectro que teníamos ahora aparece otro espejado respecto de $f_c$. Si el espectro del archivo wav lo observaramos incluyendo las “frecuencias negativas” también lo veríamos simétrico respecto a la frecuencia cero.\n", "\n", "Puede resultar raro este concepto de frecuencias negativas pero no lo es tanto. La frecuencia $f_c$ la podemos definir por un vector que gira en el plano y da $f_c$ vueltas por segundo en sentido antihorario. La frecuencia negativa la podemos imaginar como un vector que gira de la misma forma pero en sentido horario. Todas las señales reales tienen espectro positivo y negativo y además su espectro es simétrico respecto de la frecuencia cero. Pero eso ya lo verán más adelante en la carrera con detalle. Por ahora lo importante es entender que un coseno de frecuencia $f_c$ al multiplicarlo por cualquier señal traslada el espectro de la señal a esa frecuencia $f_c$. " ] }, { "cell_type": "markdown", "metadata": { "id": "7UaTJBg24c1C" }, "source": [ "# Ejercicio 1 para incluir en el informe\n", "\n", "1. Busque información en internet y explique por qué a este proceso de multiplicar por un coseno de frecuencia más alta que el ancho de banda de la señal se denomina modulación en amplitud. Para visualizar este proceso, le recomendamos visualizarlo en el eje del tiempo realizando un ejemplo en Python que module un coseno de baja frecuencia por uno de frecuencia mucho mayor. Por ejemplo, tome un coseno de 100 Hz y multiplíquelo por un coseno de frecuencia 5 kHz ambas muestreadas a 40 kHz. Observe cómo se visualizan dos o tres períodos de la la señal modulada en el tiempo.\n", "\n", "\n", "2. Realice un diagrama de bloques de cómo funcionaría el transmisor de Radio Uruguay (centrada en 1050 kHz en Montevideo y con un ancho de 10 kHz). Debajo se incluyen bloques típicos de sistemas de comunicaciones que le pueden ser de utilidad.\n", "\n", "![diagrama_AM.png](https://iie.fing.edu.uy/~gbelcredi/tallerine/diagrama_AM.png)\n", "\n", "![bloques.png](https://iie.fing.edu.uy/~gbelcredi/tallerine/bloques.png)\n" ] }, { "cell_type": "markdown", "metadata": { "id": "EWDi2V6s5GOQ" }, "source": [ "# **PARTE II**\n", "\n", "# Algunas consideraciones sobre la frecuencia de muestreo: Teorema de muestreo\n", "Ahora construiremos una señal que sea la suma de tres sinusoides a 1 kHz, 2 kHz, 3 kHz y con una tasa de muestreo de 20 kHz. Multiplicaremos esta señal por un coseno de la misma tasa de muestreo y de frecuencia portadora 6000 Hz.\n", "Observe el espectro de la señal modulada y vea si obtiene el resultado esperado. Explique lo que observa.\n", "\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "xkl0Uo-K-g9O" }, "outputs": [], "source": [ "import numpy as np\n", "fc = 6000.0 # es la frecuencia portadora de nuestra radio AM\n", "fs = 20000\n", "t=np.array([i for i in range(fs)])# genero un vector de tiempo\n", "signal = np.sin( 2*np.pi*1000/fs *t)+ np.sin( 2*np.pi*2000/fs *t)+np.sin( 2*np.pi*3000/fs *t)\n", "\n", "coseno = np.cos( 2*np.pi*fc/fs *t)\n", "data_am = signal*coseno\n", "plot_frec(data_am,fs,12000,4096)" ] }, { "cell_type": "markdown", "metadata": { "id": "NxeVCfAgBfRK" }, "source": [ "Ahora modifique el código de la señal anterior y en lugar de ser una suma de senos de 1000 2000 y 3000 Hz, haga una que sea la suma de 1000, 2000 y 5000 Hz y una última que sea la suma de 1000, 2000 y 6500 Hz y vea que pasa con los espectro de estas señales moduladas con el mismo coseno que antes. ¿Observa lo que esperaba?" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "kApKOo296oqk" }, "outputs": [], "source": [ "# celda para hacer la suma de los cosenos en 1000, 2000 y 5000 Hz modularlos en AM\n" ] }, { "cell_type": "code", "source": [ "# celda para hacer la suma de los cosenos en 1000, 2000 y 6500 Hz modularlos en AM" ], "metadata": { "id": "HIreVQGa3KN3" }, "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "fCPZ540tBGHh" }, "source": [ "Antes de tratar de explicar por qué sucede esto, discutamos qué es la tasa de muestreo que hemos utilizado. Un modelo de lo que sucede a lo largo del tiempo con, por ejemplo, el voltaje en un cable es pensar que tiene un valor para cualquier instante de tiempo t. Sea cual sea ese tiempo t, soy teóricamente capaz de medir el voltaje en ese instante y vale v(t) (o sea, una función en el tiempo t). Esto generalmente se denomina una señal analógica, un término que quizás haya escuchado nombrar. Seguramente también haya escuchado nombrar el término digital. En este contexto, una señal digital tiene dos diferencias fundamentales con respecto a v(t). La primera, y es la que exploramos ahora, es que no existe para cualquier t, sino para un conjunto de valores, tı́picamente (como en este caso) tomados cada tiempo fijo T (ver dibujo). Es decir, y por ejemplo, del audio en la computadora contamos únicamente con un conjunto de números v(0), v(T ), v(2T ), . . . , v(kT), ... Dado que la PC es un sistema digital, trabajamos con v(t) indirectamente a partir de este conjunto de muestras. La tasa de muestreo es la frecuencia a la que se toman estas muestras, es decir 1/T . Ver figura.\n", "\n", "![figura muestreo](https://iie.fing.edu.uy/~gbelcredi/tallerine/muestreo.png)" ] }, { "cell_type": "markdown", "metadata": { "id": "yNZ9spDPjmhO" }, "source": [ "Una pregunta fundamental de los sistemas de comunicaciones digitales es a qué frecuencia mínima puedo muestrear para poder reconstruir luego la señal original a partir de sus muestras. Parece intuitivo que si tomo muy pocas muestras de la señal, estoy perdiendo mucha información que luego no podré recuperar. Pero ¿cuál es esa frecuencia mínima de muestreo para no perder información de la señal original?\n", "\n", "La respuesta la da el **Teorema de muestreo** que dice informalmente lo siguiente:\n", "Si una señal analógica tiene en su espectro de frecuencias una frecuencia máxima $f_0$ (es decir que a partir de allí el espectro de frecuencia de la señal vale 0), entonces la frecuencia mínima de muestreo para poder reconstruir la señal a partir de sus muestras es $2 f_0$.\n", "\n", "En el ejemplo con que iniciamos esta sección, cuando tenía tres sinusoides de 1 kHz,3 kHz y 5 kHz y esa señal estaba modulada a 6 kHz, se tiene una señal cuya frecuencia máxima es 6+5 = 11 kHz y la señal estaba muestreada a 20 kHz, por lo tanto no se cumple el teorema de muestreo ya que 2*11 = 22 kHz sería la frecuencia mínima de muestreo y nosotros estabamos usando 20 kHz. Por eso le aparecían en la señal otras tonos en frecuencias que no deberían aparecer. Ese fenómeno se denomina aliasing o solapamiento.\n", "\n", "Trataremos de dar una explicación intuitiva de lo que pasa cuando uno muestrea a una frecuencia menor a la que dice el teorema de muestreo.\n", "Observemos la siguiente figura. Obviamente la sinusoide original esta muestreada a una tasa menor a la del teorema de muestreo. Si yo solo tengo las muestras y quiero encontrar una sinusoide que pase por esos puntos, obviamente la sinusoide original pasa por esos puntos, pero también la dibujada en azul que es una sinusoide de frecuencia mucho menor. Probablemente pueda encontrar también sinusoides de frecuencia mucho mayor a la original que pasen por esos puntos. Es decir hay ambiguedad en la reconstrucción de la señal original. Sin embargo, si tengo varias muestras en un período de la señal eso intuitivamente se ve que no pasa.\n", "\n", "![alt text](https://iie.fing.edu.uy/~belza/tallerinefiguras/aliasing.png)\n", "\n", "\n", "Lo anterior se puede generalizar y extender a señales con un espectro contenido en el intervalo (−f, f ), como las que tiene el archivo wav analizado. Recuerde que dijimos que si bien nosotros visualizamos el eje positivo de frecuencias su espectro es simétrico en las frecuencias negativas. En ese caso se dice que la señal tiene ancho de banda f.\n", "El denominado Teorema de Muestreo dice que, siempre que v(t) tenga ancho de banda f , es equivalente tener todo v(t) o sus muestras v(kT) siempre que 1/T > 2f, tal como ya dijimos.\n", "\n", "Una observación importante es la siguiente. Las señales moduladas(AM,FM,TV,celular,etc) por ejemplo la FM a 94.7 MHz no se muestrean a esa frecuencia sino que primero se demodulan y se muestrea la señal demodulada en banda base es decir centrada en 0 Hz y no en 94.7. Por lo tanto el ancho de banda que se aplica para el muestro es el que tiene la señal original, voz, música, imagen o lo que fuera antes de ser llevada a alta frecuencia.\n", "\n", "# Ejercicio 2 para incluir en el informe\n", "Busquen información sobre qué valores se pueden asignar en Sample Rate a la salida de audio de su PC. ¿Audio de hasta qué frecuencia se puede generar con estas tasas de muestreo? Tomando en cuenta el experimento que hizo en el Taller 3 referido al rango audible, ¿qué frecuencias de muestreo le parecen útiles?" ] }, { "cell_type": "markdown", "metadata": { "id": "h_dr-y8aw79G" }, "source": [ "# **PARTE III**\n", "\n", "# Construcción de un demodulador Frecuencia Modulada-FM\n", "**Ejercicio para incluir en el informe :** En primer lugar busque información en internet sobre modulación en frecuencia y explique con sus palabras como funciona la modulación en frecuencia y por qué recibe ese nombre (algo de esto fue comentado en la presentación de la clase del 18/04).\n", "\n", "Como usted verá, en la modulación FM la señal de audio a enviar (o de audio más otras cosas como veremos más adelante) se introduce en la fase de la señal portadora. Es decir, si el audio de un locutor que está hablando es una señal $x(t)$, la emisora de radio FM 94.7, que transmite en la frecuencia fc = 94.7 MHz enviará por su antena una señal de la forma: $a(t) = \\cos(w_ct+ \\Phi(t))$, dónde $w_c = 2\\pi f_c$ y $x(t) = \\frac{d\\Phi(t)}{dt}$ (es decir, $x(t)$ es la derivada de $\\Phi(t)$ respecto de t). En el caso de la 94.7 $f_c$ será 94700000 Hz. Esto significa que la información que se quiere mandar $x(t)$ viaja en la fase de la señal o en realidad en la derivada de la fase de la señal, es decir, viaja en la frecuencia de la señal (la derivada de la fase es la frecuencia instantánea). Por ese motivo se denomina modulación en frecuencia o frecuencia modulada ya que la señal a enviar modula o modifica la fase de la señal portadora. Las variaciones de frecuencia que introduce x(t) son relativamente pequeñas (decenas de kilo Hertz) comparadas con las de la portadora (decenas de MHz). Por lo tanto, el espectro de una señal FM será de algunas decenas de kHz entorno a la frecuencia portadora (por ejemplo 94.7 MHz como se vio en talleres previos).\n", "\n", "Los equipos SDR (radio definida por software) que les entregamos, tienen el siguiente esquema:\n", "\n", "![diagrama_SDR](https://iie.fing.edu.uy/~gbelcredi/tallerine/diagrama_SDR.png)\n", "\n", "Es decir que la señal que llega a la antena $a(t)$, que en el caso de FM vimos que era de la forma $a(t) = \\cos(w_ct+ \\Phi(t))$, se multiplica por un lado por un coseno y por otro por un seno, ambos de la frecuencia de la portadora o frecuencia central que se quiere recibir.\n", "\n", "# Ejercicio 3 para incluir en el informe:\n", "A) Exprese utilizando fórmulas trigonométricas la salida de la rama que se multiplica por coseno (es decir: $(\\cos(w_ct+ \\Phi(t)) \\cos(w_ct))$ como suma de dos cosenos y la rama que se multiplica por seno $(cos(w_ct+ \\Phi(t)) \\sin(w_ct))$ como suma o resta de cosenos o de senos respectivamente.\n", "\n", "B) Observando las fórmulas que obtuvo en la parte A), explique qué deberían ser los bloques denominados LP en la figura para que $i(t) = \\cos(\\Phi(t))$ y $q(t) = \\sin(\\Phi(t))$.\n", "\n", "C) Habitualmente la frecuencia portadora en que modula la emisora de radio y la misma frecuencia de nuestro equipo no son exactamente iguales ya que los osciladores que permiten obtener la frecuencia tienen errores. Es decir, asumiendo que el transmisor de FM module en 94.7 MHz cuando nosotros pedimos que demodule en 94.7 nuestro equipo demodulará por ejemplo en 94.701 o en 94.720 MHz. Explique qué efecto tiene este problema en los resultados de la parte B). Para esto puede pensar la variación en frecuencia como un $\\delta_f$, resultado de la diferencia entre la frecuencia deseada y la realmente obtenida.\n", "\n", "Cuando Ud. recibe muestras del SDR obtiene un vector $y$, donde cada elemento del vector $y(t)$ son en realidad dos números: $i(t)$ y $q(t)$, siendo $i(t)$ y $q(t)$ los que se obtienen por el procesamiento que se muestra en la figura anterior, que en el caso de FM serán idealmente $\\cos(\\Phi(t))$ y $\\sin(\\Phi(t))$ respectivamente.\n", "\n", "Hay dos maneras de representar estos dos números a la hora de recibir las muestras del SDR. La primera y la que vamos a usar en esta instancia es registrar las muestras en un archivo .wav estéreo que tenga dos canales, donde en un canal tenemos i(t) y en otro canal tenemos q(t).\n", "\n", "Una segunda manera es representarlos mediante un número complejo, donde la parte real es $i(t)$ y la parte imaginaria es $q(t)$.\n", "¿Por qué se representa mediante un número complejo? Porque para trabajar con estas señales es muy simple la operatoria si se los piensa y trabaja como números complejos.\n", "\n", "En cualquier caso, si lo que estamos recibiendo es FM, en el vector $i$ tendremos idealmente las muestras de $\\cos(\\Phi(t))$ y en el vector $q$ las muestras de $\\sin(\\Phi(t))$. ¿Por qué decimos que eso es idealmente lo que se recibe en i y q?, trate de responder esta pregunta analizando por ejemplo lo que estudió anteriormente de lo que pasa cuando nosotros demodulamos a una frecuencia que no es exactamente la misma a la que moduló la emisora o analice qué otra no idealidad puede afectar.\n" ] }, { "cell_type": "markdown", "metadata": { "id": "Si6gnGE_54qO" }, "source": [ "Nuestro objetivo es entonces, a partir de los vectores i y q que nos entrega el SDR lograr escucha la FM que estemos sintonizando. Para eso será necesario demodular los vectores i(t) y q(t) y obtener $x(t) = \\frac{d\\Phi(t)}{dt}$. En eso vamos a trabajar en el próximo ejercicio.\n", "\n", "# Ejercicio 4 para incluir en el informe:\n", "Piense cómo podría escuchar la FM. Primero que nada con lapiz y papel vea como puede lograr obtener x(t) a partir de i y q.\n", "\n", "\n", "# Ejercicio 5 para incluir en el informe:\n", "Implemente un programa Python que obtenga $x(t)$ a partir de los vectores $i$ y $q$.\n", "\n", "Analice el espectro." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "oz-6y97kJsIH" }, "outputs": [], "source": [ "# SUBA AQUI EL ARCHIVO .WAV CON LAS MUESTRAS DEL SDR\n", "# YA SEA EL QUE SE ENCUENTRA EN EL EVA O EL QUE HAYA REGISTRADO\n", "# CON SDR++.\n", "from google.colab import files\n", "\n", "uploaded = files.upload()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "gnmivJGZ3nD0" }, "outputs": [], "source": [ "from scipy.io import wavfile\n", "import numpy as np\n", "\n", "filename = 'baseband_91285000Hz_11-46-47_30-03-2022.wav'\n", "fs, data = wavfile.read(filename)\n", "\n", "# Cuando hacemos wavfile.read generamos las variables:\n", "# - fs: es la tasa de muestreo\n", "# - data: es un array numpy de dos columnas con los vectores i y q\n", "\n", "i = data[:,0]\n", "q = data[:,1]" ] }, { "cell_type": "markdown", "metadata": { "id": "cHAK0ds_y7Iv" }, "source": [ "Observaciones:\n", "\n", "1. Cuando se trabaja en tiempo discreto habitualmente la derivada se aproxima por la diferencia entre muestras consecutivas. Es decir que si se tiene una señal de la forma $x(k)$, la derivada en $k$ se puede aproximar por $x(k) - x(k-1)$.\n", "\n", "2. Observe que para obtener la señal original deberá operar con la derivada discreta o utilizando funciones trigonométricas. En el siguiente enlace puede encontrar funciones útiles: https://numpy.org/doc/stable/reference/routines.math.html" ] }, { "cell_type": "markdown", "metadata": { "id": "XThcrjQAwEWp" }, "source": [ "# **PARTE IV**\n", "\n", "## Radio Definida por Software\n", "\n", "Comenzaremos a usar los equipos de radio definida por software o SDR por su sigla en inglés (luego serán usados en los proyectos finales). En esta primera instancia utilizaremos un dispositivo denominado comunmente RTL-SDR.\n", "\n", "![SDR.jpg](https://iie.fing.edu.uy/~gbelcredi/tallerine/SDR.jpg)\n", "\n", "Como Ud. sabe de los cursos de física, un campo electromagnético induce en un conductor cercano (un cable) un voltaje (y por tanto una corriente). Un ejemplo cotidiano es cuando llaman a un celular que está cerca de un parlante: parte del campo electromagnético que usa el celular para comunicarse con la radiobase impacta en los circuitos del parlante, generando un voltaje que llega a escucharse.\n", "\n", "Una antena no es más que un conductor sofisticado cuyo fin es convertir la mayor cantidad posible del campo electromagnético en voltaje. En los equipos SDR la antena transforma el campo electromagnético generado por antenas distantes (FM, Celular, WIFI, etc.) en un voltaje que lo vamos a pensar como una función v(t). Ese voltaje estará en general a una frecuencia alta y contendrá información modulada de alguna forma (por ejemplo 97.5 MHz en el caso de una radio con modulación en frecuencia -FM-).\n", "\n", "Los equipos SDR nos permiten obtener una parte del espectro radioeléctrico desde una frecuencia de algunas decenas de MHz hasta algunos Giga Hertz. Pero no podemos ver todo ese espectro a la vez. El equipo nos permite centrarnos en una frecuencia de por ejemplo 97.5 MHz y obtener una porción del espectro entorno de esa frecuencia.\n", "\n", "Los equipos SDR permiten ver algunos MHz (depende del equipo cuánto es el máximo posible) de todo el espectro de frecuencia posible, pero permiten además centrarnos en diferentes puntos del espectro. Por ejemplo podemos decirle al equipo que se quieren ver 2 MHz centrados en los 100 MHz. Entonces el equipo brindará las muestras de lo recibido por la antena entre 99MHz y 101 MHz; pero además trasladados de 100 MHz a 0 Hz. Es decir que el espectro de la señal obtenido para procesar en el software aparecerá centrado en 0 Hz (que corresponde a 100 MHz), por lo tanto la señal ubicada a 99 MHz la recibiremos como si estuviera en -1 MHz y la señal a 101 MHz la \"veremos\" en 1 Hz.\n", "\n", "La señal que obtiene el SDR de la antena es una señal de tiempo continuo, pero para poder procesarla en una computadora necesitamos tomar muestras de esa señal. Esas muestras se toman cada un tiempo T que se denomina período de muestreo, su inverso es la frecuencia o tasa de muestreo. Es decir que si el tiempo de muestreo T es de 100 muestras por segundo, eso quiere decir que cada 0.01 segundos medirá el valor del voltaje y ese valor se lo enviará a la computadora.\n", "\n", "En el SDR la forma de fijar la porción del espectro que se quiere obtener (2 MHz en el ejemplo anterior) se hará fijando la tasa de muestreo (sample rate en inglés). Es decir, si se define que la tasa de muestreo es de 2 MHz (para seguir con el ejemplo anterior) es lo mismo que decir que se desea que el sdr obtenga muestras de un ancho de 2 MHz del espectro centrados en cierta frecuencia (100 MHz en nuestro ejemplo anterior).\n", "\n", "El equipo SDR usa una combinación de filtros y multiplicación por cosenos y senos para entregarnos las muestras correspondientes al espectro centrado en cierta frecuencia y con cierto ancho de banda. Ya estuvimos analizando en la Parte III por qué hace estas operaciones para entregarnos las muestras.\n", "\n", "## SDR++ y espectro radioeléctrico\n", "\n", "Para procesar las muestras provenientes del SDR utilizaremos en esta instancia el software [SDR++](https://github.com/AlexandreRouma/SDRPlusPlus) que ya se encuentra instalado en la ceibalita.\n", "\n", "# Ejercicio 6:\n", "\n", "a) Averigüe en Internet y explique con sus palabras, qué es el espectro radioeléctrico (**incluir esta respuesta en el informe final**).\n", "\n", "b) Conecte en primer lugar la antena al SDR y luego conecte el SDR al puerto USB de la computadora. Abra SDR++ y seleccione como fuente de entrada el dispositivo RTL-SDR. Elija una frecuencia de muestreo y comience a ejecutar SDR++.\n", "\n", "c) Pruebe distintos valores de tasa de muestreo y vea qué sucede con la escala de frecuencias. ¿Qué relación existe entre la tasa de muestreo y la frecuencia máxima mostrada en la escala? El por qué de esta relación lo veremos más adelante.\n", "\n", "d) Sincronice una estación FM de su preferencia y grabe el IQ, para esto debe hacer Record en el modo baseband. Se sugiere grabar apenas unos segundos (ej: 4 s) y utilizar 250kHz como tasa de muestreo. Este archivo utilícelo con su demodulador para evaluar su trabajo.\n", "\n", "e) Explore el espectro radioélectrico modificando la frecuencia central del SDR, tratando de identificar alguna señal. Para esto puede serle útil la información recopilada por el proyecto EsOpo sobre el uso del espectro en nuestro país: https://iie.fing.edu.uy/proyectos/esopo/uso/.\n", "\n", "A continuación sugerimos algunas señales con sus frecuencias centrales para facilitar la exploración:\n", "\n", "- señal de audio de televisión: el audio acompaña a la señal de video. Las frecuencias centrales pueden observarse en el siguiente artículo (la asignación es común para América): https://en.wikipedia.org/wiki/Pan-American_television_frequencies. Observar que para recibir la señal de audio debe centrar la recepción en la frecuencia central del audio. Explora las opciones de recepción del SDR++ y deduzca la modulación utilizada.\n", "- \"radio taxi\": estas señales utilizan modulación NBFM en frecuencias próximas a 140-141 MHz.\n", "- señales en 433 MHz: esta banda de frecuencias está liberada (es decir, sin asignación). Por lo tanto, hay varios dispositivos que utilizan estas frecuencias: controles remotos (de garage, televisión, aire acondicionado), llaves de auto, sistemas RFID (como al entrar al IIE).\n", "- telefonía celular: alrededor de los 850 MHz hay bandas utilizadas por compañías telefónicas para 3G, pueden ver la asignación con más precisión explorando la información que hay en el proyecto EsOpo, mencionado antes. En este caso el ancho de banda es muy grande, y lo que se debería poder observar es ante una llamada un aumento de la potencia en las frecuencias usadas.\n", "\n", "f) (**incluir esta respuesta en el informe final**) Elija en el espectro tres señales (excluyendo la radio FM que grabaron en la parte d), capturelas y grabelas. Para cada señal esperamos que:\n", "\n", " I) graben un segmento de la señal usando SDR++, explicando cómo detectó la presencia de la señal capturada\n", "\n", " II) obtengan una gráfica del espectro en frecuencia de la señal (pueden graficarla usando python o tratar de obtenerla a partir del SDR++)\n", " \n", " III) obtengan una gráfica de la señal en el tiempo y traten de interpretarla\n", " \n", " IV) busquen información sobre la modulación utilizada\n", "\n", "La señal que obtiene en una primera instancia no es directamente la información enviada por el transmisor. A continuación veremos por qué es necesario y en qué consiste modular una señal para luego estudiar dos modulaciones particulares: AM y FM." ] }, { "cell_type": "markdown", "metadata": { "id": "f1AiW9c5SrHb" }, "source": [ "##IMPORTANTE##\n", "En este taller además del código que debe ser entregado en un notebook y comentado adecuadamente para que se pueda comprender lo que hicieron, se debe entregar un INFORME con el formato que se encuentra disponible en la página del curso en el cual deberán poner toda la información que no sea código que se solicitó en los ejercicios, explicaciones de información que buscaron, fórmulas que dedujeron y utilizaron, explicación de cómo codificaron el demodulador, etc. También deberán entregar las grabaciones realizadas con el sdr++ (puede ser un link a un repositorio).\n", "\n", "\n", "# Fechas de entrega\n", "\n", "\n", "1. **Miércoles 24/4 23:59hs**: Entrega intermedia conteniendo la resolución de Ejercicio 3 y 4.\n", "2. **Domingo 12/5 23:59hs**: Entrega Informe Final (.pdf) y Notebook completo (.ipynb)\n", "\n" ] } ], "metadata": { "colab": { "provenance": [], "collapsed_sections": [ "h-GL6Yi7IwSw", "XThcrjQAwEWp", "oM-6bO_z9qNU", "7UaTJBg24c1C", "EWDi2V6s5GOQ", "yNZ9spDPjmhO", "h_dr-y8aw79G", "Si6gnGE_54qO", "f1AiW9c5SrHb" ] }, "kernelspec": { "display_name": "Python 3", "name": "python3" } }, "nbformat": 4, "nbformat_minor": 0 }