About a week ago I resumed working on GQRX – an experimental AM/FM/SSB software receiver powered by GNU Radio and using Qt for user interface. This time, however, I am not going to continue working on the Python receiver but create a new receiver from scratch written in C++. It will support Funcube Dongle and USRP/UHD devices.
In this post I will concentrate on the signal processing part and write about the GUI later. A flowgraph of the receiver is shown below.
As mentioned above gqrx will support both Funcube Dongle and USRP devices by Ettus Research, the latter via the UHD driver and the gr-uhd component. This will pose a small challenge in that the first stages of the receiver will have to be able to work at multiple sample rates. The Funcube Dongle has a fixed sample rate at 96 ksps, while the USRP devices user 250 ksps and up to 25 Msps.
I don’t have much info about this yet but as I understand it, it is best to let the noise blanker operate on the full bandwidth of the receiver, which is whjy it is placed before the filter.
Xlating FIR filter
This is the main receiver filter, which combines a channel filter and frequency translation. Frequency translation corresponds to moving the center frequency up or down, which is effectively the same as tuning within the received spectrum (called local oscillator in other SDR). The frequency translation comes before the bandpass filtering, thus the bandpass filter will always see 0 Hz as the center frequency. This is very useful because we can keep the bandpass filter parameters relative to 0 Hz.
The resampler will be in charge of downsampling the received spectrum to 96 ksps. The Funcube Dongle already delivers 96 ksps so in this case the resampler will be disabled. USRP devices on the other hand will deliver 250 ksps and more, and we can save some CPU load by runnign the AGC, squelch and demodulators at 96 ksps instead of the much higher USRP rate.
AGC – Automatic gain control
This block will try to maintain a steady signal level even when the input signal is fading in and out. For FM-type transmission this is not necessary, but for AM-type transmissions it makes reception much more pleasant.
This block mutes the signal when it is below a certain level. It is very useful in FM for suppressing noise when there is no signal.
This block wraps the demodulators for AM and FM into one convenient demodulator block. It also provides an option for no demodulation, which may be useful for digital modes.
I plan to include data decoders for (A)FSK, PSK, weather satellites, etc. Code for many of these already exists out there so it will be a matter of integrating it into the receiver.
This block will provide filters and gain control for the audio before it is sent to the sound card.
In addition to the above described functions, gqrx will be able to record and replay both audio and raw I/Q data. The original Python receiver already provides “one click” audio recording and playback and I found this feature to be very useful.
I have already started coding about a week ago. The code is available on Github in gqrx/cpp branch. Currently I am working on establishing the basic receiver chain and I hope to have a functional receiver in a few days.