Hear every sensor in the garden, not only the loudest one
Reported as reading nothing at all with several sensors in range. Two faults, either of which is enough on its own, and both of them things I assumed rather than checked -- this was written against messages I generated myself and never against a sensor. The first is the threshold. Bursts were found by setting one level per second of band, halfway between the noise floor and the loudest thing in that second. That is the obvious way to write it and it is wrong: a sensor on the windowsill and a sensor at the end of the garden differ by forty decibels, so a level set halfway to the near one sits above everything the far one ever does. The far ones do not come through weakly, they vanish -- and vanish only while the near one is transmitting, which is as confusing a symptom as radio produces. A block with one loud sensor in it yielded exactly one sensor however many were out there. Finding bursts is now two passes. The first asks only where anything happened at all and asks it against the noise -- the bottom fifth of the second, which is noise however busy the rest was, and which does not move when something loud arrives. Whatever clears that is grouped into regions, and the second pass re-thresholds each region against its own high and low. Every sensor is sliced at its own amplitude. Six sensors spanning eighty times in strength now all come back from one second of band. The second fault is that the slicer knew how a bit is drawn. It read a pulse by comparing it with the gap that followed, which is right when the gap is the complement of the pulse so that every bit takes the same time, and wrong when the gap is a fixed spacer: a two-hundred-and-twenty microsecond pulse against a two-hundred microsecond spacer is the longer of the two and reads as a one, which is the wrong bit, and then every message fails its checksum having said nothing about why. Nothing is assumed now -- not which of the pulse and the gap carries the bit, not whether the gap is a complement or a spacer, not which of long and short means one. The same burst is read half a dozen ways and the checksums say which reading it was, at most one being able to satisfy one. Copies are counted per message rather than per reading, or two readings of one burst would corroborate each other and the rule protecting the two thinly-checked models would protect nothing. Both were caught the same way: by measuring, rather than by reading the code again. A thousand seconds of the invented garden still yields no sensor that is not there, and reception of the ones that are is up by a quarter, because bursts that used to be masked now decode. And, because none of the above should have needed me: `bandsaunter weather --diagnose` prints each second taken apart stage by stage -- the noise, the level a burst must clear, the loudest thing in the block, then every burst with the lengths of its pulses and gaps and whatever was made of them. Those lengths are the useful part: a real message has two or three of them and nothing in between, which says at a glance whether the trouble is the radio or the arithmetic. At the end it says which of five things it was: nothing arriving, nothing above the noise, something never keyed, bursts that framed as nothing, or messages that framed and arrived only once. `--save-iq FILE` keeps the raw samples for whatever that cannot settle. Full suite 2286 passed; the new work checked against six deliberately broken builds. Built as 2026-09-07_02. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016PsWPTweCT6pwxKngvVxcg
This commit is contained in:
parent
65cc03b78d
commit
335d83f8a0
10 changed files with 1105 additions and 96 deletions
|
|
@ -1,5 +1,5 @@
|
|||
.\" Generated by packaging/make-man.py -- do not edit by hand.
|
||||
.TH BANDSAUNTER 1 "2026-09-07" "bandsaunter 2026-09-07_01" "User Commands"
|
||||
.TH BANDSAUNTER 1 "2026-09-07" "bandsaunter 2026-09-07_02" "User Commands"
|
||||
.SH NAME
|
||||
bandsaunter \- scan, record and identify radio signals with an RTL-SDR
|
||||
.SH SYNOPSIS
|
||||
|
|
@ -2277,13 +2277,28 @@ A running average of the complex samples then rejects the spike, and only
|
|||
after that is the magnitude taken \[em] filtering before detection rather than
|
||||
after is what keeps the neighbours out of the envelope of the sensor.
|
||||
.PP
|
||||
Slicing the envelope into bits never measures anything against a clock. The
|
||||
newer sensors vary the length of the pulse and keep the gaps even; the two
|
||||
older ones keep the pulse even and vary the gap. Both readings of the same
|
||||
pulses are tried and the checksums say which it was. A transmitter running ten
|
||||
per cent fast is read correctly and never noticed, which matters: these are
|
||||
unlocked and drift with the temperature, and an outdoor sensor in January is
|
||||
not the one that was on the fence in July.
|
||||
Finding the bursts is done in two passes, and the reason is having more than
|
||||
one sensor. The first pass asks only where anything is happening at all, and
|
||||
asks it against the noise: the bottom fifth of a second, which is noise
|
||||
however busy the rest was. Whatever clears that is grouped into regions, and
|
||||
the second pass re-thresholds each region against its own high and low, so
|
||||
every sensor is sliced at its own amplitude. One threshold per second, set
|
||||
halfway between the noise and the loudest thing in it, is the obvious way to
|
||||
write this and is wrong: a sensor on the windowsill and a sensor at the end of
|
||||
the garden differ by forty decibels, so the far ones fall below it and vanish,
|
||||
and vanish only while the near one is transmitting.
|
||||
.PP
|
||||
Slicing the envelope into bits never measures anything against a clock, and
|
||||
assumes as little as it can about how a bit is drawn. Not which of the pulse
|
||||
and the gap carries the bit; not whether the gap is the complement of the
|
||||
pulse or a fixed spacer, since a 220 microsecond pulse against a 200
|
||||
microsecond spacer is the longer of the two and reads as the wrong bit; and
|
||||
not which of long and short means one. The same burst is read half a dozen
|
||||
ways and the checksums say which reading it was, at most one of them being
|
||||
able to satisfy one. A transmitter running ten per cent fast is therefore read
|
||||
correctly and never noticed, which matters: these are unlocked and drift with
|
||||
the temperature, and an outdoor sensor in January is not the one that was on
|
||||
the fence in July.
|
||||
.SS Afterwards
|
||||
When the listening stops, two tables. The first is about reception \[em] who,
|
||||
how often, how well \[em] and is the one to look at when something is missing:
|
||||
|
|
@ -2320,14 +2335,45 @@ transmitting real messages with real checksums, keyed on and off as a real one
|
|||
does, through the real filter, the real slicer and the real decoders. Nothing
|
||||
touches the receiver.
|
||||
.SS If nothing is heard
|
||||
These are a few milliwatts. A quarter-wave whip for 433.92 MHz is 17 cm of
|
||||
wire, and the stock telescopic aerial set to about that length works well;
|
||||
indoors, behind a wall, with the dongle in the back of a machine, is usually
|
||||
the problem. Try
|
||||
.B "bandsaunter weather \-\-diagnose"
|
||||
is the answer to this, because "nothing was heard" is four different faults
|
||||
wearing the same coat and they want four different answers. It prints each
|
||||
second of band taken apart stage by stage: the noise level, the level a burst
|
||||
has to clear, the loudest thing in the block, and then every burst found with
|
||||
the lengths of its pulses and gaps and whatever was made of them.
|
||||
.TP
|
||||
.B "peak barely above noise, no bursts"
|
||||
Nothing is arriving, which is an aerial. These are a few milliwatts; a
|
||||
quarter-wave whip for 433.92 MHz is 17 cm of wire, which is the stock
|
||||
telescopic aerial collapsed to about that, and indoors behind a wall with the
|
||||
dongle in the back of a machine is usually the problem. Try
|
||||
.B \-\-gain 40
|
||||
if the automatic gain control is not finding them, and
|
||||
.B \-\-messages
|
||||
to watch individual receptions arrive while moving the aerial about.
|
||||
if the automatic gain control is not finding them.
|
||||
.TP
|
||||
.B "peak well above noise, no bursts"
|
||||
Something is there and did not group into a burst, usually a transmitter that
|
||||
is on continuously rather than keyed. Not one of these.
|
||||
.TP
|
||||
.B "bursts whose pulse lengths are not two or three clean groups"
|
||||
The receiver is hearing it and the slicing is wrong. A real message shows two
|
||||
or three lengths with nothing in between; a smear means noise is being sliced
|
||||
as signal, or two sensors are transmitting over each other.
|
||||
.TP
|
||||
.B "clean pulse lengths, nothing framed"
|
||||
The radio is fine and the message is from a model this does not read. The line
|
||||
of pulse lengths is what is needed to add it.
|
||||
.TP
|
||||
.B "framed, but needs the same message twice"
|
||||
It was read correctly and arrived once. The two older models are believed only
|
||||
on a second copy, so this wants a stronger signal.
|
||||
.PP
|
||||
When the listening stops it says which of those five it was, once, rather than
|
||||
on every quiet second.
|
||||
.PP
|
||||
.BI \-\-save\-iq " FILE"
|
||||
writes the raw samples alongside, for anything the diagnosis cannot settle. It
|
||||
is 8 MB a second at the default rate, so bound it with
|
||||
.BR \-\-seconds .
|
||||
.SH WEATHER OPTIONS
|
||||
Every option the weather side takes, in the four groups the menu shows them
|
||||
in. Each is a flag here and a line in the menu, and both come from one table
|
||||
|
|
@ -2403,6 +2449,15 @@ Print every message \[em] one line per message instead of a table that updates i
|
|||
.br
|
||||
Setting name \fBmessages\fR, default \fBno\fR.
|
||||
.TP
|
||||
.B --diagnose / --no-diagnose
|
||||
Say what is arriving \[em] print what each second of band looked like at every stage.
|
||||
.br
|
||||
Setting name \fBdiagnose\fR, default \fBno\fR.
|
||||
.RS
|
||||
.PP
|
||||
Turn this on when sensors you know are there are not appearing. The line of pulse lengths is the useful part: a real message has two or three lengths in it and nothing in between.
|
||||
.RE
|
||||
.TP
|
||||
.B --hold
|
||||
Keep on screen for \[em] how long a sensor stays on the display after its last message (s).
|
||||
.br
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue