First forays into Software defined radio

Shalav Kakati
6 min readMay 15, 2022

Software defined radio permits students a means to learn about the various facets of RF signals on receive and transmit side with a minimal amount of hardware, because modern CPUs and open source tools are able to do much of the previously hardcoded functions in the software (amplifier, filter, modulator, which can then be rapidly changed for experiments. In the industrial use cases, this also adds value as fixes and new applications can make their way into production faster than rebuild and retest of the hardware device.

A primer of the field may be found here https://en.wikipedia.org/wiki/Software-defined_radio

Two simple diagrams show how behind the A/D and D/A conversion, it is the SW domain (can be a general purpose computer) that takes over all the other parts of the pipeline. This SW space is done by various SW like CubicSDR and for visual programming using drag-drop-configure-connect for SW pieces that simulate HW, we make of GnuRadio https://www.gnuradio.org/

Mainly two types of devices are used by enthusiasts, one is a USB dongle that can receive only. The other is a wallet sized box called HackRF that can also do half-duplex transmit, has a better range of operating frequencies and more choice of antennas. Third party antennas are also available like dipole antennas, the attachment to the RX is through a coax cable.

Here are some photos of the devices described above. The housings tend to be of metal to act as a heat sink.

For learning in depth about how to use HackRF one SDR, there is a series of in-depth eleven lessons here https://www.youtube.com/channel/UCjA6Sn3mUvFQ4pz7MjowX2w/videos

The initial crop of client tools seem to have been developed on linux, so not all I tried out worked on macos. Finally I could use CubicSDR on mac and get Gnuradio-companion working on windows10 which I will give some details now.

CubicSDR — once the HackRF one device is connected to USB on the computer, user has to start CubicSDR and select the device from the menu that pops up. Thereafter no specific knowledge of RF is needed, one can easily tune to any local FM frequency, see the visualisation and play around with things like the gain to get the best results. It also offers a feature to record the sound into files. As I mentioned earlier, it does not transmit, even if the Hack RF one is capable of doing so.

The waterfall energy charts, the FM graph in the middle, and changing the sampling rate and gain from the top menu make it rather easy to find the local FM stations and get a good audio.

Tried to check the wifi signal of my home router and could see its energy band but of course it’s not possible to decode its content using the hackrf without a special SW module.

Tried to receive known AM frequencies of all india radio and radio sri lanka but could not with the antennas that came with the device. Seems I need to make a different kind of antenna to get good AM reception.

Here I am listenting to FM 91.8 …

I changed the demodulator frequency to 2.4 Ghz and could see the energy signature of my home wifi on the same desk … maybe due to some coding scheme lots of energy to the sides..need to understand this further

My wifi router also uses a 5Ghz band, could see a clean line and no pulsing energy around it unlike the 2.4Ghz case

CubicSDR is a fun client to get to know basics of the device capability but offers no real programmability of a learning tool. For that, we need to bring up GNUradio (https://www.gnuradio.org/). It is a active scene with a lot of tutorials and information on the website.

Its installation on my macOS mojave 12.3.1 went through using any of the methods for mac given on the gnuradio.org website but on starting and attempting to execute anything, issues with python libraries cropped up. After struggling for some time trying to maintain 2 parallel installations of python to keep the tool happy, I finally went to a windows10 machine and got it successfully working.

GnuRadio has hundreds of drag and drop blocks which it calls widgets. Some are used as containers to set values of variables, whose names can then be used anywhere (just like in a program). The others do some pipeline processing roles and can be connected with arrows such that output of one can flow to another.

Inside such pipeline blocks are parameters that tune its own function, and values may be put as absolute values or from the variable container blocks I described earlier. One set of widgets is the core pipeline like demodulation , filtering, and another set is related to display issues like controls to change the frequency in GUI instead of inside the processing block, signal visualisations etc.

Conceptually, each functional block is like a library function in a high level language like C or C++ that takes some input (the digital signal expressed in some form), works on the input to produce an output and passes that output as the input parameter to the next chained blocks…so it is like a chain or tree of functions that each take input from predecessor and call their successor. These call chains/trees are specified by the user by using the arrows to join functional blocks.

The other type of block where we setup variables is like a structure or global variable in a high level programming language.

For the HackRF one device, the “Osmocom” device is the one to use per the tutorials.

Using the tutorials, I have so far tried out narrow band FM receiver (local FM music stations) and FM transmitter. https://wiki.gnuradio.org/index.php/Tutorials

My goal is to learn more from these tutorials and the hackRF one video lessons I put in another link above and build a kind of antenna to capture images from weather satellites. Then I would attempt to decode the content of these images using open source tools. The real trick seems to be designing a sensitive antenna. The names and times of satellites transmissions over any place seem to be online.

There is a lot of work to do before I can even consider myself adequately knowledgeable in this vast field.

--

--

Shalav Kakati

Grade 11 IBDP student, interested in the intersections of mechanical, electrical and biomedical engineering.