26th April 2026 ~ <3 h0l
Shortwave radio fits nicely into my obsession with hiding things in things - since it's hiding things in wiggles, where the wiggles are EM Fields. You can (and should) scroll around for hours on WebSDR and KiwiSDR sites that people put up to get a good picture of exactly how busy everything is, all of the time.
Amongst all the voices and static, occasionally you'll be lucky enough to stumble across some modulated data. That's someone (or something...) taking some binary information, and hiding it in the wiggles by altering their phase (the offset of the wiggling), amplitude (how loud the wiggling is) or frequency (how fast the wiggle is) - sometimes there's even weirder ways of encoding stuff in the wiggles.
We have to be a bit careful about what we do with the wiggles, however. In a lot of countries actively decoding messages that aren't meant for you is illegal, and where I am it's technically illegal to even receive a signal that isn't meant for you - depending on the radio band in question.
Thankfully, I've stumbled across a signal that is digitally modulated, and I happen to know is intended to be received and decoded by us. It sits at 7850KHz, and is coming out of eastern Canada - mostly it just sends out a little beep on the second, but every now and again you get something like this :
What is this? Spooky - clearly. A booty call from R2D2? Maybe. Let's do some analysis and find out.
I decided the fastest (and fun-est) way to get a handle on what's going on would be to set up a crappy prototype analysis tool with Python. Crappy because Python isn't really the right tool for the job - it's a lot slower to execute than other languages and so it might struggle a bit with heavy number crunching if we decide to start doing anything drastic to our data. But given the relatively small amount of data, the clever available trickery of numpy / scipy (which iirc uses pre-compiled C modules to do heavy number crunching) and the flexibility of Matplotlib for making little prototype GUIs - I decided it would be a good starting point.
In future, I might make my own C++ backend + Javascript frontend (or play around with WASM + Javascript) to make a tool that's a bit heavier hitting, but we'll see.
I ended up wrapping numpy's RFFT tool to make a nice resizable waterfall, and accompanying it with an averged spectral power plot to try to diagnose the modulation. Despite how the gif above looks, it actually runs really smoothly on my (admittedly, pretty beefy) computer.
As I hone in on the data blocks towards the end of the gif, it's pretty clear that the data is being transmitted with 2FSK - that is, using 2 tones to represent binary 0 and binary 1. We could at this point look up the tone separation (~200 Hz) and try to narrow down what scheme it's being sent with - but in the name of fun, the next step is going to be to write our own little symbol and timing recovery tool - this will allow us to sync up with the tones and interpret them as bits correctly.