diff --git a/astro.config.mjs b/astro.config.mjs
index 3c0b663..1a63ea5 100644
--- a/astro.config.mjs
+++ b/astro.config.mjs
@@ -34,6 +34,22 @@ export default defineConfig({
label: 'Understanding',
autogenerate: { directory: 'understanding' },
},
+ {
+ label: 'Experiments',
+ badge: { text: 'New', variant: 'tip' },
+ items: [
+ { label: 'Overview', slug: 'experiments' },
+ { label: 'SDR Hardware Setup', slug: 'experiments/sdr-hardware' },
+ {
+ label: 'On-Board DVB (Ku-Band)',
+ autogenerate: { directory: 'experiments/dvb' },
+ },
+ {
+ label: 'External SDR (Multi-Band)',
+ autogenerate: { directory: 'experiments/sdr' },
+ },
+ ],
+ },
{
label: 'Project Journal',
badge: { text: 'Living', variant: 'note' },
diff --git a/src/content/docs/experiments/dvb/antenna-pattern.mdx b/src/content/docs/experiments/dvb/antenna-pattern.mdx
new file mode 100644
index 0000000..2bcc931
--- /dev/null
+++ b/src/content/docs/experiments/dvb/antenna-pattern.mdx
@@ -0,0 +1,219 @@
+---
+title: "Antenna Pattern Measurement"
+description: Characterizing the dish's beam width and sidelobe structure using a known satellite as a point source
+sidebar:
+ order: 5
+---
+
+import { Steps, Aside, LinkCard } from '@astrojs/starlight/components';
+
+A geostationary satellite is effectively a point source at infinity. Its angular size is negligible compared to the dish beam width, which means scanning the dish across the satellite and recording RSSI at each position maps the antenna's radiation pattern directly. This tells you the 3 dB beam width (half-power point), first sidelobe level, and overall beam shape -- numbers that matter for every other experiment in this section.
+
+## What you'll measure
+
+The dish's far-field radiation pattern in one or two planes (AZ cut, EL cut, or both). The key parameters:
+
+| Parameter | Expected value (33" x 23" dish at 12 GHz) | Why it matters |
+|-----------|---------------------------------------------|---------------|
+| AZ beam width (3 dB) | ~2.0--2.5 degrees | Determines angular resolution for sky mapping |
+| EL beam width (3 dB) | ~3.0--4.0 degrees | Wider because the dish is shorter in the EL plane |
+| First sidelobe | -15 to -20 dB below peak | Sets dynamic range for nearby source separation |
+| Beam symmetry | Slightly elliptical | Reflects the physical dish geometry |
+
+The theoretical beam width for a uniformly illuminated circular aperture is approximately `lambda / D` radians. At 12 GHz (lambda = 0.025 m) with an 84 cm dish, that gives about 1.7 degrees. The practical beam is wider because the feed illumination tapers toward the dish edges, and the reflector is elliptical rather than circular.
+
+## Prerequisites
+
+- Motors homed and calibrated (see [Calibration & Homing](/guides/calibration/))
+- TV search disabled (see [Disabling TV Search](/guides/disabling-search/))
+- LNA enabled (`dvb` then `lnbdc odu`)
+- A strong geostationary satellite locked with RSSI > 1000 and Lock = 1
+- Serial logging to a file with timestamps
+- A spreadsheet or plotting tool (Python/matplotlib, gnuplot, LibreOffice Calc)
+
+
+
+## Finding and locking a target satellite
+
+
+
+1. **Calculate look angles for a geostationary satellite.** DISH Network 110W, 119W, or 129W are strong targets in North America. Use [dishpointer.com](https://www.dishpointer.com) or Stellarium with your latitude/longitude.
+
+2. **Position the dish at the computed AZ/EL.**
+
+ ```
+ TRK> mot
+ MOT> a 0 218.7
+ MOT> a 1 38.5
+ ```
+
+3. **Enable the LNA and verify signal.**
+
+ ```
+ MOT> q
+ TRK> dvb
+ DVB> lnbdc odu
+ DVB> rssi 50
+ Reads:50 RSSI[avg: 1305 cur: 1311]
+ ```
+
+ If RSSI is near the noise floor (~500), nudge AZ and EL in 0.5 degree increments until you find the peak. A locked signal should be well above 1000.
+
+4. **Fine-tune for peak RSSI.** Adjust AZ in 0.2 degree steps, recording RSSI at each position. Park at the maximum. Repeat for EL. This is the beam center -- record this position as your reference (AZ_0, EL_0).
+
+ ```
+ DVB> q
+ TRK> mot
+ MOT> a 0 218.5
+ MOT> q
+ TRK> dvb
+ DVB> rssi 50
+ Reads:50 RSSI[avg: 1320 cur: 1318]
+ ```
+
+ Record: AZ_0 = 218.5, EL_0 = 38.5, RSSI_peak = 1320.
+
+
+
+## Azimuth cut (E-plane pattern)
+
+Scan in azimuth while holding elevation constant at EL_0. This traces the antenna pattern in the azimuth plane.
+
+
+
+1. **Decide your scan range and step size.** A range of +/- 5 degrees from beam center covers the main lobe and first sidelobes. A step size of 0.1--0.2 degrees gives good resolution on the main lobe; 0.5 degrees is sufficient for the sidelobes.
+
+ For a high-resolution scan: 100 positions across 10 degrees = 0.1 degree steps.
+
+2. **Move to the starting position.**
+
+ ```
+ TRK> mot
+ MOT> a 0 213.5
+ ```
+
+ This is AZ_0 - 5.0.
+
+3. **Step through azimuth, recording RSSI at each position.** At each step:
+
+ ```
+ MOT> a 0 213.5
+ MOT> q
+ TRK> dvb
+ DVB> rssi 50
+ Reads:50 RSSI[avg: 502 cur: 498]
+ DVB> q
+ TRK> mot
+ MOT> a 0 213.7
+ MOT> q
+ TRK> dvb
+ DVB> rssi 50
+ Reads:50 RSSI[avg: 504 cur: 501]
+ ```
+
+ This is tedious manually. For a complete scan, use `azscan` in the MOT submenu:
+
+ ```
+ TRK> mot
+ MOT> azscan 10 0 500
+ ```
+
+ This sweeps 10 degrees in AZ at the current EL, with a 500 ms delay between positions. The output includes RSSI at each position. Log the serial output.
+
+4. **Record all (offset, RSSI) pairs.** Offset = AZ - AZ_0 for each position.
+
+
+
+## Elevation cut (H-plane pattern)
+
+Same procedure, but scan in elevation while holding azimuth constant at AZ_0.
+
+
+
+1. **Return to beam center.**
+
+ ```
+ TRK> mot
+ MOT> a 0 218.5
+ ```
+
+2. **Step through elevation.** The EL range is constrained by the firmware limits (18--65 degrees on the G2). Scan as far as you can on each side of EL_0.
+
+ ```
+ MOT> a 1 33.5
+ MOT> q
+ TRK> dvb
+ DVB> rssi 50
+ ```
+
+ Repeat in 0.2 degree EL steps across +/- 5 degrees (or to the firmware limit). There is no built-in EL scan command, so this must be done manually or scripted over serial.
+
+3. **Record all (offset, RSSI) pairs.** Offset = EL - EL_0 for each position.
+
+
+
+
+
+## Processing the data
+
+### Normalize to dB
+
+Convert raw RSSI to a relative power scale in dB, referenced to the peak:
+
+```
+pattern_dB(offset) = 10 * log10(RSSI(offset) / RSSI_peak)
+```
+
+The peak is 0 dB by definition. The 3 dB beam width is the angular distance between the two points where `pattern_dB = -3`.
+
+### Example AZ pattern data
+
+| AZ offset (deg) | RSSI | Pattern (dB) |
+|------------------|------|-------------|
+| -3.0 | 510 | -4.13 |
+| -2.0 | 620 | -3.28 |
+| -1.5 | 850 | -1.91 |
+| -1.0 | 1150 | -0.60 |
+| -0.5 | 1290 | -0.10 |
+| 0.0 | 1320 | 0.00 |
+| +0.5 | 1295 | -0.08 |
+| +1.0 | 1140 | -0.64 |
+| +1.5 | 860 | -1.86 |
+| +2.0 | 615 | -3.31 |
+| +3.0 | 505 | -4.17 |
+
+In this example, the -3 dB points are near +/- 2.0 degrees, giving a 3 dB beam width of approximately 4.0 degrees in azimuth. (These are illustrative values -- your actual pattern will depend on the dish surface accuracy, feed position, and frequency.)
+
+### Plotting
+
+Plot `pattern_dB` vs. offset angle for both AZ and EL cuts on the same graph. The AZ cut will be narrower (larger dish dimension in AZ) and the EL cut wider (smaller dish dimension in EL). Overlay the theoretical pattern for a uniformly illuminated elliptical aperture if you want a comparison reference.
+
+## Interpreting the pattern
+
+| Feature | What it tells you |
+|---------|-------------------|
+| 3 dB beam width | Angular resolution for sky mapping and satellite discrimination |
+| Main lobe symmetry | Feed alignment quality -- asymmetric main lobe means the feed is off-axis |
+| First sidelobe level | How well the dish rejects signals from adjacent satellites (typically 2 degrees apart in geostationary arc) |
+| Sidelobe asymmetry | Feed offset direction or reflector surface deformations |
+| Noise floor offset | Pattern measurement dynamic range -- if sidelobes disappear into the noise floor at -10 dB, your effective dynamic range is 10 dB |
+
+If the beam is significantly wider than expected, the feed may not be at the reflector's focal point. Adjust the feed position along the focal axis and re-measure. The optimal position minimizes beam width and maximizes peak RSSI simultaneously.
+
+## Going further
+
+**Full 2D pattern.** Combine AZ and EL scans at multiple cross-cuts (e.g., AZ cuts at EL_0, EL_0 + 1, EL_0 + 2) to build a 2D contour map of the beam. This reveals any coma or astigmatism from feed misalignment.
+
+**Dual-polarization pattern.** Measure the pattern at both H-pol and V-pol using `peak rssits` at each position. The cross-pol pattern (sidelobes in the orthogonal polarization) indicates the dish's polarization purity, which matters for experiments comparing polarization channels.
+
+**Frequency dependence.** If you can select different transponder frequencies with `dvb t `, measure the pattern at two or three frequencies. The beam should narrow at higher frequencies (shorter wavelength). The ratio of beam widths should be approximately proportional to the ratio of wavelengths.
+
+**Calibrating sky maps.** The beam pattern is the point spread function (PSF) of your radio telescope. Deconvolving the PSF from a sky map (from the [Radio Telescope Guide](/guides/radio-telescope/) workflow) improves angular resolution and separates closely spaced sources. This is the same technique used by professional radio observatories.
+
+
+
+
diff --git a/src/content/docs/experiments/dvb/differential-radiometry.mdx b/src/content/docs/experiments/dvb/differential-radiometry.mdx
new file mode 100644
index 0000000..55ab5a3
--- /dev/null
+++ b/src/content/docs/experiments/dvb/differential-radiometry.mdx
@@ -0,0 +1,177 @@
+---
+title: "Differential Radiometry"
+description: Correlating RSSI measurements between two dishes to separate sky signals from receiver noise
+sidebar:
+ order: 7
+---
+
+import { Steps, Aside, LinkCard } from '@astrojs/starlight/components';
+
+Single-dish radiometry with the BCM4515 is limited by receiver instability. The LNA gain drifts with temperature, the tuner's AGC adjusts in discrete steps, and the ADC's reference voltage wanders. When you see an RSSI change, you can't tell whether the sky got brighter or the receiver got noisier. This is the fundamental problem that drove radio astronomers to invent Dicke switching in 1946.
+
+With two dishes, you get a simpler solution. Both receivers observe the same patch of sky simultaneously. Any RSSI variation that appears in both time series at the same moment is a real sky signal — because independent receivers don't drift in unison. Variations that appear in only one receiver are instrument noise. Cross-correlating the two time series extracts the common signal and suppresses the independent noise, improving sensitivity by a factor of approximately 1.4 (the square root of 2).
+
+
+
+## What you'll measure
+
+- **Correlated sky signal** — RSSI variations common to both receivers, isolated from instrument noise
+- **Receiver noise characterization** — the uncorrelated component tells you how much noise each receiver contributes
+- **Atmospheric emission** — the troposphere radiates thermal noise at Ku-band that varies with water vapor content, detectable as a correlated signal when both dishes point at the same airmass
+- **Scintillation separation** — tropospheric scintillation (rapid signal fluctuations caused by turbulent air cells) is correlated between dishes separated by less than a few hundred meters, while receiver noise is not
+
+## How it works
+
+Each dish measures a total power:
+
+```
+P_dish1(t) = S(t) + N1(t)
+P_dish2(t) = S(t) + N2(t)
+```
+
+Where `S(t)` is the sky signal (identical for both dishes pointed at the same direction) and `N1(t)`, `N2(t)` are the independent receiver noise contributions. The cross-correlation of the two time series is:
+
+```
+ = + + +
+```
+
+The last three terms average to zero over time because the noise is uncorrelated with both the signal and the other receiver's noise. What remains is `` — the sky signal power, free of receiver contamination.
+
+In practice, you don't need to compute a formal cross-correlation. Even simple simultaneous averaging — plotting both RSSI time series on the same graph and looking for features that appear in both — gives you most of the benefit.
+
+## Prerequisites
+
+- Two Carryout G2 dishes, both homed and calibrated
+- Both dishes pointed at the same sky position (within 1 degree)
+- Both LNAs enabled (`dvb` > `lnbdc odu`)
+- Both serial connections logging to separate files with timestamps
+- A method to synchronize timestamps between the two logs (NTP-synced clocks on both computers, or a shared timestamp source)
+
+### Dish placement
+
+The two dishes should be:
+
+- **Close enough** that they see the same atmospheric conditions (within ~200 meters for tropospheric correlation)
+- **Far enough** that they don't shadow each other or create ground reflections (at least 3 meters apart)
+- **Same elevation above ground** — different ground reflections at different heights add uncorrelated systematic errors
+
+Ideally, place them side by side on the same flat surface with 3-10 meters of separation.
+
+## Procedure
+
+
+
+1. **Home and calibrate both dishes independently.**
+
+ On dish 1:
+ ```
+ TRK> mot
+ MOT> h 0
+ MOT> h 1
+ ```
+
+ On dish 2 (separate serial session):
+ ```
+ TRK> mot
+ MOT> h 0
+ MOT> h 1
+ ```
+
+2. **Point both dishes at the same sky position.** Choose a position away from known satellites for a clean radiometry baseline, or point at a satellite for signal correlation work.
+
+ On both dishes:
+ ```
+ MOT> a 0 180
+ MOT> a 1 45
+ ```
+
+ The pointing doesn't need to be perfect — 1 degree of agreement is sufficient for correlation work since the Carryout G2's beam is several degrees wide at Ku-band.
+
+3. **Enable LNA on both dishes.**
+
+ On each dish:
+ ```
+ MOT> q
+ TRK> dvb
+ DVB> lnbdc odu
+ DVB> q
+ TRK> dvb
+ ```
+
+4. **Establish baseline noise independently.** Take a 10-sample RSSI reading from each dish and record the mean and spread.
+
+ On each dish:
+ ```
+ DVB> rssi 10
+ Reads:10 RSSI[avg: 498 cur: 502]
+ ```
+
+ The two dishes will have different noise floors — component tolerances mean no two receivers are identical. That's fine. You're looking for correlated *changes*, not matching absolute values.
+
+5. **Start synchronized RSSI logging.** On both dishes, begin streaming RSSI at the same time (coordinate by clock or a verbal countdown).
+
+ On each dish:
+ ```
+ DVB> rssi 100
+ ```
+
+ For longer integration, repeat the `rssi 100` command in a loop or use the ADC submenu's streaming monitor:
+
+ ```
+ DVB> q
+ TRK> adc
+ ADC> m
+ ```
+
+ The ADC `m` command streams continuous RSSI readings with carriage-return overwriting. Log the serial output — each line contains a timestamp (from your logging tool) and the RSSI value.
+
+6. **Run for an extended period.** Meaningful correlation requires enough data points to average down the noise. At one reading per second, collect at least 30 minutes of simultaneous data. Longer is better — overnight runs capture diurnal atmospheric variation.
+
+7. **Introduce a known signal change.** To validate that your correlation pipeline is working, create a deliberate common-mode signal:
+
+ - Slew both dishes across a strong satellite — both RSSI traces should peak at the same moment
+ - Wait for a cloud to pass — atmospheric attenuation affects both dishes simultaneously
+
+
+
+## Interpreting results
+
+Align the two RSSI time series by timestamp and examine them together.
+
+**Correlated features (real sky signal):**
+
+| Feature | What it means |
+|---------|---------------|
+| Both traces dip simultaneously | Cloud or rain attenuation — troposphere absorbing Ku-band signal |
+| Both traces rise simultaneously | Satellite or source entering the beam, or clearing weather |
+| Both traces show same rapid fluctuations (seconds timescale) | Tropospheric scintillation — turbulent cells in the atmosphere |
+| Both traces show same slow drift (hours timescale) | Diurnal atmospheric emission change (thermal) |
+
+**Uncorrelated features (receiver noise):**
+
+| Feature | What it means |
+|---------|---------------|
+| Step change in one trace only | AGC adjustment in that receiver |
+| Slow drift in one trace only | Temperature-dependent gain drift in that LNA or tuner |
+| Random fluctuation in one trace only | Receiver thermal noise (normal) |
+
+### Quantifying the improvement
+
+Compute the Pearson correlation coefficient between the two time series over a sliding window (e.g., 60-second windows). Values near 1.0 indicate the signal dominates (both dishes see the same thing). Values near 0 indicate receiver noise dominates (independent fluctuations). The correlation coefficient as a function of time shows when sky signals are present and when you're noise-limited.
+
+
+
+## Going further
+
+- **Rain fade measurement** — point both dishes at a geostationary satellite during a rain event. The correlated RSSI drop measures atmospheric attenuation independent of receiver drift. Compare with the single-dish [rain fade experiment](/experiments/dvb/rain-fade/) to see how much receiver noise contaminates the single-dish measurement.
+- **Atmospheric emission mapping** — tilt both dishes through a range of elevations. The atmosphere's thermal emission increases at lower elevation angles (longer path through the troposphere). Differential radiometry separates this real elevation-dependent signal from the receiver gain changes that also happen when motors move.
+- **Baseline extension** — if the two dishes are separated by more than a few hundred meters, tropospheric scintillation decorrelates and becomes part of the noise rather than the signal. This lets you probe larger-scale atmospheric structure.
+- **More than two dishes** — each additional dish adds another independent noise realization. With N dishes, the sensitivity improvement scales as the square root of N. Three dishes give a factor of 1.7, four dishes give a factor of 2.
+- **Intensity interferometry** — while true phase-coherent interferometry requires synchronized local oscillators (which the BCM4515 doesn't provide), intensity correlation between separated dishes can detect spatial structure in bright sources. This is an advanced topic that requires careful calibration and long integration times.
+
+
+
diff --git a/src/content/docs/experiments/dvb/dvb-sigint.mdx b/src/content/docs/experiments/dvb/dvb-sigint.mdx
new file mode 100644
index 0000000..32d8120
--- /dev/null
+++ b/src/content/docs/experiments/dvb/dvb-sigint.mdx
@@ -0,0 +1,190 @@
+---
+title: "DVB Signal Intelligence"
+description: Identifying active transponders, modulation parameters, and carrier characteristics through blind scanning
+sidebar:
+ order: 6
+---
+
+import { Steps, Aside, LinkCard } from '@astrojs/starlight/components';
+
+The BCM4515 tuner includes a blind scan mode that searches for DVB-S and DVB-S2 carriers without knowing their parameters in advance. Combined with the transponder table generator, channel parameter display, and streaming AGC/SNR/NID readouts, you can fully characterize the signals transmitted by any satellite in the dish's beam — frequency, symbol rate, modulation type, FEC rate, and network identity.
+
+This is signal intelligence at the RF physical layer. You're identifying what carriers exist and how they're modulated, not decoding content. The output tells you which transponders are active, how they're configured, and how strong they are — enough to identify the satellite operator and compare against published transponder plans.
+
+## What you'll measure
+
+- **Transponder inventory** — frequency, symbol rate, and modulation for every detectable carrier on a given satellite
+- **Signal quality** — RSSI, SNR, and AGC levels per transponder
+- **Network identity** — the DVB Network ID (NID) embedded in each carrier's transport stream, which identifies the broadcast network
+- **Lock statistics** — carrier lock reliability, glitch count, and signal stability over time
+
+## Prerequisites
+
+- Motors homed and calibrated (see [Calibration & Homing](/guides/calibration/))
+- TV search disabled (see [Disabling TV Search](/guides/disabling-search/))
+- A target satellite in the beam — either a known satellite from the [Geostationary Census](/experiments/dvb/geostationary-census/) or a position estimated from orbital data
+- Serial output logged to a file
+
+
+
+## Procedure
+
+
+
+1. **Point the dish at a target satellite.** Use a known position from a previous census, or estimate from orbital data.
+
+ ```
+ TRK> mot
+ MOT> a 0 195
+ MOT> a 1 42
+ ```
+
+ Replace the azimuth and elevation with values appropriate for your target and location.
+
+2. **Enable the LNA and verify signal.**
+
+ ```
+ MOT> q
+ TRK> dvb
+ DVB> lnbdc odu
+ DVB> rssi 10
+ Reads:10 RSSI[avg: 872 cur: 880]
+ ```
+
+ RSSI well above the ~500 noise floor confirms a satellite signal is present. If you're near the noise floor, adjust pointing in small increments (0.5-degree steps on AZ and EL) until RSSI peaks.
+
+3. **Check the current tuner configuration.**
+
+ ```
+ DVB> config
+ ```
+
+ This reports the BCM4515 hardware and firmware version (ID 0x4515, Rev B0, FW v113.37 on the G2). Useful as a baseline reference.
+
+ ```
+ DVB> dis
+ ```
+
+ Shows the currently configured channel parameters — frequency, symbol rate, LNB polarity. This is what the tuner will start from before blind scanning.
+
+4. **Run the blind scan.**
+
+ ```
+ DVB> srch
+ ```
+
+ The blind scan sweeps across frequencies and symbol rates looking for DVB carriers. This takes several minutes per satellite. The firmware tries each combination and reports found carriers.
+
+ You can check or modify the search mode:
+
+ ```
+ DVB> srch_mode
+ ```
+
+5. **Generate the transponder table.** After the blind scan completes, build the table of found carriers.
+
+ ```
+ DVB> table
+ ```
+
+ This produces a list of transponders with their frequencies and basic parameters. For extended information:
+
+ ```
+ DVB> tablex
+ ```
+
+ The extended table includes additional modulation and coding details.
+
+6. **Examine individual transponders.** Select a transponder by index and read its parameters.
+
+ ```
+ DVB> t 1
+ DVB> dis
+ ```
+
+ The `dis` output shows the selected transponder's frequency, symbol rate, and LNB polarity. Cycle through all found transponders (`t 1`, `t 2`, `t 3`, ...) and record each one's parameters.
+
+7. **Measure signal quality per transponder.** For each transponder of interest:
+
+ ```
+ DVB> rssi 20
+ Reads:20 RSSI[avg: 945 cur: 940]
+ ```
+
+ For streaming AGC, SNR, and NID:
+
+ ```
+ DVB> agc
+ ```
+
+ The `agc` command streams continuous RF AGC, IF AGC, SNR, and NID readings. The NID (Network ID) is a 16-bit identifier assigned by the broadcast operator — `FFFF` means no signal or no transport stream. Interrupt with `q` or any other command.
+
+8. **Check lock statistics.**
+
+ ```
+ DVB> ls
+ ```
+
+ This reports total reads, no-signal count, glitch count, and an NID table. A high glitch count relative to total reads indicates a marginal signal — possibly edge-of-beam or a weak transponder.
+
+9. **Repeat for V-pol.** The initial scan uses the current LNB voltage. Switch polarization and rescan to find transponders on the other polarization.
+
+ ```
+ DVB> lnbdc odu
+ DVB> srch
+ DVB> table
+ ```
+
+ Many satellites split their capacity across H-pol and V-pol. A complete inventory requires scanning both.
+
+
+
+## Interpreting results
+
+### Transponder parameters
+
+Each transponder is characterized by a set of physical-layer parameters:
+
+| Parameter | Typical values | What it tells you |
+|-----------|---------------|-------------------|
+| Frequency | 11.7-12.7 GHz (Ku-band) | Carrier center frequency after LNB downconversion |
+| Symbol rate | 18000-30000 ksps | Channel bandwidth — higher rates carry more data |
+| Modulation | QPSK, 8PSK | DVB-S uses QPSK; DVB-S2 adds 8PSK for higher throughput |
+| FEC | 1/2, 2/3, 3/4, 5/6, 7/8 | Error correction overhead — lower ratios are more robust |
+| Rolloff | 0.20, 0.25, 0.35 | Spectral shaping factor — affects occupied bandwidth |
+| NID | 16-bit hex | Network identity — identifies the broadcast operator |
+
+### Identifying the satellite
+
+Cross-reference your transponder list against online databases:
+
+- **[LyngSat](https://www.lyngsat.com/)** — comprehensive transponder plans for nearly every satellite, organized by orbital position
+- **[SatBeams](https://www.satbeams.com/)** — searchable satellite database with footprint maps and transponder lists
+- **[King of Sat](https://en.kingofsat.net/)** — European-focused but covers global Ku-band
+
+Match the frequencies, symbol rates, and NIDs you measured against the published data for satellites at the orbital slot you're pointing at. A good match confirms satellite identity. Discrepancies — transponders you found that aren't listed, or listed ones you couldn't detect — are worth documenting.
+
+### Signal quality assessment
+
+| Metric | Good | Marginal | Poor |
+|--------|------|----------|------|
+| RSSI | > 900 | 600-900 | < 600 |
+| SNR | > 10 dB | 5-10 dB | < 5 dB |
+| Lock | Stable (Lock=1 persistent) | Intermittent | No lock |
+| Glitch count | < 1% of total reads | 1-5% | > 5% |
+
+
+
+## Going further
+
+- **Track changes over time** — satellite operators regularly add, remove, and reconfigure transponders. Monthly scans of the same satellite build a history of its transponder plan evolution.
+- **Identify unlisted carriers** — transponders that appear in your scan but not in LyngSat or SatBeams may be occasional-use capacity (news gathering, event coverage), military/government transponders, or recently activated carriers not yet cataloged.
+- **Compare satellites at adjacent slots** — GEO satellites are spaced 2-3 degrees apart at Ku-band. Point at neighboring slots and compare transponder plans. Some operators (e.g., SES, Intelsat) cluster related satellites at adjacent positions.
+- **Automated monitoring** — script the `birdcage` CLI to cycle through known satellite positions, run blind scans at each one, and diff the results against previous scans. Alert on new or missing transponders.
+
+
+
diff --git a/src/content/docs/experiments/dvb/geostationary-census.mdx b/src/content/docs/experiments/dvb/geostationary-census.mdx
new file mode 100644
index 0000000..17a6eaa
--- /dev/null
+++ b/src/content/docs/experiments/dvb/geostationary-census.mdx
@@ -0,0 +1,182 @@
+---
+title: "Geostationary Arc Census"
+description: Mapping every detectable satellite across the full azimuth arc using automated DVB sweeps
+sidebar:
+ order: 3
+---
+
+import { Steps, Aside, LinkCard } from '@astrojs/starlight/components';
+
+The geostationary arc is a ring of satellites parked at 35,786 km altitude, orbiting at the same rate the Earth rotates. From any fixed location on the ground, these satellites appear motionless — arranged in a band across the southern sky (in the Northern Hemisphere) at a specific elevation that depends on your latitude. The Carryout G2 can sweep the full azimuth range, measure RSSI and DVB lock at each position, and produce a complete census of every Ku-band satellite visible from your site.
+
+## What you'll measure
+
+A full-arc census produces three data products:
+
+- **RSSI profile** — a signal strength curve across 360 degrees of azimuth, showing peaks at each satellite's orbital slot
+- **Lock detections** — positions where the BCM4515 achieves DVB carrier lock, confirming active DVB-S/S2 transmission
+- **SNR readings** — signal quality at each locked position, useful for distinguishing strong regional satellites from weak ones at the edge of your coverage
+
+From the Americas, expect to detect 10-30 satellites depending on your longitude, local horizon obstructions, and atmospheric conditions. The DISH Network fleet (110W, 119W, 129W), DirecTV (99W, 101W, 103W), and Bell TV (82W, 91W) satellites produce the strongest signals in North America.
+
+## Prerequisites
+
+- Motors homed and calibrated (see [Calibration & Homing](/guides/calibration/))
+- TV search disabled (see [Disabling TV Search](/guides/disabling-search/))
+- LNA enabled (`dvb` > `lnbdc odu`)
+- Serial output logged to a file for post-processing (e.g., `picocom --logfile census.log`)
+
+You also need the GEO arc elevation for your latitude. The arc passes through a range of elevations depending on the satellite's longitude relative to yours, but the midpoint elevation (due south) is a good starting position:
+
+| Latitude | GEO arc elevation (due south) |
+|----------|-------------------------------|
+| 25 N | ~55 deg |
+| 30 N | ~50 deg |
+| 35 N | ~46 deg |
+| 40 N | ~41 deg |
+| 45 N | ~36 deg |
+| 50 N | ~31 deg |
+
+The actual arc traces a shallow curve across the sky — highest due south, lower toward the east and west horizons. For a first census, a single EL value near the midpoint captures most satellites. A multi-elevation sweep (described below) catches the ones at extreme orbital slots.
+
+
+
+## Procedure
+
+
+
+1. **Home the motors and set elevation.**
+
+ ```
+ TRK> mot
+ MOT> h 0
+ MOT> h 1
+ MOT> a 1 41
+ ```
+
+ Replace `41` with the GEO arc elevation for your latitude from the table above.
+
+2. **Enable the LNA.**
+
+ ```
+ MOT> q
+ TRK> dvb
+ DVB> lnbdc odu
+ DVB> q
+ TRK> mot
+ ```
+
+3. **Verify RSSI baseline.** Point away from any known satellite and check the noise floor.
+
+ ```
+ MOT> q
+ TRK> dvb
+ DVB> rssi 10
+ Reads:10 RSSI[avg: 498 cur: 502]
+ DVB> q
+ TRK> mot
+ ```
+
+ Readings near 489-502 with LNA active confirm the receiver is working. If you see ~233-238, the LNA is not powered.
+
+4. **Run the H-pol sweep.** The boot default is 18V (H-pol). Sweep the full azimuth range at 1-degree resolution, cycling 32 transponders at each position.
+
+ ```
+ MOT> azscanwxp 0 360 100 32
+ ```
+
+ This takes approximately 20-40 minutes depending on dwell time per transponder. Each measurement outputs:
+
+ ```
+ Motor:0 Angle: RSSI: Lock:<0/1> SNR: Scan Delta:
+ ```
+
+ Let it run to completion. Do not send any serial input during the sweep.
+
+5. **Run the V-pol sweep.** Switch to 13V (V-pol) and repeat.
+
+ ```
+ MOT> q
+ TRK> dvb
+ DVB> lnbdc odu
+ DVB> q
+ TRK> mot
+ MOT> azscanwxp 0 360 100 32
+ ```
+
+ Many satellites transmit on both polarizations using different transponders. Running both sweeps doubles your detection rate.
+
+6. **Optional: multi-elevation sweep.** The GEO arc curves downward at the east and west edges. Run additional sweeps at elevations 3-5 degrees above and below your midpoint to catch satellites at extreme orbital slots.
+
+ ```
+ MOT> a 1 38
+ MOT> azscanwxp 0 360 100 32
+ MOT> a 1 44
+ MOT> azscanwxp 0 360 100 32
+ ```
+
+
+
+## Interpreting results
+
+Parse the serial log to extract the `Angle`, `RSSI`, `Lock`, and `SNR` fields. Plot RSSI versus azimuth angle — satellites appear as distinct peaks rising above the ~500 noise floor.
+
+**What the peaks mean:**
+
+| Signal characteristic | Interpretation |
+|-----------------------|----------------|
+| RSSI > 1000, Lock=1, SNR > 5 dB | Strong satellite with active DVB carriers |
+| RSSI 600-1000, Lock=0 | Weak satellite or non-DVB carrier (C-band spillover, beacon-only) |
+| RSSI > 1000, Lock=1, multiple adjacent angles | Wide beam — dish is resolving the satellite's angular extent (rare for GEO at Ku-band) |
+| Narrow RSSI peak, no lock | Possible non-DVB Ku-band emitter or adjacent satellite sidelobe |
+
+### Identifying satellites by position
+
+To identify satellites, convert each peak's azimuth to a true bearing (accounting for your dish's North alignment) and compare against the known GEO orbital slot for that bearing from your location. Online tools like [SatBeams](https://www.satbeams.com/) or the [UCS Satellite Database](https://www.ucsusa.org/resources/satellite-database) provide orbital longitudes for all registered GEO satellites.
+
+
+
+### Post-processing the scan data
+
+The `azscanwxp` output is line-oriented and straightforward to parse. Each line contains fixed-format fields separated by spaces. A minimal Python script to extract the data:
+
+```python
+import re
+
+pattern = re.compile(
+ r"Motor:(\d+)\s+Angle:(-?\d+)\s+RSSI:(\d+)\s+"
+ r"Lock:(\d)\s+SNR:(-?\d+)\s+Scan Delta:(\d+)"
+)
+
+with open("census.log") as f:
+ for line in f:
+ m = pattern.search(line)
+ if m:
+ az_cdeg = int(m.group(2))
+ rssi = int(m.group(3))
+ lock = int(m.group(4))
+ snr = int(m.group(5))
+ print(f"{az_cdeg/100:.1f},{rssi},{lock},{snr}")
+```
+
+Plot the resulting CSV as RSSI versus azimuth. Peaks above the noise floor are satellite detections. Lock=1 markers on the plot confirm DVB carrier presence. Satellites with high RSSI but no lock are transmitting non-DVB signals (telemetry beacons, C-band spillover into the Ku-band feed, or non-standard modulation).
+
+### Dual-polarization comparison
+
+Overlay the H-pol and V-pol sweeps on the same plot. Satellites that appear in both are transmitting on both polarizations (most do). Satellites that appear in only one polarization are either single-pol or too weak on the other polarization to detect. The RSSI difference between H-pol and V-pol at the same azimuth reflects the satellite's polarization plan and the dish's cross-polarization isolation.
+
+## Going further
+
+- **Repeated surveys over weeks** detect new satellite launches, orbital relocations, and end-of-life drift. A satellite that wasn't there last month is either newly launched or repositioned from another orbital slot.
+- **Seasonal variation** — atmospheric attenuation changes with weather. Run the census on clear days for the most consistent baseline, then compare against rainy-day runs to see which satellites drop below the detection threshold first (the weakest ones).
+- **Compare with published catalogs** — the [UCS Satellite Database](https://www.ucsusa.org/resources/satellite-database) lists all known GEO objects. Your census will find a subset (Ku-band DVB transmitters only), but any detection not in the database is worth investigating.
+- **Beam calibration** — once you've identified a strong satellite, use it as a reference source for the [antenna pattern measurement](/experiments/dvb/antenna-pattern/) experiment.
+- **Feed the census into DVB SIGINT** — satellites you detect here become targets for the [DVB Signal Intelligence](/experiments/dvb/dvb-sigint/) experiment, where you characterize each satellite's transponder plan in detail.
+- **Resolution refinement** — if two satellites are close together (2-3 degrees), decrease the scan resolution from 100 centidegrees (1 degree) to 25 or 50 centidegrees to resolve them. The Carryout G2's beam width is approximately 3-4 degrees at Ku-band, so satellites closer than that will merge into a single peak.
+
+
+
diff --git a/src/content/docs/experiments/dvb/rain-fade.mdx b/src/content/docs/experiments/dvb/rain-fade.mdx
new file mode 100644
index 0000000..ff81ab0
--- /dev/null
+++ b/src/content/docs/experiments/dvb/rain-fade.mdx
@@ -0,0 +1,181 @@
+---
+title: "Rain Fade Radiometry"
+description: Measuring atmospheric attenuation at Ku-band by tracking RSSI on a geostationary satellite through weather events
+sidebar:
+ order: 2
+---
+
+import { Steps, Aside, LinkCard } from '@astrojs/starlight/components';
+
+Rain fade is the attenuation of microwave signals by precipitation -- the same effect that kills satellite TV reception during thunderstorms. At Ku-band (10--12 GHz), raindrops are a significant fraction of a wavelength and scatter incoming RF energy. The heavier the rain, the more signal you lose.
+
+By locking the dish onto a geostationary satellite (a constant, known signal source) and logging RSSI over hours or days, you turn the Carryout G2 into a calibrated atmospheric radiometer. Your measurements can be directly compared against the ITU rain attenuation models used by satellite link engineers worldwide.
+
+## What you'll measure
+
+Signal attenuation in dB caused by precipitation along the dish's line of sight. Typical values at Ku-band:
+
+| Rain rate | Expected attenuation |
+|-----------|---------------------|
+| Light rain (2 mm/hr) | 1--3 dB |
+| Moderate rain (10 mm/hr) | 5--10 dB |
+| Heavy rain (25 mm/hr) | 10--20 dB |
+| Downpour (50+ mm/hr) | 20--40 dB |
+
+These numbers are path-integrated -- they depend on your elevation angle (longer slant path through rain at low EL) and the vertical extent of the rain cell. A satellite at 40 degrees elevation has a slant path through a 3 km rain cell of about 4.7 km. At 20 degrees elevation, the same rain cell produces a slant path of about 8.8 km -- nearly double the attenuation for the same rain rate on the ground.
+
+## Prerequisites
+
+- Motors homed and calibrated (see [Calibration & Homing](/guides/calibration/))
+- TV search disabled (see [Disabling TV Search](/guides/disabling-search/))
+- LNA enabled (`dvb` then `lnbdc odu`)
+- Known geostationary satellite position for your location -- DISH Network 110W, 119W, or 129W are strong targets in the continental US
+- A local weather data source: personal weather station, Weather Underground, or NOAA ASOS station for rainfall rate
+- Serial logging to a file with timestamps
+- Patience -- you need actual rain, which is not on-demand
+
+
+
+## Locking onto the beacon
+
+Before you can measure rain fade, you need a stable reference signal. A locked geostationary transponder gives you a steady RSSI baseline.
+
+
+
+1. **Position the dish at the satellite's computed AZ/EL.**
+
+ ```
+ TRK> mot
+ MOT> a 0 220.5
+ MOT> a 1 40.2
+ ```
+
+2. **Enable the LNA and check for signal.**
+
+ ```
+ MOT> q
+ TRK> dvb
+ DVB> lnbdc odu
+ DVB> rssi 50
+ Reads:50 RSSI[avg: 1247 cur: 1251]
+ ```
+
+ An RSSI well above 1000 indicates a strong signal. If you are near the noise floor (~500), the dish is not pointed at the satellite -- adjust AZ/EL in 0.5 degree increments.
+
+3. **Verify carrier lock.**
+
+ ```
+ DVB> qls
+ ```
+
+ The quick lock status should show Lock = 1 with a positive SNR value. If Lock = 0, you are either off-target or the transponder configuration does not match. Try selecting different transponders with `t ` and checking each.
+
+4. **Fine-tune pointing for maximum RSSI.** Nudge AZ by +/- 0.5 degrees while watching RSSI. Then do the same for EL. Park at the peak.
+
+ ```
+ DVB> q
+ TRK> mot
+ MOT> a 0 220.3
+ MOT> q
+ TRK> dvb
+ DVB> rssi 50
+ Reads:50 RSSI[avg: 1285 cur: 1290]
+ ```
+
+5. **Record your clear-sky baseline RSSI and the exact AZ/EL.** This is your 0 dB reference point. All attenuation measurements are relative to this value.
+
+
+
+## Logging RSSI through a weather event
+
+The dish stays locked at the satellite's position. The atmosphere changes; the dish does not move.
+
+
+
+1. **Start periodic RSSI logging.** Use a script or manual samples at regular intervals (every 1--5 minutes). For each sample:
+
+ ```
+ DVB> rssi 100
+ Reads:100 RSSI[avg: 1283 cur: 1279]
+ ```
+
+ The 100-sample average smooths out short-term fluctuations. Record the timestamp and the `avg` value.
+
+ Alternatively, use `adc m` for continuous streaming if you want sub-second resolution during a fast-moving storm cell.
+
+2. **Log weather data simultaneously.** Record rainfall rate (mm/hr) from your weather station at the same timestamps. Temperature and humidity are useful secondary data.
+
+3. **Continue through the weather event.** A passing thunderstorm might last 30--90 minutes. A frontal system can produce measurable attenuation for hours. Let the logger run.
+
+4. **Record the clear-sky recovery.** After the rain stops, RSSI should return to within a few counts of your original baseline. If it does not, check for water on the dish surface (which also attenuates) or a temperature drift in the receiver.
+
+
+
+
+
+## Converting RSSI to attenuation
+
+RSSI values from the BCM4515 are raw ADC counts, not calibrated power in dBm. To get attenuation in dB, you work in relative terms:
+
+```
+attenuation_dB = 10 * log10(RSSI_clear / RSSI_rain)
+```
+
+Where `RSSI_clear` is your baseline and `RSSI_rain` is the value during precipitation. This assumes the ADC response is roughly linear in power over the range you are measuring, which is a reasonable approximation for the moderate dynamic range involved.
+
+| RSSI_clear | RSSI_rain | Attenuation |
+|------------|-----------|-------------|
+| 1280 | 1200 | 0.28 dB |
+| 1280 | 800 | 2.04 dB |
+| 1280 | 400 | 5.05 dB |
+| 1280 | 100 | 11.07 dB |
+| 1280 | 50 | 14.08 dB |
+
+If RSSI drops to the noise floor (~500 with LNA), you have lost lock and the attenuation exceeds your measurement range. Record it as "> X dB" where X is computed from `RSSI_clear / noise_floor`.
+
+## Interpreting results
+
+Plot your RSSI time series against rainfall rate. You should see:
+
+- **Clear inverse correlation.** RSSI drops when rain rate increases, with heavier rain producing deeper fades. The correlation is strongest with instantaneous rainfall rate, not accumulated total -- a brief downpour at 50 mm/hr produces a deeper (but shorter) fade than steady drizzle at 2 mm/hr that deposits more total water.
+- **Path length dependence.** Lower elevation angles (longer slant path through the atmosphere) produce more attenuation for the same rain rate. If you can lock onto satellites at different elevations simultaneously (with a second dish or by switching targets), the ratio of attenuations reveals the rain cell's vertical extent.
+- **Scintillation.** Even on clear days, you may notice small RSSI fluctuations of 0.5--1 dB on timescales of seconds to minutes. This is tropospheric scintillation from turbulent mixing of air masses at different temperatures and humidity. It sets the noise floor for your attenuation measurements and is itself an interesting atmospheric parameter.
+- **Hysteresis during freezing precipitation.** Wet snow and melting-layer effects can produce more attenuation than the equivalent liquid rain rate would suggest. The "bright band" at the melting layer (~2 km altitude in winter) is a known phenomenon in radar meteorology, and you may see it as excess fade that does not match surface rainfall.
+- **Dish wetting effect.** Water films on the dish surface add attenuation even after rain stops. A wet dish surface can add 1--3 dB at Ku-band. You will see this as a slow recovery after the rain ends, with RSSI gradually returning to baseline as the dish dries.
+
+## Polarization effects
+
+Raindrops are not spherical. Large drops are oblate (flattened by aerodynamic drag), which means horizontally polarized signals experience more attenuation than vertically polarized ones. The effect increases with rain rate.
+
+Use `peak rssits` to measure both polarizations simultaneously:
+
+```
+PEAK> rssits
+Even_sig = 823, Odd_sig = 891
+```
+
+`Even_sig` is H-pol (18V), `Odd_sig` is V-pol (13V). During rain, you should see H-pol fade more than V-pol. The ratio between them is called the **differential attenuation** and is directly related to raindrop size distribution.
+
+
+
+## Going further
+
+**Long-term dataset.** Run the logger through an entire rain season. Accumulate hundreds of rain events and plot attenuation vs. rainfall rate on a log-log scale. Fit the ITU-R P.838 power-law model `A = k * R^alpha` to your data and compare your fitted coefficients against the published values for your frequency and polarization.
+
+**Dual-polarization differential attenuation.** Systematically compare H-pol and V-pol fade during each event. The differential attenuation is a proxy for median raindrop diameter -- larger drops are more oblate and produce more differential fade. This is the same principle used by dual-pol weather radars (ZDR measurement).
+
+**Cloud attenuation.** On overcast but rain-free days, you may detect a small attenuation (0.1--0.5 dB) from liquid water content in clouds. This requires a very stable baseline and careful temperature-drift correction, but it is within the measurement range.
+
+**Multi-satellite comparison.** Lock onto two or more geostationary satellites at different elevation angles and log RSSI simultaneously (or alternate between them every few minutes). Different slant paths through the same rain cell let you triangulate the rain cell height and horizontal extent.
+
+**Snow and ice detection.** Dry snow produces very little attenuation at Ku-band (ice crystals are weak scatterers). But the melting layer -- the altitude where snow transitions to rain -- produces pronounced attenuation (the "bright band" effect). By logging RSSI during winter precipitation events where the surface temperature is near freezing, you can detect the onset and cessation of the melting layer as temperature changes. This has direct applications in weather radar calibration and hydrometeorological research.
+
+
+
+
diff --git a/src/content/docs/experiments/dvb/rfi-mapping.mdx b/src/content/docs/experiments/dvb/rfi-mapping.mdx
new file mode 100644
index 0000000..9488076
--- /dev/null
+++ b/src/content/docs/experiments/dvb/rfi-mapping.mdx
@@ -0,0 +1,180 @@
+---
+title: "RFI Mapping"
+description: Surveying terrestrial radio frequency interference at Ku-band using low-elevation azimuth sweeps
+sidebar:
+ order: 4
+---
+
+import { Steps, Aside, LinkCard } from '@astrojs/starlight/components';
+
+At low elevation angles, the dish points toward the horizon — straight into the terrestrial radio environment. Microwave backhaul links, weather radar, spurious emissions from industrial equipment, and even LED lighting can produce Ku-band interference that shows up as elevated RSSI readings. By sweeping the full azimuth range near the firmware's elevation floor, you build a 360-degree interference map of your site.
+
+This is useful for three reasons. First, it documents which azimuths are contaminated by terrestrial emitters, so you can avoid those directions during sky observations. Second, it establishes a baseline that makes it possible to detect new interference sources when they appear. Third, it's just interesting to see what's transmitting at 10-12 GHz in your neighborhood.
+
+## What you'll measure
+
+- **RSSI versus azimuth** at one or more low elevation angles, producing a polar interference map
+- **Elevation falloff** — how quickly interference diminishes as you tilt away from the horizon
+- **Time-of-day variation** — intermittent emitters (automotive radar, industrial processes) that only appear at certain hours
+
+Terrestrial interference typically produces sharp, narrow RSSI peaks at specific azimuths — much narrower than the broad rises seen from satellites, because the sources are relatively close and the dish beam is tight. A cell tower's microwave backhaul link, for example, appears as a spike 1-3 degrees wide at the tower's bearing.
+
+## Prerequisites
+
+- Motors homed and calibrated (see [Calibration & Homing](/guides/calibration/))
+- TV search disabled (see [Disabling TV Search](/guides/disabling-search/))
+- LNA enabled (`dvb` > `lnbdc odu`)
+- Serial output logged to a file
+- Clear sightlines — no obstructions within 32.5 inches of the dish base that could shadow the beam at low elevation
+
+
+
+## Procedure
+
+
+
+1. **Home the motors and set minimum elevation.**
+
+ ```
+ TRK> mot
+ MOT> h 0
+ MOT> h 1
+ MOT> a 1 18
+ ```
+
+ Start at the firmware floor (18 degrees) for maximum terrestrial sensitivity.
+
+2. **Enable the LNA.**
+
+ ```
+ MOT> q
+ TRK> dvb
+ DVB> lnbdc odu
+ DVB> q
+ TRK> mot
+ ```
+
+3. **Run the first sweep.** Use `azscan` for a quick RSSI-only survey, or `azscanwxp` for transponder-cycling data.
+
+ For a fast survey:
+ ```
+ MOT> azscan 360 0 100
+ ```
+
+ For detailed data with lock detection:
+ ```
+ MOT> azscanwxp 0 360 100 8
+ ```
+
+ Using fewer transponders (8 instead of 32) speeds up the sweep. For RFI mapping, RSSI matters more than lock status — terrestrial emitters rarely produce valid DVB carriers.
+
+4. **Repeat at higher elevations.** Increase elevation in 2-degree steps to measure how interference falls off with angle.
+
+ ```
+ MOT> a 1 20
+ MOT> azscan 360 0 100
+ MOT> a 1 22
+ MOT> azscan 360 0 100
+ MOT> a 1 25
+ MOT> azscan 360 0 100
+ ```
+
+ Most terrestrial interference drops sharply between 18 and 25 degrees. The rate of falloff tells you whether the source is nearby (steep falloff) or distant (gradual falloff).
+
+5. **Check dual polarization.** Some terrestrial emitters are polarized. Run the 18-degree sweep in both H-pol (18V, boot default) and V-pol (13V via `lnbdc odu`).
+
+ ```
+ MOT> a 1 18
+ MOT> azscanwxp 0 360 100 8
+ ```
+
+ Compare H-pol and V-pol RSSI at each azimuth. A source that appears in only one polarization is a linearly polarized emitter — consistent with microwave backhaul antennas, which are typically single-polarization.
+
+6. **Time-of-day comparison.** For a thorough site survey, run the 18-degree sweep at different times:
+
+ - Early morning (05:00-06:00) — minimal human activity, automotive radar quiet
+ - Midday (12:00-13:00) — peak industrial and commercial activity
+ - Evening (20:00-21:00) — residential electronics, LED lighting harmonics
+ - Late night (02:00-03:00) — quietest baseline
+
+
+
+## Interpreting results
+
+Plot RSSI versus azimuth for each elevation angle. Terrestrial interference shows these characteristics:
+
+| Pattern | Likely source |
+|---------|---------------|
+| Sharp peak (1-3 deg wide), constant across time | Fixed microwave backhaul link or point-to-point relay |
+| Sharp peak, appears only during certain hours | Intermittent emitter (automotive radar, industrial process) |
+| Broad rise (10-20 deg wide) at low EL, absent at 25 deg | Urban RF clutter — aggregate of many weak sources at the horizon |
+| Peak that shifts azimuth between sweeps | Moving source (vehicle radar) or multipath reflection |
+| Peak present in H-pol only, absent in V-pol | Linearly polarized fixed emitter (backhaul antenna) |
+| Peak present in both polarizations | Unpolarized or circularly polarized source |
+
+**RSSI scale for terrestrial sources:**
+
+| RSSI range | Interpretation |
+|------------|----------------|
+| 489-520 | Normal noise floor with LNA, no detectable interference |
+| 520-600 | Marginal — may or may not affect sky observations at this azimuth |
+| 600-800 | Moderate interference — will degrade weak-signal DVB measurements |
+| 800+ | Strong interference — avoid this azimuth for sky work |
+
+
+
+## Common Ku-band terrestrial emitters
+
+Understanding what generates Ku-band interference helps you classify what you find:
+
+| Source type | Frequency range | Characteristics |
+|-------------|----------------|-----------------|
+| Fixed-service microwave links | 10.7-11.7 GHz | Narrow beam, fixed bearing, 24/7, single polarization |
+| Weather radar (X-band spillover) | 9.3-9.5 GHz harmonics | Pulsed, rotating (bearing shifts each sweep), broadband |
+| Automotive radar (77 GHz subharmonics) | Sporadic | Appears as brief spikes at road-facing azimuths, inconsistent timing |
+| Industrial ISM equipment | 10.525 GHz | Motion sensors, door openers — weak, very short range |
+| Satellite uplink earth stations | 14.0-14.5 GHz | Strong, fixed bearing, directional — may appear as ground reflection off nearby structures |
+| LED driver harmonics | Broadband | Very weak, correlates with lights-on hours, from switching power supplies |
+
+Most persistent interference at Ku-band comes from licensed fixed-service microwave links. These are point-to-point connections between cell towers, data centers, and broadcast facilities, typically transmitting at 10-100 mW into high-gain dishes. They produce the sharpest, most consistent RSSI peaks in your survey.
+
+## Building an RFI database
+
+For ongoing site monitoring, save each sweep with metadata:
+
+```
+# Filename convention
+rfi__