Benchmark results - windytan/redsea GitHub Wiki
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.
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 | |
| 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 |
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 | |
| 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 |
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 |
# 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>" | bcWe 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.
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.
