I have had some time to hack on the GQRX receiver – my experimental AM/FM/SSB receiver implemented in Python (GNU Radio) and qith Qt GUI. Most notably, I have implemented audio recording, playback and squelch.
The audio playback will simply play the last recorded audio file or do nothing if no audio has been recorded in the current session. With this functionality complete it is now very easy to make a quick recording and playback of something that you might stumble upon as you scan the RF spectrum. You just click the “Rec” button to start recording to a file; when you finish recording you can playback by clicking the “Play” button. I don’t know how much easier this could get.
The squelch turned out to be a bit tricky. There are three squelch blocks available in GNU Radio each of them with their own advantages and quirks. First, I tried the standard_squelch block which appears to have been designed for audio streams. For some reason I wasn’t able to make it do anything at all; it was just passing everything through regardless of the level settings.
Second, I tried the power_squelch block. This one didn’t work either in the opposite way: Once it activated it blocked everything, even a very strong FM signal.
My third and final attempt was the simple_squelch block, which works very well. Currently the range is set to 0…100 dB which appears to cover most cases but we will see how it works in practice. So far I could test with local NFM stations as well as WFM broadcast stations. This block takes two parameters: The level and an alpha value. The alpha value determines the “hang time”, i.e. how long the squelch should stay open after the signal disappears, though this property also depends on the signal strength vs. squelch level setting. For FM no “hang time” is required but it could be useful for transmissions that do not have a constant carrier, e.g. AM or SSB. I have to say though that I never found squelch to be useful for AM or SSB. Currently the alpha is hard coded to a value that keeps the squelch open for 1-2 seconds after the signal disappears.
Most people will be able to figure out how the receiver works by simply using it. For those who wont I have created a simple user guide screenshot:
The main gqrx.py script is now almost 1000 lines long. Although it is mostly simple and straightforward Python, I created a simple overview diagram that shows how the various blocks are wired together depending on the operating mode.
In case you didn’t know, you can get the receiver from Github, see https://github.com/csete/gqrx