The other day I was sitting on the couch lounging about when I came up with an idea and there and then I picked up a circuit board, soldered down a hundred or so components and built a noise cancelling gadget, all within about an hour … right there, on my couch.

Yeah, that didn’t happen, least of all, my soldering skills are not up to scratch, never mind the couch.

I did however build a noise cancelling circuit, on my couch, in about an hour, but no soldering iron was hurt and the room didn’t smell of chicken afterwards. Instead I used GNU Radio to put together a series of blocks that allow me to apply noise cancelling to a signal.

How does this work?

Well, imagine a signal mixed together with the negative version of that signal, think of it as swapping positive and negative if you like. If you mix two identical signals together, one of them inverted, you end up with nothing, because they cancel each other out, where one is high, the other is opposite and low and vice versa. Mix a high signal with a low signal, you end up half-way. If they’re the same but opposite, half-way is zero.

Hearing nothing is not helpful, but what if the two signals were slightly different, let’s say, one is connected to a proper 10m antenna and the other is connected to an antenna that picks up local noise. We’ll call the antenna on 10m the “signal” and the local noise antenna the “noise”. If you mix these together, you end up with a signal and noise combined, but if you invert the noise signal, you can, at least theoretically, filter out the noise that’s common to both antennas.

Now I did say “theoretically” and that’s because while it sounds simple, it’s far from it. Unless you have a special radio, the two signals are not coming from the same device and won’t really be identical where it matters. For example, let’s call it the volume or gain of one might be higher than the other. One might arrive slightly later than the other if the coax isn’t the same length or the electronics in both radios are different. There are other things too, but let’s just stay with this for a moment.

You could amplify or attenuate one or both signals to make them the same or similar levels. You could change the phase, think of it as the time when a signal starts, and synchronise the two signals in time manually.

Of course whilst you’re doing this, inside GNU Radio, the computer is doing some serious math, which takes time to make these changes, which introduces further delays you’ll also need to account for.

Building it was simple. Testing it much less so.

After coming to grips with the USB port on my computer, which for reasons best known to the manufacturer, cough, Apple, switches off ports that are in use, I managed to get two RTL-SDR dongles connected and working. This involved removing GNU Radio, which was installed using a tool called “homebrew”, then installing it instead using “radioconda”, twice, since the first time the installer failed with an error, actually three times, because the failed installation left all manner of rubbish behind, so that needed to be removed; then I had to disconnect my keyboard and track pad, because for reasons only known to the manufacturer, yeah, the same one, they won’t play nice if there’s an RTL-SDR dongle plugged into the USB-C hub, I finally got this running, which in turn involved figuring out what the GNU Radio “Device Arguments” look like for a locally connected dongle, in case you’re wondering, it’s “rtl=0” for the first one and “rtl=1” for the second.

Clearly this project is living up to its name, Bald Yak.

Now I can invert a signal, I can amplify and attenuate it, change the phase, shift the frequency, swap the I and Q, do a complex conjugate, and have a user interface that can change these settings as required.

I’m going to ignore the hour of my life I’m not getting back to understand how variables, parameters and user interface items hang together and how they interact. It’s logical, but it takes a bit to wrap your head around it and I’m a software developer, so I don’t envy you if you’re not.

Anyway, I tuned to a local FM broadcast radio station and couldn’t make any noise go away. I then discovered that my noise antenna was picking up the station just fine, so that didn’t help. Then I swapped radios, actually, I just swapped the zero and the one in the “Device Argument” fields and tried again.

In the process I discovered how you can create a so-called “Hierarchical Block” in GNU Radio and to my delight also discovered that there is one that can have a user interface, so I can make a stand-alone block, that has a user interface, that I can use in another project, which is how I intend Bald Yak to function.

So, changing stations, I could finally hear noise, but still no reduction.

Then I realised that I was using FM, not single side band, so I started hunting for an SSB decoder but had to abandon ship to go and do life. Overnight I realised that if everything went to plan, the two FM signals should have cancelled each other out, making silence, which they didn’t, despite my efforts.

So, at this point I have a thing that can alter noise and mix it with a signal for the purposes of noise reduction. That it doesn’t work is potentially because I have not enough range in my adjustments, or too much range with not enough steps, just as likely it’s because I’m missing some fundamental understanding somewhere. If you have any documentation I should read, please don’t be shy.

As life adventures go, I’m hooked, but it’s not without shaving Yaks, Bald or otherwise.

I’m Onno VK6FLAB