Link Budget & Propagation
Link Budget Calculations
A link budget calculation estimates whether a radio path between two nodes will work reliably before you deploy hardware. It's the single most useful tool for avoiding wasted installation trips and surprised failures.
The link budget equation
Received Power (dBm) = TX Power (dBm)
+ TX Antenna Gain (dBi)
− TX Cable Loss (dB)
− Free Space Path Loss (dB)
− Obstruction Loss (dB)
+ RX Antenna Gain (dBi)
− RX Cable Loss (dB)
Link Margin (dB) = Received Power (dBm) − Receiver Sensitivity (dBm)
A positive link margin means the link should work. As a common rule of thumb, a margin of 10 dB or more is treated as reliable (longer or mission-critical links often target a 15 - 20 dB fade margin). The author's recommended minimum is about 3 dB - below that a link is borderline and not recommended for permanent infrastructure. These are engineering conventions, not hard standards.
Key values for LoRa at 915 MHz
Receiver sensitivity by MeshCore preset
Figures below are SX1262 datasheet values with Rx Boosted gain (standard gain is roughly 3 - 4 dB worse). They assume the bandwidth listed for each preset.
| Preset equivalent (SF / BW) | Receiver sensitivity |
|---|---|
| USA/Canada (SF7 / 62.5 kHz) | ~−125 dBm |
| Long Fast (SF11 / 250 kHz) | ~−131 dBm |
| Long Slow (SF12 / 125 kHz) | ~−137 dBm |
| Medium Slow (SF10 / 250 kHz) | ~−129 dBm |
Lower sensitivity number = can receive weaker signals = more range potential. Long Slow gives the best sensitivity but at the cost of extremely low data rate. (Sensitivity figures near −141/−148 dBm only occur at very narrow bandwidths around 10.4 kHz, not at the 125 - 250 kHz bandwidths these presets use.)
Free Space Path Loss at 915 MHz
Practical form (distance in km, frequency in GHz): FSPL (dB) = 20×log10(d_km) + 20×log10(f_GHz) + 92.45. The 92.45 constant already folds in the 4π/c term for kilometres and gigahertz.
In practical terms for 915 MHz:
| Distance | Free Space Path Loss |
|---|---|
| 1 km (0.62 mi) | 91.6 dB |
| 5 km (3.1 mi) | 105.6 dB |
| 10 km (6.2 mi) | 111.6 dB |
| 20 km (12.4 mi) | 117.6 dB |
| 50 km (31 mi) | 125.6 dB |
Note: Free space path loss assumes clear line of sight with no obstructions. Real-world losses are always higher.
Worked example: Rooftop repeater to ground-level node
Scenario: 5 km path, rooftop repeater at 30m height, portable node at 2m height.
| Parameter | Value |
|---|---|
| TX Power (repeater) | 27 dBm (requires external PA - see note) |
| TX Antenna Gain | +5 dBi |
| TX Cable Loss (1m LMR-200) | −0.4 dB |
| Free Space Path Loss (5 km, 915 MHz) | −105.6 dB |
| Obstruction/Fresnel loss estimate | −10 dB (mixed urban) |
| RX Antenna Gain (portable node, 2 dBi) | +2 dBi |
| RX Cable Loss (none for portable) | 0 dB |
| Received Power | 27 + 5 − 0.4 − 105.6 − 10 + 2 = −82.0 dBm |
| Receiver Sensitivity (USA/Canada SF7) | −125 dBm |
| Link Margin | −82.0 − (−125) = +43.0 dB |
Power note: common LoRa modules built on the SX1262 top out at +22 dBm conducted, so a 27 dBm example implies an external power amplifier - state it explicitly when planning. FCC Part 15.247 (902 - 928 MHz) caps conducted power at 1 W (30 dBm) and derives a 36 dBm EIRP ceiling, and requires a 1 dB reduction in conducted power for every dB of antenna gain above 6 dBi. At the +5 dBi gain used here no reduction is required, but higher-gain antennas would force the conducted power down.
A 43 dB margin is very comfortable - this link will work reliably even with additional obstruction losses not captured in the estimate. (Because this example uses the SF7 sensitivity of −125 dBm, it is unaffected by the higher-SF sensitivity corrections above; a Long Slow / SF12 link at −137 dBm would have an even larger margin.)
Fresnel zone clearance
The Fresnel zone is an elliptical (football-shaped) region around the straight-line path between two antennas. Radio energy travels through this whole zone, not just the visual line, so obstacles near - not just directly on - the line still degrade the signal.
Even in "clear" line-of-sight paths, the first Fresnel zone must be about 60% clear of obstructions for reliable communication. The first Fresnel zone radius at the midpoint of a path:
r = 8.66 × sqrt(d_km / f_GHz) meters
Where d = path length in km, f = frequency in GHz
(This is the same as the form r = 17.3 × sqrt(d / (4·f)) used elsewhere:
17.3 / sqrt(4) = 8.66.)
The radius scales with link length. For 915 MHz:
1 km path: r ≈ 9 meters
10 km path: r ≈ 28.6 meters
So an obstruction within ~28.6 m of the direct path midpoint will partially
block the signal on a 10 km link, but on a 1 km link the relevant zone is only
~9 m. Use the formula for your actual path length rather than a fixed radius.
This is why hilltop-to-hilltop links work so well: the terrain clears the Fresnel zone naturally. For rooftop-to-rooftop links in cities, trees and building facades at path midpoints can add 10 - 20 dB of loss even when the antennas themselves have direct line of sight.
When to use a link budget
- Before installing a repeater at a new site, calculate whether it can reach your intended coverage area
- When planning a point-to-point relay link between two specific nodes
- When a deployed link is underperforming - work backwards from measured RSSI to identify where the losses are
- When comparing two candidate repeater sites - small differences in height can produce large differences in link budget
RF Propagation Planning Tools
Several free tools can help you model coverage and plan repeater placement before deploying hardware. Using these tools can save wasted trips and help you choose between candidate sites.
HeyWhatsThat (heywhatsthat.com)
The fastest tool for estimating radio horizon from a specific point.
- Enter a location (address, coordinates, or click on map)
- Set the antenna height
- Get a visualization of the radio horizon: which areas have line-of-sight from that point
How to use for repeater site selection:
- Go to heywhatsthat.com
- Click on your candidate repeater site on the map
- Set height to your intended antenna mounting height
- Click "Submit" and examine the color-coded visibility map
- Compare multiple candidate sites by opening each in a new tab
Limitations: HeyWhatsThat uses SRTM elevation data, which is a Digital Surface Model, not bare earth - it partially captures building rooftops and tall vegetation (HeyWhatsThat's own documentation notes you may see "shadowy bumps and gaps" in cities because the elevation data includes rooftops). The real caveat is that SRTM is too coarse (~30 m) to model individual buildings or trees reliably, so treat the visibility output as terrain-dominated: actual coverage will still be lower than predicted in areas with tall buildings or dense forest that the coarse data cannot resolve.
Radio Mobile Online (radiomobileonline.pe1mew.nl)
More sophisticated link analysis tool with full path profile and link budget integration. The online version is hosted at radiomobileonline.pe1mew.nl.
- Enter transmitter and receiver coordinates, heights, antenna gain, TX power, and frequency
- Generates a path profile showing terrain elevation along the path
- Calculates predicted received signal level
- Shows Fresnel zone clearance along the path
Radio Mobile is best for detailed analysis of specific point-to-point paths, not area coverage visualization.
CloudRF (cloudrf.com)
Professional-grade coverage prediction with a free tier. Features:
- SRTM + LIDAR terrain data (more accurate than basic tools)
- Can include clutter data (buildings, vegetation) for urban environments
- Overlay predicted coverage on Google Maps or OpenStreetMap
- Free tier: limited calculations per month; paid plans for heavy use
Best for: precise coverage maps for presentations, permitting, or professional deployments. Overkill for casual site selection.
Splat! (free, offline)
Open-source RF propagation tool that runs locally on Linux/Mac. Uses SRTM terrain data. This is an advanced tool - it is not a copy-paste one-liner. Before you can run it you must (1) create .qth site-location files describing each transmitter/receiver (location, height, name), (2) download SRTM elevation data and convert it into SPLAT's own .sdf format using the srtm2sdf utility (SPLAT! does not read raw SRTM directly), and (3) set the operating frequency and other path parameters in an .lrp file - SPLAT! has no -f frequency command-line option (in SPLAT! the -f flag relates to Fresnel-zone clearance, not center frequency).
# Install on Debian/Ubuntu (package availability varies by release;
# you may need to build from source per the SPLAT! project site)
sudo apt install splat
# Download SRTM data for your region from dwtkns.com/srtm or usgs.gov,
# then convert it to SPLAT's .sdf format:
srtm2sdf N40W106.hgt
# Create your tx.qth / rx.qth site files and a tx.lrp parameter file
# (frequency, ERP, etc. go in the .lrp file, NOT on the command line).
# Then generate a point-to-point path analysis:
splat -t tx.qth -r rx.qth -d /path/to/sdf/data
Splat! is overkill for most community mesh deployments but valuable when building professional-grade coverage documentation or integrating with GIS workflows. Note that the 0.5 W ERP figures used in such examples are not buildable on stock LoRa radios - the SX1262 chip maxes out at +22 dBm and an external PA would be required.
Practical planning workflow
For most community mesh network planning, this workflow is sufficient:
-
Identify candidate sites
Use topographic maps (USGS topo viewer, CalTopo) to identify hilltops, ridgelines, water towers, and tall buildings in your coverage area. -
Quick horizon check
For each candidate site, run HeyWhatsThat at the proposed antenna height. Immediately discard sites with poor visibility to your target coverage area. -
Link budget for remaining candidates
For the 2 - 3 best candidates, calculate link budgets to your target coverage area edges (farthest points). Compare margin values. -
On-site test before permanent install
Set up a temporary antenna and node at the candidate site. Walk/drive your coverage area while monitoring RSSI/SNR. Real-world testing always beats prediction tools. -
Document the result
Record the actual coverage performance after deployment. This data helps plan future expansion nodes.
Interpreting RSSI and SNR from field tests
The bands below are approximate field heuristics, not hard cutoffs - the actual decode limit depends on the modem preset (spreading factor). LoRa decodes below the noise floor: the relevant SNR threshold is the per-spreading-factor demodulator floor from the SX1262 datasheet - roughly −7.5 dB at SF7, −12.5 dB at SF9, −17.5 dB at SF11 (LongFast), and −20 dB at SF12 (Long Slow). A link that looks "weak" at SF7 may still decode reliably at SF11/SF12.
| RSSI | SNR | Link quality assessment |
|---|---|---|
| >−90 dBm | >+10 dB | Excellent - reliable at all data rates |
| −90 to −105 dBm | +5 to +10 dB | Good - reliable for all normal use |
| −105 to −115 dBm | 0 to +5 dB | Marginal - may see occasional packet loss |
| −115 to −120 dBm | −5 to 0 dB | Weak - intermittent; not suitable for infrastructure |
| <−120 dBm | <−5 dB | Very weak - expect frequent failure (though SF11/SF12 can still decode down to roughly −17.5/−20 dB SNR) |
Key insight: In the noise-limited regime, what determines whether a packet decodes is whether the SNR exceeds LoRa's per-spreading-factor decode floor (e.g. −17.5 dB at SF11) - RSSI alone does not. Both metrics matter, though: when the signal is well above the noise floor, absolute received power (RSSI) becomes the limiting factor. A signal at −125 dBm with +5 dB SNR is more reliable than one at −100 dBm with −5 dB SNR (which is being swamped by noise). When diagnosing a noise-limited marginal link, prioritize improving SNR; when the link is power-limited, work on RSSI.