Evaluating a PA or DPD with a reference waveform (EVM and ACLR)¶
Plan S15 adds one reference waveform, ofdm-lte20-v1 (CP-OFDM with the LTE
20 MHz numerology and known 64QAM symbols), and one evaluation profile,
ofdm-lte20-evm-v1, that measures the RMS error vector magnitude and the
adjacent-channel leakage of a capture made while that waveform was played.
Everything runs in Python; MATLAB is only the independent backend maintainers
use to cross-validate it (docs/protocols/waveform-profiles.md).
The profile is pending cross-validation: the GUI does not offer it yet,
opendpd profiles lists it with that status, and every result it produces
says so. Nothing about the existing profiles changes.
1. Generate the waveform and play it¶
opendpd waveforms generate --seed 1 --subframes 10 --out ./waveforms/lte20-seed1
opendpd waveforms show ./waveforms/lte20-seed1/waveform.json
x.npy (float32 I/Q at 30.72 MS/s, unit average power) is the signal to
play in a loop; symbols.npy holds the reference symbols; waveform.json
holds the specification and the package hash. The package is regenerated
from the specification (id, seed, length) whenever it is needed, so a copy
cannot drift from what was played.
2. Capture and import with the binding¶
Capture the PA input and output as usual (any rate that is an exact rational multiple of 30.72 MS/s, for example 122.88 MS/s; 800 MS/s also works). Then import the capture and bind it to the waveform:
opendpd datasets import capture.csv --id pa-lte20 --fs 122.88e6 --bandwidth 18e6 --n-sub-ch 1 --nperseg 4096 --units normalized --waveform ./waveforms/lte20-seed1/waveform.json --workspace WS
The import regenerates the waveform, cross-correlates it with the imported
input column and records the offset and the correlation peak in the
dataset (signal.waveform). An input that does not correlate with the
waveform is refused with the peak value; the captured data itself is never
modified.
3. Train and read the result¶
opendpd run --recipe pa-gru-smoke-v1 --dataset pa-lte20 --workspace WS
opendpd evaluate <run_id> --workspace WS --profile ofdm-lte20-evm-v1
Every run stores the profile next to the others under runs/<id>/results/.
EVM_RMS (%) and EVM_DB come from the data-aided demodulation of the
evaluated signal (the PA model output for a PA run, the linearised output for
a DPD run); ACLR_L / ACLR_R (dBc, leakage convention) come from the PSD
at the capture rate and need at least 58 MS/s so that the first adjacent
channel is inside the capture.
What the statuses mean¶
| Status | Why |
|---|---|
missing_reference |
the dataset is not bound to the waveform, or the evaluated signal does not correlate with it (peak below 0.3) |
not_applicable |
the capture rate cannot be converted exactly, is below 30.72 MS/s, or (ACLR) does not contain the adjacent channel; nperseg or the sample rate is unknown |
invalid |
non-finite samples |
The built-in ten-carrier captures are not bound to any waveform and report
missing_reference under this profile: that is the correct answer, not a
gap to fill by re-using the profile's name for another definition.