Benchmark results - windytan/redsea GitHub Wiki

Decoding speed

Radio stations transmit 11.4 RDS groups per second (for RDS1). Redsea must be faster than this to decode in real time. Ideally, it should be a lot faster to leave room for other processes and overhead.

We ran test recordings through redsea as fast as possible and measured the throughput (data flow per second) on different kinds of computers. The output was piped to /dev/null so that the terminal wouldn't bottleneck it. We marked easily real-time capable situations with ✅ and those requiring extra care with a ⚠️.

We didn't measure RDS2 performance yet, but you can estimate the RDS2 time budget by comparing the throughput to the number 45.6 instead of 11.4.

MPX to JSON (RDS1, 171 kHz)

171 kHz is redsea's "native" sample rate.

Computer CPU Redsea version Throughput Time budget
Raspberry Pi 1 Model B ARM11 1.3-SNAPSHOT
(2cf26a7)
26 groups/s ⚠️ Near limit
Raspberry Pi 3B (SSD) ARMv7 1.3-SNAPSHOT
(2cf26a7)
146 groups/s ✅ Real-time
Macbook Pro 2021 M1 Pro 1.3-SNAPSHOT
(2cf26a7)
2564 groups/s ✅ Real-time

MPX to JSON (RDS1, 192 kHz)

If the sample rate is not 171k redsea needs to activate the resampler; this is slower. The RasPi 1 might have trouble keeping up.

Computer CPU Redsea version Throughput Time budget
Raspberry Pi 1 Model B ARM11 1.3-SNAPSHOT
(2cf26a7)
17 groups/s ⚠️ Near limit
Raspberry Pi 3B (SSD) ARMv7 1.3-SNAPSHOT
(2cf26a7)
92 groups/s ✅ Real-time
Macbook Pro 2021 M1 Pro 1.3-SNAPSHOT
(2cf26a7)
1606 groups/s ✅ Real-time

Hex to JSON

Decoding an input that is already in the hex format is very fast.

Computer CPU Redsea version Throughput Time budget
Raspberry Pi 1 Model B ARM11 1.3-SNAPSHOT
(2cf26a7)
3241 groups/s ✅ Real-time
Raspberry Pi 3B (SSD) ARMv7 1.3-SNAPSHOT
(2cf26a7)
25 600 groups/s ✅ Real-time
Macbook Pro 2021 M1 Pro 1.3-SNAPSHOT
(2cf26a7)
257 900 groups/s ✅ Real-time

Command used

# Note: Copy the seconds from 'time' output manually as <time-output>

# mpx
time ./build/redsea -f /data/mpx/viker.wav --output json >/dev/null
DURATION=`soxi -D /data/mpx/viker.wav`
echo "$DURATION * 1187.5 / 104 / <time-output>" | bc

# hex
time ./build/redsea --input hex < /data/hex/d311_d318.spy > /dev/null
NUM_GROUPS=`wc -l /data/hex/d311_d318.spy`
echo "$NUM_GROUPS / <time-output>" | bc

Noise performance

We measured how redsea 1.0-SNAPSHOT does under noisy conditions on different platforms:

  • took a recording of a clean MPX and added varying amounts of white rand() noise to it.
  • calculated the power coming through the narrow-band RDS shaping filter (signal + noise) and compared it with another filter running 5 kHz higher (noise only, same bandwidth).
  • calculated the signal-to-noise ratio estimate as $\mathit{SNR_{dB}} = 10 \times log_{10}\frac{P_{signal with noise} - P_{noise only}}{P_{noise only}} $.

Here, the percentage of correct syndromes received (before error correction) is plotted against the subcarrier's SNR estimate.

Syndromes vs. snr

On some platforms like armv7, liquid-dsp uses --fast-math that changes how sine and cosine are calculated. This explains why noise affects reception differently on different platforms.

See Error detection and correction for more discussion and measurements.

⚠️ **GitHub.com Fallback** ⚠️