OpenDPD ↔ MATLAB parity¶
Status: pre-registered; runs 1 and 2 done — the LTE cross-validation does not pass as registered (2026-10-08). The registration (rules, signals, procedures, budgets and the scored/diagnostic split) was committed before any comparison script existed or was run. The commits that follow change only this status line, the run log and the Results section; they do not edit the registration. If the registration itself must change, that is a dated amendment appended below, never an edit in place.
OpenDPD's EVM and ACLR numbers are only as useful to MATLAB users as they are checkable against the tools they already trust. This document fixes what is compared, with which MathWorks functions and which error budgets, before any number exists, and records the outcome afterwards, including everything that does not agree.
Rules¶
- Signals, MathWorks configuration and budgets below are fixed before the first run. A run never changes them.
- Budgets for the LTE cross-validation (P2, P3) are those of
docs/protocols/waveform-profiles.md§5, which were fixed there "before any model comparison, never relaxed afterwards": adjacent-channel ratio within 0.1 dB, RMS EVM within 0.05 percentage points. They are not re-derived here. - An item passes if its measured difference is within its budget. An item outside its budget is reported as failed with the numbers; the explanation is a hypothesis until it is shown (a diagnostic run is allowed and is reported next to the failure, never instead of it).
- If a comparison disagrees because the MATLAB-side code does not implement the registered procedure (a bug in the check, not a difference between the two tools), the MATLAB code is corrected to the registered procedure and the run is repeated. Every run, including the ones discarded, appears in the run log with the reason. MathWorks options (windows, segment lengths, filters) are not changed after seeing a result.
- "Diagnostic" items are reported but have no budget and do not decide the verdict.
- MathWorks sample data is not used or redistributed. Every signal is generated by the scripts from the
repository's own waveform generator and the synthetic PA of
tests/fixtures/synthetic.py; MATLAB needs only its own licensed toolboxes.
What this can and cannot show¶
- It checks OpenDPD's implementation of the procedure documented in
docs/protocols/waveform-profiles.md§2 against an independent implementation of the same documented procedure written with MathWorks building blocks (lteOFDMModulate,lteOFDMDemodulate,lteEVM,resample,comm.ACPR), and the ACLR againstcomm.ACPRused as MathWorks documents it. A disagreement means one implementation has a defect or the two tools define the quantity differently; agreement means neither has a defect that the registered signals can expose. - It does not show that the profile equals 3GPP TS 36.104 Annex E. The deviations listed in the protocol (§2, "Deviations from a standard EVM procedure") remain; quantifying them against a standards-conformant EVM measurement is a separate step.
- Not compared, with the reason: 5G NR EVM — OpenDPD has no NR waveform profile, so there is nothing to compare to the 5G Toolbox; adding one is a protocol decision, not a MATLAB-compatibility task. Hardware — nothing here is measured. Other MATLAB releases — one release is recorded (below).
Environment (recorded with the results)¶
MATLAB release and update, the version of every toolbox used (LTE Toolbox, Communications Toolbox, Signal Processing Toolbox), Python, NumPy, SciPy, the OpenDPD commit, and the SHA-256 of every input signal and script.
Signals¶
All generated deterministically by one script and stored as float32 I/Q, the precision of OpenDPD datasets; both sides read the same stored values and convert to double.
Waveform: ofdm-lte20-v1, seed 1, 10 subframes (opendpd waveforms generate --seed 1 --subframes 10): 307 200
samples at 30.72 MS/s. Interpolation to a higher rate U is band-limited and exact for this periodic signal
(FFT zero padding). The PA is memory_polynomial_pa of tests/fixtures/synthetic.py, applied to
a · x_U where a is the drive scale. The four drive levels were chosen to span about 1 % to 11 % EVM and
−41 to −27 dBc ACLR; this was read from a Python-only exploration before any MATLAB comparison existed, for
coverage and not to favour any outcome.
| id | content | rate | length |
|---|---|---|---|
| S0 | the package waveform | 30.72 MS/s | 307 200 |
| S1 | S0 interpolated ×4, no PA | 122.88 MS/s | 1 228 800 |
| S2 | PA, a = 0.15 |
122.88 MS/s | 1 228 800 |
| S3 | PA, a = 0.25 |
122.88 MS/s | 1 228 800 |
| S4 | PA, a = 0.35 |
122.88 MS/s | 1 228 800 |
| S5 | PA, a = 0.50 |
122.88 MS/s | 1 228 800 |
| S6 | S4, captured starting 3 subframes into the waveform (circular shift of 3 × 122 880 samples), then multiplied by the complex gain 0.8·e^{j0.4} and a carrier frequency offset of +350 Hz | 122.88 MS/s | 1 228 800 |
| S7 | S4 plus complex white Gaussian noise at 30 dB SNR (numpy.random.default_rng(7)) |
122.88 MS/s | 1 228 800 |
| S8 | S0 interpolated ×8, PA with a = 0.35 |
245.76 MS/s | 2 457 600 |
| S9 | S1 (ideal, no PA) with the same shift, gain and frequency offset as S6 | 122.88 MS/s | 1 228 800 |
S9 exists because the protocol's frequency-offset bound (0.01 Hz) comes from a clean-signal test; on the PA-distorted S6 the estimator's own scatter is of that order, so a bound taken from the clean case would not be a principled budget there. The offset is therefore scored on S9 and only compared between the two tools on S6.
Welch segment length nperseg for the ACLR: 1024, 2048, 4096 for the 122.88 MS/s signals (resolution bandwidth
120, 60, 30 kHz) and 2048, 4096, 8192 for S8 (the same three resolutions). At these values every band edge
(±9, ±11, ±29 MHz) falls on a bin boundary or centre in the same way for both tools.
P1 — waveform generation¶
LTE Toolbox lteOFDMModulate (NDLRB = 100, normal cyclic prefix, windowing 0) applied to the package's
symbols.npy (placed on the 1200 grid rows k = −600…−1, +1…+600 of 140 symbols) against the package waveform
x.npy. Compared after the single real scale factor that minimises the difference (reported).
| item | budget | kind |
|---|---|---|
| same sample count and same first-sample alignment | exact | scored |
| relative RMS difference ‖x − s·x_ref‖ / ‖x‖ | ≤ 1·10⁻⁶ | scored |
| scale factor s | reported | diagnostic |
The budget is set by the float32 storage of the package (about 6·10⁻⁸ relative) with an order of magnitude of margin.
P2 — ACLR against comm.ACPR¶
Signals S2–S8 (S1 and S9 are diagnostic: an ideal signal's adjacent power is below the estimator floor, which the
protocol says is "reported with the floor stated, not scored"). For every signal and every nperseg, the OpenDPD value is
ofdm-lte20-evm-v1 ACLR_L and ACLR_R (main channel [−9, +9] MHz, adjacent channels centred at ∓20 MHz, 18 MHz
rectangular bandwidth, Welch with Hann, 50 % overlap). The MATLAB value is comm.ACPR with
MainChannelFrequency = 0, MainMeasurementBandwidth = 18e6, AdjacentChannelOffset = [-20e6 20e6],
AdjacentMeasurementBandwidth = 18e6, SampleRate = fs, PowerUnits = 'dBW', in two registered modes:
- MathWorks default (
SpectralEstimation = 'Auto': Welch, Hamming, no overlap, one segment spanning the input, i.e. the finest resolution the capture allows). This is the "toolbox function with its default procedure" of protocol §6.2. It does not depend onnperseg, so it is evaluated once per signal and compared with eachnpersegof OpenDPD. - Aligned (
SpectralEstimation = 'Specify window parameters',SegmentLength = nperseg,OverlapPercentage = 50,Window = 'Hann',FFTLength = 'Same as segment length'), the same estimator settings as OpenDPD.
Left is the channel at −20 MHz, right at +20 MHz; the sign convention is leakage in dBc (negative), as in OpenDPD.
The MATLAB script first checks the sign and unit of comm.ACPR on a signal of known ratio and stops if they
differ from this convention.
| item | budget | kind |
|---|---|---|
|ACLR_OpenDPD − ACLR_ACPR(default)| per signal, side, nperseg |
≤ 0.1 dB | scored |
|ACLR_OpenDPD − ACLR_ACPR(aligned)| per signal, side, nperseg |
≤ 0.1 dB | scored |
| the same for S1 and S9 | reported | diagnostic |
a third comparator, SPT pwelch with the OpenDPD settings and band rule |
reported | diagnostic |
P3 — EVM against an independent implementation with MathWorks building blocks¶
Signals S0–S9. OpenDPD value: ofdm-lte20-evm-v1 EVM_RMS (percent). The MATLAB value is produced by this
chain, written from the procedure of protocol §2 and not from OpenDPD's code:
- Rate conversion to 30.72 MS/s by
resample(y, p, q)(MathWorks default Kaiser filter) with the exact rationalp/q = 30.72e6/fs. - Reference waveform
x_ref = lteOFDMModulateof the package symbols (as P1). Integer timing τ from the circular cross-correlation magnitude (FFT based) of the firstperiodsamples withx_ref; same sign convention as OpenDPD, y[n] ≈ x[(n + τ) mod period]. The registered signals have τ a whole number of subframes (0, or 3 × 30 720 for S6 and S9), so every OFDM symbol of the capture is complete; the handling of symbols cut by the capture edge is covered by the repository's unit tests, not by this comparison. - Coarse carrier frequency offset: the cyclic-prefix correlation of every symbol, skipping the first 32 prefix samples; f = −angle(Σ head·conj(tail)) / 2π × 15 kHz.
- Up to three rounds of: correct the offset,
lteOFDMDemodulate(enb, ·, 1)(FFT at the end of the cyclic prefix), one least-squares complex gain per subcarrier from the known symbols over all symbols (H = Σ conj(S)·Y / Σ |S|²), equalise, then the fine offset from the slope (polyfit) of the unwrapped per-symbol residual phase against time, stopping when the update is below 1 mHz. No per-symbol phase tracking. evm = lteEVM(S_equalised(:), S_reference(:));EVM_RMS = 100 · evm.RMS.
| item | budget | kind |
|---|---|---|
| |EVM_OpenDPD − EVM_MATLAB| per signal | ≤ 0.05 percentage points | scored |
| integer timing τ equal (S6, S9; τ = 0 for the others) | exact | scored |
| carrier frequency offset on S9: each tool within 0.01 Hz of the injected +350 Hz | ≤ 0.01 Hz | scored (protocol §5) |
| carrier frequency offset on S6: difference between the two estimates | reported | diagnostic |
| the same chain fed with OpenDPD's own rate-converted baseband signal (isolates the two resamplers) | reported | diagnostic |
lteFrequencyOffset coarse estimate on S6 |
reported | diagnostic |
rate-conversion difference: ‖resample − resample_poly‖ / ‖·‖ per rate |
reported | diagnostic |
The protocol records a 0.037 % EVM floor after rate conversion from 122.88 or 800 MS/s. A resampler difference of that size is within the 0.05 point budget only when it adds in quadrature to a larger EVM; the diagnostic row makes the contribution visible rather than assumed.
P4 — verdict rule¶
The LTE cross-validation (protocol §6) passes only if every scored item of P1, P2 (both modes) and P3 is within
its budget. A partial result is reported as such, item by item. The validation flag of
opendpd/core/metrics/ofdm_evm_v1.py is a protected-path change that needs science review; this document
supplies evidence for that review and does not change the flag.
Not yet registered¶
The comparison of OpenDPD's least-squares memory-polynomial models with comm.DPDCoefficientEstimator (same
data, same memory depth and degree, mapping of coefficient order and cross terms) needs the two conventions read
side by side first. Its signals, mapping, metrics and budgets are registered in an amendment committed before
that comparison is run.
Run log¶
| run | date | change since the previous run | outcome |
|---|---|---|---|
| 0 | 2026-10-08 | first execution of the harness | no result. The OpenDPD stage stopped because demodulate() returned None for S6 (synchronisation refused); the harness was changed to record a refusal as a result instead of stopping |
| 1 | 2026-10-08 | harness records refusals. The MATLAB chain was corrected to apply the protocol's rule that a normalised timing peak below 0.3 means missing_reference (§2 step 2): the chain description above omitted it, which is a defect of the check, not a difference between the tools |
registered signals S0–S9: 96 of 109 scored items within budget, 7 outside, 6 not evaluable. Record: matlab-parity-run1.json |
| 2 | 2026-10-08 | amendment 1 items added to the harness (S6b, S9b, rule-replica diagnostic, timing-peak table) | registered items unchanged from run 1; 6 added scored items all within budget: 102 of 115 within budget, 7 outside, 6 not evaluable. Record: matlab-parity.json |
Amendment 1 (2026-10-08, after run 1 and before run 2)¶
Run 1 showed two things the registration did not anticipate. Nothing registered above is changed; this amendment only adds items, and it is committed before the harness gains them.
F1 — timing range. The timing step (protocol §2 step 2) is a circular cross-correlation without
frequency-offset compensation, so with the 10-subframe package (T = 10 ms) its normalised peak falls as
|sinc(f·T)| with the carrier offset f. Measured with OpenDPD alone, before any MATLAB comparison of these
signals: 0.98 at 10 Hz, 0.86 at 30 Hz, 0.64 at 50 Hz, 0.009 at 100 Hz, 0.09 at 350 Hz; with a 1 ms waveform
(which the repository's ±350 Hz unit test uses) 0.81 at 350 Hz. Below 0.3 the profile reports
missing_reference. S6 and S9 (+350 Hz) are therefore refused by both OpenDPD and the MATLAB chain (peak
0.090 in both), so their scored EVM, timing and frequency-offset items have no value to compare.
F2 — band integration. The registration assumed that the band edges fall on bin boundaries or centres "in the
same way for both tools". They do not: ±9 MHz are bin centres at the registered resolutions, but ±11 and ±29 MHz
fall 1/3 of a bin from a centre (183.33 and 483.33 bins at 60 kHz), and the two tools treat such edges
differently. OpenDPD sums the bins whose centre lies in [lo, hi); comm.ACPR sums the enclosing range (the last
bin at or below lo through the first bin at or above hi), which at 60 kHz is 302 bins in each adjacent channel
against OpenDPD's 300, and 301 against 300 in the main channel. Run 1 reports 7 ACLR values outside the 0.1 dB
budget (all on S2, S3; the largest 0.21 dB).
Added items:
| id | item | budget | kind |
|---|---|---|---|
| A1-1 | Signals S6b and S9b: S6 and S9 with a carrier frequency offset of +30 Hz instead of +350 Hz (every other step unchanged). 30 Hz is the largest round offset whose OpenDPD-only timing peak (0.86) is well above the 0.3 rule; it was read from the OpenDPD-only exploration above. EVM_RMS: difference ≤ 0.05 percentage points; integer timing: equal; S9b frequency offset: each tool within 0.01 Hz of +30 Hz; S6b offset: difference between the tools reported | as for S6, S9 | scored (diagnostic for the S6b offset difference) |
| A1-2 | comm.ACPR (aligned mode) against a pwelch PSD integrated with comm.ACPR's documented-in-code rule (enclosing bin range, true bin frequencies), for every signal and nperseg: worst absolute difference |
reported | diagnostic (tests the explanation F2; it does not replace the registered comparison) |
| A1-3 | Normalised timing peak against injected offset (0, 10, 30, 50, 100, 350, 1000 Hz) for 1 and 10 subframes, OpenDPD only | reported | diagnostic (documents F1) |
The verdict rule is unchanged: the cross-validation passes only if every scored item, registered or added, is within its budget. The explanation of F2 is a hypothesis until A1-2 shows it; A1-2 cannot change the verdict of the registered ACLR items.
Results¶
Verdict: the registered LTE cross-validation does not pass as registered. Of 115 scored items 102 are within budget, 7 are outside it, and 6 cannot be evaluated because both tools refuse the signal. The reasons are specific and, except for the refusals, understood; none of them is a defect found in the EVM or waveform code.
What agrees:
- Waveform generation (P1).
lteOFDMModulateof the package symbols equals the package waveform to 2.9·10⁻⁸ relative RMS after one real scale factor (59.12; MathWorks normalises differently), same length, lag 0. - EVM (P3). On the ten evaluable signals (S0–S5, S7, S8 and the added S6b, S9b) the independent MATLAB chain
and OpenDPD differ by at most 2.1·10⁻⁹ percentage points against a budget of 0.05, except S0 (4·10⁻⁷, where
the EVM itself, 2·10⁻⁶ %, is the float32 quantisation floor of the package), with the same integer
timing. The same chain fed with OpenDPD's own rate-converted signal gives the same numbers, and
resampleandresample_polyagree to better than 10⁻¹⁵ relative at every rate (6·10⁻¹⁶ at most), so the two resamplers are not a source of difference here. On the clean S9b both tools recover the injected +30 Hz to 4·10⁻⁵ Hz. - ACLR estimator. A Signal Processing Toolbox
pwelchcomputation with OpenDPD's settings and band rule reproduces OpenDPD's ACLR to 10⁻¹⁴ dB on every signal and resolution.
What does not, and why:
- F2 —
comm.ACPRvs OpenDPD ACLR (7 scored values outside 0.1 dB, up to 0.21 dB, all on the low-distortion S2 and S3). The two tools integrate a band differently when its edge is not a bin centre. OpenDPD sums the bins whose centre lies in [lo, hi);comm.ACPRsums the enclosing range from the last bin at or below lo to the first bin at or above hi (ACPR.m,freqRange). At 60 kHz resolution that is 302 bins in each adjacent channel against OpenDPD's 300, and the extra bins sit at the steep near edge. Diagnostic A1-2 shows this is the whole difference: apwelchPSD integrated withcomm.ACPR's rule reproducescomm.ACPRto at most 2.5·10⁻⁴ dB in all 66 comparisons (11 signals × 3 resolutions × 2 sides). The effect scales with the bin width and with how much of the adjacent power is skirt (largest for S1, S2, S9; 0.02–0.09 dB for S5). It is a definitional difference between the two tools, not an estimator error; the registered budget was nevertheless exceeded and stays exceeded. - F1 — the 350 Hz signals S6 and S9 are refused by both tools. The timing step does not compensate a carrier
offset, so the correlation peak of the 10 ms waveform is 0.09 at 350 Hz (below the protocol's 0.3 rule); it is
0.86 at 30 Hz and 0.009 at 100 Hz (table below), and follows |sinc(f·T)|, which reaches 0.3 at about 75 Hz.
A capture whose offset exceeds that is reported as
missing_reference, however good the signal. Whether that matters depends on the lab setup (a shared reference clock keeps the offset to a few Hz). Both tools agree on the refusal, which is why it is reported as agreement on a status and as not evaluable for the numeric items. The added S6b/S9b at +30 Hz exercise the offset estimation, timing and gain handling that S6/S9 were meant to, and pass. - F3 — the reference waveform's own ACLR is about −42 dBc (S1, no PA; −42.2 dBc at 60 kHz resolution). The protocol specifies the test waveform without windowing or filtering, which is consistent with this level (the cause was not isolated further here). An ideally linearised PA reproduces the input's own skirt, so the profile cannot show an ACLR better than about −42 dBc with this waveform, and the adjacent power of the low-distortion S2 is mostly that skirt. This is recorded, not changed.
Limits of this evidence:
- One MATLAB release (R2026a Update 5) on Linux, and one machine. Other releases and Windows/macOS were not run.
- The MATLAB EVM chain is an independent implementation of the documented procedure, written with MathWorks functions, by the same author who had read OpenDPD's implementation. Agreement shows that the two implementations compute the same thing; it does not show that the procedure equals 3GPP TS 36.104 Annex E, which the protocol lists as deviations and which this run does not quantify.
- The signals are synthetic (a short-memory polynomial PA); no measured data and no hardware are involved.
- The 6 not-evaluable items are not counted as agreement.
What this run does not do: it does not change the validation flag of opendpd/core/metrics/ofdm_evm_v1.py
(protected path, science review), and it does not edit docs/protocols/. The maintainers decide whether the
profile should keep its band rule (document the expected ≤ 0.2 dB difference to comm.ACPR at resolutions of
60 kHz and coarser), state the carrier-offset capture range, and state the waveform's ACLR floor.
Reproduce: python scripts/matlab_parity.py --work /tmp/parity --matlab <path to matlab> --write-report (about
two minutes; needs the Communications, LTE and Signal Processing Toolboxes). Exit status 1 means the registered
cross-validation did not pass.
Run 2 — 2026-10-08. MATLAB 26.1.0.3346908 (R2026a) Update 5; Communications Toolbox 26.1, LTE Toolbox 26.1, Signal Processing Toolbox 26.1. Python 3.13.14, NumPy 2.4.4, SciPy 1.18.0. OpenDPD commit 314b3ced7e85 with local modifications.
Scored items: 102 of 115 within budget, 7 outside budget, 6 not evaluable — the registered cross-validation does not pass as registered.
Outside budget:
- P2 S2 ACLR_L nperseg=1024 vs comm.ACPR aligned: difference 0.15335180894727074 (budget <= 0.1 dB)
- P2 S2 ACLR_R nperseg=1024 vs comm.ACPR default: difference 0.1617750901145243 (budget <= 0.1 dB)
- P2 S2 ACLR_R nperseg=1024 vs comm.ACPR aligned: difference 0.15779905304619035 (budget <= 0.1 dB)
- P2 S2 ACLR_L nperseg=2048 vs comm.ACPR default: difference -0.20636538612878041 (budget <= 0.1 dB)
- P2 S2 ACLR_L nperseg=4096 vs comm.ACPR default: difference -0.1292434422656754 (budget <= 0.1 dB)
- P2 S3 ACLR_L nperseg=1024 vs comm.ACPR aligned: difference 0.11454800855568692 (budget <= 0.1 dB)
- P2 S3 ACLR_R nperseg=1024 vs comm.ACPR aligned: difference 0.11386556206630871 (budget <= 0.1 dB)
Not evaluable (a tool refused the signal, so no difference exists to compare):
- P3 S6 EVM_RMS (percent): not evaluable: OpenDPD missing_reference (normalised peak 0.090); MATLAB chain missing_reference (normalised peak 0.090); the two tools agree on the refusal
- P3 S6 integer timing: not evaluable: OpenDPD missing_reference (normalised peak 0.090); MATLAB chain missing_reference (normalised peak 0.090); the two tools agree on the refusal
- P3 S9 EVM_RMS (percent): not evaluable: OpenDPD missing_reference (normalised peak 0.090); MATLAB chain missing_reference (normalised peak 0.090); the two tools agree on the refusal
- P3 S9 integer timing: not evaluable: OpenDPD missing_reference (normalised peak 0.090); MATLAB chain missing_reference (normalised peak 0.090); the two tools agree on the refusal
- P3 S9 frequency offset, OpenDPD: not evaluable: OpenDPD missing_reference (normalised peak 0.090); MATLAB chain missing_reference (normalised peak 0.090); the two tools agree on the refusal
- P3 S9 frequency offset, MATLAB: not evaluable: OpenDPD missing_reference (normalised peak 0.090); MATLAB chain missing_reference (normalised peak 0.090); the two tools agree on the refusal
P1 — waveform generation¶
| item | kind | OpenDPD package | MATLAB | difference | budget | within |
|---|---|---|---|---|---|---|
| sample count | scored | 307200 | 307200 | 0 | exact | yes |
| first-sample alignment (peak lag) | scored | 0 | 0 | 0 | exact | yes |
| relative RMS difference after one real scale | scored | — | 2.85483e-08 | 2.85483e-08 | <= 1e-06 | yes |
| scale factor | diagnostic | — | 59.1207 | — | — | — |
P2 — ACLR against comm.ACPR¶
Worst absolute difference over both sides and all nperseg values (full list in matlab-parity.json); budget 0.1 dB for scored rows.
| signal | MATLAB comparator | kind | values compared | worst difference (dB) | all within |
|---|---|---|---|---|---|
| S1 | enclosing-rule replica of comm.ACPR aligned | diagnostic | 6 | -0.000157 | — |
| S1 | comm.ACPR default | diagnostic | 6 | -0.25 | — |
| S1 | comm.ACPR aligned | diagnostic | 6 | 0.175 | — |
| S1 | pwelch (OpenDPD settings) | diagnostic | 6 | 0 | — |
| S2 | enclosing-rule replica of comm.ACPR aligned | diagnostic | 6 | 8.95e-05 | — |
| S2 | comm.ACPR default | scored | 6 | -0.206 | no |
| S2 | comm.ACPR aligned | scored | 6 | 0.158 | no |
| S2 | pwelch (OpenDPD settings) | diagnostic | 6 | -7.11e-15 | — |
| S3 | enclosing-rule replica of comm.ACPR aligned | diagnostic | 6 | 9.81e-05 | — |
| S3 | comm.ACPR default | scored | 6 | -0.0892 | yes |
| S3 | comm.ACPR aligned | scored | 6 | 0.115 | no |
| S3 | pwelch (OpenDPD settings) | diagnostic | 6 | 7.11e-15 | — |
| S4 | enclosing-rule replica of comm.ACPR aligned | diagnostic | 6 | 0.000115 | — |
| S4 | comm.ACPR default | scored | 6 | -0.0398 | yes |
| S4 | comm.ACPR aligned | scored | 6 | 0.0972 | yes |
| S4 | pwelch (OpenDPD settings) | diagnostic | 6 | 0 | — |
| S5 | enclosing-rule replica of comm.ACPR aligned | diagnostic | 6 | 0.000104 | — |
| S5 | comm.ACPR default | scored | 6 | -0.0247 | yes |
| S5 | comm.ACPR aligned | scored | 6 | 0.0906 | yes |
| S5 | pwelch (OpenDPD settings) | diagnostic | 6 | 7.11e-15 | — |
| S6 | enclosing-rule replica of comm.ACPR aligned | diagnostic | 6 | 0.000106 | — |
| S6 | comm.ACPR default | scored | 6 | 0.0334 | yes |
| S6 | comm.ACPR aligned | scored | 6 | 0.0973 | yes |
| S6 | pwelch (OpenDPD settings) | diagnostic | 6 | 7.11e-15 | — |
| S7 | enclosing-rule replica of comm.ACPR aligned | diagnostic | 6 | 8.59e-05 | — |
| S7 | comm.ACPR default | scored | 6 | -0.0395 | yes |
| S7 | comm.ACPR aligned | scored | 6 | 0.0847 | yes |
| S7 | pwelch (OpenDPD settings) | diagnostic | 6 | 7.11e-15 | — |
| S8 | enclosing-rule replica of comm.ACPR aligned | diagnostic | 6 | 5.79e-05 | — |
| S8 | comm.ACPR default | scored | 6 | -0.0384 | yes |
| S8 | comm.ACPR aligned | scored | 6 | 0.0942 | yes |
| S8 | pwelch (OpenDPD settings) | diagnostic | 6 | -7.11e-15 | — |
| S9 | enclosing-rule replica of comm.ACPR aligned | diagnostic | 6 | -0.000243 | — |
| S9 | comm.ACPR default | diagnostic | 6 | 0.272 | — |
| S9 | comm.ACPR aligned | diagnostic | 6 | 0.175 | — |
| S9 | pwelch (OpenDPD settings) | diagnostic | 6 | 0 | — |
| S6b | enclosing-rule replica of comm.ACPR aligned | diagnostic | 6 | 0.000106 | — |
| S6b | comm.ACPR default | diagnostic | 6 | 0.033 | — |
| S6b | comm.ACPR aligned | diagnostic | 6 | 0.0974 | — |
| S6b | pwelch (OpenDPD settings) | diagnostic | 6 | -7.11e-15 | — |
| S9b | enclosing-rule replica of comm.ACPR aligned | diagnostic | 6 | -0.000243 | — |
| S9b | comm.ACPR default | diagnostic | 6 | 0.272 | — |
| S9b | comm.ACPR aligned | diagnostic | 6 | 0.175 | — |
| S9b | pwelch (OpenDPD settings) | diagnostic | 6 | 7.11e-15 | — |
P3 — EVM against the independent MATLAB chain¶
| item | kind | OpenDPD | MATLAB | difference | budget | within |
|---|---|---|---|---|---|---|
| S0 EVM_RMS (percent) | scored | 1.93006e-06 | 2.33372e-06 | 4.037e-07 | <= 0.05 points | yes |
| S0 integer timing | scored | 0 | 0 | 0 | exact | yes |
| S1 EVM_RMS (percent) | scored | 0.0298635 | 0.0298635 | 6.89e-10 | <= 0.05 points | yes |
| S1 integer timing | scored | 0 | 0 | 0 | exact | yes |
| S1 EVM_RMS, MATLAB chain on OpenDPD's baseband (isolates the resamplers) | diagnostic | 0.0298635 | 0.0298635 | 6.89e-10 | — | — |
| S1 relative difference of the two rate converters | diagnostic | — | 3.94603e-16 | — | — | — |
| S2 EVM_RMS (percent) | scored | 0.983657 | 0.983657 | -1.073e-09 | <= 0.05 points | yes |
| S2 integer timing | scored | 0 | 0 | 0 | exact | yes |
| S2 EVM_RMS, MATLAB chain on OpenDPD's baseband (isolates the resamplers) | diagnostic | 0.983657 | 0.983657 | -1.073e-09 | — | — |
| S2 relative difference of the two rate converters | diagnostic | — | 3.94576e-16 | — | — | — |
| S3 EVM_RMS (percent) | scored | 2.72583 | 2.72583 | -1.05e-09 | <= 0.05 points | yes |
| S3 integer timing | scored | 0 | 0 | 0 | exact | yes |
| S3 EVM_RMS, MATLAB chain on OpenDPD's baseband (isolates the resamplers) | diagnostic | 2.72583 | 2.72583 | -1.05e-09 | — | — |
| S3 relative difference of the two rate converters | diagnostic | — | 3.93994e-16 | — | — | — |
| S4 EVM_RMS (percent) | scored | 5.31525 | 5.31525 | -9.998e-10 | <= 0.05 points | yes |
| S4 integer timing | scored | 0 | 0 | 0 | exact | yes |
| S4 EVM_RMS, MATLAB chain on OpenDPD's baseband (isolates the resamplers) | diagnostic | 5.31525 | 5.31525 | -9.998e-10 | — | — |
| S4 relative difference of the two rate converters | diagnostic | — | 3.94593e-16 | — | — | — |
| S5 EVM_RMS (percent) | scored | 10.6382 | 10.6382 | -9.036e-10 | <= 0.05 points | yes |
| S5 integer timing | scored | 0 | 0 | 0 | exact | yes |
| S5 EVM_RMS, MATLAB chain on OpenDPD's baseband (isolates the resamplers) | diagnostic | 10.6382 | 10.6382 | -9.036e-10 | — | — |
| S5 relative difference of the two rate converters | diagnostic | — | 4.00223e-16 | — | — | — |
| S6 EVM_RMS (percent) | scored | — | — | — | <= 0.05 points | — |
| S6 integer timing | scored | — | — | — | exact | — |
| S7 EVM_RMS (percent) | scored | 5.44974 | 5.44974 | -1.28e-09 | <= 0.05 points | yes |
| S7 integer timing | scored | 0 | 0 | 0 | exact | yes |
| S7 EVM_RMS, MATLAB chain on OpenDPD's baseband (isolates the resamplers) | diagnostic | 5.44974 | 5.44974 | -1.28e-09 | — | — |
| S7 relative difference of the two rate converters | diagnostic | — | 3.93829e-16 | — | — | — |
| S8 EVM_RMS (percent) | scored | 5.3213 | 5.3213 | -9.74e-10 | <= 0.05 points | yes |
| S8 integer timing | scored | 0 | 0 | 0 | exact | yes |
| S8 EVM_RMS, MATLAB chain on OpenDPD's baseband (isolates the resamplers) | diagnostic | 5.3213 | 5.3213 | -9.74e-10 | — | — |
| S8 relative difference of the two rate converters | diagnostic | — | 5.62099e-16 | — | — | — |
| S9 EVM_RMS (percent) | scored | — | — | — | <= 0.05 points | — |
| S9 integer timing | scored | — | — | — | exact | — |
| S9 frequency offset, OpenDPD | scored | 350 | — | — | <= 0.01 Hz of the injected value | — |
| S9 frequency offset, MATLAB | scored | 350 | — | — | <= 0.01 Hz of the injected value | — |
| S6b EVM_RMS (percent) | scored | 5.31521 | 5.31521 | -9.933e-10 | <= 0.05 points | yes |
| S6b integer timing | scored | 92160 | 92160 | 0 | exact | yes |
| S6b EVM_RMS, MATLAB chain on OpenDPD's baseband (isolates the resamplers) | diagnostic | 5.31521 | 5.31521 | -9.934e-10 | — | — |
| S6b relative difference of the two rate converters | diagnostic | — | 3.92053e-16 | — | — | — |
| S6b frequency offset, OpenDPD vs MATLAB estimate | diagnostic | 30.0002 | 30.0002 | 9.962e-12 | — | — |
| S6b frequency offset, lteFrequencyOffset (cyclic prefix, no guard) | diagnostic | 30.0002 | 30.0046 | 0.00443 | — | — |
| S9b EVM_RMS (percent) | scored | 0.0264295 | 0.0264295 | 2.02e-09 | <= 0.05 points | yes |
| S9b integer timing | scored | 92160 | 92160 | 0 | exact | yes |
| S9b EVM_RMS, MATLAB chain on OpenDPD's baseband (isolates the resamplers) | diagnostic | 0.0264295 | 0.0264295 | 2.02e-09 | — | — |
| S9b relative difference of the two rate converters | diagnostic | — | 3.95442e-16 | — | — | — |
| S9b frequency offset, OpenDPD | scored | 30 | 30 | 3.939e-05 | <= 0.01 Hz of the injected value | yes |
| S9b frequency offset, MATLAB | scored | 30 | 30 | 3.939e-05 | <= 0.01 Hz of the injected value | yes |
A1-3 — timing peak against carrier offset (OpenDPD only)¶
| waveform | 0 Hz | 10 Hz | 30 Hz | 50 Hz | 100 Hz | 350 Hz | 1000 Hz |
|---|---|---|---|---|---|---|---|
| 1 subframes | 1.000 | 1.000 | 0.999 | 0.996 | 0.984 | 0.811 | 0.025 |
| 10 subframes | 1.000 | 0.984 | 0.859 | 0.637 | 0.009 | 0.091 | 0.009 |
The profile reports missing_reference below a peak of 0.3.