diff --git a/demod/mod/README.md b/demod/mod/README.md index aaa4989..2456c54 100644 --- a/demod/mod/README.md +++ b/demod/mod/README.md @@ -40,3 +40,23 @@ alternative decoders using cross-correlation for better header-synchronization      ``: sample rate
     `=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. + + diff --git a/demod/mod/dfm09mod.c b/demod/mod/dfm09mod.c index b3c3668..954b753 100644 --- a/demod/mod/dfm09mod.c +++ b/demod/mod/dfm09mod.c @@ -1242,11 +1242,15 @@ int main(int argc, char **argv) { if (option_iq >= 2) { float bl = -1; if (option_iq > 2) bl = 4.0; - bitQ = read_softbit(&dsp, &hsbit, 0/*gpx.option.inv*/, bitofs, bitpos, bl, 0); + bitQ = read_softbit(&dsp, &hsbit, 0, bitofs, bitpos, bl, 0); } else { - bitQ = read_softbit(&dsp, &hsbit, 0/*gpx.option.inv*/, bitofs, bitpos, -1, spike); + bitQ = read_softbit(&dsp, &hsbit, 0, bitofs, bitpos, -1, spike); } + // optional: + // normalize soft bit s_j by + // rhsbit.sb /= dsp._spb+1; // all samples in [-1,+1] + } if ( bitQ == EOF ) { frm = nfrms; break; } // liest 2x EOF diff --git a/demod/mod/lms6Xmod_soft.c b/demod/mod/lms6Xmod_soft.c index 9fcaa8a..972a2f5 100644 --- a/demod/mod/lms6Xmod_soft.c +++ b/demod/mod/lms6Xmod_soft.c @@ -1246,6 +1246,12 @@ int main(int argc, char **argv) { bitQ = read_softbit(&dsp, &rhsbit, 0, bitofs, bitpos, -1, 0); // symlen=1 if (bitQ == EOF) { break; } + // optional: + // normalize soft bit s_j by + // rhsbit.sb /= dsp._spb+1; // all samples in [-1,+1] + // or at the end by max|s_j| over all bits in rawframe + // (only if |sj| >> 1 by factor 100) + hsbit.hb = rhsbit.hb ^ (bc%2); // (c0,inv(c1)) int sgn = -2*(((unsigned int)bc)%2)+1; hsbit.sb = sgn * rhsbit.sb; diff --git a/ecc/ecc_hamming.pdf b/ecc/ecc_hamming.pdf new file mode 100644 index 0000000..5dd986c Binary files /dev/null and b/ecc/ecc_hamming.pdf differ