Scramblers and their implementation in GNUradio

A scrambler is a function that is applied to a sequence of data before transmitting with the goal of making this data more “random-like”. For instance, scrambling avoids long runs of the bits 0 or 1 only, which may make the receiver loose synchronization or cause spectral concentration of the signal. The receiver applies the inverse function, which is called descrambler, to recover the original data. The documentation for the scrambler blocks in GNUradio is not very good and one may need to take a look at the implementation of these blocks to get their parameters right. Here, I’ll try to explain a bit of the mathematics behind scramblers and the peculiarities of their implementation in GNUradio.

Decoding packets from GOMX-3: modulation and coding

Recently, Mike DK3WN pointed me to some decoder software for the satellite GOMX-3. This satellite is a 3U cubesat from GomSpace and transmits in the 70cm Amateur band. It has an ADS-B receiver on board, as well as an L-band SDR. As far as I know, no Amateur has decoded packets from this satellite previously, and Mike had some problems running the decoder software. I have taken a look at the software and tried my best to decode some packets from GOMX-3. So far, I have been able to do Reed-Solomon decoding and get CSP packets. However, I don’t have the precise details for the beacon format yet. Here, I describe all of my findings.

A bunch of data from AAUSAT-4

Recently, I have published a Gnuradio AAUSAT-4 decoder in Github. It is based on software from the university team, but several parts have been rewritten completely.

The current features of this decoder are as follows:

  • FEC decoding of both long frames and short frames using the code from bbctl (this code is included in the Gnuradio decoder)
  • CSP header parsing according to the specifications in Wikipedia
  • Parsing of the COM and EPS fields in telemetry beacons, using the code from the university team

In the future, I would like to be able to parse more data from the satellite, but I don’t have the format specifications. I’m trying to get the university team to send me some information.

Scanning Ku band satellites with the FUNCube Dongle

I’ve recently installed my satellite dish and modified LNBF in my garden. This equipment will be used to receive Es’hail 2, the first geostationary satellite carrying an amateur radio transponder. Here I’ll look at the hardware I’m using, how I did the alignment to the 25.5ºE geostationary orbital position where Es’hail 2 will be located, and how to have some fun scanning the direct broadcast satellites in the Ku band with a FUNCube Dongle Pro+.

Calibrating the S-meter in Linrad

In a previous post, I talked about the GALI-39 amplifier kit from Minikits. Here I will describe the procedure to calibrate the S-meter in Linrad (or another SDR) using this amplifier or any other amplifier with a known NF and an uncalibrated signal source. Leif Åsbrink has a youtube video where he speaks about the calibration of the S-meter in Linrad. However, he doesn’t use an amplifier, so I will be following a slightly different procedure.

Testing microphone performance for Codec 2

Codec 2 is the open source and patent-free voice codec used in FreeDV, a digital voice mode used in amateur radio. Since Codec 2 is designed to be used at very low bitrates (the current version of FreeDV uses 1300bps and 700bps), it does an adequate job at encoding voice, but can’t encode well other types of sounds, and thus fails poorly in the presence of noise. Hence, microphones which may be good enough for other applications can give poor results when used for FreeDV (if, for instance, they pick up too much ambient noise or have too much echo). This is a small note about how to test the microphone performance for Codec 2.

Using Linrad as a panadapter

Recently, I installed a G4HUP PAT on my FT-817ND. This is a small board which allows one to tap the IF of a conventional radio receiver to use an SDR as a panadapter (essentially, a waterfall display which shows a chunk of spectrum about the frequency tuned on the receiver). In the previous post I described the installation of the hardware. Here I will describe how I’ve set up Linrad to suit my preferences. One interesting aspect of this set up is that I’ve ended up adding a bit of code in Linrad to make it read the dial frequency of the radio using CAT and make Linrad track the frequency as one tunes around in the radio.

Updating Gpredict transponder files

Gpredict stores the information for the satellite transponders in plain text files, one file per satellite. These files are called .trsp files. The files shipped with the stable version tend to become outdated pretty soon, as new satellites are launched. However, the project’s git repository is usually up to date.

The following shell script will download the files from git and install the .trsp files in Gpredict’s config path in the user’s home folder. This can be used in Linux and probably other Unix-like operating systems. Something similar can also be done in Windows.

This is just an easy and temporary workaround to keep the transponder files updated, as Alexandru OZ9AEC, who is Gpredict’s author, thinks of perhaps using an online database as a long-term solution.

Doppler correction with GNURadio

When receiving signals from a satellite, it can be important to correct for the Doppler shift in the signal. Normally, I use Gpredict to track satellites and compute the Doppler shift. Gpredict can control the frequency of a receiver using Hamlib to track the Doppler shift. When using an SDR receiver, there are several possible ways of using Gpredict’s frequency control.

Normally, the SDR software doesn’t support Hamlib control in a way that it’s useful and easy to use for this purpose. This is the case with Linrad, which is the software I use, and probably with many other popular SDR softwares. An easy solution is to let Gpredict completely control the frequency of the SDR receiver through Hamlib and prevent the SDR software from controlling the frequency. With the FUNCube Dongle Pro+, which is the receiver I normally use, this is easy to do. It can be controlled without problem with recent versions of Hamlib, and if you set the dongle in Linrad as an “Undefined” card instead of a FUNCube Dongle, then Linrad will not try to control its frequency.

The problem with this solution is that each time that the frequency gets updated, it does so in a non phase continuous manner, because the PLL of the receiver has to lock on to the new frequency, effectively losing reception for just a tiny amount of time. This supposes no problem for SSB, CW or FM reception, because your ears just don’t notice. However, if you want to receive any digital signal or SSTV, the frequency change usually messes with the decoder software, which loses sync and suffers decoding problems. An alternative solution is to leave the receiver frequency fixed and correct for Doppler shift in software.

LilacSat-2 GNUradio receiver

I have made my own LilacSat-2 telemetry GNUradio receiver using the flowgraphs included in gr-lilacsat. The new features of this receiver are the following:

  • All the decoders and the frontend are run on the same flowgraph. I find this more practical than having to run all the flowgraphs separately. Also, some blocks can be reused in this way.
  • It uses gr-gpredict-doppler to compensate for Doppler. As I mentioned in a previous post, I prefer this to the Doppler correcting system included in gr-lilacsat.
  • It plots and outputs to a file the signal strength on 437.200MHz and 437.225MHz. This can be used for later analysis.
  • It supports recording file input, or live SDR using an ALSA source (for the FUNCube Dongle Pro+, for instance). Another SDR supported by GNUradio can be easily used.
  • It supports recording both the raw IQ data and the Doppler corrected IQ data. The raw IQ file can be then played back by simultaneously running Gpredict with the correct settings for the recorded pass. The Doppler corrected IQ file can be played back without running Gpredict.

This receiver can be downloaded from GitHub. The flowgraph is a bit crammed, but that’s what you get for having all the decoders in the same flowgraph. Several of the input/output blocks are disabled, so that you can choose which ones to use.