This document gives a high level overview of the gqrx design seen both from an architectural and a signal processing point of view.
Gqrx is heavily based on GNU Radio using both DSP blocks as well as its famous runtime engine. Since GNU Radio is based on the flowgraph principle where DSP blocks are wired together like on a circuit diagram, it seems natural to describe gqrx using a flowgraph. The following flowgraph describes gqrx from a signal processing perspective:
- A narrow band receiver used for AM, FM and SSB reception (files receivers/nbrx.h and receivers/nbrx.cpp).
- A wide band FM receiver used for broadcast FM reception usually between 88 and 108 MHz (files receivers/wfmrx.h and receivers/wfmrx.cpp).
All blocks before the application specific receiver run at full bandwidth specified by the input sample rate. A complex sine wave multiplied with the baseband signal is used to translate the spectrum serving as channel selection. The frequency of the sine wave determines the amount of translation.
The first block in any receiver is a re-sampler that converts the input sample rate to a lower sample rate that is appropriate for the particular demodulator.
This concept may not provide the most efficient processing, however, it was found to appropriate as a hacker-friendly architecture.
At lowest level we have various DSP and I/O blocks. These can be blocks from GNU Radio, gr-osmosdr or even implemented in gqrx. The blocks implemented in gqrx are located in the dsp/ subdirectory.
The next level contains the various application specific receivers. These are GNU Radio hierarchical blocks that provide fully functional receiver chains less the hardware I/O and some secondary support functionality as shown on the flowgraph in the previous section. These receivers are located in the receivers/ subdirectory.
The “Receiver proxy” is the highest level SDR block which creates and controls the GNU Radio top block. It performs the necessary switching between the various application specific receivers hiding the details behind a single control API that is made available to the user interface. The implementation of the receiver proxy is available in applications/gqrx/receiver.h and applications/gqrx/receiver.cpp.
At the top we have the user interfaces, which for now is limited to a Qt-based GUI. Internally, this component is also split up into simple reusable widgets and composite objects that glue things together and makes the whole application work. The Qt GUI interfaces to the SDR part only via the receiver proxy object. While this extra layer of abstraction may seem unnecessary and confusing, it shall prove useful later on when we add different forms of user interfaces.