Skip to content

Spectrum Analysis Guides

The SkyWalker-1’s BCM4500 demodulator and BCM3440 tuner accept any signal in the 950—2150 MHz IF range. While the demod pipeline only locks to DVB-S, Turbo, DCII, and DSS carriers, the AGC registers respond to RF energy at any frequency in range. Custom firmware v3.02.0 exposes this through SIGNAL_MONITOR (0xB7) and TUNE_MONITOR (0xB8) commands, turning the hardware into a crude but useful power detector.

skywalker.py wraps these commands into practical modes: spectrum sweeps, transponder scanning, dish alignment monitoring, L-band direct input, and long-duration carrier tracking.

Terminal window
pip install pyusb matplotlib

Survey what transponders are active on a satellite by stepping across the IF range and recording AGC power at each frequency.

  1. Confirm the dish is pointed at the target satellite and the LNB coax is connected to the SkyWalker-1 F-connector.

  2. Run a spectrum sweep. The tool steps from --start to --stop in MHz (IF frequency), reading AGC power at each step. Specify your LNB local oscillator frequency so the output labels show true downlink frequencies.

    Sweep Ku-band low (H-pol)
    sudo python3 tools/skywalker.py spectrum --lnb-lo 9750 --start 950 --stop 2150 --step 5
    Sweep Ku-band high (V-pol)
    sudo python3 tools/skywalker.py spectrum --lnb-lo 10600 --start 950 --stop 2150 --step 5
  3. Look for peaks in the output. Each peak corresponds to a carrier — the wider the peak, the higher the symbol rate. The AGC value is relative, not calibrated, so compare peaks to each other rather than treating the numbers as absolute power.

  4. Note the downlink frequencies of interesting peaks. Use these as inputs to the Tuning Tool to attempt demodulator lock, or feed them into the transponder scanner below for automated identification.


The scan mode automates the full process of discovering and identifying transponders on a satellite. It runs three phases internally: coarse AGC sweep, peak refinement, and blind demod lock attempts.

  1. Start a scan with your LNB parameters and a detection threshold. The threshold controls how many dB above the noise floor a peak must be to count as a candidate.

    Full satellite scan, H-pol high band
    sudo python3 tools/skywalker.py scan --lnb-lo 10600 --pol H --band high --threshold 3
  2. The scanner runs three phases automatically:

    • Phase 1 — Coarse sweep: Steps across the full IF range reading AGC power. Builds a noise floor baseline and identifies candidate peaks above the threshold.
    • Phase 2 — Peak refinement: Re-sweeps each candidate with finer step size to pinpoint center frequencies and estimate bandwidths.
    • Phase 3 — Blind scan: Attempts demodulator lock at each refined peak, cycling through modulation types (QPSK, Turbo QPSK, Turbo 8PSK, DCII) and common symbol rates. Reports lock status, SNR, and modulation parameters for each successful lock.
  3. Review the results. Successfully locked transponders are reported with their downlink frequency, symbol rate, modulation type, FEC rate, and SNR. Peaks that produced AGC response but no demod lock may be DVB-S2, analog, or non-satellite signals.


The monitor mode provides real-time signal quality feedback at high poll rates, suitable for peaking a dish on a known transponder.

  1. Pick a known strong transponder on the target satellite. You need the downlink frequency and symbol rate. Transponder lists for most satellites are available from LyngSat or SatBeams.

  2. Start the signal monitor at a high poll rate. The tool tunes to the specified transponder and continuously reads SNR and lock status.

    Monitor for dish alignment (50 Hz polling)
    sudo python3 tools/skywalker.py monitor 12520 27500 --lnb-lo 10600 --pol H --band high --rate 50 --audio --peak-hold
  3. Slowly move the dish in azimuth and elevation while watching the SNR reading. The --peak-hold flag keeps the highest observed value on screen so you can tell when you have passed the peak.

  4. The --audio flag produces a pitch-proportional tone through the system audio — higher pitch means stronger signal. This frees you from watching the screen while adjusting the dish.

  5. Fine-tune for maximum SNR. Once you find the general peak, make small adjustments in azimuth, then elevation, then azimuth again. Tighten the mount hardware and verify the SNR holds.


The SkyWalker-1 accepts 950—2150 MHz directly at the F-connector. With no LNB in the path, you can survey L-band signals from a direct-connect antenna or feed.

  1. Disconnect the LNB coax cable. Connect your L-band antenna, preamp, or feed directly to the SkyWalker-1 F-connector.

  2. Run the lband mode. This automatically disables LNB power output to protect direct-connect equipment, then sweeps the IF range with zero LO offset.

    Full L-band survey with allocation annotations
    sudo python3 tools/skywalker.py lband --band-info
  3. The --band-info flag annotates the sweep output with ITU frequency allocation data for the 950—2150 MHz range, identifying which services (GPS, Iridium, Inmarsat, amateur, weather satellite, ATC) occupy each segment.

  4. Narrow to a specific band of interest for higher resolution sweeps.

    Focus on 23cm amateur band
    sudo python3 tools/skywalker.py lband --23cm --plot
    Focus on weather satellite frequencies
    sudo python3 tools/skywalker.py lband --start 1670 --stop 1710 --step 0.5 --dwell 50

The Es’hail 2 / QO-100 geostationary amateur satellite carries DVB-S QPSK signals on its narrowband transponder at 10489—10499 MHz downlink. This is the one scenario where amateur satellite signals are both in the SkyWalker-1’s IF range AND use a compatible modulation scheme.

The catch: a standard 9.75 GHz universal LNB places QO-100 at ~741 MHz IF, which is below the 950 MHz minimum. You need a modified or purpose-built LNB with a lower LO frequency.

LNB LOQO-100 IF RangeIn Range?
9750 MHz (standard)739 — 749 MHzNo
9000 MHz (custom)1489 — 1499 MHzYes
9250 MHz (custom)1239 — 1249 MHzYes

With a suitable LNB, sweep the QO-100 DATV range:

Sweep QO-100 DATV range with custom 9.0 GHz LO LNB
sudo python3 tools/skywalker.py spectrum --lnb-lo 9000 --start 1480 --stop 1510 --step 1 --dwell 30

To tune to a specific carrier once you have identified it:

Tune to a specific QO-100 DATV carrier
sudo python3 tools/tune.py tune 10494 1000 --lnb-lo 9000 --mod qpsk --fec auto

Track mode continuously monitors a transponder’s signal quality and logs timestamped samples. Useful for rain fade analysis, antenna drift detection, and long-term signal characterization.

  1. Tune to the target transponder frequency and symbol rate, specifying LNB parameters as usual.

  2. Start tracking with logging enabled. Specify a duration in seconds, or omit --duration to run until Ctrl-C.

    Track a transponder for 1 hour with CSV logging
    sudo python3 tools/skywalker.py track 12520 27500 --lnb-lo 10600 --pol H --band high --log signal_log.csv --duration 3600
  3. The tracker logs SNR, lock status, and AGC values at each sample. Lock/unlock transitions are flagged in the log for easy filtering.

  4. For frequency drift analysis, add --drift-track to monitor the demodulator’s carrier frequency offset over time.

    Track with drift detection
    sudo python3 tools/skywalker.py track 12520 27500 --lnb-lo 10600 --pol H --band high --drift-track --log drift.csv

All spectrum analysis modes support data export. Choose the format that fits your workflow.

FlagApplicable ModesOutput Format
--csv FILEspectrum, scan, lbandComma-separated: frequency, power, annotations
--log FILEtrackTimestamped CSV: time, frequency, SNR, lock, AGC
--json-lines FILEtrackOne JSON object per sample, newline-delimited
--jsonscanFull scan results as a single JSON document
--plotspectrum, scan, lbandInteractive matplotlib window

Combine --csv or --json with --plot to both save data and visualize it in a single run.