{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# EE123 Lab 2: Software Defined Radio - Part II\n", "\n", "### Written by Miki Lustig and Frank Ong" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Intructions for Raspberry Pi (EE123 Sp'18)\n", "\n", "All the drivers for the rtl-sdr are installed. However, you will need to install the python module for controlling the rtl-sdr.\n", "\n", "In the commandline of a terminal on the RaspberryPi Run:\n", "\n", "``pip3 install pyrtlsdr``\n", "\n", "Also, you will need to install python Mode-S decoder for decoding airplane Automatic Dependent Surveillance - Broadcast (ADS-B). Run:\n", "\n", "``pip3 install pyModeS``\n", "\n", "Restart the Kernel.\n", "\n", "*Please kill all other kernels before starting on this lab. The memory on the raspberryPi is limited -- and this will help speed up computation*\n", "\n", "#### Intructions for other laptops\n", "\n", "Before you start, you must make sure that the rtl-sdr drivers and its python support are installed. If you have not done so in the prelab, then follow the instructions on the class website: \n", "\n", "https://inst.eecs.berkeley.edu/~ee123/sp18/rtl_sdr_install.html\n", "\n", "### About the lab:\n", "\n", "In the first part of the lab, we will look at the power spectrum of the NOAA radio signal and introduce settings of the SDR along the way. In the second part of the lab, we will decode Mode-S ADS-B packets that are transmitted by airplanes passing by, and picked up by the SDR, which allows us to track airplanes in realtime.\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## About the SDR\n", "\n", "The rtl-sdr usb dongles enables you to obtain samples from the electromagnetic spectrum around you. In very general terms, the dongle contains several components:\n", "\n", "1. The antenna couples to received electromagnetic fields and tiny currents are produced in it. \n", "2. A tuner integrated circuit amplifies the signal, filters it, demodulates it to an intermediate frequency where it is filtered again. The dongles we distributed in class contain either the Refael Micro 820T (Black dongles) tuner or the Elonics E4000 (white dongles). \n", "3. All dongles are equipped with the realtek RTL2832U (hence rtl-sdr). Although the chip is capable of doing many things (like decoding TV in Europe), we use only its analog to digital converters and its USB interface. The RTL2832U samples the signal that is coming from the tuner and spits out samples to the computer through the USB interface. \n", "\n", "The SDR returns samples at a desired rate up to 2.4MS/s (sometimes 3.5MS/s) of a part of the spectrum around a desired center frequency. For example, setting a center frequency $f_0 = 88.5\\cdot 10^6$ and a sampling rate of $Fs=2\\cdot 10^6$ will result in a complex valued sequence $x[n]$ whos DTFT corresponds to the physical frequency range of $87.5\\cdot 10^6 < f < 89.5\\cdot 10^6$. In other words, the digital frequency $\\omega=0$ of $X(e^{j\\omega})$, the DTFT of $x[n]$, will correspond to the physical frequency $88.5$MHz. The digital frequency $\\omega=\\pi$ will correspond to $89.5$MHz and $\\omega=-\\pi$ will correspond to $87.5$MHz.\n", "\n", "Q) How come the sequence $x[n]$ is complex valued ??? \n", "\n", "A) Consider the case when there is a transmitter which outputs a pure frequency at 89MHz. We choose a center frequency of 88.5MHz and sampling rate of 2MHz. The spectrum of $x[n]$ will not be symmetric, and has to be complex valued! The received signal would be $x[n] = e^{i2\\pi500000/2000000n} = e^{i\\pi/2n}$ which will have a single frequency at $\\omega=\\pi/2$ --> corresponding to 89MHz. \n", "\n", "\n", "\n", "To learn about what you can do with SDR's, I recommend you watch this youtube video. Most (not all) the stuff shown there can be done using rtl-sdr. At minute 5:00 you will see an example of ADS-B, which you will partly implement in this lab. (You will need internet connection to watch the video-- so it might not show up if you are connected to the raspberryPi via managed or ad-hoc)" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "image/jpeg": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAUDBAsLCAgIBgsKBgYHBwcGBwcGBgcFBwcIBwgHCAcHBwcHChAMBwgOCQcHDRUMDhERExMTBwwWGBYSGBASExIBBQUFCAcIDwkJDxIMDAwSEhISFBISEhISEhISEhISEhISEhISFBISEhISEhISEhISEhISEhISFBISFBISEhQSFP/AABEIAWgB4AMBIgACEQEDEQH/xAAdAAABBQEBAQEAAAAAAAAAAAAAAwQFBgcCAQgJ/8QAWxAAAgECAwMGCAkGCQkGBwEAAQIDAAQFERIhIjEGEzJBUWEHFEJScXKBkQgjYoKSobHB0RUzotTh8CRDU1STlLLS0xYXGHODhLO08TREY3R1wjVkZZXE4vIl/8QAGgEAAgMBAQAAAAAAAAAAAAAAAAIBAwQFBv/EAC4RAAICAQQCAQQABgIDAAAAAAABAgMRBBIhMUFREwUUImEVMlJxkaEjgcHR4f/aAAwDAQACEQMRAD8A+MqKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK2Zvg5YmOlcYcP96vf1ShPg64kdgucM/rV7+p0AYzRW2/6NWK/wA4w3+tX36nXD/BvxMdK5wwf71ffqdBGTFaK2lPg3Yoejc4Yf8Aer79Trt/g1YqONzhn9avv1OgkxOitwHwY8ZIzVrR185Pyoy+8WOVNl+DnieZHjOGq44q1zfKy+kGzzFAGMUVtn+jVivHxjDf61ffqdJt8HHEx0rrDB/vV9+p0AYvRWzf6OeJfzrDP61ffqdej4OOJno3OGN6Ly82en+CUAYxRW2j4NGK/wA4w3+tX36nSb/BvxMdK5wxf96vv1OgDFqK2U/B0xL+dYZ/Wr79Trr/AEc8S4eNYXn/AOcvf1OgDGKK21fg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EHba4j1beq+FYXjWKvcXNxdShRLdXE11IsYIQPPI0rhQzE6dTnpE9XGr6oyed5XOa8MkbfxbZq5xnzGY2ZcNuRPfVw5IyawgUFLe2JbJ2GRcnMZd1Zp403dXS3zjgSvqsR99EqItdi/Jk1nErxHJDENnUTiSExnzk3SfZs+rL3Vn6YnIODH3mnsXKWYAhtMgI076k/Ywqh6XHTDeafZ3CyWMYZhvwhH3hnmBpOXYdlRNxjwjPNXSSIybol6QcDg/zhtrOzi0ncu3Vsz/ABomxSRukc17N4j6zQtNjsVzJzGYIsudglE7SSHNOiUz28PqqIY0z8bbu+v8a88YPYPr/GtUVgqaHRkyO70hvArVkwblSQAt0C/ZIvT+f21TjMe6gTHupJ1KfYybRqtpexSbYmV+7rHs413IKyuO8dTmp0nuzH31K2vKmdBluS/61Sx96sDWWWlfgs3l3fLbwpuaqLcqpj5Mf0H/AL9c/wCU8vmx/Rk/v0y08g3ItbrTOWLKq+eU0vmx/Rk/v14eUknmx/Rk/v0ypkRlExKcgah72XqpKXG5G8lPYr/3qZNdE9Q+v8atjBoRi4NegU08YPYK98ZPYPr/ABqzAuB6K8poLs9g+v8AGjxo9g+v8akjax8KM6ZeNt2D6/xrnxg931/jQRsJCPMkBRvHd9/CtowqwC20cKxlWSIa3bgSFBzG3t6u+sPssQaN0cKjNG4cBw2RIOe3Jhsq1/5zbv8Ak7bZ/wCFN/jVTdW54wX0tQ5Zpy2p4sdLbNAVdPVx2GpSzxKQR6Zc3y4F22ZdnbWOt4TrsnMx239FP/jVz/nLu/5O2/op/wDGrLLRuXZrjqlE2F5NRBgZkYcUXLj2bah8fjm5qV3y0FHzDdMDSduwbKzUeEu6HRjtl9EU3+NXUvhLu2DBkt98FSebnzyI0nLObsqY6WUeiJXxkUaiiit5iCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA/9k=\n", "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from IPython.display import YouTubeVideo\n", "# A video on what you can do with Software defined radio. The B200 is a high-end SDR which is capable to much more than the rtl-sdr. \n", "# however, most of the stuff shown in the video could be done with the rtl-sdr as well. \n", "YouTubeVideo('cygDXeZaiOM')" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "\n", "# Import functions and libraries\n", "from __future__ import division\n", "import numpy as np, matplotlib.pyplot as plt\n", "from numpy import *\n", "from numpy.fft import *\n", "from matplotlib.pyplot import *\n", "from rtlsdr import RtlSdr\n", "import threading,time\n", "import gc # python garbage collection\n", "\n", "#import bokeh.plotting as bk\n", "#from bokeh.models import ColumnDataSource\n", "#from bokeh.io import push_notebook\n", "#bk.output_notebook()\n", "#from IPython.html.widgets import interact\n", "\n", "\n", "%matplotlib inline" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Task I: Capture data and compute the spectrum\n", "Let's look at a simple example of acquring data and looking at its spectrum. NOAA weather radio is transmitted from San Francisco at 162.4MHz It is a 5KHz frequency modeulated (FM) audio signal that voices a recording of the weather. If you live in the east-bay, you might also be able to pick up the Mt. Diablo transmitter at 162.425MHz. Here's a map of the SF coverage:\n", "\n", "\"Drawing\"\n", "\n", "It's best if you are outside of the building when collecting samples. Let's collect 4 seconds worth of samples ,sampled with a center frequency of 162MHz and a sampling rate of 960KHz.\n", "\n", "To Instantiate the sdr with the following parameters, which create the rtlsdr object, set the center frequency and the sampling rate\n", "\n", " sdr = RtlSdr()\n", " sdr.set_sample_rate(960000) # sampling rate\n", " sdr.set_center_freq(162200000) # 162.2MhZ center frequency\n", " " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# code here\n", "\n", "\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It is also useful to set the gain appropriately. The default is usually quite high and the signal saturates. \n", "\n", "To see what are the valid gains, invoke: \n", "\n", " print(sdr.valid_gains_db)\n", "\n", "The result will depend on the type of SDR you have (there are a few variants)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "print(sdr.valid_gains_db)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Pick a number that's one or two slots larger than the middle (around 37.2 I found to be working well) and set the gain using\n", " sdr.set_gain(gain)\n", " " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "gain = \n", "sdr.set_gain(gain)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The python interface to the SDR required that the number of samples be a multiple of 256. To read samples from the SDR, run the following command:\n", "\n", " N_samples = 960000*4 # 4 seconds\n", " y = sdr.read_samples(N_samples) # get samples\n", "\n", "If you are done with the device, you can clear it by:\n", " sdr.close()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Your code here\n", "\n", "\n", "\n", "\n", "\n", "\n", "sdr.close()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In case you are having trouble with the SDR, uncomment the line below to load Miki's capture\n", "``y = np.load('noaa.npy')``" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#np.save('noaa.npy',y)\n", "\n", "#In case you are having trouble with the SDR, uncomment the line below to load Miki's capture\n", "#y = np.load('noaa.npy')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We will only use a small portion of it to process and look at the spectrum. Let’s crop the samples and analyze the spectrum of a portion of 16384 samples of it. We will use the function `fft` to compute the DFT and then `fftshift` to center the DFT around $\\omega=0$. Remember, the signal you captured is complex valued, and hence has a two-sized spectrum. Intead of showing the spectrum in terms of $\\omega$, plot it in terms of the physical frequencies. Use a Kaiser window with $\\beta=6$. Use the function `plt.semilogy` to plot in log-scale. Make sure the axis is tight using `plt.axis` and that the aspect ratio of the figure is wide, so you can see the spectrum better\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Your Code here:\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "# Plot\n", "width, height = figaspect(0.2)\n", "fig=plt.figure(figsize=(width,height))\n", "p = plt.semilogy( f/1e6, abs(Y_w)), plt.xlabel('frequency [MHz]'); \n", "plt.title('spectrum');" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You should be able to see some energy in the spectrum around the right frequency. However, what you will notice immediately is that the spectrum is noisy. In addition there might be some spurious peaks and in the white dongles (E4000) there is also a large peak at the DC frequency. The peak at the DC frequency is due to constant bias in the ADC of the device. This translates to an impulse at $\\omega = 0$. Spourius peaks come from local oscillator leak and also quantization erros. \n", "\n", "To reduce the noise and get a finer look at the spectrum, we will break our entire sequence into smaller sequences. We don't need such a good spectral resolution, so we will break it to chunks sized 2048 samples, calculate their magnitude spectrum and average. This is also called average power specrum.\n", "\n", "* Reshape the sequence into a matrix with row size of 2048. Remember that the ordering of the matrix is 'C' style and hence row-first. \n", "* Multiply the rows by a kaiser window with $\\beta=6$\n", "* Compute fft and fftshift along the 2nd dimension. \n", "* Compute the absolute square of the result and average along the 1st dimension\n", "* Plot the result" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Yor code here:\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "# compute mean\n", "Pspect = mean(abs(X)*abs(X),axis=0);" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": true }, "outputs": [], "source": [ "# Display:\n", "\n", "f = r_[-N/2:N/2]/N*fs + f0\n", "\n", "width, height = figaspect(0.3)\n", "fig=plt.figure(figsize=(width,height))\n", "p = plt.semilogy( f/1e6,Pspect);\n", "plt.xlabel('frequency [MHz]'); plt.title('Average Power Spectrum');\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This plot is called average power spectrum. As you can see, the spectrum looks much nicer now. Can you identify the NOAA weather station? Only the wide spectrum peaks are real. BTW, The very narrow spiky peaks in the spectrum are probably not real signals. They are due to leakage of the local oscilator, non-linearity in the receiver, and poor dynamic range of the ADC of the device. Still... for 12$ it is not too bad!\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "* What is the spectral resolution in the plot?\n", "* Repeat the the measurement and the average power spectrum for the center frequency 88.4MHz. Can you identify NPR 88.5 Station?\n", "\n", "Note: The rectangular bands you see around the main signal are HD radio signals. These are transmitted at the band edges and provide digital radio programming. Unfortunately HD radio in the USA uses proprietery protocol, and we can not decode it at this time. " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Your code here:\n", "\n", "\n", "\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#np.save('npr.npy',y)\n", "\n", "#In case you are having trouble with the SDR, uncomment the line below to load Miki's capture\n", "#y = np.load('npr.npy')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Your Code here:\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "Pspect = mean(abs(X)*abs(X),axis=0);\n", "f = r_[-N/2:N/2]/N*fs + f0\n", "width, height = figaspect(0.2)\n", "fig=plt.figure(figsize=(width,height))\n", "p = plt.semilogy( f/1e6,Pspect);\n", "plt.xlabel('frequency [MHz]'); plt.title('Average Power Spectrum');\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## You are now ready to proceed to the next part. Make sure you kill this kernel to save memory" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "%reset -f" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.5.3" } }, "nbformat": 4, "nbformat_minor": 1 }