Assumes: RF-201 toolchain fully functional (GNU Radio, RTL-SDR, HackRF, URH, gr-iio for ANT-SDR E200, Python 3.10+, Conda environment).
Run gnuradio-companion --version and python3 -c "import numpy, scipy, matplotlib" before starting. If any of these fail, return to the RF-201 SETUP.md.
New Tools for RF-301
1. OpenAirInterface (LTE + 5G NR)
OAI requires Ubuntu 22.04 LTS (recommended) or Debian 12. Docker deployment is the safest option for initial lab work.
# Docker image (pre-built; ~3 GB)
docker pull oaisoftwarealliance/oai-gnb:develop
docker pull oaisoftwarealliance/oai-nr-ue:develop
# Verify images
docker images | grep oaisoftwarealliance
# Clone OAI source (for configuration files + scripts)
git clone https://gitlab.eurecom.fr/oai/openairinterface5g.git
cd openairinterface5g
git checkout develop
For LTE lab (Lab 5 Part A), also pull:
docker pull oaisoftwarealliance/oai-enb:develop
docker pull oaisoftwarealliance/oai-mme:develop
docker pull oaisoftwarealliance/oai-spgwu-tiny:develop
2. srsRAN (alternative cellular stack)
# srsRAN 4G (LTE) from apt on Ubuntu 22.04
sudo add-apt-repository ppa:softwareradiosystems/srsran
sudo apt-get update
sudo apt-get install srsran srsran-4g
# srsRAN Project (5G NR; requires UHD/USRP or ZeroMQ for simulation)
git clone https://github.com/srsran/srsRAN_Project.git
cd srsRAN_Project
mkdir build && cd build
cmake -DENABLE_ZEROMQ=ON ..
make -j$(nproc)
3. gr-satellites (SATCOM decoder framework)
# From PyPI inside the GNU Radio conda environment
conda activate gnuradio # or your GNU Radio virtualenv
pip install gr-satellites
# Verify
python3 -c "import satellites; print(satellites.__version__)"
# Also install dependencies
pip install construct requests pyzmq
4. gr-leo (LEO orbital mechanics)
# From source (gr-leo requires GNU Radio 3.10+)
git clone https://github.com/aerospaceresearch/gr-leo.git
cd gr-leo
mkdir build && cd build
cmake ..
make -j$(nproc)
sudo make install
sudo ldconfig
5. GNSS-SDR
# Binary install on Ubuntu 22.04
sudo apt-add-repository ppa:gnss-sdr/gnss-sdr-stable
sudo apt-get update
sudo apt-get install gnss-sdr
# Verify
gnss-sdr --version
6. gr-fosphor (GPU-accelerated waterfall)
# From source (requires OpenCL)
sudo apt-get install opencl-headers ocl-icd-opencl-dev
git clone https://git.osmocom.org/gr-fosphor
cd gr-fosphor
mkdir build && cd build
cmake ..
make -j$(nproc)
sudo make install
sudo ldconfig
7. USRP / Ettus UHD drivers
The USRP hardware is program-supplied for Labs 5 and 6. When available:
sudo apt-get install libuhd-dev uhd-host python3-uhd
sudo uhd_images_downloader
# Verify device
uhd_find_devices
uhd_usrp_probe
8. gr-iio advanced (ANT-SDR E200)
Carried forward from RF-201. Confirm libIIO version 0.26+:
python3 -c "import iio; print(iio.version)"
# Should report (0, 26, 0) or higher
9. Parks-McClellan FIR design (SciPy)
conda activate gnuradio
pip install scipy numpy matplotlib jupyter
# Test Parks-McClellan available
python3 -c "from scipy.signal import remez, freqz; print('remez OK')"
10. Academy Flowgraph (browser DSP tool)
The Academy Flowgraph DSP tool ships at https://portal.virtuscyberacademy.org/workbench/static/academy-flowgraph.html. No install required. Open in any modern browser. Use it for block-graph sketching and filter-chain visualisation in Labs 1-3 before committing to GNU Radio flowgraph implementations.
Hardware required
| Hardware | Required for | Status |
|---|---|---|
| ANT-SDR E200 (or equivalent AD9361-based) | Labs 3, 4 | Student-provided or program bench |
| HackRF One | Labs 2, 9 | Student-provided (from RF-201 kit) |
| RTL-SDR | Lab 6 (NOAA APT) | Student-provided (from RF-201 kit) |
| V-dipole antenna (137 MHz) | Lab 6 | Build or source ($5-10 in parts) |
| USRP B200 / B210 or N310 | Labs 5, 10 | Program-supplied for cellular labs |
| RF-shielded enclosure | Labs with transmit | Required for Labs 4, 9; program bench |
| ARRL Extra license (or controlled test environment) | All transmit labs | Confirm before transmit operations |
Verification script
#!/bin/bash
echo "=== RF-301 Toolchain Verification ==="
# GNU Radio
python3 -c "import gnuradio; print('GNU Radio', gnuradio.__version__)" 2>/dev/null || echo "FAIL: gnuradio"
# gr-satellites
python3 -c "import satellites; print('gr-satellites', satellites.__version__)" 2>/dev/null || echo "FAIL: gr-satellites"
# GNSS-SDR
gnss-sdr --version 2>/dev/null | head -1 || echo "FAIL: gnss-sdr"
# scipy / remez
python3 -c "from scipy.signal import remez; print('scipy.signal.remez OK')" 2>/dev/null || echo "FAIL: scipy remez"
# OAI Docker image
docker images oaisoftwarealliance/oai-gnb:develop --format "{{.Repository}}:{{.Tag}}" 2>/dev/null || echo "WARN: OAI Docker image not pulled"
# UHD
uhd_find_devices 2>/dev/null | head -1 || echo "WARN: UHD USRP not detected (program-supplied hardware)"
echo "=== Verification complete ==="
Tool Journal initial entries (RF-301)
Run this before Week 1 to initialize the RF-301 Toolchain Diary extension:
## RF-301 Tool Journal
| # | Tool | Introduced | First use | Notes |
|---|---|---|---|---|
| 1 | OpenAirInterface | Week 6 | Lab 5 | LTE eNB / 5G gNB via Docker |
| 2 | srsRAN | Week 6 | Lab 5 | Alternative cellular stack |
| 3 | gr-satellites | Week 8 | Lab 6 | SATCOM decoder framework |
| 4 | gr-leo | Week 8 | Lab 6 | LEO orbital mechanics GR integration |
| 5 | GNSS-SDR | Week 8 | Lab 6 | GPS/Galileo/GLONASS SDR receiver |
| 6 | gr-fosphor | Week 9 | Lab 7 | GPU waterfall visualisation |
| 7 | gr-paint | Week 9 | Lab 7 | Spectrogram SIGINT visualisation |
| 8 | USRP/UHD | Week 6 | Lab 5 | Research-grade SDR |
| 9 | gr-iio advanced | Week 4 | Lab 3 | ANT-SDR E200 advanced workflow |
| 10 | LPDA/discone/yagi | Week 8 | Lab 6 | Advanced antenna selection |
| 11 | Academy Flowgraph | Week 1 | Lab 1 | Browser DSP block-graph tool |