// Belle Suite

The signal chain,
end to end.

A desktop engineering suite for software-defined radio work — synthesize modulated waveforms, recover the bits blind, and dissect the resulting bitstream, with a console that shows its math at every step.

Desktop Python Qt NumPy · SciPy

// 01 — Waveform Generator

Synthesize the signal you need.

Pick a scheme, shape the pulse, chain the coding — Belle renders the constellation and spectrum before a single sample hits disk.

// BELLE — Waveform Generator · v3.1 Ready
Modulation
Mod typeQPSK
Symbol rate250 ksym/s
Sample rate2.048 Msps
Center freq12.5 kHz
Pulse shapeRRC · α = 0.35
FEC / Randomizer
CodingCONV K=7 R=1/2
Additive (XOR) randomizer
Feedthrough randomizer
Output
Data sourceBinary counter
Fileburst_qpsk_250k.cf32
Generate + Save Preview only CLR
Constellation preview
Spectrum · RRC α = 0.35
$ belle --waveform
[gen] qpsk @ 250 ksym/s · rrc α=0.35 · span 8
[gen] fec: conv k=7 r=1/2 · xor randomizer
[ok]  wrote burst_qpsk_250k.cf32 (2.4 MB)

Scroll →

A·01

13 schemes, one dialog

BPSK through 64-QAM, FSK and MSK — with per-scheme symbol mapping you can edit by hand.

A·02

Pulse shaping done right

Root-raised-cosine filtering with configurable roll-off, previewed in the spectrum before export.

A·03

Coding chains

Convolutional FEC, scramblers, and randomizers stack in the order real waveforms use them.

// 02 — Demodulator

Recover bits you didn't transmit.

Costas carrier recovery and Gardner timing pull the constellation into lock, while the LFSR analyzer identifies the scrambler that's hiding the data.

// BELLE — Demodulator Locked
Input file
capture_2m4.cf32
Formatcf32 · complex IQ
Sample rate2.048 Msps
Demod parameters
ModulationQPSK
Symbol rate250 ksym/s
RRC roll-off0.35
SPS8.19
Carrier / timing recovery
Automatic recovery
Costas BW0.020
Gardner BW0.010
Output options
Viterbi decode · K=7 R=1/2
Pack bits · MSB first
Demodulate Abort Save bits…
// BELLE — Constellation EVM 3.2%
I/Q · converged
48 128Bits
24 064Symbols
3.2 %EVM
LFSR analyzer
DegPolynomialPeriodTypeScore
15x¹⁵ + x¹⁴ + 132 767Fibonacci98.7
7x⁷ + x⁶ + 1127Galois41.2
9x⁹ + x⁵ + 1511Fibonacci22.8
B·01

Blind lock

Costas + Gardner loops converge without a training sequence — watch the clusters tighten live.

B·02

Honest metrics

Bits, symbols, and EVM update as the loop settles, so you know the demod is real, not lucky.

B·03

Scrambler cracking

The LFSR analyzer sweeps candidate polynomials and scores them by period match and entropy drop.

// 03 — Data Viewer

See the structure inside the bits.

A visual bit-raster with chainable worksheet operations — descramble, deinterleave, frame-sync — and a shelf of analysis spies for whatever's left.

// BELLE — Data Viewer 8 192 × 512
Raw bits Descrambled Frame sync +
Bit raster · width 32
sync @ col 7 · 22 period 32 767 entropy drop 0.99 ASCII zoom Column bias LRS search

Scroll →

C·01

Worksheets, not scripts

28 bit operations — invert, deinterleave, derandomize, Viterbi, Reed-Solomon — chained visually per tab.

C·02

Sync jumps out

Solid columns in the raster are frame alignment made visible; the viewer finds the width for you.

C·03

13 analysis spies

Dockable panels for bit statistics, telecode, RS detection, audio playback, and LFSR tap search.

// Capabilities

One suite, four tools.

01

13 modulation schemes

BPSK, π/2-BPSK, QPSK, π/4-QPSK, OQPSK, 8-PSK, QAM to 64, FSK, and MSK — generated or demodulated.

02

Blind demodulation

Costas carrier recovery and Gardner timing with a live constellation and EVM readout across all schemes.

03

LFSR recovery

Automatic scrambler polynomial identification with period, entropy-drop, and confidence scoring.

04

FEC lab

Viterbi decoding of K=7 convolutional codes, punctured rates, and Reed-Solomon (255,223).

05

Bitstream workbench

28 chained bit operations and 13 dockable analysis spies over a dual-view synchronized raster.

06

Waveform viewer

Time domain, spectrogram, power spectrum, I/Q scatter, and time-raster displays with a full marker toolkit.

PythonQt / PySide6NumPySciPyMatplotlibDSP