Skip to content
Instrument Control

RF Testing and Calibration with TofuPilot

Learn how to log RF test and calibration data for wireless products using TofuPilot, covering output power, sensitivity, and frequency accuracy.

JJulien Buteau
advanced10 min readMarch 14, 2026

RF Testing and Calibration with TofuPilot

Every wireless product needs RF testing: output power, receiver sensitivity, frequency accuracy, spurious emissions. For products with WiFi, Bluetooth, LoRa, cellular, or custom RF, these measurements determine whether the product meets regulatory requirements and actually works in the field. TofuPilot stores RF test data for trending, calibration tracking, and compliance.

RF Test Parameters

ParameterWhat it measuresWhy it matters
TX output power (dBm)Transmitted signal strengthToo high: regulatory violation. Too low: poor range
RX sensitivity (dBm)Minimum receivable signalDetermines receive range
Frequency error (ppm)Crystal/oscillator accuracyAffects interoperability
EVM (Error Vector Magnitude)Modulation qualityAffects data throughput
Spurious emissionsUnintended RF outputRegulatory compliance
RSSI accuracyReceived signal strength indicatorAffects link management

Logging RF Test Results

Basic RF Parametric Test

rf_test.py
from tofupilot import TofuPilotClient

client = TofuPilotClient()

def rf_production_test(serial, tx_power, rx_sensitivity, freq_error_ppm, evm_pct):
    client.create_run(
        procedure_id="RF-PARAMETRIC-BLE",
        unit_under_test={
            "serial_number": serial,
            "part_number": "IOT-SENSOR-V3",
        },
        run_passed=True,
        steps=[{
            "name": "TX Performance",
            "step_type": "measurement",
            "status": 0 <= tx_power <= 4,
            "measurements": [
                {"name": "tx_power_dbm", "value": tx_power, "unit": "dBm", "limit_low": 0, "limit_high": 4},
                {"name": "freq_error_ppm", "value": freq_error_ppm, "unit": "ppm", "limit_low": -20, "limit_high": 20},
                {"name": "evm_pct", "value": evm_pct, "unit": "%", "limit_high": 30},
            ],
        }, {
            "name": "RX Performance",
            "step_type": "measurement",
            "status": rx_sensitivity <= -90,
            "measurements": [
                {"name": "rx_sensitivity_dbm", "value": rx_sensitivity, "unit": "dBm", "limit_high": -90},
            ],
        }],
    )

Multi-Channel RF Test

Test across all operating channels to catch channel-specific issues.

rf_multi_channel.py
# BLE has 40 channels (0-39)
# Test a representative set
test_channels = [0, 12, 19, 20, 38, 39]

measurements = []
for ch in test_channels:
    set_channel(ch)
    power = measure_tx_power()
    measurements.append({
        "name": f"tx_power_ch{ch}_dbm",
        "value": power,
        "unit": "dBm",
        "limit_low": 0,
        "limit_high": 4,
    })

client.create_run(
    procedure_id="RF-MULTI-CHANNEL-BLE",
    unit_under_test={"serial_number": serial},
    run_passed=all(0 <= m["value"] <= 4 for m in measurements),
    steps=[{
        "name": "Multi-Channel TX Power",
        "step_type": "measurement",
        "status": True,
        "measurements": measurements,
    }],
)

RF Calibration

Many wireless products require per-unit RF calibration to compensate for component tolerances. The calibration process:

  1. Measure actual TX power at a reference level
  2. Calculate the offset from target
  3. Write a calibration value to the DUT's flash/EEPROM
  4. Verify calibrated output matches target
rf_calibration.py
def calibrate_rf(serial):
    # Step 1: Measure uncalibrated power
    raw_power = measure_tx_power()

    # Step 2: Calculate calibration offset
    target_power = 0.0  # dBm
    cal_offset = target_power - raw_power

    # Step 3: Write calibration to DUT
    write_cal_value(cal_offset)

    # Step 4: Verify
    calibrated_power = measure_tx_power()

    client.create_run(
        procedure_id="RF-CALIBRATION-BLE",
        unit_under_test={"serial_number": serial},
        run_passed=abs(calibrated_power - target_power) < 1.0,
        steps=[{
            "name": "TX Calibration",
            "step_type": "measurement",
            "status": True,
            "measurements": [
                {"name": "raw_tx_power_dbm", "value": raw_power, "unit": "dBm"},
                {"name": "cal_offset_db", "value": cal_offset, "unit": "dB"},
                {"name": "calibrated_tx_power_dbm", "value": calibrated_power, "unit": "dBm",
                 "limit_low": -1.0, "limit_high": 1.0},
            ],
        }],
    )

Tracking RF Performance Across Production

Calibration Offset Distribution

The distribution of calibration offsets tells you about your RF hardware consistency. A tight distribution (small offsets) means consistent PCB manufacturing. A wide or drifting distribution suggests:

  • Antenna placement variation
  • PCB impedance variation
  • Component lot changes (balun, matching network)

TX Power Over Time

Plot TX power across production. Look for:

PatternCause
Gradual driftTest equipment calibration drift
Step changeNew component lot, PCB revision
Increased varianceManufacturing process variation
Channel-dependent failuresAntenna or matching network issues

RX Sensitivity Monitoring

Receiver sensitivity is harder to measure in production (requires a shielded environment and calibrated signal source). Track it to catch:

  • LNA gain degradation
  • Filter mistuning
  • Increased noise figure from layout changes

Test Fixture Considerations

RF testing requires controlled RF environments:

SetupUse caseIsolation
Shielded boxProduction testing60-80 dB
Anechoic chamberAntenna characterization80+ dB
RF cable (conducted)Board-level testingDirect connection

Log the fixture type and serial number with each test run. If RF test results shift, the fixture calibration or cable condition may have changed.

Regulatory Compliance Data

RF certification (FCC, CE, IC, MIC) requires specific test data. While certification testing is done at accredited labs, pre-compliance data from TofuPilot helps you:

  • Predict certification outcomes based on production margins
  • Compare production units to the original certified unit
  • Track any changes that could void certification

More Guides

Put this guide into practice