Skip to content

cell M6: EVM over F1 (filtered uplink EVM in the measurement reports, F1 v16) - #571

Merged
josephnef merged 1 commit into
masterfrom
feat/m6-evm-f1
Nov 13, 2026
Merged

josephnef merged 1 commit into
masterfrom
feat/m6-evm-f1

Conversation

@josephnef

Copy link
Copy Markdown
Collaborator

First item of #566 (M6 follow-ups), epic #254. M6's first deliverable lists RSSI/SNR/EVM in the DUs' measurement reports, but F1 carried only RSSI and SNR.

What

  • src/cell/Handover.h MeasTable: an L3-filtered EVM per (cell, UE), fed only by frames that carry one (raw 0 = none). MeasEntry gains evm_db / evm_valid.
  • F1 v16:
    • UeMeas.evm_qdb (quarter dB) and HeardUe.evm_db (dB), with sentinels for "none" (kNoEvmQ, kNoEvm8);
    • a real value is clamped one above the sentinel, so it never reads as none.
  • DU: feeds each frame's EVM, from its own UEs and from the other cells' UEs it hears.
  • CU: logs it as the last element of each ran.meas tuple (null when none), so earlier positions are unchanged.
  • Selftests (cell_m6): filtered EVM from mixed frames, none for a link that never carried one, round trip through the report, no collision with the sentinel.

The A3 decision #566 asks for: EVM is reported, not used by the A3. The A3 ranks cells on a neighbour's margin over the serving cell, and RSSI or SNR measured on the same frames does that. EVM tracks SNR and is flat at the rig's levels (−30 to −33 dB at SNR 38–39 dB), so it adds no ranking there. It's per-link quality for scheduling and link adaptation. Written in docs/cell-m6.md.

Rig: m6_handover passes. The CU received 165 own-UE EVMs (median −33.5 dB) and 164 heard (median −34.0 dB), none missing.

🤖 Generated with Claude Code

…ment reports (F1 v16)

MeasTable filters EVM (L3) from the frames that carry one, next to RSSI and
SNR; F1 v16 carries it in UeMeas (quarter dB) and HeardUe (dB), with a
sentinel for none (a real value never encodes as it); the DU feeds each
frame's EVM for its own UEs and the ones it hears; the CU logs it last in each
ran.meas tuple. Reported, not used by the A3 (docs: why).

Rig: m6_handover passes; the CU received 165 own-UE EVMs (median -33.5 dB)
and 164 heard (median -34.0 dB), none missing.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@qodo-free-for-open-source-projects

Copy link
Copy Markdown

PR Summary by Qodo

Report filtered uplink EVM over F1 v16

✨ Enhancement 🧪 Tests 📝 Documentation 🕐 20-40 Minutes

Grey Divider

AI Description

• Add filtered EVM to DU reports for own and heard UEs, preserving missing measurements.
• Expose EVM in CU measurement logs without changing A3 handover decisions.
• Test report round-trips and sentinel handling; document why EVM is not an A3 metric.
Diagram

sequenceDiagram
    participant Radio as Radio RX
    participant DU as DU
    participant Filter as MeasTable
    participant F1 as F1 v16
    participant CU as CU
    participant Log as ran.meas
    participant A3 as A3
    Radio->>DU: Uplink frames with optional EVM
    DU->>Filter: Update own and heard links
    Filter-->>DU: Fresh filtered snapshot
    DU->>F1: Build and encode report
    F1-->>CU: EVM values or sentinels
    CU->>Log: Append EVM or null
    CU->>A3: Evaluate RSSI or SNR
Loading
High-Level Assessment

Keep EVM in the existing per-link filter and versioned F1 measurement reports. Sending raw EVM separately would sacrifice the reports' filtering and freshness behavior while adding another transport path; retaining RSSI/SNR for A3 avoids changing handover ranking.

Files changed (6) +95 / -20

Enhancement (4) +59 / -17
main.cppFeed available frame EVM into DU measurements +11/-2

Feed available frame EVM into DU measurements

• Converts radio EVM to dB when present and updates the measurement table for both own UEs and UEs heard from other cells. Treats raw zero as no measurement.

examples/cell/main.cpp

F1.hCarry filtered EVM in F1 v16 reports +15/-3

Carry filtered EVM in F1 v16 reports

• Adds EVM fields and missing-value sentinels to own-UE and heard-UE measurements, then serializes and decodes them. Clamps real values above the sentinels to prevent ambiguity.

src/cell/F1.h

Handover.hFilter optional EVM per cell and UE +19/-7

Filter optional EVM per cell and UE

• Adds an independent L3 EVM filter that updates only when a frame supplies EVM. Snapshots mark EVM valid only while its own samples are fresh.

src/cell/Handover.h

main.cppAppend EVM to CU measurement logs +14/-5

Append EVM to CU measurement logs

• Adds EVM as the last element of own-UE and heard-UE ran.meas tuples, emitting null for missing measurements. Leaves the existing tuple positions and A3 inputs unchanged.

tools/ran-controller/main.cpp

Tests (1) +27 / -0
cell_m6_selftest.cppTest EVM filtering and F1 sentinel handling +27/-0

Test EVM filtering and F1 sentinel handling

• Covers reports built from mixed frames, links with no EVM, encode/decode round-trips, and clamping that keeps a real heard-UE value distinct from the missing sentinel.

tests/cell_m6_selftest.cpp

Documentation (1) +9 / -3
cell-m6.mdDocument reported EVM and its exclusion from A3 +9/-3

Document reported EVM and its exclusion from A3

• Describes EVM in filtered measurements and F1 v16 reports. Explains why A3 still ranks cells using RSSI or SNR.

docs/cell-m6.md

@qodo-free-for-open-source-projects

Copy link
Copy Markdown

Code Review by Qodo

🐞 Bugs (0) 📘 Rule violations (0) 📎 Requirement gaps (0)

Grey Divider

Great, no issues found!

Qodo reviewed your code and found no material issues that require review

Grey Divider

Tip of the day
💡 Did you know, you can start a comment with 'qodo' or '@qodo' to chat about any finding

More tips ↗ | Customize Qodo ↗ | Qodo docs ↗

Grey Divider

Qodo Logo

@josephnef

Copy link
Copy Markdown
Collaborator Author

Qodo: no issues found. Adding skip-qodo-gate.

@josephnef josephnef added the skip-qodo-gate Bypass the Qodo review gate (outage / maintainer decision) label Nov 13, 2026
@josephnef
josephnef merged commit ceaaf4b into master Nov 13, 2026
30 of 31 checks passed
@josephnef
josephnef deleted the feat/m6-evm-f1 branch November 13, 2026 10:12
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

skip-qodo-gate Bypass the Qodo review gate (outage / maintainer decision)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant