How to extract FoM (Figure of Merit) for AoA reliability in CLI firmware?

Hi everyone,

I’m currently working on a project using the DWM3000/QM33 kit with the nRF52840.

My project focuses on characterizing the Angle of Arrival (AoA) performance in a mobile scenario. Since the Tag is battery-powered, I am forced to use the standard CLI firmware (“nRF52840DK-CLI-FreeRTOS.hex”) to log data on the Anchor side.

My issue is that to validate the angle measurements, I specifically need the Figure of Merit (FoM) (confidence level). The standard RSSI is not enough to detect multipath effects that corrupt the PDoA calculation.

I have enabled diagnostics using:

diag 1

However, the output JSON only provides “RSSI” and “cfo_ppm”.

Is there any specific shell command or flag in the CLI application to expose the FoM metric? Or is it possible to retrieve the raw First Path / Total RX power values through the shell to calculate the quality metric manually?

Thanks in advance!

In section 4.2.1 of uwb-fira-protocol-R12.7.0-405 in SDK documents:
“By default, the FiRa region produces reports at the end of each round containing a summary of the measures it has been able to compute during the round. Those reports do not contain details about the frames exchanged during the round. The FiRa diagnostics feature of the Qorvo UWB Stack has been designed to solve this issue and to provide details about a round after its completion.”

In the SDK, uwb-qorvo-tools has a python implementation that contains a library where you can turn on RangingDiagnosticsData. It has a ton of that stuff you’re looking for, including CIR and F-M to name a few. My question was what goes into the Qorvo FoM.

The run_fira_twr --en-diag will engage this.

I know that you asked about CLI and I’m talking about using UCI, but maybe this could be helpful to cross-reference?

Snippet:

Ranging Data:

    session handle:         7
    sequence n:         41781
    ranging interval:   200 ms
    measurement type:   Twr
    Mac add size:       2
    primary session id: 0x0
    n of measurement:   1
    # Measurement 1:
        status:             Ok (0x0)
        mac address:        00:00 hex
        is nlos meas:       Unsupported
        distance:           219.0 cm
        AoA azimuth:        0.0 deg
        AoA az. FOM:        0.0 %
        AoA elevation:      0.0 deg
        AoA elev. FOM:      0.0
        AoA dest azimuth:   0.0 deg
        AoA dest az. FOM:   0.0 %
        AoA dest elevation: 0.0 deg
        AoA dest elev. FOM: 0.0 %
        slot in error:      0
        rssi:               -71.5 dBm

Ranging Diagnostic Data:

    Session handle:     7
    Sequence n:     41781
    Nbr of reports: 6
    # Ranging Diag. Report 0:
        Message id:    Control
        Action:        Rx
        Antenna_set:   0
        Nbr of fields: 4
        # Frame Status Report:
            is processing ok  : 1
            is wifi activated : 0
        # CFO Report:
            cfo:     0.536 ppm
        # Segment Metrics Reports:
            Nbr of Segment Metrics: 1
            # Segment Metrics       0:
                segment type:       0
                primary_recv:       1
                receiver Id:        0x0
                noise_value:        -80
                rsl_dBm:            -71.4765625
                path1_rsl_dbm:      -72.8828125
                path1_idx:          740
                path1_snr:          7.1171875
                path1_t:            47361
                peak_rsl_dbm:       -71.4765625
                peak_idx:           742
                peak_snr:           8.5234375
                peak_t:             47488
        # CIR Report:
            Nbr of CIRs: 1
            # CIR 0:
                segment type: 0
                primary_recv: 1
                receiver Id:  0x0
                path1_ridx:   248
                n_samples :   16
                sample_size:  6
                window (i,q): [(-4, -62), (-9, -60), (-31, -3), (50, -22)]
                              [(-3, -20), (-38, -67), (-105, -262), (-339, -598)]
                              [(-933, -1036), (-1632, -964), (-2016, -360), (-1602, 235)]
                              [(-415, 221), (422, 16), (649, 176), (405, 380)]
    # Ranging Diag. Report 1:
        Message id:    RangingInitiation
        Action:        Rx
        Antenna_set:   0
        Nbr of fields: 4
        # Frame Status Report:
            is processing ok  : 1
            is wifi activated : 0
        # CFO Report:
            cfo:     0.641 ppm
        # Segment Metrics Reports:
            Nbr of Segment Metrics: 1
            # Segment Metrics       0:
                segment type:       1
                primary_recv:       1
                receiver Id:        0x0
                noise_value:        -80
                rsl_dBm:            -72.578125
                path1_rsl_dbm:      -73.78125
                path1_idx:          354
                path1_snr:          6.21875
                path1_t:            22696
                peak_rsl_dbm:       -72.578125
                peak_idx:           356
                peak_snr:           7.421875
                peak_t:             22784
        # CIR Report:
            Nbr of CIRs: 1
            # CIR 0:
                segment type: 1
                primary_recv: 1
                receiver Id:  0x0
                path1_ridx:   248
                n_samples :   16
                sample_size:  6
                window (i,q): [(10, -16), (-10, -9), (-14, 0), (-3, 20)]
                              [(8, -29), (-11, -32), (-49, -15), (-254, 1)]
                              [(-784, 64), (-1576, 453), (-2036, 1156), (-1739, 1611)]
                              [(-815, 1167), (-22, 173), (423, -379), (671, -318)]
    # Ranging Diag. Report 2:
        Message id:    RangingResponse
        Action:        Tx
        Antenna_set:   0
        Nbr of fields: 1
        # Frame Status Report:
            is processing ok  : 1
            is wifi activated : 0
    # Ranging Diag. Report 3:
        Message id:    RangingFinal
        Action:        Rx
        Antenna_set:   0
        Nbr of fields: 4
        # Frame Status Report:
            is processing ok  : 1
            is wifi activated : 0
        # CFO Report:
            cfo:     0.328 ppm
        # Segment Metrics Reports:
            Nbr of Segment Metrics: 1
            # Segment Metrics       0:
                segment type:       1
                primary_recv:       1
                receiver Id:        0x0
                noise_value:        -80
                rsl_dBm:            -72.578125
                path1_rsl_dbm:      -73.4375
                path1_idx:          360
                path1_snr:          6.5625
                path1_t:            23093
                peak_rsl_dbm:       -72.578125
                peak_idx:           362
                peak_snr:           7.421875
                peak_t:             23168
        # CIR Report:
            Nbr of CIRs: 1
            # CIR 0:
                segment type: 1
                primary_recv: 1
                receiver Id:  0x0
                path1_ridx:   248
                n_samples :   16
                sample_size:  6
                window (i,q): [(-6, -7), (-28, -19), (2, 1), (23, 26)]
                              [(33, -20), (48, 14), (112, -64), (261, -234)]
                              [(620, -647), (863, -1473), (673, -2271), (89, -2217)]
                              [(-193, -1167), (-83, 59), (-64, 648), (-265, 639)]
    # Ranging Diag. Report 4:
        Message id:    MeasurementReport
        Action:        Rx
        Antenna_set:   0
        Nbr of fields: 4
        # Frame Status Report:
            is processing ok  : 1
            is wifi activated : 0
        # CFO Report:
            cfo:     0.551 ppm
        # Segment Metrics Reports:
            Nbr of Segment Metrics: 1
            # Segment Metrics       0:
                segment type:       0
                primary_recv:       1
                receiver Id:        0x0
                noise_value:        -80
                rsl_dBm:            -71.16796875
                path1_rsl_dbm:      -72.73046875
                path1_idx:          743
                path1_snr:          7.26953125
                path1_t:            47565
                peak_rsl_dbm:       -71.16796875
                peak_idx:           745
                peak_snr:           8.83203125
                peak_t:             47680
        # CIR Report:
            Nbr of CIRs: 1
            # CIR 0:
                segment type: 0
                primary_recv: 1
                receiver Id:  0x0
                path1_ridx:   248
                n_samples :   16
                sample_size:  6
                window (i,q): [(-57, -9), (-34, 20), (-43, 50), (-41, 7)]
                              [(-33, 8), (6, -46), (81, -109), (90, -316)]
                              [(20, -877), (-384, -1509), (-980, -1651), (-1274, -1304)]
                              [(-960, -602), (-145, 7), (325, 403), (224, 626)]
    # Ranging Diag. Report 5:
        Message id:    RangingResultReport
        Action:        Tx
        Antenna_set:   0
        Nbr of fields: 1
        # Frame Status Report:
            is processing ok  : 1
            is wifi activated : 0

Thanks for the detailed response! That log is exactly what I was looking for.

I see that the “Ranging Diagnostic Data” (containing path1_rsl, CIR, and FoM) is available via the UCI interface.

My specific question is: Is there any flag or compilation switch to route this specific “Ranging Diagnostic Data” block to the UART Shell output in the standard CLI application?

I am asking because my setup requires the Tag to be mobile and battery-powered (no PC attached for UCI), so I am relying on the CLI logs over UART on the Anchor side. If the CLI strictly outputs the summary (RSSI only) and filters out the path1/FoM details, I will stick to RSSI as my quality metric.

Thanks again for your help!

1 Like