Today I spent about two hours messing around in GNU Radio in order to write a receiver for the VLF transmitter in Grimeton, Varberg, Sweden (callsign SAQ). The Grimeton transmitter is one of the last of its kind, and uses a reluctance-based mechanical oscillator known as an Alexanderson alternator to transmit Morse code (CW in radio jargon). Because of this the operating frequency of the station is very low: 17.2 kHz. Since this frequency is in the audio range, it is quite common for VLF enthusiasts to use some programs and a simple antenna connected to the microphone jack on their computer or smartphne to listen whenver SAQ or other VLF stations are broadcasting.
Incidentally, SAQ is scheduled to transmit on May 1st 12:00 Swedish time (10:00 UTC) 📻
Where GNU Radio comes in
Unless the listener has very young ears (or is a dog), some form of signal processing must be used to bring the 17.2 kHz down to something more listenable like 1 kHz. I decided to use the frequency translating FFT filter block for this, bringing the signal down to 0 Hz and filtering out everything outside ±50 Hz of it. The filtered signal is then mixed up to the desired listening frequency.
You can download a .grc file I wrote that does this by clicking here. That said, on to the pictures:
On the left is the microphone input, which gets a 15.2 kHz test signal injected. The combined signal is then mixed down, filtered and mixed up again as described earlier. Finally the result is converted to a real signal and sent to an audio sink (speakers/headphones). There are also two FFT blocks for plotting added at the input and output respectively.
Here's a screenshot of the entire thing in action:
There are five sliders, which serve the following functions:
- transition_width
- How sharply the filter rolls off, in Hz.
- test_tone
- Frequency of the injected test tone, in Hz.
- output_frequency
- At what frequency to put the filtered signal, in Hz.
- gain_db
- Post-filter amplitude gain, in dB.
- filter_width
- The width of the filter, in Hz.
- center_freq
- The frequency to receive, in Hz.
Hopefully this will work fine come May 1st, or some other time later this year. SAQ typically activates twice per year.
Again, the .grc file for this graph can be downloaded by clicking here 😊
Update: Here is a screenshot of GNU Radio being piped to fldigi for CW decoding, since I suck at decoding Morse by ear:
I made use of pulse_monitor as the capture device for PortAudio in the audio options. This means fldigi hears whatever is being played through the speakers.