Every walk you record with Consentiva becomes a report: a map, a timeline, a table of signals that were stronger than usual, your own marks and video, a picture of the whole spectrum, and a record-integrity check. This guide goes through each part in the order it appears, explains exactly what the numbers mean, works through real-world patterns, and shows how to verify and share the evidence package. Open the sample report alongside it if you'd like to follow along.
Where you'll see a report, and which version you're looking at
The same walk can be shown in a few slightly different ways. It helps to know which one is in front of you.
| Version | Where it comes from | What's different |
|---|---|---|
| Online report | Opened from the app or your account | Full report with street map; a link to download the evidence package |
| Zip copy (report.html) | Inside the evidence package | Same content, works offline; the street map isn't shown when opened from a file; audio and video play from the files in the package |
| Linked phone | A walk recorded on a phone linked to your account | The header says "Recorded on linked phone"; the account owner downloads the evidence package |
| Locked report | Walks on a Free account | Shows that the recording worked (sweeps, distance, duration, your marks) but not the analysis |
A Free account records 30 MHz–2.7 GHz and keeps recordings for 7 days, with analysis locked. Standard ($29/month) unlocks the analysis, reports, evidence packages and video, up to 2.7 GHz. Full ($45/month) adds 2.7–6 GHz. Details are on the plans page.
The header: what, when and with which receiver
The top of the report identifies the walk:
- Walk name. The name you gave it, or the start time if you didn't name it.
- Start → end. The local date and time the walk began and ended. A walk still being recorded shows "in progress".
- Receiver. The device that made the sweeps, for example the HackRF One.
- Timezone. All times in the report are in this timezone. Check it before you compare times with a camera, a phone log or another person's notes.
- Recorded on linked phone. Shown only when a linked phone, rather than the account owner's phone, recorded the walk, along with that phone's name.
When you quote a time from the report in an email or complaint, quote the timezone with it. "18:42 Eastern" can't be misread; "18:42" can.
The stats cards: is this walk worth reading closely?
Below the header is a row of six numbers. Read them first; together they tell you how much weight the rest of the report can carry.
| Card | What it counts | How to use it |
|---|---|---|
| Sweeps | Passes across the whole frequency range during the walk | More sweeps means each place was looked at more often |
| Km walked | Distance along the GPS track | A very short distance with many sweeps means you mostly stood still |
| Duration | Minutes from start to end | Divide sweeps by duration to see your sweep rate |
| Marks | Your tapped marks and audio notes | Context for anything unusual |
| Unusual signals | Rows in the unusual signals table | Zero is a normal result, not a failure |
| % of sweeps with a baseline | Share of sweeps that had a learned normal to compare against | Low means the walk was mostly learning |
Why the baseline percentage matters most
Consentiva can only call something unusual if it knows what's usual for that place and time. If only 20% of sweeps had a baseline, then 80% of the walk wasn't checked for anything unusual at all. "0 unusual signals" on a walk with a 20% baseline means much less than the same result with 95%.
The sweep rate depends on the frequency range you record and on your setup. Work it out from the cards: 1,200 sweeps in 20 minutes is one sweep a second. That lets you turn the Sweeps column of the unusual signals table into rough time: at that rate, ten sweeps is about ten seconds of signal.
How Consentiva decides what's "unusual"
Everything in the report depends on the baseline, so it's worth understanding how it's built.
- Per block. The map is divided into blocks of roughly 150 m. Each block has its own record of what is normal there.
- Per time of day. Each block keeps separate baselines for night (00:00–06:00), morning (06:00–12:00), afternoon (12:00–18:00) and evening (18:00–24:00), in local time. A busy evening street isn't compared with the same street at 3 a.m.
- Built from more than one walk. A block and time needs data from at least two separate walks before it's used. One long walk on one day can't, on its own, define normal.
- Per frequency channel. The comparison is made channel by channel across the whole range, using both the peak level and the power in each channel.
- A margin above normal. A channel is flagged when it is well above the learned level: at least 10 dB, and more on channels that naturally vary a lot.
- Unusual signals don't teach themselves. Channels flagged as unusual are not added to the baseline, so a transmitter that lingers can't gradually become "normal".
Where a block doesn't yet have enough data for that time of day, Consentiva can fall back to the same block at any time, or to a wider area. The evidence package's summary.json shows how many sweeps used each kind of baseline.
"Unusual" means "stronger than your own baseline for that place and time". It does not mean harmful, illegal or suspicious. Most unusual readings turn out to be ordinary radios, cell sites and Wi-Fi.
Route map
The map draws your route, coloured by how unusual each stretch was compared with the normal for that block:
- Green: normal for that block and time.
- Amber: unusual.
- Red: strongly unusual.
- Purple pins: your marks. Tap one to see its type and note.
- Red rings: where the strongest unusual signals peaked, up to the ten strongest. Tap a ring for its frequency, how far above normal it was and the likely service.
Learning stretches, which had no baseline, are drawn green as well, because nothing was flagged there. Check the baseline percentage before reading a green route as "all normal".
Reading the map
- A single short amber segment usually means something brief: a passing vehicle, a radio transmission.
- A long amber or red run along one street suggests something that stayed on and covered an area, such as a transmitter on a building.
- A red ring next to a purple pin is worth looking at together: what did you mark at that moment?
When you open the zip copy from a file, the street map tiles aren't loaded and the report says so. The coloured route, pins and rings are still there; the online report shows the streets underneath.
Timeline
The timeline shows one bar per sweep, from the start of the walk on the left to the end on the right. The height of each bar is that sweep's anomaly score: how far the most unusual channel in that sweep was above normal, in dB. Bars use the same colours as the map: green for nothing unusual, amber for unusual, and red for strongly unusual (15 dB or more above normal). Your marks appear as dashed purple vertical lines.
It answers three questions quickly:
- When did it start, and how long did it last? A cluster of tall bars marks the period.
- Was it once or repeated? Separate clusters spread through the walk suggest something intermittent.
- Does it line up with something you marked? A cluster right after a purple line is the pattern a passing vehicle or a nearby transmission usually leaves.
The timeline is in time, not distance. If you stood still for ten minutes, that's a long stretch of the timeline and a single point on the map.
The unusual signals table, column by column
The table is titled Unusual signals (vs. your baseline). Each row is one signal: detections in overlapping frequency ranges across the walk are grouped into a single row. Rows are sorted with the largest excess above normal first. If nothing was flagged, the table says "nothing above baseline".
| Column | Meaning |
|---|---|
| Peak | The frequency where the signal was strongest, at the sweep where it stood out most |
| Width | The range of frequencies flagged, combined across all sweeps in the row |
| Status | new (normally nothing there) or elevated (a usual signal, much stronger than usual) |
| Level | The measured level at that peak, in dBFS or dBm |
| Normal | The baseline level for that channel, block and time |
| Above | How far above normal it was, in dB |
| Sweeps | How many sweeps saw it |
| When | The first and last time it was seen |
| Likely service | The kind of service allocated that frequency, such as cellular, land mobile radio or Wi-Fi |
Peak and Width
Peak tells you where to look on the spectrum chart. Width tells you what kind of signal it might be. A narrow width suggests a single radio channel, such as a two-way radio. A wide one suggests a cellular or Wi-Fi channel, or several neighbouring channels flagged together. Because the width is combined across the walk, a signal that drifts or is seen with slightly different edges on different sweeps can show a wider range than any single sweep did.
Status: new or elevated
- new means the baseline at that frequency was close to the general background level: normally there's nothing noticeable there. A "new" row is something that is usually absent.
- elevated means there is normally a signal at that frequency, and this time it was much stronger. A cell site you always see, reading far higher than usual, would be "elevated".
Neither status says anything about who is transmitting. "New" is not the same as "never existed before": it means "not normally present in your baseline for this block and time". A taxi radio that happens never to have been on when you walked before is "new" to your baseline.
Level, Normal and Above
Level and Normal are the measured and baseline levels at the peak channel, in the report's unit. Levels are uncalibrated dBFS unless you entered a calibration offset, in which case they're shown in dBm. Compare them with each other, not with any external limit.
Above is the excess, in dB, and it's the column to read first. Decibels are logarithmic:
| Above | Power compared with normal |
|---|---|
| +10 dB | 10 times |
| +15 dB | about 32 times |
| +20 dB | 100 times |
| +30 dB | 1,000 times |
| +40 dB | 10,000 times |
Big ratios are common in radio. A handheld radio a few metres away can easily read 30 dB above a quiet channel. A large number tells you the signal was close or strong relative to what's normally there, not that it was dangerous.
Above is usually close to Level minus Normal, but it can be larger. Each channel is checked on two measurements, its peak level and its power, and Above reports whichever exceeded normal by more. Level and Normal are both peak levels. So a signal whose power rose more than its peak can show, for example, Level −52.0, Normal −65.0 and Above +17.4. That's expected, not an error.
Sweeps and When
These two columns, read together, tell you how persistent the signal was.
- Many sweeps over a short window: a steady signal while you were nearby.
- Few sweeps over a short window: a brief transmission.
- Few sweeps spread over a long window: intermittent; it came and went.
- Most of the walk's sweeps over the whole walk: something present everywhere you went, or across a large area.
When gives the first and last detection, not a continuous period. A row reading 18:05–18:47 with 6 sweeps was seen six times in that window, not for 42 minutes.
Likely service
The likely service comes from the frequency allocation: what that part of the spectrum is set aside for. It's a strong hint, not an identification. A signal at a land mobile frequency is probably a two-way radio, but the report can't tell you whose. For the bands themselves, see 5G frequency bands explained and radio signals on a Miami street.
The learning note
If some sweeps had no baseline, a note above the table says how many, for example "120 of 400 sweeps were in places or times with no baseline yet". Those sweeps weren't checked. Walk the same areas again on other days, at the times you care about, to fill the gaps.
Your marks
The marks table lists everything you marked during the walk:
- Time of the mark.
- Type, such as vehicle, antenna, aircraft, boat, other, or voice for a hold-to-record audio note.
- Note: any text attached.
- Audio: a player for hold-to-talk recordings, so you can hear exactly what you said at the time.
- Position: latitude and longitude where the mark was made.
Marks turn a measurement into a story. "+28 dB at 18:42:10" means little alone; "+28 dB at 18:42:10, seven seconds after a vehicle mark: white van, roof antenna, parked" points to an explanation. A mark records what you saw or said. It isn't a measurement and it isn't proof of cause.
Marks made while GPS was poor may have a position some distance from where you really were. If a pin looks wrong on the map, trust your note and the time, and say so when you share the report.
Video evidence
On Standard and Full plans you can record short video clips during a walk. Each clip in the report has a card showing:
- The clip label, or "Clip 1", "Clip 2" if unlabelled.
- The start and end times and duration in seconds.
- The GPS position where the clip started.
- Whether time, GPS and live RF are burned in: drawn into the picture itself while recording, so they can't be separated from the footage. The card also says whether the clip has sound, and its file size.
- The clip's SHA-256 fingerprint, computed on the phone before upload and checked on arrival, and also stored in the hash chain.
- A table of RF readings during the clip: one row per sweep from a few seconds before to a few seconds after. Each row gives the time, whether the sweep was Normal or Unusual, and either the unusual signal (frequency, dB above normal, likely service) or the strongest signal in that sweep.
Press play and the row matching the moment on screen is highlighted, moving down the table as the video plays. This lets anyone see what the receiver measured while the camera was pointing at, say, an antenna on a roof. If no sweeps fell within the clip (the receiver was off or between sweeps), the table says so.
Spectrum over the walk
This chart shows the whole frequency range of the walk, low frequencies on the left. It is built from every sweep in the walk:
- The red line is the max hold: the highest level reached at each frequency at any point in the walk.
- The blue line is the median: the typical level at each frequency, exceeded in half the sweeps.
- Shaded bands mark the frequency ranges listed in the unusual signals table.
The legend gives the unit and the width of each channel. The mean power in each channel is also calculated and is included in summary.json in the evidence package.
Patterns to recognise
| Pattern | What it usually means |
|---|---|
| Red and blue both high, close together | A steady signal present for most of the walk, such as FM broadcast or cellular downlink |
| Tall red spike, low blue line | Something that came and went: a radio transmission, a passing vehicle, a radar sweep |
| Shaded band where blue is low | An unusual signal that was brief compared with the walk |
| Shaded band where blue is high | Unusual for a large part of the walk, or a usual signal that was elevated throughout |
| Broad raised hump with no sharp peak | A wideband signal such as a cellular or Wi-Fi channel, or broadband electrical noise |
| Wide gap between red and blue across many frequencies | Lots of short-lived activity: a busy area, or a walk past many different sources |
Remember that this chart covers the whole walk. A signal strong on one block and absent on the others shows its local strength in the red line, but the blue line, averaged over the walk, will be low. Use the map and timeline to see where and when.
Strongest signals seen
This table lists the strongest individual signals of the walk, regardless of the baseline:
- Frequency of the signal.
- Level: the highest level it reached.
- Seen in: the percentage of sweeps in which it was among the signals picked out.
- Likely service.
FM stations and nearby cell sites usually top this list on every walk. That's normal: they're powerful and always on. A signal here with a high "Seen in" percentage that isn't in the unusual table is a strong signal that is normal for your route. A signal with a low percentage was strong but brief.
This table answers a different question from the unusual table. "What was strongest?" is about absolute level. "What was different?" is about change. A weak signal that is normally absent can be in the unusual table and nowhere near the strongest list, and that's often the more interesting one.
Record integrity
Every sweep, mark and video, and the start and end of each walk, is added to your account's hash chain. Each record's SHA-256 fingerprint is calculated from the previous record's fingerprint plus the record itself:
hash = SHA-256(prev_hash + record)
Change anything in any record, even one character, and its hash no longer matches. Change the hash to cover it up, and the next record's prev_hash no longer matches. Rewriting history would mean rewriting every later record, and the head hash would change.
The section shows:
- Hash chain: verified or FAILED. Verified means the server checked the whole chain for your account and found every link intact. FAILED is followed by the reason.
- The number of records on your account. This covers all your walks, not just this one.
- The head hash: the fingerprint of the latest record on your account when the report was produced.
- The first ledger rows of this walk: sequence number, record type, the time the server received it, and the start of its hash. The rest are in the evidence package.
The chain proves that records haven't been changed since they were received. It doesn't prove the receiver was accurate or that GPS was precise; those are measurement questions.
What this shows
The report ends with a short statement of its own limits. In summary: it documents RF emissions measured by the listed receiver at the listed times and places. "Unusual" means stronger than the account's own baseline for that location and time of day. Most transmitters on vehicles and buildings are legitimate. Levels are uncalibrated (dBFS) unless stated as dBm. Any finding should be verified by repeating the measurement.
Keep that statement with the report when you share it. It sets fair expectations for the reader and protects your credibility.
Worked interpretation scenarios
The figures below are illustrative, chosen to show the patterns clearly. Your own reports will differ in the details.
Scenario 1: a passing vehicle with a radio
You walk your usual evening route. The report shows one unusual signal:
| Peak | Width | Status | Level | Normal | Above | Sweeps | When | Likely service |
|---|---|---|---|---|---|---|---|---|
| 453.400 MHz | 1 MHz | new | −38.2 | −71.5 | +33.3 | 9 | 18:42:10–18:42:16 | UHF land mobile / business radio |
The timeline has a short cluster of red bars at 18:42, just after a dashed purple line. Your marks table shows a vehicle mark at 18:42:08 with the note "white van, antenna on roof". The map has one red ring a few metres along from the purple pin, and the spectrum chart has a tall red spike at 453 MHz with a flat blue line beneath it.
Reading it: a narrow signal, normally absent, seen for a few seconds right as a vehicle with an antenna went past. Land mobile radio is used by businesses, utilities, taxis and public services. The most likely explanation is an ordinary two-way radio transmission. +33 dB looks dramatic, but a radio transmitting nearby on a channel that is normally quiet produces exactly that.
What to do: nothing, unless it recurs. If the same frequency turns up on several walks, note the times; a pattern may point to a nearby business's dispatch radio.
Scenario 2: a new cell site
You've walked the same route for weeks. This week the report shows three unusual signals, all wide, all with a cellular Likely service such as "Cellular PCS downlink (B2/25)", status "new" or "elevated", Above between +12 and +19 dB, and Sweeps in the hundreds, seen from the start to the end of the walk. The map is amber along two streets and green elsewhere. The red rings cluster near one corner.
Reading it: wide, steady signals in cellular bands, present for long stretches and strongest near one place. That pattern fits a new or reconfigured cell site, or a change to an existing one. Because unusual channels aren't added to the baseline, these will keep showing on later walks until the baseline is rebuilt. That's deliberate: a lasting change stays visible.
What to do: walk it again on another day at the same time to confirm. Look for new antennas near the corner where the rings cluster, and check public records of antenna sites. The guide to finding cell towers near you covers how. Mark the antenna on your next walk, and record a short video clip of it if your plan includes video.
Scenario 3: an intermittent signal
One row reads: Peak 915.2 MHz, narrow, new, Likely service "915 MHz ISM (smart meters, LoRa, RFID)", Above +21 dB, Sweeps 6, When 19:03:40–19:41:12. The timeline shows four separate short amber-to-red spikes spread through the walk, none near a mark. On the map, three of the four rings are on the same block.
Reading it: six sweeps over nearly 40 minutes means short bursts, not a steady signal. Three detections on one block suggest a fixed source there. The 902–928 MHz band is used by many unlicensed devices, such as smart utility meters, sensors and tags, many of which transmit briefly and periodically.
What to do: walk that block slowly, or stand there for a few minutes, so more sweeps cover it. Repeat at another time of day. If it always appears on that block, it is very likely a fixed device that reports in bursts. If you're concerned about a device in a vehicle or a bag, see finding hidden GPS trackers and bugs.
Scenario 4: a learning-heavy first walk
Your first walk shows: 412 sweeps, 2.1 km, 38 minutes, 3 marks, 0 unusual signals, 0% of sweeps with a baseline. The table says "nothing above baseline" and the learning note says "412 of 412 sweeps were in places or times with no baseline yet". The whole route is green.
Reading it: nothing was checked. The green route means "no comparison was possible", not "everything was normal". This is how every account starts.
What to do: walk the same route on other days, at the times you care about. A block and time needs data from at least two separate walks, so the second walk may still be partly learning. Watch the baseline percentage climb. Meanwhile, the "Strongest signals seen" table and the spectrum chart are still informative: they show what's on the air along your route. See how to survey radio signals for a good baseline plan.
Scenario 5: many bars, one row
Occasionally you may notice a pattern that seems inconsistent: the stats card shows "1 unusual signal", but the timeline has dozens of amber bars spread across the walk. That's because overlapping detections are combined into one row. Look at the Sweeps and When columns: a single row seen in 60 sweeps over 20 minutes explains all those bars.
Inside the evidence package
On Standard and Full plans, you can download an evidence package for any walk. It is a zip file containing:
| File | What it is |
|---|---|
ledger.jsonl | One line per record this walk added to the hash chain: seq, kind, record, prev_hash and hash |
sweeps/NNNNNN_pk.i16 | The peak levels for each channel of sweep number NNNNNN |
sweeps/NNNNNN_pw.i16 | The power levels for each channel of the same sweep |
audio/ | Voice mark recordings, named after the mark |
video/ | Video clips, named after the clip |
summary.json | The figures the report is built from: route, findings, strongest signals, spectrum summary, baseline use |
report.html | The report itself, readable offline |
VERIFY.txt | Plain-text instructions for checking the package |
The ledger
Each line of ledger.jsonl is a JSON object. The record field is itself a JSON string: the exact bytes that were hashed. For a
sweep, the record includes the time, GPS position and accuracy, the start frequency, channel width (step_hz), number of channels
(n), the unit, the strongest peaks, the sweep number (seq) and the SHA-256 of both sweep files (pk_sha256,
pw_sha256). Mark records include audio_sha256 when there is a recording. Video records include the clip's
sha256.
Note that there are two different sequence numbers. The seq on each ledger line is the record's position in your account's chain.
The seq inside a sweep record is the sweep's number within the walk, and that's the NNNNNN in the sweep file names.
The sweep files
Each .i16 file is a plain array of little-endian 16-bit signed integers, one per channel, each in tenths of a dB. A stored value of −523
means −52.3 dB. Channel i starts at start_hz + i × step_hz. The unit (dBFS, or dBm if a calibration offset was set) is in
the sweep record.
How to verify an evidence package, step by step
Verification lets anyone, not just you, confirm that the package is complete and unaltered. It needs no account and no contact with Consentiva.
- Keep the original. Make a copy of the zip and work on the copy. Record the SHA-256 of the zip file itself so you can later show that the copy you shared is the one you downloaded.
- Unzip it into an empty folder.
- Read VERIFY.txt. It states the rules the steps below check.
- Check each ledger line. For every line, SHA-256 of prev_hash followed by record (both as text, UTF-8) must equal hash.
- Check the links. Each line's prev_hash must equal the previous line's hash. If the ledger seq numbers jump (for example 311 then 315), records from another walk sit between them, so that pair can't be linked from this package alone; the server checks the account-wide chain.
- Check the files. Each sweep file's SHA-256 must equal pk_sha256 or pw_sha256 in its sweep record. Each audio and video file must match the hash in its mark or video record.
- Compare with the report. The ledger rows in the Record integrity section should match the start of ledger.jsonl.
Checking one file by hand
To check a single file without writing code, compute its SHA-256 and compare it with the record:
- Linux:
sha256sum sweeps/000000_pk.i16 - macOS:
shasum -a 256 sweeps/000000_pk.i16 - Windows:
certutil -hashfile sweeps\000000_pk.i16 SHA256
A Python script that checks everything
Save this as verify_walk.py and run python3 verify_walk.py path/to/unzipped-folder. It uses only the Python standard
library.
import glob, hashlib, json, os, sys
folder = sys.argv[1] if len(sys.argv) > 1 else "."
def sha256_file(path):
h = hashlib.sha256()
with open(path, "rb") as f:
for block in iter(lambda: f.read(1 << 20), b""):
h.update(block)
return h.hexdigest()
def check_file(path, expected):
if not os.path.exists(path):
return "MISSING " + path
if sha256_file(path) != expected:
return "MISMATCH " + path
return None
with open(os.path.join(folder, "ledger.jsonl"), encoding="utf-8") as f:
lines = [json.loads(line) for line in f if line.strip()]
problems, gaps, files_checked, prev = [], 0, 0, None
for e in lines:
# 1. each hash must equal SHA-256(prev_hash + record)
calc = hashlib.sha256((e["prev_hash"] + e["record"]).encode("utf-8")).hexdigest()
if calc != e["hash"]:
problems.append(f"seq {e['seq']}: hash does not match its record")
# 2. consecutive records must link; a jump in seq means
# records from another walk sit in between (not an error)
if prev is not None:
if e["seq"] == prev["seq"] + 1:
if e["prev_hash"] != prev["hash"]:
problems.append(f"seq {e['seq']}: prev_hash does not match seq {prev['seq']}")
else:
gaps += 1
prev = e
# 3. files named in a record must match the fingerprint stored in it
rec = json.loads(e["record"])
targets = []
if e["kind"] == "sweep":
stem = os.path.join(folder, "sweeps", "%06d" % rec["seq"])
targets = [(stem + "_pk.i16", rec["pk_sha256"]), (stem + "_pw.i16", rec["pw_sha256"])]
elif e["kind"] == "mark" and rec.get("audio_sha256"):
found = glob.glob(os.path.join(folder, "audio", rec["mark"] + ".*"))
targets = [(found[0] if found else "audio/" + rec["mark"], rec["audio_sha256"])]
elif e["kind"] == "video":
found = glob.glob(os.path.join(folder, "video", rec["video"] + ".*"))
targets = [(found[0] if found else "video/" + rec["video"], rec["sha256"])]
for path, expected in targets:
files_checked += 1
err = check_file(path, expected)
if err:
problems.append(err)
print(f"{len(lines)} records, {files_checked} files checked, {gaps} gap(s) in seq")
print("last hash in this package:", lines[-1]["hash"])
if problems:
print("FAILED:")
for p in problems:
print(" " + p)
sys.exit(1)
print("OK: every hash, link and file matches")
On an intact package it prints the number of records and files checked, then "OK". If anything has been edited, it names the record or file. We tested it on the sample evidence package from the samples page, and on copies with one changed character in a record, one changed byte in a sweep file, a missing audio file and a broken link; each change was reported.
Reading a sweep file
To look inside a sweep, this short script prints the number of channels and the strongest one. Run it as
python3 read_sweep.py folder 0 for sweep 000000.
import json, struct, sys
folder, n = sys.argv[1], int(sys.argv[2]) # n = the sweep's "seq"
rec = None
for line in open(folder + "/ledger.jsonl", encoding="utf-8"):
e = json.loads(line)
r = json.loads(e["record"])
if e["kind"] == "sweep" and r["seq"] == n:
rec = r
break
raw = open(folder + "/sweeps/%06d_pk.i16" % n, "rb").read()
levels = [v / 10 for v in struct.unpack("<%dh" % (len(raw) // 2), raw)]
assert len(levels) == rec["n"]
best = max(range(len(levels)), key=lambda i: levels[i])
lo = rec["start_hz"] + best * rec["step_hz"]
print(f"{len(levels)} channels of {rec['step_hz'] / 1e6:g} MHz, unit {rec['unit']}")
print(f"strongest: {levels[best]} in the channel starting at {lo / 1e6:g} MHz")
The format string <%dh means little-endian (<) 16-bit signed integers (h).
What a failure means
| Message | Likely cause |
|---|---|
| hash does not match its record | The record text was changed after hashing, or the line was damaged in copying |
| prev_hash does not match | A record was removed, reordered or replaced between two consecutive records |
| MISMATCH on a sweep, audio or video file | The file was edited, re-encoded or replaced |
| MISSING | The file was deleted or the zip was only partly extracted |
| Gaps in seq | Not an error: other walks' records sit between this walk's records in your account chain |
A failure on a file you opened in another program is the most common cause. Some media players and editors save changes silently. Always verify the untouched original.
The head hash
The last hash in the package is the fingerprint of this walk's final record. The head hash in the report is the latest record on your whole account when the report was produced. They are the same only if nothing was recorded after this walk. Keeping a note of the head hash with a date, for example in an email to yourself or your lawyer, fixes the state of your record at that moment.
Sharing a report with a lawyer, a utility or the FCC
Different readers need different things. In every case, share the report and the package unchanged, and keep the original.
A lawyer
- Send the whole evidence package zip, not just report.html, and give them the SHA-256 of the zip file in your covering email.
- Explain in a few sentences what you measured, where and when, and why: the question you were trying to answer.
- Point them to VERIFY.txt and the "What this shows" section so the limits are clear from the start.
- List your walks by date, including those that showed nothing unusual. A complete record is more credible than a selection.
- If a figure against an exposure limit is needed, say so early. That requires a calibrated measurement by a qualified engineer; see RF meter vs spectrum analyzer.
An electric utility
- Utilities want to know where and when. Give the street, the nearest pole or address, the times the signal appeared, and the frequencies.
- Broadband electrical noise from power-line hardware often shows as a raised hump across a wide range rather than a sharp peak, strongest near one pole. The spectrum chart and the map rings near that pole are the useful parts.
- A printout or PDF of the report is usually enough for a first contact. Keep the package in case they ask for more.
The FCC
- The FCC handles interference to licensed services, such as broadcast, aviation, public safety, cellular and amateur radio. Describe the affected service, the location, the dates and times, the frequency and how far above normal it was.
- Say what you have already ruled out, such as your own devices.
- Keep the evidence package ready to provide if they ask. The guide to documenting radio interference for an FCC complaint covers where to file and what to include.
Don't describe an unusual signal as illegal, harmful or deliberate unless you have evidence beyond the report. The report shows that a signal was stronger than your baseline; it doesn't show who was transmitting or why. Accurate wording makes you more credible, not less.
Common misreadings
| Misreading | What the report actually says |
|---|---|
| "Unusual means dangerous." | Unusual means stronger than your own baseline for that place and time. It says nothing about effects on people. |
| "+30 dB is a thousand times the safe level." | +30 dB is a thousand times your baseline at that frequency, which is often a very quiet channel. It isn't compared with any limit. |
| "The levels are in dBm." | Only if you entered a calibration offset. Otherwise they're dBFS: relative to the receiver, not absolute power. |
| "A green route means nothing unusual." | Only where there was a baseline. Check the percentage of sweeps with a baseline. |
| "0 unusual signals means nothing is there." | It means nothing exceeded the baseline. Strong normal signals are listed in "Strongest signals seen". |
| "New means it has never been there." | New means it isn't normally present in your baseline for that block and time. |
| "When 18:05–18:47 means it was on for 42 minutes." | It was first and last seen at those times. Check Sweeps for how often. |
| "Likely service tells me who it is." | It tells you what the frequency is allocated for, not who is transmitting. |
| "Above should equal Level minus Normal." | Above can be larger, because it reports the bigger excess of the peak and power measurements. |
| "A mark next to a signal proves the cause." | It shows two things happened at the same time and place. That's a lead to check, not proof. |
| "Verified means the measurements are accurate." | Verified means the records are unchanged since they were received. Accuracy is a separate question. |
| "The map is missing, so the file is broken." | The zip copy doesn't load street tiles when opened from a file. The online report shows them. |
A short glossary
- Anomaly score: for one sweep, how far its most unusual channel was above normal, in dB. Shown as bar height on the timeline.
- Baseline: the learned normal level for each channel, block and time of day.
- Block: an area of roughly 150 m with its own baseline.
- dBFS: decibels relative to the receiver's full scale. Uncalibrated and relative.
- dBm: decibels relative to one milliwatt, shown when you've entered a calibration offset.
- Elevated: a usual signal, much stronger than usual.
- Evidence package: the zip file holding the ledger, sweep files, audio, video, summary and report.
- Hash chain: a sequence of records in which each fingerprint includes the previous one, so any change is detectable.
- Head hash: the fingerprint of the latest record on your account.
- Learning: a sweep in a place or time with no baseline yet.
- Max hold: the highest level seen at each frequency over the walk.
- Median: the typical level at each frequency, exceeded in half the sweeps.
- New: a signal at a frequency where there's normally nothing noticeable.
- SHA-256: a cryptographic fingerprint; any change to the input gives a completely different result.
- Sweep: one pass across the whole frequency range.
Common questions
What does "unusual" mean in a Consentiva report?
It means a signal was stronger than your own learned baseline for that block (about 150 m) and time of day. It doesn't mean harmful, illegal or suspicious, and most unusual readings are ordinary radios, cell sites or Wi-Fi.
What is the difference between "new" and "elevated"?
New means there is normally nothing noticeable at that frequency in your baseline for that place and time. Elevated means a signal that is usually there was much stronger than usual.
Why does my first walk show 0 unusual signals?
Because there was no baseline to compare against yet. Check the percentage of sweeps with a baseline; walk the same route on other days and the comparison starts to work.
What does +30 dB in the Above column mean?
The signal was about 1,000 times stronger in power than your baseline at that frequency, place and time. It is a comparison with your own normal, not with any exposure limit.
Are the levels in a report in dBm?
Only if you entered a calibration offset. Otherwise they are uncalibrated dBFS, relative to the receiver's full scale, which is fine for comparing with your baseline but not an absolute power.
How can someone else check that my evidence package hasn't been altered?
For every line of ledger.jsonl, SHA-256 of prev_hash plus record must equal hash, each prev_hash must match the previous hash, and each sweep, audio and video file must match the fingerprint in its record. VERIFY.txt explains this and the guide includes a Python script that checks it all.
Does the report show who is transmitting?
The measurements show which frequencies were stronger than usual, when and where, and the kind of service each frequency is allocated to. If you recorded video on the walk, the report shows each clip next to the RF readings for the same seconds, so you can see who or what was there when the signal peaked.
Why is the street map missing from the report in my zip file?
Street map tiles aren't loaded when report.html is opened from a file. The route, marks and signal rings still appear, and the online report shows the streets underneath.