RS-tracker/demod/mod
Zilog80 f1c79e34f7 M20: increase max AUX len (min 0x6F-0x45) 2024-02-11 12:07:54 +01:00
..
Makefile add Meteosis mts01mod (cf. test) 2022-11-13 22:59:26 +01:00
README.md mod: split --lp into --lpIQ and --lpFM; --dc update 2021-10-27 23:32:17 +02:00
bch_ecc_mod.c mod: more modular/encapsulated decoders/components 2019-03-16 10:15:11 +01:00
bch_ecc_mod.h mod/multi: Makefiles 2020-12-26 23:45:39 +01:00
demod_mod.c noted in rs41d-fork: compare full raw header if symhd=2 2023-02-19 18:26:03 +01:00
demod_mod.h demod_mod: reduce % ops 2022-09-12 02:26:38 +02:00
dfm09mod.c dfm09mod: reset subtype if invalid T 2022-12-17 10:13:39 +01:00
imet54mod.c imet54: ext. frame, std ok 2022-08-28 12:22:30 +02:00
lms6Xmod.c mod json: time/position reference 2022-02-13 22:43:20 +01:00
lms6mod.c IF/IQ lowpass 2019-09-12 23:41:46 +02:00
m10mod.c m10mod: fix JSON output with raw 49-frames 2023-02-08 17:36:16 +01:00
mXXmod.c M20: increase max AUX len (min 0x6F-0x45) 2024-02-11 12:07:54 +01:00
meisei100mod.c ims100: adjust default year/decade 2020..2029 2024-01-05 14:29:27 +01:00
mp3h1mod.c mod json: time/position reference 2022-02-13 22:43:20 +01:00
mts01mod.c mts01mod: battery, cf. pull request #52 from icalik/test 2022-11-25 22:47:20 +01:00
nav_gps_vel.c mod/multi: Makefiles 2020-12-26 23:45:39 +01:00
rs41mod.c rs41mod: fix broken frame output 2022-08-28 12:22:53 +02:00
rs41mod18.c rs41_sgm.c -> (new) rs41mod.c 2019-05-23 18:21:14 +02:00
rs41mod34.c rs41mod: tag2 2020-11-23 21:05:11 +01:00
rs92mod.c mod json: time/position reference 2022-02-13 22:43:20 +01:00
version_jsn.h json: optional JSON version output, global or local define 2021-01-31 20:28:34 +01:00

README.md

Radiosonde decoders

alternative decoders using cross-correlation for better header-synchronization

Files

  • demod_mod.c, demod_mod.h,
    rs41mod.c, rs92mod.c, dfm09mod.c, m10mod.c, lms6mod.c, lms6Xmod.c, meisei100mod.c, imet54mod.c, mp3h1mod.c,
    bch_ecc_mod.c, bch_ecc_mod.h

Compile

gcc -c demod_mod.c
gcc -c bch_ecc_mod.c
gcc rs41mod.c demod_mod.o bch_ecc_mod.o -lm -o rs41mod
gcc dfm09mod.c demod_mod.o -lm -o dfm09mod
gcc m10mod.c demod_mod.o -lm -o m10mod
gcc imet54mod.c demod_mod.o -lm -o imet54mod
gcc lms6Xmod.c demod_mod.o bch_ecc_mod.o -lm -o lms6Xmod
gcc meisei100mod.c demod_mod.o bch_ecc_mod.o -lm -o meisei100mod
gcc rs92mod.c demod_mod.o bch_ecc_mod.o -lm -o rs92mod (needs RS/rs92/nav_gps_vel.c)
gcc mp3h1mod.c demod_mod.o -lm -o mp3h1mod

Usage/Examples

./rs41mod --ecc2 -vx --ptu <audio.wav>
./dfm09mod --ecc -v --ptu <audio.wav> (add -i for dfm06; or use --auto)
./m10mod --dc -vv --ptu -c <audio.wav>
./lms6Xmod --vit --ecc -v <audio.wav>

IQ data:
If the IQ data is downsampled and centered (IF band), use
./rs41mod --iq2 <iq_data.wav>
or with lowpass filter
./rs41mod --iq2 --lpIQ <iq_data.wav>
For baseband IQ data, use ./rs41mod --IQ <fq> --lpIQ <iq_data.wav>
where <fq> is the relative frequency in -0.5 .. 0.5; e.g. if the receiver is tuned to 403MHz and the (complex) sample rate is 2MHz, a signal at 402.5MHz would be -0.5MHz off, i.e. <fq> = -0.5/2 = -0.25.
For IQ data (i.e. 2 channels) it is possible to read raw data (without wav header):
./rs41mod --IQ <fq> - <sr> <bs> <iq_data.raw>
     <sr>: sample rate
     <bs>=8,16,32: bits per (real) sample (u8, s16 or f32)

Remarks

FM-demodulation is sensitive to noise at higher frequencies. A narrow low-pass filter is needed before demodulation. For weak signals and higher modulation indices IQ-decoding is usually better.

DFM:
The high modulation index has advantages in IQ-decoding.
--ecc2 uses soft decision for 2-error words. If weak signals frequently produce errors, it is likely that more than 2 errors occur in a received word. Since there is no additional frame protection (e.g. CRC), the frames will not be decoded reliably in weak conditions. The --dist option has a thredshold for the number of errors per packet.

LMS6-403:
lms6Xmod_soft.c (testing) provides a soft viterbi decoding option --vit2; IQ-decoding is recommended for soft decoding (noisy/spikey FM-signals don't always help soft decision). The difference between hard and soft viterbi becomes only apparent at lower SNR. The inner convolutional code does most of the error correction. The concatenated outer Reed-Solomon code kicks in only at low SNR.

soft input:
Option --softin expects float32 symbols as input, with s>0 corresponding to bit=1.
(remark/caution: often soft bits are defined as bit=0 -> s=+1 and bit=1 -> s=-1 such that the identity element 0 for addition mod 2 corresponds to the identity element +1 for multiplication.)