Finding a 500 kHz Channel
Two-node survey of 902–915 MHz at 500 kHz, and why we selected 911.3 MHz for the next round of tests.
TL;DR
There isn’t a quiet channel in this band you can point at and say THERE. 911.3 MHz was more acceptable than most of the rest. It sits in the 909–913 MHz passband of typical filters. Delivery was good enough to keep using it: Cougar Mountain is a commercial site (34 dBm into 6 dBi, 5–6 dB of feedline/chain loss). My home repeater is a typical station — 27 dBm into 9 dBi.
SF changed the results more than CR. CR still helped. Long messages are less reliable than short ones, more than the 1-byte numbers suggest. Cougar transmits stronger than it receives. We already knew those last two; this put numbers on them. The size of the long-message drop was the surprise.
An earlier test ran part of the Puget Sound mesh at 910.1 MHz / 500 kHz / SF7. That was about whether the mesh can run a wider channel. This one is: if we’re going to keep testing 500 kHz and eventually switch, which frequency do we use. Most filters here are 909–913 MHz, not the whole ISM band.
Code: meshcore-snr-sweep. Two nodes, KISS modems, no mesh routing. Count packets that decoded and record SNR.
Two sites: Cougar Mountain (commercial radio site, 34 dBm into a 6 dBi antenna, 5–6 dB of loss in the full chain) and my home repeater (27 dBm, 9 dBi — a typical home station). Sweep center frequency in 100 kHz steps. At each center, send a fixed number of packets in both directions, for 1, 128, and 255 byte payloads. Delivery rate is received / sent. SNR is the median of packets that decoded.
Main runs: 500 kHz bandwidth, SF7 and SF8, CR 4/5 and 4/7. One extra SF8 / CR 4/8 pass on 910–912 MHz. Control: 62.5 kHz, SF7 / CR 4/5, 909–910 MHz — the settings the mesh already uses.
902.3–913.0 MHz, 100 kHz steps. Cut at 913 MHz (filter passband). Teal band is 500 kHz centered on 911.3 MHz. Solid lines: 1 / 128 / 255 B delivery. Dashed: median SNR of decoded packets. 20 packets per cell.
Same run, zoomed to the filter passband. Tables below cover all configs; the chart is SF8 / CR 4/7. Hops are Cougar → home and home → Cougar.
| Config | Hop | 1 B | 128 B | 255 B | Median SNR |
|---|---|---|---|---|---|
| SF7 CR 4/5 · 500 kHz | Cougar → home | 82% | 70% | 52% | +10.8 dB |
| home → Cougar | 68% | 30% | 10% | −5.2 dB | |
| SF8 CR 4/5 · 500 kHz | Cougar → home | 97% | 90% | 79% | +9.5 dB |
| home → Cougar | 85% | 49% | 30% | −6.0 dB | |
| SF8 CR 4/7 · 500 kHz | Cougar → home | 94% | 91% | 80% | +9.5 dB |
| home → Cougar | 81% | 47% | 31% | −7.2 dB | |
| SF8 CR 4/8 · 500 kHz · 910–912 | Cougar → home | 98% | 93% | 88% | +10.2 dB |
| home → Cougar | 86% | 63% | 41% | −7.0 dB | |
| SF7 CR 4/5 · 62.5 kHz · 909–910 | Cougar → home | 99% | 88% | 95% | +11.8 dB |
| home → Cougar | 90% | 69% | 56% | +7.2 dB |
SF7 at 500 kHz is the same SF as the 62.5 kHz mesh. On this path it is not enough, especially home → Cougar at 255 bytes (10%). SF8 recovered most of that (30% on that hop, 79% Cougar → home). CR 4/7 vs 4/5 barely moved the 909–913 averages. CR 4/8 on 910–912 was a bit better on 128-byte home → Cougar (63% vs ~47–49%).
The 62.5 kHz run is the same two sites around 909–910 MHz. Home → Cougar median SNR is +7.2 dB there vs about −6 dB at 500 kHz. The path works. 500 kHz is just harder.
SF7 → SF8 at CR 4/5, 909–913 MHz: Cougar → home 255-byte delivery 52% → 79%. Home → Cougar 10% → 30%.
SF8 CR 4/5 → 4/7, same window: 255-byte averages 79% → 80% and 30% → 31%. At 911.3 MHz specifically, home → Cougar 128-byte went 50% → 80%, 255-byte 40% → 50%.
SF matters more than CR. CR can still help, mostly on the weak hop.
SF8 / CR 4/7 / 500 kHz, 909–913 MHz: Cougar → home 1-byte 94%, 255-byte 80%. Home → Cougar 1-byte 81%, 255-byte 31%. A 1-byte test will tell you the link exists. It will not tell you whether a real MeshCore payload gets through. The size of that gap was the surprise. Don’t use 1-byte delivery as a stand-in for traffic.
That’s the site: other 900 MHz users, and in this area utility meters hopping on a 300 kHz grid. At 62.5 kHz those hops show up as individual dead 100 kHz steps on the uplink. At 500 kHz they’re always in the passband somewhere, so you don’t get a clean comb — you get a worse noise floor. Parking on a different 100 kHz step does not fix Cougar’s receive.
Nothing in 909–913 was uniquely clean. On SF8 / CR 4/7, 911.3 is one of several Cougar → home centers around 90% on all three sizes. Home → Cougar: 1-byte 95%, 128-byte 80%, 255-byte 50%, median SNR about −7 dB. 911.0–911.5 looks similar.
We picked it because:
- It is inside 909–913 MHz, which is what most of these filters pass.
- At SF8, short packets were reliable Cougar → home and still usable home → Cougar, with the home end being a typical 27 dBm / 9 dBi station.
- CR 4/7 helped this center on the weak hop more than it helped the window average.
- It lands on the same 300 kHz family as the meters. Don’t use 911.3 at 62.5 kHz. At 500 kHz that hop is in the channel anyway, so it isn’t a reason to avoid it.
We’re using 911.3 MHz for the next 500 kHz tests. Not because the band is quiet there. Because it was acceptable, and it fits the filters.
| 911.3 MHz | Hop | 1 B | 128 B | 255 B | Median SNR |
|---|---|---|---|---|---|
| SF7 CR 4/5 · 500 kHz | Cougar → home | 70% | 95% | 20% | +9.8 dB |
| home → Cougar | 100% | 60% | 35% | −3.8 dB | |
| SF8 CR 4/5 · 500 kHz | Cougar → home | 100% | 85% | 90% | +9.5 dB |
| home → Cougar | 95% | 50% | 40% | −5.8 dB | |
| SF8 CR 4/7 · 500 kHz | Cougar → home | 100% | 90% | 95% | +8.2 dB |
| home → Cougar | 95% | 80% | 50% | −6.8 dB | |
| SF8 CR 4/8 · 500 kHz | Cougar → home | 100% | 95% | 90% | +8.8 dB |
| home → Cougar | 95% | 75% | 45% | −8.2 dB |
SF7 at 911.3 still has 20% delivery on 255-byte Cougar → home. If the next test is SF7 / 500 kHz, this frequency won’t paper over that. If it’s SF8 / 500 kHz, it’s a reasonable place to sit.
Software: github.com/Cisien/meshcore-snr-sweep.