LilacSat-2 subaudio telemetry

Yesterday, the FM repeater on the Amateur satellite LilacSat-2 was active. I’ve talked about LilacSat-2 before, but so far I hadn’t made any recordings containing subaudio telemetry. While contacting several Spanish stations (EA5TT, EA1JM and EA1IW) throughout the pass, I made an IQ recording to analyse the telemetry later. Here I take a look at the telemetry format and the decoded data.

While the FM repeater is active, LilacSat-2 transmits telemetry data in the frequency range 0Hz-200Hz of the audio spectrum in the FM downlink. The data packets are encoded using Reed Solomon. The coding used is NRZ. The transmission is done at 300bps and filtered with a Root Raised Cosine (RRC) filter.

In the image below, you can see the signal after being FM demodulated and low-pass filtered with a 250Hz cut-off. The coding used by LilacSat-2 is sensitive to the polarity of the signal, and for some reason linrad inverts the polarity while doing FM demodulation. This can be handled later by inverting the signal, but keep in mind that the image below shows the inverted polarity. It is apparent that the preamble/idle signal consists of alternating 0’s and 1’s and then the FEC data comes after it. It is also apparent the use of RRC filtering. Another important thing to note is the huge DC offset of the signal. This is just caused because the FM signal was not perfectly centred in the demodulator. Therefore, the first step in processing the telemetry is to remove the DC offset.

Subaudio signal (after FM demodulation and 250Hz low-pass filtering)
Subaudio signal (after FM demodulation and 250Hz lowpass filtering)

LilacSat-2 transmits subaudio packets every so often while the FM repeater is in use. The idle signal (alternating 0’s and 1’s) is transmitted all the time between packets. This idle signal can be viewed as a 150Hz tone that depending on the audio characteristics of your FM receiver can be heard all the time. It also produces a lot of spectral lines after being FM modulated, as you can see in the waterfall on top of this post. The waterfall image also includes the transmission of a subaudio telemetry packet and some voice. Below you can listen to a fragment of the audio recording. Listen to the 150Hz tone. When it stops, if you listen carefully you can hear a low frequency rumble. That’s the subaudio telemetry.

I have updated GNUradio LilacSat-2 receiver to decode subaudio telemetry directly from the FM demodulated audio. The decoder uses Polyphase Clock Sync to recover the clock and do RRC filtering. Then, it does bit slicing and passes the bits to the LilacSat-2 FEC decoder. The telemetry packets I received are in Github. A total of 8 packets could be decoded.

The decoder software by DK3WN can be used to analyse the telemetry packets. One of the interesting things you can see is the COM A HAM RSSI parameter, which is graphed in the figure below. Presumably, this is the strength of the uplink received by LilacSat-2. Keep in mind that in VHF a signal level of S9 corresponds to -93dBm. I don’t know how accurate is LilacSat’s signal measurement, but it seems that it hears quite well. The uplink signal is above S9 almost all the time. In fact, my Spanish fellow operators where reaching the satellite without any problems and their audio quality was good. Note that the time and date of the OBC (On Board Computer) clock is completely off these days.

DK3WN telemetry decoder
DK3WN telemetry decoder


  1. LilacSat-2’s Linux LiveCD contains everything needed for decoding the downlink. But your analysis explained a lot! There’s so much to learn! Thank you so much!

  2. Daniel, I am a newb at GNU Radio Companion and have limited Python capability. I am trying to create a GMSK AX25 transmitter (and receiver) via GNU Radio. In order to test my work I am trying to frame (using HDLC Framer) a simple Linux test file. As you know, the HDLC Framer requires PDU input and the File Source Block (i.e. the test file) is not in that form. I am trying to figure out how to convert the test file into PDU’s so that the HDLC Framer will accept it (or maybe that is the wrong approach). PDU to Tagged Stream does not seem to do it. Can you point me in the right direction? Sorry to approach you in this venue, but I could not find your email address. I really appreciate your time

    1. Hi Fred,

      What is the format of your test file? If it is a KISS file with AX.25 frames then you could use “KISS to PDU” from gr-kiss.

      By the way, you can find my email address at the bottom of this page.

Leave a comment

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.