RS-tracker/demod/mod
Zilog80 aa341786d0 M10 Temp: R [30E]=2000k 2020-05-21 17:12:07 +02:00
..
README.md soft decoding: info update 2020-05-05 21:00:01 +02:00
bch_ecc_mod.c mod: more modular/encapsulated decoders/components 2019-03-16 10:15:11 +01:00
bch_ecc_mod.h C99 2020-01-24 22:59:04 +01:00
demod_mod.c Hamming [8,4] 2-bit-errors -> soft decision 2020-04-27 23:35:45 +02:00
demod_mod.h Hamming [8,4] 2-bit-errors -> soft decision 2020-04-27 23:35:45 +02:00
dfm09mod.c JSON output: added type key 2020-05-07 23:47:17 +02:00
lms6Xmod.c LMS6 JSON: type=LMS , subtype=6,X,MK2A 2020-05-09 12:10:48 +02:00
lms6Xmod_soft.c LMS6 JSON: type=LMS , subtype=6,X,MK2A 2020-05-09 12:10:48 +02:00
lms6mod.c IF/IQ lowpass 2019-09-12 23:41:46 +02:00
m10mod.c M10 Temp: R [30E]=2000k 2020-05-21 17:12:07 +02:00
mXXmod.c mXX/M20: dbg lfdnr 2020-05-18 00:47:20 +02:00
meisei100mod.c JSON output: added type key 2020-05-07 23:47:17 +02:00
rs41mod.c JSON output: added type key 2020-05-07 23:47:17 +02:00
rs41mod18.c rs41_sgm.c -> (new) rs41mod.c 2019-05-23 18:21:14 +02:00
rs92mod.c JSON output: added type key 2020-05-07 23:47:17 +02: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,
    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 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)

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 --lp <iq_data.wav>
For baseband IQ data, use ./rs41mod --IQ <fq> <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.