GNU Radio: I Built My Own SDR Apps by Dragging Blocks Around! ๐ก๐จ
GNU Radio: I Built My Own SDR Apps by Dragging Blocks Around! ๐ก๐จ
Real talk: I thought building radio receivers required years of electrical engineering classes and intimate knowledge of Fourier transforms. Then I discovered GNU Radio Companion (GRC) - a visual programming environment where you build SDR applications by dragging blocks and connecting them with wires.
Within 30 minutes, I had built a working FM radio receiver. No DSP code. No complex math. Just blocks that say "FM Demod" and "Audio Sink." My mind was BLOWN! ๐คฏ
Then I realized: Each block IS running complex DSP code under the hood. I can write my own blocks. I can build ANYTHING that processes radio signals. Custom decoders, signal analyzers, even transmitters!
What I discovered: GNU Radio is like visual scripting meets signal processing. It's the perfect bridge between "I know programming" and "I want to build RF applications!" Welcome to the most powerful (and most fun) SDR framework! ๐ป
What Even Is GNU Radio? ๐ค
GNU Radio = Free, open-source software for building SDR applications
Translation: A framework + visual programming tool that lets you build real radio systems without being an RF wizard!
Think of it like this:
- Traditional approach: Write thousands of lines of C++ implementing filters, demodulators, FFTs, etc.
- GNU Radio approach: Drag pre-built blocks (filters, demodulators, FFTs) onto a canvas, wire them together, click "Run"! ๐ฏ
The magic: Each block is optimized C++ code doing real-time signal processing. You just connect them like plumbing!
What fascinated me as a developer: It's VISUAL PROGRAMMING for signal processing! Like Node-RED or LabVIEW, but for radio waves! ๐
My GNU Radio Journey (From Confused to Obsessed) ๐
Week 1: The Installation Nightmare
Me: "Let me install GNU Radio..."
Linux package manager:
sudo apt-get install gnuradio
# [10 minutes later]
# Installing 247 dependencies...
Me: "TWO HUNDRED DEPENDENCIES?! What did I get myself into?!" ๐
But then: I launch gnuradio-companion and see the GUI. Beautiful blocks. Flowgraph canvas. Signal processing blocks organized into categories. OKAY, THIS IS COOL! ๐
Week 1: First Flowgraph - FM Radio Receiver
My goal: Build an FM radio receiver for my RTL-SDR
What I thought I'd need: PhD in electrical engineering
What I actually needed: 5 blocks!
The flowgraph:
[RTL-SDR Source] โ [Low Pass Filter] โ [WBFM Receive] โ [Rational Resampler] โ [Audio Sink]
That's it! Five blocks. Connect them. Set parameters. Click "Run." OUT COMES CRYSTAL CLEAR FM RADIO! ๐ป
My reaction: "THAT SHOULD NOT HAVE BEEN THAT EASY!" ๐
Week 2: The "Aha!" Moment
In my GNU Radio experiments, I realized what each block actually DOES:
- RTL-SDR Source: Captures raw IQ samples from the dongle
- Low Pass Filter: Removes signals outside our FM station bandwidth
- WBFM Receive: Demodulates FM (extracts audio from carrier)
- Rational Resampler: Converts sample rate to match audio (48 kHz)
- Audio Sink: Sends audio to speakers
The revelation: I'm building a signal processing PIPELINE! Data flows through blocks, each transforming the signal! It's like Unix pipes, but for RADIO WAVES! ๐
Week 3: The Deep Dive
My obsession kicked in:
- Built AM radio receiver (different demod block!)
- Created spectrum analyzer (FFT block + visualization!)
- Made waterfall display (like SDR#, but I BUILT IT!)
- Started reading about what's inside each block
- Discovered I could write Python blocks
- Realized I could BUILD MY OWN BLOCKS! ๐จ
The moment I knew I was hooked: I spent 4 hours on a Saturday building a custom NOAA weather satellite decoder in GNU Radio. It worked. I decoded satellite images with MY OWN CODE. This hobby owns me now. ๐
GNU Radio Companion: Visual Programming Tour ๐จ
The Interface
When you open GRC, you see:
-
Block Library (left side): Hundreds of signal processing blocks organized by category
- Sources (RTL-SDR, file, signal generators)
- Sinks (audio, file, GUI displays)
- Filters (low pass, high pass, band pass)
- Math operations (multiply, add, FFT)
- Modulators/Demodulators (AM, FM, PSK, etc.)
- Custom blocks (your own creations!)
-
Canvas (center): Where you build flowgraphs by dragging/connecting blocks
-
Properties (right side): Configure each block's parameters
What I love: It's VISUAL! I can SEE the signal flow! Coming from traditional code, this is mind-blowing! ๐ฏ
My First Flowgraph Step-by-Step
Goal: FM radio receiver for RTL-SDR
Step 1: Add blocks
Search "osmocom" โ Drag "osmocom Source" to canvas
Search "low pass" โ Drag "Low Pass Filter" to canvas
Search "wbfm" โ Drag "WBFM Receive" to canvas
Search "rational resampler" โ Drag "Rational Resampler" to canvas
Search "audio sink" โ Drag "Audio Sink" to canvas
Step 2: Connect blocks
- Click output port of osmocom โ drag to input of Low Pass Filter
- Connect each block in sequence
- You literally draw wires between blocks! ๐
Step 3: Configure parameters
Osmocom Source (RTL-SDR):
- Sample Rate: 2.4 MHz (samp_rate variable)
- Center Frequency: 101.5 MHz (your local FM station!)
- RF Gain: 20 dB
Low Pass Filter:
- Cutoff Freq: 100 kHz (isolate one FM station)
- Sample Rate: 2.4 MHz
WBFM Receive:
- Quadrature Rate: 2.4 MHz (input)
- Audio Decimation: 10 (outputs 240 kHz)
Rational Resampler:
- Interpolation: 1
- Decimation: 5
- (240 kHz โ 48 kHz for audio)
Audio Sink:
- Sample Rate: 48000 (CD quality!)
Step 4: Generate and run
Click the "Generate" button (creates Python code!)
Click "Execute" button (runs the flowgraph!)
Result: FM radio playing through speakers! Built in 10 minutes! ๐ต
What fascinated me: The "Generate" button creates actual Python code! I can READ IT! I can MODIFY IT! I can learn how it works! ๐
Real Projects I Built with GNU Radio ๐ง
Project 1: Dual FM Receiver (Two Stations at Once!)
The idea: Listen to two FM stations simultaneously
The flowgraph:
โโโ [Filter 1] โ [WBFM 1] โ [Audio Sink Left]
[RTL-SDR] โ [xlating FIR Filter] โโค
โโโ [Filter 2] โ [WBFM 2] โ [Audio Sink Right]
What I learned: You can SPLIT signal flow! One input โ multiple processing chains! Like forking a stream! ๐
Result: Left earcup plays station 1, right earcup plays station 2. Useless but COOL! ๐
Project 2: Spectrum Analyzer with Waterfall
The setup:
[RTL-SDR Source] โ [FFT] โ [QT GUI Frequency Sink]
โโโ [QT GUI Waterfall Sink]
What it does: Real-time spectrum display + waterfall visualization!
What blew my mind: The GUI sinks create BEAUTIFUL plots! Real-time updating! I built my own SDR# in 2 minutes! ๐
Customizations I added:
- Peak hold (shows strongest signals)
- Average filtering (smooths display)
- Color maps (makes it pretty!)
- Click to tune (interactive!)
Result: Professional-looking spectrum analyzer. Friends thought I downloaded software. NOPE, I BUILT IT! ๐ช
Project 3: NOAA Weather Satellite APT Decoder
This was my masterpiece!
The challenge: NOAA satellites transmit at 137 MHz, images encoded as analog audio tones (APT format)
My flowgraph:
[RTL-SDR Source]
โ [Low Pass Filter]
โ [Quadrature Demod] (FM demodulation)
โ [Rational Resampler] (resample to 11025 Hz)
โ [AGC] (automatic gain control)
โ [WAV File Sink]
Then: Process the WAV file with noaa-apt decoder โ SATELLITE IMAGE! ๐ฐ๏ธ
What I learned:
- Quadrature demod extracts FM modulation
- Resampling matches the APT standard (11025 Hz)
- AGC normalizes signal strength variations
- File sinks let you save for later processing!
Result: Captured beautiful NOAA-18 image of hurricanes over the Atlantic! FROM SPACE! Built the decoder myself! This is THE COOLEST THING I'VE EVER DONE! ๐
Project 4: Custom Digital Mode Decoder
The goal: Decode FSK (Frequency Shift Keying) signals
What FSK is: Binary data transmitted as two frequencies (mark = 1, space = 0)
My flowgraph:
[RTL-SDR Source]
โ [Quadrature Demod]
โ [Moving Average] (low pass filter)
โ [Binary Slicer] (threshold detection)
โ [Custom Python Block] (decode bytes โ text!)
โ [File Sink] (save decoded data)
What I built in Python block:
import numpy as np
from gnuradio import gr
class fsk_decoder(gr.sync_block):
def __init__(self):
gr.sync_block.__init__(
self,
name="FSK Decoder",
in_sig=[np.uint8], # Binary input
out_sig=[np.uint8] # Byte output
)
self.bit_buffer = []
def work(self, input_items, output_items):
in0 = input_items[0]
# Collect bits into bytes
for bit in in0:
self.bit_buffer.append(bit)
if len(self.bit_buffer) == 8:
# Convert 8 bits โ byte
byte = 0
for i, b in enumerate(self.bit_buffer):
byte |= (b << i)
output_items[0][0] = byte
self.bit_buffer = []
return 1
return 0
Result: I decoded pager messages! Weather alerts! FSK data transmissions! I WROTE MY OWN DEMODULATOR! ๐ฏ
What this taught me: GNU Radio blocks are just Python (or C++) classes! You can build ANYTHING! The framework handles all the streaming, buffering, and threading! ๐ฅ
Understanding Signal Processing Blocks ๐ง
The Three Types of Blocks
1. Sources (no input, generate data)
- RTL-SDR Source: Read from hardware
- Signal Source: Generate sine waves, square waves, etc.
- File Source: Replay recorded IQ data
- Vector Source: Generate custom patterns
2. Processing Blocks (input โ processing โ output)
- Filters: Low pass, high pass, band pass, notch
- Math: Add, multiply, FFT, complex to magnitude
- Demodulators: FM, AM, SSB, PSK, FSK
- Resamplers: Change sample rate
3. Sinks (accept input, no output)
- Audio Sink: Play through speakers
- File Sink: Save to disk
- GUI Sinks: Display plots, waterfall, constellation
- NULL Sink: Discard data (useful for testing!)
What I realized: It's like LEGO! Each block has specific input/output types. You can only connect compatible types! ๐งฉ
Block I/O Types
Common types:
- Complex: IQ samples (most SDR data!)
- Float: Real numbers (audio, demodulated signals)
- Byte: 8-bit integers (digital data)
- Int: 32-bit integers (counts, indices)
Example error I made:
[RTL-SDR] โ [Audio Sink]
Error: "Cannot connect complex to float!"
Fix: Add converter block!
[RTL-SDR] โ [Complex to Mag] โ [Audio Sink]
Lesson: Type checking prevents errors! Coming from Python, this feels like TypeScript! ๐
Advanced GNU Radio: Python API ๐
When Visual Programming Isn't Enough
I hit the limits of GRC when:
- Need custom logic (state machines, protocols)
- Want to integrate with other Python code
- Need dynamic reconfiguration at runtime
- Building complex applications
Solution: Use GNU Radio's Python API directly!
My First Python Flowgraph
Instead of GRC, write Python code:
#!/usr/bin/env python3
from gnuradio import gr
from gnuradio import blocks
from gnuradio import audio
from gnuradio import analog
from gnuradio import filter
import osmosdr
class fm_receiver(gr.top_block):
def __init__(self):
gr.top_block.__init__(self, "FM Receiver")
# Variables
self.samp_rate = samp_rate = 2.4e6
self.freq = freq = 101.5e6
# Blocks
self.rtlsdr_source = osmosdr.source(args="numchan=1")
self.rtlsdr_source.set_sample_rate(samp_rate)
self.rtlsdr_source.set_center_freq(freq, 0)
self.rtlsdr_source.set_gain(20, 0)
self.lpf = filter.fir_filter_ccf(
1,
filter.firdes.low_pass(1, samp_rate, 100e3, 10e3)
)
self.wbfm = analog.wfm_rcv(
quad_rate=samp_rate,
audio_decimation=10
)
self.resampler = filter.rational_resampler_fff(
interpolation=1,
decimation=5
)
self.audio_sink = audio.sink(48000, '', True)
# Connections
self.connect((self.rtlsdr_source, 0), (self.lpf, 0))
self.connect((self.lpf, 0), (self.wbfm, 0))
self.connect((self.wbfm, 0), (self.resampler, 0))
self.connect((self.resampler, 0), (self.audio_sink, 0))
if __name__ == '__main__':
tb = fm_receiver()
tb.start()
input('Press Enter to quit: ')
tb.stop()
tb.wait()
What I learned:
- GRC generates code EXACTLY like this!
gr.top_blockis the flowgraph containerself.connect()wires blocks together- You have full Python control! ๐
Why this is powerful: Now I can add REST APIs, databases, dynamic tuning, automation - ANYTHING Python can do! ๐
Dynamic Reconfiguration Example
Problem: Want to change frequency without restarting
Solution: Expose setters!
class fm_receiver(gr.top_block):
# ... (previous code) ...
def set_freq(self, freq):
"""Change frequency while running!"""
self.freq = freq
self.rtlsdr_source.set_center_freq(freq, 0)
print(f"Tuned to {freq/1e6:.2f} MHz")
# In main code:
tb = fm_receiver()
tb.start()
# Change station while running!
tb.set_freq(104.3e6) # Switch to different station
time.sleep(10)
tb.set_freq(101.5e6) # Switch back
Result: Live frequency scanning! Automated station hopping! All while the flowgraph runs! โก
Signal Processing Concepts I Actually Learned ๐
1. Sample Rate (The Most Important Concept!)
What it is: How many samples per second you capture
Why it matters: Nyquist theorem says you need 2ร the highest frequency!
Example:
- FM radio station bandwidth: ~200 kHz
- Need sample rate: >400 kHz
- I use: 2.4 MHz (plenty of headroom!)
What I learned the hard way: Low sample rate = aliasing (signals fold back, create artifacts)! ๐
2. IQ Samples (Complex Numbers!)
What RTL-SDR gives you: Complex numbers (I + jQ)
Why complex? Encodes both amplitude AND phase!
In GNU Radio:
# Complex sample = I + jQ
# I = In-phase component (real)
# Q = Quadrature component (imaginary)
# Get magnitude (signal strength)
[Complex to Mag] block
# Get phase (frequency information)
[Complex to Arg] block
My "aha" moment: IQ samples let you capture BOTH sidebands of a signal simultaneously! Traditional radio can't do this! ๐ฏ
3. Filtering (Isolating What You Want)
Types of filters I use:
Low Pass Filter (LPF):
- Keeps low frequencies, removes high
- Use case: Isolate single FM station from others
High Pass Filter (HPF):
- Keeps high frequencies, removes low
- Use case: Remove DC offset from signal
Band Pass Filter (BPF):
- Keeps middle frequencies, removes high and low
- Use case: Select specific channel in crowded band
Notch Filter:
- Removes specific frequency
- Use case: Kill interference from nearby transmitter!
What fascinated me: Filters are just multiplication in frequency domain! FFT โ multiply โ IFFT! DSP is MATH! ๐ข
4. Decimation and Interpolation
Decimation: Reduce sample rate (throw away samples)
- RTL-SDR gives 2.4 MHz โ decimate to 240 kHz for FM audio
Interpolation: Increase sample rate (add samples)
- 240 kHz FM audio โ interpolate to 48 kHz for speakers
Why this matters: Processing at high sample rates is EXPENSIVE! Decimate as early as possible! ๐ฐ
Rational Resampler: Does both! Changes rate by fraction (e.g., ร1/5 = divide by 5)
5. Demodulation (Extracting Information)
What modulation is: Encoding information onto a carrier wave
Common types:
AM (Amplitude Modulation):
- Info in amplitude changes
- Demod: Take magnitude of signal
- Use case: AM radio, aviation
FM (Frequency Modulation):
- Info in frequency changes
- Demod: Quadrature demod (detect frequency shifts)
- Use case: FM radio, weather satellites
SSB (Single Sideband):
- Info in one sideband only
- Demod: Complex multiply with carrier
- Use case: Ham radio HF
PSK (Phase Shift Keying):
- Info in phase changes
- Demod: Costas loop (carrier recovery + phase detection)
- Use case: Digital modes (PSK31, BPSK)
What I realized: Each modulation has trade-offs! AM is simple but inefficient. FM is noise-resistant. SSB saves bandwidth. It's protocol design for ANALOG signals! ๐ป
Common GNU Radio Mistakes (I Made Them All!) ๐
Mistake #1: Sample Rate Mismatch
My error:
[RTL-SDR @ 2.4 MHz] โ [Audio Sink @ 48 kHz]
What happened: HORRIBLE screeching noise! ๐ฑ
Why: Sample rate mismatch! Audio sink expects 48k samples/sec, getting 2.4M!
Fix: Add resampler!
[RTL-SDR @ 2.4 MHz] โ [Rational Resampler รท50] โ [Audio Sink @ 48 kHz]
Lesson: ALWAYS match sample rates between blocks! ๐
Mistake #2: Forgetting to Set Center Frequency
My flowgraph: Built FM receiver, clicked run, heard static
Problem: Forgot to set RTL-SDR center frequency! It was tuned to 0 Hz! ๐
Fix: Set center_freq parameter to actual station (e.g., 101.5 MHz)
Pro tip: Use variables! Makes tuning easy!
Mistake #3: Too Much Gain = Overload
Problem: Set RTL-SDR gain to maximum (49 dB)
Result: Signals clipped, distortion, terrible audio
Fix: Start with gain=20, increase only if signal weak
Rule of thumb: Enough gain to see signal clearly, but NOT saturating (flat-topped waveforms = bad!)
Mistake #4: Not Enabling "Generate Options"
My error: Modified flowgraph in Python, ran it, changes didn't appear
Why: GRC caches generated code!
Fix: Click "Generate" button before "Execute"! Or enable "Auto-Generate" in settings!
Lesson: GRC generates Python code. If you don't regenerate after changes, you're running OLD code! ๐
Mistake #5: Incorrect Data Types
My flowgraph:
[Vector Source (float)] โ [FFT (complex)]
Error: "Cannot connect float to complex!"
Fix: Add type converter!
[Vector Source (float)] โ [Float to Complex] โ [FFT (complex)]
What I learned: GNU Radio has STRONG typing! Can't connect incompatible types! (Coming from Python, this was surprising!) ๐ฏ
Resources That Made Me Actually Understand This ๐
Official Documentation
GNU Radio Wiki: https://wiki.gnuradio.org/
- Tutorials section (START HERE!)
- Block documentation
- API reference
GNU Radio Guided Tutorials: Built-in tutorials in GRC (Help โ Tutorials)
Books
"Software Defined Radio for Engineers" by Travis Collins:
- FREE online version!
- Covers theory + practical GNU Radio
- BEST resource I found! ๐
"GNU Radio Manual and C++ API Reference":
- Deep dive into internals
- For when you want to write C++ blocks
Video Courses
"GNU Radio Tutorials" by Michael Ossmann (Great Scott Gadgets):
- YouTube series
- Covers basics to advanced
- HackRF focus, but applies to RTL-SDR too!
"Fundamentals of GNU Radio" by Dr. Marc Lichtman:
- Excellent free course
- Theory + hands-on flowgraphs
- Perfect for developers!
Communities
GNU Radio Mailing List:
- [email protected]
- VERY helpful community!
- Developers themselves answer questions!
r/GNURadio Subreddit:
- Smaller community but active
- Good for quick questions
GNU Radio Conference (GRCon):
- Annual conference
- Talks published on YouTube
- Cutting-edge research + practical projects!
The Bottom Line ๐ก
GNU Radio transformed me from "I can write code" to "I can build radio systems!" The visual programming approach makes signal processing ACCESSIBLE!
What I learned as a software developer exploring GNU Radio:
- โ Visual programming is POWERFUL for signal processing
- โ You don't need an EE degree to build radio apps
- โ Understanding flowgraphs teaches you DSP concepts
- โ Python API gives full control when needed
- โ Custom blocks let you build ANYTHING
- โ Open source means you can learn from REAL implementations
- โ The community is incredibly helpful! ๐ค
The best part: GNU Radio makes RF accessible to software developers. We think in data flows, pipelines, transformations. Flowgraphs are EXACTLY that! It's our native language! ๐ป
After weeks of GNU Radio experiments, my takeaway: The barrier between software and RF has collapsed. I can build custom decoders, signal analyzers, even transmitters (with proper hardware + license). GNU Radio is the ultimate playground for developer minds curious about radio! ๐ก
Your Weekend GNU Radio Project ๐
Saturday Morning: Installation (1-2 hours)
On Linux (Ubuntu/Debian):
sudo apt-get update
sudo apt-get install gnuradio gnuradio-dev gr-osmosdr
# Verify installation
gnuradio-companion --version
On macOS:
brew install gnuradio
# Or use MacPorts
On Windows:
- Download installer from gnuradio.org
- Or use WSL2 (Linux subsystem)
Pro tip: Docker is easiest for all platforms!
docker run -it --device=/dev/bus/usb gnuradio/gnuradio
Saturday Afternoon: First Flowgraph (2 hours)
Project: FM radio receiver
- Launch
gnuradio-companion - Follow the tutorial in Help โ Tutorials โ 01-GRC
- Build FM receiver (my example above!)
- Generate and execute
- HEAR FM RADIO! ๐ป
Sunday: Advanced Project (4 hours)
Choose your adventure:
Beginner: Spectrum analyzer with waterfall
- Learn: FFT, GUI sinks, visualization
Intermediate: AM radio receiver
- Learn: Different demodulation (magnitude instead of FM)
Advanced: Weather satellite decoder
- Learn: Quadrature demod, file sinks, real-world application
Expert: Custom digital mode decoder
- Learn: Python blocks, protocol implementation
Your Action Plan Right Now ๐ฏ
Today:
- Visit gnuradio.org and read about the project
- Watch one GNU Radio tutorial on YouTube
- Join r/GNURadio and r/RTLSDR
- Check if your OS has GNU Radio packages
This Week:
- Install GNU Radio (Docker is easiest!)
- Complete the built-in tutorials in GRC
- Build your first FM receiver
- Join the mailing list and introduce yourself
This Month:
- Build 5+ flowgraphs (FM, AM, spectrum analyzer, etc.)
- Write your first Python block
- Decode weather satellite with your custom flowgraph
- Contribute to GNU Radio (docs, examples, bug reports!)
- Start planning your dream SDR application! ๐ญ
Final Thoughts ๐ญ
When I started exploring RF, I thought I'd need hardware engineering skills. GNU Radio proved me wrong. It's SOFTWARE all the way down!
The signal processing happens in code. The flowgraphs are code. The blocks are code. Even the generated applications are Python scripts you can read and modify!
Best parts of GNU Radio:
- โ Perfect for developers (it's all software!)
- โ Visual programming for rapid prototyping
- โ Python API for production applications
- โ Open source (learn from the code!)
- โ Massive block library (don't reinvent the wheel!)
- โ Active community of helpful developers
- โ Build ANYTHING that processes radio signals! ๐ง
The moment I was hooked: I built a custom NOAA satellite decoder, saw the generated Python code, understood how every piece worked, modified it to add features, and realized: I'm an RF engineer now! Not because of formal education, but because GNU Radio made it POSSIBLE to learn by building! ๐
One year later: I've built signal analyzers, custom decoders, spectrum monitors, and contributed blocks to the GNU Radio ecosystem. I understand DSP concepts I never thought I'd grasp. All because a visual programming tool made signal processing APPROACHABLE! ๐
Ready to build radio apps? Connect with me on LinkedIn and share your first GNU Radio flowgraph!
Want to see my projects? Check out my GitHub - I've got custom GNU Radio blocks and example flowgraphs!
Now go forth and build radio systems with code! Welcome to GNU Radio - where software meets spectrum! ๐ก๐ปโจ
P.S. The first time you realize that clicking "Generate" creates human-readable Python code you can actually LEARN FROM, you'll understand why GNU Radio is brilliant. It's not a black box - it's a TEACHING TOOL! Every flowgraph is a DSP lesson waiting to happen! ๐
P.P.S. If you become obsessed with building custom blocks and start reading DSP papers at 2 AM to implement novel demodulation algorithms, welcome to the club. I'm currently implementing a custom decoder for a mystery digital signal I found. GNU Radio makes the impossible feel achievable! Ask me how I know! ๐
P.P.P.S. The rabbit hole goes DEEP. First it's visual flowgraphs. Then Python blocks. Then you're reading the C++ source code of core blocks. Then you're optimizing with SIMD instructions. Then you're presenting at GRCon. The intersection of software and RF is endlessly fascinating! Come join us in the deep end! ๐