Strong preamble detection even with --aggressive.

To try to decode messages with a fundamentally flawed preamble is mostly
a useless waste of CPU time.

The new aggressive mode still detects a sensible percentage of
additional messages because of the error tolerance and two-bits fixes
but does not waste your CPU time.
This commit is contained in:
antirez 2013-01-26 13:03:24 +01:00
parent 184953ff92
commit 977493cf63
2 changed files with 29 additions and 32 deletions

View file

@ -195,7 +195,6 @@ sending DF17 packets), but can detect a few more messages.
The algorithm in aggressive mode is modified in the following ways: The algorithm in aggressive mode is modified in the following ways:
* Preamble detection is weakened to be more liberal in what is consdered valid.
* Up to two demodulation errors are tolerated (adjacent entires in the magnitude * Up to two demodulation errors are tolerated (adjacent entires in the magnitude
vector with the same eight). Normally only messages without errors are vector with the same eight). Normally only messages without errors are
checked. checked.

View file

@ -1361,38 +1361,36 @@ void detectModeS(uint16_t *m, uint32_t mlen) {
continue; continue;
} }
if (!Modes.aggressive) { /* The samples between the two spikes must be < than the average
/* The samples between the two spikes must be < than the average * of the high spikes level. We don't test bits too near to
* of the high spikes level. We don't test bits too near to * the high levels as signals can be out of phase so part of the
* the high levels as signals can be out of phase so part of the * energy can be in the near samples. */
* energy can be in the near samples. */ high = (m[j]+m[j+2]+m[j+7]+m[j+9])/6;
high = (m[j]+m[j+2]+m[j+7]+m[j+9])/6; if (m[j+4] >= high ||
if (m[j+4] >= high || m[j+5] >= high)
m[j+5] >= high) {
{ if (Modes.debug & MODES_DEBUG_NOPREAMBLE &&
if (Modes.debug & MODES_DEBUG_NOPREAMBLE && m[j] > MODES_DEBUG_NOPREAMBLE_LEVEL)
m[j] > MODES_DEBUG_NOPREAMBLE_LEVEL) dumpRawMessage(
dumpRawMessage( "Too high level in samples between 3 and 6",
"Too high level in samples between 3 and 6", msg, m, j);
msg, m, j); continue;
continue; }
}
/* Similarly samples in the range 11-14 must be low, as it is the /* Similarly samples in the range 11-14 must be low, as it is the
* space between the preamble and real data. Again we don't test * space between the preamble and real data. Again we don't test
* bits too near to high levels, see above. */ * bits too near to high levels, see above. */
if (m[j+11] >= high || if (m[j+11] >= high ||
m[j+12] >= high || m[j+12] >= high ||
m[j+13] >= high || m[j+13] >= high ||
m[j+14] >= high) m[j+14] >= high)
{ {
if (Modes.debug & MODES_DEBUG_NOPREAMBLE && if (Modes.debug & MODES_DEBUG_NOPREAMBLE &&
m[j] > MODES_DEBUG_NOPREAMBLE_LEVEL) m[j] > MODES_DEBUG_NOPREAMBLE_LEVEL)
dumpRawMessage( dumpRawMessage(
"Too high level in samples between 10 and 15", "Too high level in samples between 10 and 15",
msg, m, j); msg, m, j);
continue; continue;
}
} }
Modes.stat_valid_preamble++; Modes.stat_valid_preamble++;