Link Budget & Propagation

Link Budget Calculations

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)

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:

DistanceFree 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.

ParameterValue
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 Power27 + 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.

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.

How to use for repeater site selection:

  1. Go to heywhatsthat.com
  2. Click on your candidate repeater site on the map
  3. Set height to your intended antenna mounting height
  4. Click "Submit" and examine the color-coded visibility map
  5. 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.

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:

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:

  1. Identify candidate sites
    Use topographic maps (USGS topo viewer, CalTopo) to identify hilltops, ridgelines, water towers, and tall buildings in your coverage area.
  2. 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.
  3. 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.
  4. 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.
  5. 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.

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.