Skip to content

SkyWalker Multi-Mode RF Tool

skywalker.py provides five alternative operating modes beyond satellite feed tuning. These modes repurpose the BCM4500’s AGC registers as a crude power detector across the 950—2150 MHz IF range, allowing spectrum sweeps, blind transponder scanning, real-time dish alignment, L-band direct input analysis, and carrier tracking — all without requiring demodulator lock.

Requires custom firmware v3.02.0+

Commands 0xB7 (SIGNAL_MONITOR), 0xB8 (TUNE_MONITOR), and 0xB9 (BLIND_SCAN) must be present in the FX2 firmware. See Custom v3.01 for the base firmware these commands build on.

SubcommandPurpose
spectrumSweep spectrum analyzer (950—2150 MHz IF range)
scanAutomated transponder scanner (sweep + blind scan)
monitorReal-time signal strength / dish alignment
lbandL-band direct input analyzer (no LNB)
trackCarrier/beacon tracker with logging
FlagDescription
-v, --verboseShow raw USB traffic

Sweeps the IF range using TUNE_MONITOR (0xB8) at each step and renders an ASCII bar chart to the terminal. Optionally produces waterfall displays, matplotlib plots, and CSV exports.

FlagDescription
--start FLOATStart IF frequency in MHz (default: 950)
--stop FLOATStop IF frequency in MHz (default: 2150)
--step FLOATStep size in MHz (default: 5)
--dwell INTDwell time per step in ms (default: 10)
--lnb-lo FLOATLNB LO frequency in MHz; 0 = direct input (default: 0)
--sr INTSymbol rate for measurement in ksps (default: 20000)
--waterfallWaterfall display (time x frequency x power)
--sweeps INTNumber of sweeps (default: 1)
--threshold FLOATPeak detection threshold in dB above noise floor (default: 3)
--plotShow matplotlib plot after sweep completes
--csv FILESave sweep data to CSV
Full IF range sweep
sudo python3 tools/skywalker.py spectrum
Narrow sweep with LNB LO, save CSV
sudo python3 tools/skywalker.py spectrum --start 1200 --stop 1400 --step 2 --lnb-lo 9750 --csv sweep.csv
Waterfall display, 10 sweeps
sudo python3 tools/skywalker.py spectrum --waterfall --sweeps 10 --step 10
Plot with peak markers
sudo python3 tools/skywalker.py spectrum --plot --threshold 5
SkyWalker-1 Spectrum Sweep
==================================================
Range: 950.0 - 2150.0 MHz IF (step 5.0 MHz)
Dwell: 10 ms/step SR: 20000 ksps
Steps: 240 Est. time: ~2.9s
950.0 | -62.3 dBm
955.0 | -61.8 dBm
960.0 | -62.1 dBm
...
1120.0 | ████████████████████ -48.2 dBm
1125.0 | ██████████████████████████████████ -42.7 dBm << PEAK
1130.0 | ████████████████████ -48.5 dBm
...
1920.0 | █████████████████████████████ -44.1 dBm << PEAK
1925.0 | ████████████████████████████████████ -41.3 dBm << PEAK
1930.0 | ████████████████████████ -46.0 dBm
...
2145.0 | -63.1 dBm
2150.0 | -62.9 dBm
Peaks detected (>3.0 dB above floor):
1125.0 MHz IF -42.7 dBm (RF: 1125.0 MHz)
1925.0 MHz IF -41.3 dBm (RF: 1925.0 MHz)
Sweep complete: 240 steps in 2.88s

Performs a three-phase automated transponder search: coarse spectrum sweep, fine sweep around detected peaks, and blind scan at each refined peak across a range of symbol rates.

  1. Coarse sweep at 10 MHz steps across the full IF range to identify candidate carriers.
  2. Fine sweep at 2 MHz steps around each peak detected in the coarse pass.
  3. Blind scan (0xB3) at each refined peak, trying symbol rates from --sr-min to --sr-max in --sr-step increments.
FlagDescription
--start FLOATStart IF frequency in MHz (default: 950)
--stop FLOATStop IF frequency in MHz (default: 2150)
--threshold FLOATPeak detection threshold in dB (default: 3)
--sr-min INTMinimum symbol rate in ksps (default: 1000)
--sr-max INTMaximum symbol rate in ksps (default: 30000)
--sr-step INTSymbol rate step in ksps (default: 500)
--lnb-lo FLOATLNB LO frequency in MHz (default: 9750)
--pol H/V/L/RPolarization
--band low/highLNB band
--jsonJSON output
--csv FILECSV output
Full Ku-band low scan, horizontal
sudo python3 tools/skywalker.py scan --pol H --band low
Narrow scan, fast SR range, JSON output
sudo python3 tools/skywalker.py scan --start 1100 --stop 1200 --sr-min 10000 --sr-max 30000 --sr-step 1000 --json
C-band scan with custom LO
sudo python3 tools/skywalker.py scan --lnb-lo 5150 --pol V --csv cband_scan.csv

Tunes to a specified frequency and symbol rate, then polls SIGNAL_MONITOR (0xB7) at a configurable rate to display a continuously updating signal strength indicator. Designed for hands-free dish alignment.

ArgumentDescription
FREQ_MHZTransponder frequency in MHz
SR_KSPSSymbol rate in ksps
FlagDescription
--pol H/V/L/RPolarization
--band low/highLNB band
--lnb-lo FLOATLNB LO frequency in MHz (default: 9750)
--rate FLOATPoll rate in Hz (default: 10, max ~50)
--audioPitch-proportional beep for hands-free alignment
--peak-holdTrack and display maximum signal level
--history INTSparkline history length in samples (default: 60)
--plotShow matplotlib plot after stopping
Basic monitor, horizontal low-band
sudo python3 tools/skywalker.py monitor 12520 27500 --pol H --band high
Audio-assisted dish alignment
sudo python3 tools/skywalker.py monitor 11836 27500 --pol V --band low --audio --peak-hold
Fast polling with long history
sudo python3 tools/skywalker.py monitor 12520 27500 --pol H --band high --rate 30 --history 120
[LOCK] SNR 8.2dB AGC 0x3A [████████████████░░░░░░░░░░░░░░░░░░░░░░░░] 42% ▁▃▅▇█▇▅▃▅▇█▇▅▃▁
[----] SNR 0.0dB AGC 0xFF [░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░] 0% ▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁

The display updates in-place using terminal control codes. The sparkline at the right edge shows --history samples of recent signal strength. Press Ctrl-C to stop.


Identical to spectrum mode but with lnb_lo=0 and LNB power disabled. Intended for direct RF input in the 950—2150 MHz range (L-band). Annotates known L-band frequency allocations in the output.

FlagDescription
--start FLOATStart frequency in MHz (default: 950)
--stop FLOATStop frequency in MHz (default: 2150)
--step FLOATStep size in MHz (default: 2)
--dwell INTDwell time per step in ms (default: 20)
--23cmNarrow to 1240—1300 MHz with 500 kHz steps
--band-infoPrint L-band allocation table and exit
--waterfallWaterfall display
--plotShow matplotlib plot
--csv FILESave data to CSV
Range (MHz)Service
1240—1300Amateur 23cm
1525—1559Inmarsat downlink
1559—1610GNSS (GPS L1, Galileo E1)
1610—1626Iridium downlink
1670—1710MetSat (GOES LRIT, NOAA HRPT)
1710—1785LTE/AWS uplink
1920—2025UMTS uplink
Full L-band sweep
sudo python3 tools/skywalker.py lband
23cm amateur band, fine resolution
sudo python3 tools/skywalker.py lband --23cm
Waterfall with CSV export
sudo python3 tools/skywalker.py lband --waterfall --csv lband_sweep.csv
Print allocation table only
sudo python3 tools/skywalker.py lband --band-info

Tunes to a single frequency and symbol rate, then polls SIGNAL_MONITOR continuously with timestamped logging. Detects lock/unlock transitions and optionally tracks frequency drift by periodically sweeping a narrow window around the target.

ArgumentDescription
FREQ_MHZCarrier frequency in MHz
SR_KSPSSymbol rate in ksps
FlagDescription
--pol H/V/L/RPolarization
--band low/highLNB band
--lnb-lo FLOATLNB LO frequency in MHz (default: 9750)
--rate FLOATPoll rate in Hz (default: 1)
--duration FLOATDuration in seconds (default: until Ctrl-C)
--log FILECSV log file
--drift-trackSweep +/-5 MHz every 5s to measure frequency drift
--plotShow matplotlib plot after stopping
--json-lines FILEJSON-lines log file
Track a beacon for 1 hour, log to CSV
sudo python3 tools/skywalker.py track 11700 27500 --pol V --band low --duration 3600 --log beacon.csv
Drift tracking with JSON-lines output
sudo python3 tools/skywalker.py track 12520 27500 --pol H --band high --drift-track --json-lines drift.jsonl
Quick track with matplotlib plot on exit
sudo python3 tools/skywalker.py track 11836 27500 --pol V --band low --rate 5 --plot