← All posts

The Cavity Filter Arrives: RF Chain Calibration Against a Known Tower

The intermodulation problem identified in the previous entry demanded a hardware solution. Strong P25 downlink signals from nearby base stations in the 851–869 MHz band were overloading the SDR’s front end and raising the noise floor on the uplink frequencies we actually care about. The fix: a Celwave CF800-6P six-pole cavity bandpass filter, tuned to pass 810–825 MHz while rejecting the downlink energy before it reaches the receiver.

When the filter arrived, initial bench testing produced a surprise — measured stopband rejection was only about 2 dB at 855 MHz, far short of the 40–60 dB expected from a six-pole cavity. The antenna signal was bypassing the filter entirely, coupling directly into the unshielded LNA board. The solution was to reorder the RF chain: antenna → BNC right-angle adapter → Celwave BPF → 2m RG-58 coax → BNC-SMA adapter → Nooelec LaNA (USB-C powered, metal shielded enclosure) → SMA-SMA adapter → SDR-B. With the LaNA inside its shielded enclosure and powered via USB-C (not bias-T), the filter now sits properly in the signal path with approximately 15 dB average downlink rejection and 18 dB at 855 MHz.

A critical lesson from the LNA testing: the Nooelec LaNA must be USB-C powered. Without DC bias, the unpowered LaNA produces a noise floor indistinguishable from a bare SDR — roughly −63 to −64 dBFS at gain=40, compared to −42 to −44 dBFS with the LaNA active. That’s a 20 dB difference that directly maps to detection range.

With the RF chain finalized, I ran the first systematic calibration drive against a known P25 tower. The Brunswick site is a standalone (non-simulcast) P25 installation at a known location with its own control channel on 774 MHz — one antenna, one position, ideal for validating the geolocation pipeline against ground truth. The calibration script recorded 1,300 RSSI samples across a 30-minute drive loop around the tower, then ran a two-phase grid search to optimize the dBFS-to-dBm offset and path loss exponent.

The optimizer landed on an RF_OBS_RSSI_OFFSET of 34.0 dB (later refined to 28.0 dB theoretical for the production chain with filter) and predicted the tower’s position to within 470 meters of its actual coordinates. The path loss exponent remained at 3.2 — the regression’s attempt to fit n=0.82 was clearly corrupted by the tower’s high-gain sectoral antenna compressing RSSI-vs-distance, confirming that extracting path loss exponent from a tower CC drive is unreliable. The offset, however, is hardware-only and transfers directly.

The 3.3 dB passband insertion loss from the Celwave filter was measured empirically and factored into the production offset calculation. With these numbers validated, the RSSI-to-distance conversion in the geolocation engine now has an empirical anchor rather than a theoretical estimate.

← RF Hardware Deep Dive...The Live Web Dashboard... →