ISEE-3/ICE Telemetry Decoded!

Phil Karn, KA9Q

Added 26 June 2014: Here is a repository of my software for demodulating and decoding the ISEE-3/ICE telemetry downlink. The tarballs contain the documentation.

Added 6 June 2014: Here's a pretty large collection of NASA documents on the ISEE-3 spacecraft. A mirror is here.

Thanks to Mario Lorenz, DL5MLO, for spotting this.

Added 4 June 2014: All my decoded telemetry can be found here. The first 773 frames were from a very strong signal (SNR of about 30 dB); all decoded quite easily. The signal then began to fade rather rapidly, probably as the spacecraft moved out of the rather small region of the sky that can be seen from Arecibo. Although the data has strong error correction coding (k=24 r=1/2 convolutional coding with Viterbi decoding) this type of coding does not reliably indicate whether all the errors were in fact corrected. (There's no additional CRC, for example.)

But the "re-encode symbol error" count provides a pretty solid clue. This is the number of channel symbol errors corrected by the Viterbi algorithm provided the Viterbi algorithm corrected them all. This particular code can correct up to about 225 channel symbol errors in each 2048-symbol frame (i.e., about 11%), so decoded frames with fewer than 225 symbol errors are probably error free; frames with more are probably garbage. Other indications of valid vs invalid frames will probably become apparent from inspection of the data. (E.g., the last five bytes in a correctly decoded frame are always 12 fc 81 9f be.)

Note 1: There are two encoded binary channel symbols for each binary user data bit, so each frame consists of 2048 binary symbols that decode to 1024 data bits (128 bytes). 1024 symbols are transmitted per second, so it takes two seconds to send each frame. Yes, 512 bits per second is less than half the speed of a 1980's 1200 baud dialup modem, but remember: this data has crossed 15 million kilometers of empty space, about 10% of the distance to the sun. This spacecraft was originally designed to operate at the earth-sun L1 point 1.5 million km away, only 1/10 as far, and thanks to the inverse-square law this reduces the signal strength to only 1% of its original level. That's why the ISEE-3 Reboot Project needed the huge Arecibo dish.

Note 2: My data here consists of just the raw, uninterpreted but error-corrected telemetry frames in hexadecimal. One needs another program to interpret what it all actually means, and to write such a program you need the spacecraft documentation. It says that a certain bit in a certain location will tell you whether a certain instrument is off or on, and that another location gives how many amperes the solar panels are generating, and so on. The ISEE-3 Reboot Project has this documentation and I'm sure they're been hard at work learning as much as they can about the current state of health of the spacecraft. I eagerly await their report.

1 June 2014: Success!

I have been helping with the ISEE-3/ICE Reboot Project for several months now.

My first task was to write a Viterbi decoder for the k=24 r=1/2 convolutional error-correcting code used on this spacecraft. I started with my existing k=15 r=1/6 decoder for Cassini and modified and verified it for this code.

Early on 31 May 2014 the reboot team at the Arecibo observatory sent me a large recording of the spacecraft downlink. The recording was 'raw', that is, it consisted of a direct recording of the receiver output before any demodulation or decoding.

I first wrote a phase demodulator to lock onto the spacecraft carrier (at about 16 kHz in the recording) and bring the data down to baseband.

After correcting for the small difference between spacecraft and ground clock frequency, I fed the baseband data into a second program that searched for the synchronization sequence between every frame. These sequences occurred every 2 seconds, just as they should for the frame size of 1024 bits at the current data rate of 512 bits/s.

Having identified where the frame began and ended, I extracted the received symbols from their Manchester encoding and ran them through my Viterbi decoder. Here is the result from decoding the first complete frame on my recording:

7c 02 02 02 02 02 02 02 7c 02 02 02 02 02 02 02
7c 00 02 00 00 f2 00 00 7c 02 02 79 a0 00 00 00
7c 00 02 33 c8 02 4d 02 7c 4b 02 76 00 00 00 00
7c 02 02 53 01 02 39 02 7c 44 02 00 b1 49 00 00
7c 00 02 5a 00 19 5c 64 7c 4b 02 0e a0 00 00 00
7c 0e 02 4b 47 63 91 1d 7c 42 02 4d 36 00 00 00
7c 45 02 44 4e 8a 89 02 7c ce 02 50 a4 00 00 00
7c 48 02 32 4b b5 d2 ad 7c 33 02 12 fc 81 9f be
re-encode  symbol errors: 0

While I do not yet know how to interpret most of the data, the last five bytes (12 fc 81 9f be) are constants listed in the published JPL documentation, confirming that I probably got it right.

As an additional check, I re-encoded the Viterbi-decoded data and compared the encoded symbols with the raw symbols received from the spacecraft. The match was exact.

Normally you'd expect to see some errors when you do this because a satellite signal is usually noisy enough to corrupt a few channel symbols. That's the whole reason to use fancy error correction algorithms like Viterbi! But the ISEE-3 signal was extremely strong at the huge Arecibo dish; my link budget calculates a Eb/No ratio of 31 dB.

The modulation and coding on ISEE-3 is designed to operate down to an Eb/No of about 2-3 dB, so there's a lot of margin that should allow smaller antennas to receive it, especially as the spacecraft gets closer to earth.

A Record Large Viterbi Decoder?

As far as I know, this is the largest Viterbi decoder ever used operationally, i.e., to decode an actual spacecraft signal. Long constraint length codes such as ISEE-3's k=24 code were designed for sequential (Fano) decoding, which is less effective at correcting errors than the Viterbi algorithm but, unlike Viterbi, can handle arbitrary values of k. The Viterbi algorithm is more effective in correcting errors, but this comes with a price: its complexity increases exponentially with k. Increase k by 1 and you double the number of operations required to decode every bit.

This has historically limited Viterbi decoding to small values of k. Voyager 1&2 (launched 1977, a year before ISEE-3) use k=7, still a very popular code. The next largest operational Viterbi decoder I'm aware of is used with a k=15 r=1/6 code designed for the Cassini spacecraft at Saturn. It was also used on STEREO A & B.

During ISEE-3's prime missions from 1978-1986 or so, the notion of using the Viterbi algorithm on a k=24 code would have elicited laughter from space telecom engineers. But computer power has a way of increasing over time...

My Viterbi decoder for the k=24 code reads 16 megabytes of path metrics, writes 16 MB of new path metrics and 1 MB of decisions for each and every decoded bit. To decode the 1024-bit frames of ISEE-3, it requires 1 GB of RAM and runs at about 225 b/s on my 2.1 GHz i7 laptop. To go even this fast I made extensive use of the SSE2 vector instructions in the x86 instruction set; my Viterbi decoder in regular C runs at only about 30 bits/s.

So I hereby claim the world's record for the largest Viterbi decoder ever used operationally. I expect this record to stand for some time because no one in their right mind would ever design a new system like this, especially now that we have Turbo codes that can provide even better error performance while executing much more quickly.

Last updated: 26 June 2014