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
,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.
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.)