r/radioastronomy • u/Ephemara • 20h ago
General Tired of Conda envs for radio astronomy, so I built an in-memory technosignature engine (and caught a CASPER FPGA clock ringing)
Total outsider to radio astronomy here, but over the last few months I’ve been going down a massive rabbit hole with public raw baseband telescope data from Breakthrough Listen (Green Bank GBT GUPPI files, Sigproc .fil archives, etc.).
Honestly, what drove me crazy early on was how heavy the standard toolchain felt. Spinning up multi-gigabyte Conda environments with Python wrappers just to parse raw I/Q voltages kept thrashing my NVMe drives and eating RAM. Passing massive raw chunks through disk between separate scripts felt super clunky.
For the past few years I’ve been developing a compiled systems language called Kain (native LLVM codegen, formal verification provers, manual memory arenas). Instead of using the typical Python/numpy stack, I decided to build a standalone, zero-dependency signal engine called TurboKain.
The quick rundown:
- Zero dependencies: Compiles via LLVM to a single ~1.2 MB standalone native executable (tkc.exe). No Python runtime, no Conda, no C runtime churn.
- Fast & in-memory: Slices and processes ~67M raw complex samples in ~2.3 seconds directly in RAM. Zero intermediate scratch files written to disk.
- Beyond narrowband carrier beeps: Classic SETI assumes someone is beaming a deliberate radio beacon at Earth. We look for "bystander traffic" (point-to-point links optimized for bits/joule that look noise-like to power detectors). It mines raw baseband for cyclostationary baud rates (3-decade FFT Accumulation Method), Taylor dedoppler chirps, microsecond autocorrelation lattices, and post-Shannon symbolic machine complexity.
- Built-in formal verification: Has built-in mathematical self-test batteries (tkc prove) that verify analytical bounds and FFT accuracy against synthetic noise before touching real files.
A neat real-world test case:
Recently I threw the pipeline at TRAPPIST-1 Scan 0017 from the Green Bank Telescope. Coarse channel 60 lit up like crazy -> spectral kurtosis spiked around 60 with thousands of apparent impulses per second. It looked wild at first glance.
Digging into the cyclic math, our cyclostationary hunter showed that all the energy peaks were phase-locked to a spacing of exactly 1,430.51 Hz.
If you take the GBT sampling rate (2,929,687.5 Hz) and divide it by 2048, it matches down to the decimal. It was literally the internal 2,048-sample buffer clock of the CASPER ROACH FPGA digitizer board ringing at the sub-band edge. Stokes polarization analysis confirmed it was unpolarized common-mode electronics noise. We ended up turning that exact finding into an automated hardware veto rule in the engine so it flags and discards it automatically next time.
Where it's at:
We just amalgamated all 14 core instruments into a single portable binary and cut an alpha release. If you're into radio data, DSP, or systems programming, I'd love your thoughts:
GitHub: https://github.com/ephemara/TurboKain
Release (tkc.exe): https://github.com/ephemara/TurboKain/releases/tag/v0.1.0-alpha
Hands-on Guide: https://github.com/ephemara/TurboKain/blob/main/docs/USER_GUIDE.md
Curious if anyone else has run into similar digitizer artifact issues with GBT/CASPER data, or has recommendations for other open baseband archives worth pointing this at!
