Skip to content

Recover range and velocity from synthetic FMCW chirps

Generate synthetic FMCW beat signals and recover known range and radial velocity while reporting resolution and ambiguity.

Radio Remi: I want you to predict the result, inspect each intermediate value, and keep the final claim inside the evidence., your practice guide

Radio Remi: I want you to predict the result, inspect each intermediate value, and keep the final claim inside the evidence.
Predict the reading, then compare it with the measurement.

Python 3 in your browser (JupyterLite)

Python · no install

Tier 2 · Web · paste-in setup · No account

Version tested: Python 3.12.7 / Pyodide 0.27.6 in JupyterLite 0.6.4; Chromium 148.0.7778.96; captureSource playwright:jupyterlite. Date: 2026-09-10.

Open the notebook in your browser and run each Python cell; no install or account is needed.

Three ways to run: use JupyterLite here with no install; run main.py locally from the downloadable lab folder; or open the same notebook in Google Colab.

Open in your browser (new tab)

Steps

Screens captured against Python 3 in your browser (JupyterLite) Python 3.12.7 / Pyodide 0.27.6 in JupyterLite 0.6.4; Chromium 148.0.7778.96; captureSource playwright:jupyterlite on 2026-09-10; the tool may have moved on — the text steps are the contract.

  1. 1 Step 1

    Do
    In the JupyterLite notebook, run the Step 1 cell to freeze waveform and target assumptions.
    You will see
    Input: execute notebook step 1 with the record’s unchanged fixture, seed, and parameters. Observed: bandwidth=600 MHz; chirp=60 us; carrier=60 GHz Observed: samples/chirp=128; sample_rate=2.133 MHz Observed: targets=7.5 m and 15.0 m; no RF hardware
    Why it matters
    Expected: STEP 1 complete from this deterministic notebook step. Interpretation: For a linear chirp, slope equals bandwidth divided by chirp duration. Action: Freeze waveform and target assumptions. Boundary: this local fixture is not a live device, network, or site measurement.
    JupyterLite step 1 for Recover range and velocity from synthetic FMCW chirps, showing the printed evidence for this step.
    Step 1 · Python 3 in your browser (JupyterLite); numbered callout added to a real capture. Enlarge screenshot (new tab)
  2. 2 Step 2

    Do
    In the JupyterLite notebook, run the Step 2 cell (run_step(2)) to calculate delays and beat frequencies.
    You will see
    Input: execute notebook step 2 with the record’s unchanged fixture, seed, and parameters. Observed: 7.5 50.035 500.346 Observed: 15.0 100.069 1000.692 Observed: Expected delay and beat
    Why it matters
    Expected: STEP 2 complete from this deterministic notebook step. Interpretation: A target at range R creates an approximate round-trip delay of 2R/c. Action: Calculate delays and beat frequencies. Boundary: this local fixture is not a live device, network, or site measurement.
    JupyterLite step 2 for Recover range and velocity from synthetic FMCW chirps, showing the printed evidence for this step.
    Step 2 · Python 3 in your browser (JupyterLite); numbered callout added to a real capture. Enlarge screenshot (new tab)
  3. 3 Step 3

    Do
    In the JupyterLite notebook, run the Step 3 cell (run_step(3)) to generate one mixed beat signal.
    You will see
    Input: execute notebook step 3 with the record’s unchanged fixture, seed, and parameters. Observed: dt=468.750 ns Observed: 0 1.65000 Observed: 1 -0.54077
    Why it matters
    Expected: STEP 3 complete from this deterministic notebook step. Interpretation: Mixing transmit and receive signals produces a beat frequency linked to delay and range. Action: Generate one mixed beat signal. Boundary: this local fixture is not a live device, network, or site measurement.
    JupyterLite step 3 for Recover range and velocity from synthetic FMCW chirps, showing the printed evidence for this step.
    Step 3 · Python 3 in your browser (JupyterLite); numbered callout added to a real capture. Enlarge screenshot (new tab)
  4. 4 Step 4

    Do
    In the JupyterLite notebook, run the Step 4 cell (run_step(4)) to perform a range DFT.
    You will see
    Input: execute notebook step 4 with the record’s unchanged fixture, seed, and parameters. Observed: 7.50 7.49 0.005 Observed: 15.00 14.99 0.010 Observed: Rectangular-window DFT; no calibration correction.
    Why it matters
    Expected: STEP 4 complete from this deterministic notebook step. Interpretation: Samples within one chirp form range bins. Action: Run a range DFT. Boundary: this local fixture is not a live device, network, or site measurement.
    JupyterLite step 4 for Recover range and velocity from synthetic FMCW chirps, showing the printed evidence for this step.
    Step 4 · Python 3 in your browser (JupyterLite); numbered callout added to a real capture. Enlarge screenshot (new tab)
  5. 5 Step 5

    Do
    In the JupyterLite notebook, run the Step 5 cell (run_step(5)) to compare phase across chirps.
    You will see
    Input: execute notebook step 5 with the record’s unchanged fixture, seed, and parameters. Observed: 1 -1.25 -500.3 Observed: 2 2.50 1000.7 Observed: Slow-time Doppler fixture
    Why it matters
    Expected: STEP 5 complete from this deterministic notebook step. Interpretation: Doppler resolution improves with a longer coherent observation, while frame rate and target change limit how long samples remain comparable. Action: Compare phase across chirps. Boundary: this local fixture is not a live device, network, or site measurement.
    JupyterLite step 5 for Recover range and velocity from synthetic FMCW chirps, showing the printed evidence for this step.
    Step 5 · Python 3 in your browser (JupyterLite); numbered callout added to a real capture. Enlarge screenshot (new tab)
  6. 6 Step 6

    Do
    In the JupyterLite notebook, run the Step 6 cell (run_step(6)) to change bandwidth and chirp time.
    You will see
    Input: execute notebook step 6 with the record’s unchanged fixture, seed, and parameters. Observed: 300 60 0.500 31.98 Observed: 600 60 0.250 15.99 Observed: 600 120 0.250 15.99
    Why it matters
    Expected: STEP 6 complete from this deterministic notebook step. Interpretation: Ideal range resolution is approximately c divided by twice the swept bandwidth, so more bandwidth separates closer reflectors. Action: Change bandwidth and chirp time. Boundary: this local fixture is not a live device, network, or site measurement.
    JupyterLite step 6 for Recover range and velocity from synthetic FMCW chirps, showing the printed evidence for this step.
    Step 6 · Python 3 in your browser (JupyterLite); numbered callout added to a real capture. Enlarge screenshot (new tab)
  7. 7 Step 7

    Do
    In the JupyterLite notebook, run the Step 7 cell (run_step(7)) to write a bounded result card.
    You will see
    Input: execute notebook step 7 with the record’s unchanged fixture, seed, and parameters. Observed: target1_error=0.005 m Observed: target2_error=0.010 m Observed: ideal_range_resolution=0.250 m
    Why it matters
    Expected: STEP 7 complete from this deterministic notebook step. Interpretation: Synthetic chirps verify maths and code, not mmWave hardware, antennas, or a deployed scene. Action: Write a bounded result card. Boundary: this local fixture is not a live device, network, or site measurement.
    JupyterLite step 7 for Recover range and velocity from synthetic FMCW chirps, showing the printed evidence for this step.
    Step 7 · Python 3 in your browser (JupyterLite); numbered callout added to a real capture. Enlarge screenshot (new tab)

Chapter checks

These questions refer to the chapter’s examples. Use the return links to review their answers.

  1. What mainly improves ideal FMCW range resolution?

    Return to the chapter’s knowledge check
  2. Which sample dimension supplies Doppler evidence?

    Return to the chapter’s knowledge check

Caution

The supplied data and simulation verify the calculation path only. Reopen the prepared notebook if screens change, and validate any field claim with measured hardware and site evidence.

Return to FMCW mmWave Radar: Range, Doppler, and Angle · Browse Labs