Decoding 3CAT-1

A few days ago I spoke about my Reaktor Hello World decoder in gr-satellites. Another of the satellites that were launched with Reaktor Hello World in the November 29 PSLV launch is 3CAT-1, a 1U cubesat from the NanoSat Lab in Universidad Politècnica de Catalunya. It is designed as a technology demonstrator of COTS parts, and integrates four scientific payloads.

The communications system of 3CAT-1 uses a Texas Instrument CC1101 FSK transceiver chip, which is very similar to the CC1125 used in Reaktor Hello World. It transmits a 9k6 FSK telemetry beacon in the 70cm Amateur band. An interesting thing about this beacon is that it is powered by a temperature gradient that generates naturally within the satellite. A Peltier module is used to collect energy from the gradient and power the communications module. This is called “eternal self-powered beacon demonstrator” by the designers of the satellite, since it doesn’t depend on batteries or solar cells.

I have been in contact with Juan Fran Muñoz from NanoSat Lab, who has been kind enough to send me a telemetry recording for 3CAT-1. With this, and following my implementation of the Reaktor Hello World decoder, I have added a decoder for 3CAT-1 to gr-satellites.

The protocol used by the CC1101 in 3CAT-1 is the same as the one used by the CC1125 in Reaktor Hello World, but some of the options are different. The syncword for 3CAT-1 is 0xD391D391. The length fields, address fields and CRC-16 are not used. Thus, the data field has a fixed size of 255 bytes. Scrambling with a PN9 sequence is used. Therefore, to deframe and descramble the packets it is enough to use the “Sync and create packed PDU” and “PN9 scrambler” blocks from gr-satellites.

The 255 byte packets contain FEC in the form of a (255, 223) Reed-Solomon code from the rscode library, so each packet is a single Reed-Solomon codeword. This can be decoded with the “Reed-Solomon Decoder (rscode)” block from gr-satellites. The use of rscode here is interesting, as all the other satellites I’ve seen that use a (255, 223) code (or a shortened code with 32 parity check bytes) use the CCSDS code.

The decodes from the test recording can be seen in this gist. There are padding bytes with zeros at the end of each packet to bring the size to 223 bytes.

There is a complete decoder by the NanoSat Lab team in their github repository. This includes both a packet decoder and a telemetry parser. The telemetry parser includes some documentation about the beacon format. Using this, I have written a telemetry parser for gr-satellites.

The telemetry parser has been an interesting exercise to write in construct, because the 3CAT-1 telemetry format includes several (but similar) message types, a variable number of fields of variable size, and a clever way of encoding timestamps incrementally. The output of the telemetry parser when run on the example given above is shown in this gist. The recording used in this post is here.


    1. Hi Janos,

      I’ve seen the updated “attachment 2” from ESA. It looks very complete. However, we are starting to analyze signals from ESEO and we’re having problems with the “attachment 1”, i.e., the description of the coding. I expected ESEO to use standard AX.25, but we have seen that it is quite far from this. Here we need the information in “attachment 1”, but it is not so clearly written. Here you can see my current best try at decoding a frame from ESEO.

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.