The TUBIN satellite takes infrared pictures and transmits them on S-band using the "HiSPiCO" transmitter. Decoding this without a matching hardware receiver was hindered by the use of an undocumented forward error correction scheme, making it inaccessible to radio amateurs. Using a "known-plaintext" pair of I/Q data and decoded data provided by TU Berlin, I've managed to reverse engineer the FEC and implemented a software receiver using GNU Radio and Rust :3

📷 Las Vegas, 2025-11-07

TUBIN will be reentering the atmosphere and burning up in ~2-3 weeks, and we will try to track it and download data for as long as possible during the reentry process. If you have a ground station in Europe capable of receiving on ~2260-2270 MHz and would like to help receive telemetry and images before and during reentry, check out the receiver https://github.com/PistonMiner/hispico-receiver and forum thread https://community.libre.space/t/tubin-tubsat-27-re-entry/13998/

If you decode anything, please feel free to tag me :)

GitHub - PistonMiner/hispico-receiver: Software receiver for the HiSPiCO transmitter

Software receiver for the HiSPiCO transmitter. Contribute to PistonMiner/hispico-receiver development by creating an account on GitHub.

GitHub

@pistonminer
Hi very great job ! I was able to record (.cs8 8Msps from satdump) the pass of 30.11.2025 at 6:00 cet (QTH North of Tuscany) and decode something (but images are very striped, am I doing something wrong ? To succesfully lock I had to reduce loop bw of symbol sync. Here is the link to decoded files:

https://drive.google.com/file/d/1wHRbf7HSb5x9b3Jyq3sq1xcGxy6_Fh9F/view?usp=sharing

tubin_20251130_0456.zip

Google Docs

@cmax Awesome! TUBIN is usually configured to alternate packets between both transmitters which causes the striping if the packets from one transmitter are decoded but the ones from the other aren't.

It's hard to debug without I/Q, but the data files look like they might both be from the same channel, did you switch the "channel" variable in the flowgraph between runs? You need to decode channel 0, then channel 1, then put both data files into tubin_sband_decode.py at the same time in one go.

@cmax Another possibility is that the signal quality of one channel was worse than the other, leading to one channel simply not being decodable. We suspect that the antenna pattern might not be exactly identical between both channels, which may make a difference the further from the main lobe your ground station is, given the satellite points at Berlin while transmitting. Do you have a waterfall plot or something like that perhaps?

@pistonminer Hi, I have repeated the decode (alternating channels) but with the same results. Here is the link to I/Q file; sorry I wasn't able to cut it so you have to skip around 2GB before useful data:

https://drive.google.com/file/d/1i9HpnxTI5JCcOWrkrIGnrVMF8ep1oFFr/view?usp=drive_link

2025-11-30_04-56-17_8000000SPS_2264500000Hz.cs8

Google Docs

@cmax Hm, I just decoded your I/Q recording myself and it worked fine for me for both channels. The only changes I made were adjusting input_samp_rate and adding an IChar to Complex to adapt to your 8 Msps signed 8-bit file, no change to symbol sync. I'm not sure what the problem could be exactly :/

To triple check, are you definitely running

tubin_sband_decode.py data_cmax_c0.bin data_cmax_c1.bin <output_folder>

with both channel files in one command?

Decode results:
https://drive.google.com/file/d/1xlWhgGM1Ra3im8K-qjkdJlwrBjlCWbeB/view?usp=sharing

@pistonminer Very very strange ;-) yes I confirm to execute the same command (both bin) and same blocks after file source.. I'll try to restart from 0.. Thanks !