Hi Jan,
decodes with light-1 deframer 56.38 MB file on MEGA
Bob
N6RFM
Thanks Bob,
Looking better, one can clearly see two alternating signals
This Yaml needs some further tuning and investigation, but it is a start.
name: QUBE2
norad: 98314
data:
&tlm Telemetry:
unknown
&ax25 AX25 Telemetry:
telemetry: ax25
transmitters:
2k4 FSK downlink:
frequency: 435.600e+6
modulation: FSK
baudrate: 2400
deviation: 600
framing: Light-1
data:
- *tlm
9k6 FSK downlink:
frequency: 435.600e+6
modulation: FSK
baudrate: 9600
deviation: 2600
framing: AX.25 G3RUH
data:
- *ax25
gr_satellites QUBE2.yml --rawfile QUBE2_50000SPS_435600000Hz_2026_05_05_T03-16-30Z_snip.raw --samp_rate 50e3 --iq
***** VERBOSE PDU DEBUG PRINT ******
((transmitter . 2k4 FSK downlink))
pdu length = 92 bytes
pdu vector contents =
0000: 01 20 00 96 a0 02 00 83 05 34 00 70 61 f9 69 23
0010: 5d 02 00 02 00 00 00 00 00 00 0c 11 00 00 00 11
0020: 00 00 00 00 80 00 00 00 80 00 00 89 ff ff ff 00
0030: 00 00 00 27 bf 01 00 18 0b 01 00 1e 01 30 01 3d
0040: 01 03 01 00 00 00 00 00 00 00 00 00 00 00 00 00
0050: 00 00 00 eb 1f 00 00 14 04 96 00 00
************************************
***** VERBOSE PDU DEBUG PRINT ******
((transmitter . 2k4 FSK downlink))
pdu length = 92 bytes
pdu vector contents =
0000: 01 20 00 96 a0 02 01 00 00 00 af 02 eb 00 18 01
0010: bc 00 00 00 03 00 00 00 ba 00 00 00 00 00 27 00
0020: 00 00 10 10 10 10 12 11 12 11 11 0b 0b 0b 00 00
0030: 00 14 04 00 00 00 1c bf 01 00 04 00 00 00 80 95
0040: 80 40 da 23 e2 43 00 00 88 3f 00 00 c0 7f 00 00
0050: c0 7f 00 00 ec 40 00 00 c0 7f 00 00
************************************
***** VERBOSE PDU DEBUG PRINT ******
((transmitter . 2k4 FSK downlink))
pdu length = 91 bytes
pdu vector contents =
0000: 01 20 00 96 a0 02 02 c0 7f 71 61 f9 69 01 f7 cf
0010: 0a 42 fb b5 7e c2 f8 71 f8 48 3b 48 d8 46 13 00
0020: 00 00 0b 00 00 00 01 00 00 00 03 5c c3 38 3d 89
0030: 47 73 3e 8f ad 14 bd 4a 42 6f bd 52 fb 52 ba 33
0040: f3 0e 45 00 c0 45 45 66 76 28 c5 00 18 4f c5 17
0050: bf 01 00 03 00 00 00 01 00 00 00
************************************
Jan | PE0SAT
This modem for GEMINI-POLLUX 9k6 (not for QUBE2)
Noticed one appearance of S-band signal with 2268.745 center, matching closest to 88083 in last nights strf 22:25 UTC
Frequency is calculated from average top and bottom trace. Signal is weak but it’s not matching anything else / older
HYDRA-3 is in DB with a transmitter at 401.320 MHz, for initial TLE we are going to use this one:
HYDRA-3
1 98308U 26123.40776256 .00000000 00000-0 50000-4 0 01
2 98308 97.3900 21.9297 0014528 0.0000 48.1116 15.20279983 05
Also, Gemini-Pollux is now at BPSK 1k2 (instead 9k6), future observations will be updated in the next minutes, here is the latest TLE from space-track.org analyst list (object 88061) based on ikhnos analysis:
GEMINI-POLLUX
1 98320U 26124.67370674 +.00003270 +00000+0 +32746-3 0 00051
2 98320 97.7367 22.9426 0002456 71.0771 289.0714 14.92072934000213
I’m very pleased to report a 38k4 AX100-ccsds decode from NuLink-1 tonight. Thanks very much for sharing modulation & TLE information!
https://x.com/scott23192/status/2051884369879462176
Here are the settings used: (note, ‘baud’ = 38400 & input source was 48k audio from GQRX)
My attempt to parse this NuLink-1 frame using the .ksy file kindly provided earlier was not successful.
Or, if this KSY file is only for the 401 MHz LoRa packets, could we have access to one for the S-Band frames? Thanks!
Any help appreciated if the .ksy file requires modification, etc.
Update: decoder is now complete, all fields confirmed from firmware source
After analyzing 97 frames captured April 1-3, 2026 (pre-launch ground tests), I located the authoritative struct definition in the CTS-SAT-1 OBC firmware source:
firmware/Core/Inc/comms_drivers/comms_tx.h→COMMS_beacon_basic_packet_t
Repo: https://github.com/CalgaryToSpace/CTS-SAT-1-OBC-Firmware
Frame layout: 4-byte CSP header + 130-byte struct = 134 bytes (some frames add a trailing 4-byte CRC32 = 138 bytes)
Key fields and confirmed values from your two frames (decoded with corrected decoder):
Frame 1: 2026-04-01 12:34:45 UTC
OBC uptime : 46,685 s (12.97 hours)
EPS uptime : 46,167 s (matches OBC — no reboot)
Battery voltage : 15,912 mV = 15.912 V (4S LiPo, 97%)
Battery temp : 11.33 °C
OBC temperature : 17.75 °C
Beacon # : 2,270 (~21 s interval)
Message : "Hello from CalgaryToSpace FrontierSat"
Frame 2: 2026-04-01 12:35:05 UTC
Battery voltage : 15,907 mV (97%)
OBC temperature : 17.75 °C
Previous incorrect assumptions (now fixed):
uptime field is in milliseconds, not seconds — the “61-day uptime” I reported earlier was actually 87.9 minutes
The field previously labeled bus_voltage_mv is actually eps_uptime_sec (EPS uptime in seconds, persists across OBC reboots)
unix_epoch_time_ms is a u64 — the “firmware_id=413” was the high-32 bits of the timestamp, constant for all frames within 2026
The sensor block contains EPS power readings in centi-Watts (cW), not raw ADC sensor values
What I decoded as “sensor6 current = 1225 mA” is actually obc_temperature_cC = 1225 → 12.25°C
Thanks to @sv2hwm for the two frames, they were essential for cross-checking. The decoder should now work on any frame received on orbit.
If anyone would like to test their 38k4 decoder setup for the NuLink sats, you are welcome to an audio file of the decodable (is that a word?) packet at:
Based on the space-track.org analyst list, for HELIOS we follow 88082 but with checking also 88083 as candidate and for SELENE we follow 88081 with additional candidate 88070, here are the TLE with changed NORAD ID to follow the temporary one we use in DB:
SELENE
1 98316U 26125.90170986 +.00007051 +00000+0 +33643-3 0 00066
2 98316 97.4079 24.4804 0005911 117.0709 243.1129 15.19364063000389
HELIOS
1 98317U 26125.90154353 +.00007388 +00000+0 +35132-3 0 00076
2 98317 97.4063 24.4771 0006339 123.2577 236.9266 15.19463087000381
Just to follow up on this thread, parker-research has already raised MR #517 on satnogs-decoders with a full decoder for FrontierSat. I had been independently working on the same thing using the firmware source (COMMS_beacon_basic_packet_t in the OBC repo), and when I checked parker’s KSY against my decoded frames, every field matches. 97 pre-launch ground-test frames (April 1–3, 2026) all parse cleanly with zero unparsed bytes.
So no separate PR from my side, parker’s submission covers it. Worth merging once CTS-SAT-1 starts appearing on SatNOGS passes.
On a separate note - @bali @PE0SAT, I also have an open PR for UWE-3 on satnogs-decoders. Could anyone take a look and help get it merged when you have a moment?
73, Sunil
Congratulations Scott,
Great to see this S-band reception and decode.
Looking at your information I have created the following Yaml that should work.
name: NULINK-1
norad: 98322
data:
&tlm Telemetry:
unknown
transmitters:
38k4 FSK downlink:
frequency: 2218.000e+6
modulation: FSK
baudrate: 38400
deviation: 9600
framing: AX100 ASM+Golay
scrambler: CCSDS
syncword: 4
data:
- *tlm
Jan | PE0SAT
congrats scott @K4KDR
it work @PE0SAT
gr_satellites NULINK-1.yml --audio --samp_rate 48000 --kiss_out /tmp/kisstnc
symbol_sync_ff :warning: block performing more interpolations per symbol (2) than input samples per symbol (1.25). Consider reducing osps or increasing sps
correlate_access_code_tag_bb :debug: Access code: 930b51de
correlate_access_code_tag_bb :debug: Mask: ffffffff
correlate_access_code_tag_bb :debug: writing tag at sample 486251
correlate_access_code_tag_bb :debug: writing tag at sample 488156
***** VERBOSE PDU DEBUG PRINT ******
((transmitter . 38k4 FSK downlink))
pdu length = 204 bytes
pdu vector contents =
0000: 83 47 6a 01 4e 75 4c 69 6e 6b 2d 31 00 00 02 06
0010: 40 08 7f 0d 10 0d 0d 00 00 00 01 01 00 00 00 01
0020: 01 00 00 be c7 ae 14 bf 20 a3 d7 3f c8 a3 d7 00
0030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0040: 00 03 03 03 03 03 03 03 03 03 03 00 05 87 00 bf
0050: c8 a3 d7 bf 20 a3 d7 be c7 ae 14 00 00 00 00 00
0060: 00 00 00 00 00 00 00 01 ff f7 00 ef e5 02 95 fc
0070: 54 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0080: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0090: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00a0: 00 00 00 00 00 00 00 00 00 00 ff 00 01 00 01 00
00b0: 00 40 b9 00 08 00 08 00 08 00 08 00 00 00 01 05
00c0: 69 fa bf 44 86 77 86 22 f9 f4 40 e7
************************************
hexdump -C /tmp/kisstnc
00000000 c0 09 00 00 01 9d fe 0d 25 77 c0 c0 00 83 47 6a |........%w....Gj|
00000010 01 4e 75 4c 69 6e 6b 2d 31 00 00 02 06 40 08 7f |.NuLink-1....@..|
00000020 0d 10 0d 0d 00 00 00 01 01 00 00 00 01 01 00 00 |................|
00000030 be c7 ae 14 bf 20 a3 d7 3f c8 a3 d7 00 00 00 00 |..... ..?.......|
00000040 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03 03 |................|
00000050 03 03 03 03 03 03 03 03 00 05 87 00 bf c8 a3 d7 |................|
00000060 bf 20 a3 d7 be c7 ae 14 00 00 00 00 00 00 00 00 |. ..............|
00000070 00 00 00 00 01 ff f7 00 ef e5 02 95 fc 54 00 00 |.............T..|
00000080 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
000000b0 00 00 00 00 00 00 00 ff 00 01 00 01 00 00 40 b9 |..............@.|
000000c0 00 08 00 08 00 08 00 08 00 00 00 01 05 69 fa bf |.............i..|
000000d0 44 86 77 86 22 f9 f4 40 e7 c0 |D.w."..@..|
000000da
From space-track.org analyst list and @PE0SAT strf analysis we have for QUBE2 a match with object 88084 and the TLE changed to use the temporary NORAD ID:
QUBE2
1 98314U 26125.70374634 .00000000 00000-0 41301-3 0 00
2 98314 97.4108 24.2931 0004516 123.2465 236.9203 15.19613077 01
This config will work with NuLink-2 as well ![]()
Is there a KSY available for the S-Band downlink? Thanks!
Tonight it was NuLink-2’s turn to show off. Not one but FOUR 38k4 AX100 decodes this time - what a thrill on S-Band!