CS Reflector multi-antenna-path phase semantics after DRGN-29459 — is tag-side geometric phase difference expected to survive?

Setup

  • Initiator: nRF54L15 DK, 1 antenna, NCS v3.3.1
  • Reflector: custom nRF54L15 board ("tag"), 2 antennas at 2.5 cm spacing, 2 CS antenna paths
  • We compute the per-channel phase difference between antenna paths AP0/AP1 from the CS step data on the initiator (circular mean over ~70 channels, then 60 s averaging; per-point statistical error < 0.01 rad)

What we observed

On the v3.3.1 release SDC, the inter-path phase difference Δφ tracked the tag rotation angle θ with a usable ~2 rad swing across ±90°, and repeatable bearing estimates near boresight were possible (we noted the swing exceeded the ideal 2-element model by ~36%, so we suspected extra path-dependent phase even then).

On a dev SDC containing the DRGN-29459 fix ("controller, acting as a CS Reflector, would shift the CS tone phase incorrectly when IPT feature was used with multiple antenna paths"), a full single-session rotation scan gives a completely different Δφ(θ):

θ −60° −30° +30° +50° +60° +70° +90°
Δφ (rad) −2.54 −0.29 0 +0.15 +0.41 +2.97 +2.98 +3.08

i.e. within ±50° the swing is compressed to ~0.4 rad total, and beyond ~±55° Δφ jumps to ≈ ±π and saturates. Each point is highly repeatable within the session (R > 0.99).

Questions

  1. After DRGN-29459, what is the intended phase relationship between antenna paths as seen by the initiator? Is the reflector now expected to present phase-continuous tones across the antenna-path switch, such that the tag-side geometric phase difference between its antennas is (by design) no longer observable in the inter-path phase?
  2. If yes — is there any supported way to recover per-path phase referenced to each physical antenna (for AoA-style processing on a 2-antenna reflector), or is the CS antenna-path mechanism strictly specified for ranging only?
  3. If no — i.e., geometric phase differences should survive the fix — what could produce the compressed-then-saturating curve above? (e.g., antenna switch timing/configuration requirements that changed with the fix?)
  4. Is the ≈ ±π two-state behavior beyond ±55° expected from anything in the controller, or should we attribute it to board-level effects (antenna directivity/shadowing)?

We can share raw per-channel data if useful.

Parents
  • Hi

    1. Antenna-paths are handled independently from each other. When IPT is enabled, the reflector adjusts phase shift for each antenna path separately.

    The rest of the questions I think we need more details in order to answer correctly.

    • Can you provide some more details on how you perform your measurements?
    • Can you share logs of the measurements you're doing or similar for us to review for context on our end.
    • Are youo correctly extracting the antenna-path values from the CS reports? You need to use the bt_le_cs_get_antenna_path() function to convert the antenna permutation index reported by the controller to the antenna path, similar to what's done in the RAS sample. This part of the BLE spec. is a bit confiusing and it's easy to accidentally use the antenna permutation index value instead of the antenna path. This will ruin all following signal processing.

    Best regards,

    Simon

  • Hi Simon, thanks for the quick response.

    Re: antenna path extraction — yes, we handle this the same way as the RAS sample: for each mode-2 step we iterate tone_index 0..N_AP−1 and call bt_le_cs_get_antenna_path(n_ap, antenna_permutation_index, tone_index) to map into per-path accumulators, and we only accept tones where both local and remote quality indicators are HIGH. So the permutation-index pitfall should be covered.

    Measurement details:

    • CS config: main mode 2 + sub mode 1, tone_antenna_config_selection = A1_B2 (initiator 1 antenna, reflector 2 antennas → N_AP = 2), channel_map_repetition = 1, CHSEL 3B. Initiator: CONFIG_BT_CTLR_SDC_CS_NUM_ANTENNAS=1, MAX_ANTENNA_PATHS=2. Reflector: NUM_ANTENNAS=2.
    • Per channel: φ_APx = atan2(Q, I) of the remote (reflector-measured) PCT for that antenna path; Δφ(ch) = wrap±π(φ_AP1 − φ_AP0).
    • Per procedure: amplitude-weighted circular mean of Δφ over the ~70 usable channels (weight = min of the two paths' tone magnitudes on that channel), with a circular outlier-rejection pass.
    • Each data point in the table = circular mean over 60 s (~530 procedures). Same fixture, same session.

    A question back, which I suspect is the crux: since our Δφ is computed from the reflector's received-tone PCTs — when you say "with IPT enabled the reflector adjusts phase shift for each antenna path separately", does that per-path adjustment (a) only affect the tones the reflector transmits, or (b) also normalize the PCT values it reports for its own antennas? If the adjustment (in either direction) compensates the physical inter-antenna phase offset, that would exactly explain why the geometric information visible on the release SDC disappears on the dev SDC.

    Logs: happy to share. Which format is most useful — raw per-channel dumps of (channel, φ_AP0, φ_AP1, amplitudes) at a few known angles on both SDC versions, or full HCI subevent logs? We can capture either.

    Best regards

Reply
  • Hi Simon, thanks for the quick response.

    Re: antenna path extraction — yes, we handle this the same way as the RAS sample: for each mode-2 step we iterate tone_index 0..N_AP−1 and call bt_le_cs_get_antenna_path(n_ap, antenna_permutation_index, tone_index) to map into per-path accumulators, and we only accept tones where both local and remote quality indicators are HIGH. So the permutation-index pitfall should be covered.

    Measurement details:

    • CS config: main mode 2 + sub mode 1, tone_antenna_config_selection = A1_B2 (initiator 1 antenna, reflector 2 antennas → N_AP = 2), channel_map_repetition = 1, CHSEL 3B. Initiator: CONFIG_BT_CTLR_SDC_CS_NUM_ANTENNAS=1, MAX_ANTENNA_PATHS=2. Reflector: NUM_ANTENNAS=2.
    • Per channel: φ_APx = atan2(Q, I) of the remote (reflector-measured) PCT for that antenna path; Δφ(ch) = wrap±π(φ_AP1 − φ_AP0).
    • Per procedure: amplitude-weighted circular mean of Δφ over the ~70 usable channels (weight = min of the two paths' tone magnitudes on that channel), with a circular outlier-rejection pass.
    • Each data point in the table = circular mean over 60 s (~530 procedures). Same fixture, same session.

    A question back, which I suspect is the crux: since our Δφ is computed from the reflector's received-tone PCTs — when you say "with IPT enabled the reflector adjusts phase shift for each antenna path separately", does that per-path adjustment (a) only affect the tones the reflector transmits, or (b) also normalize the PCT values it reports for its own antennas? If the adjustment (in either direction) compensates the physical inter-antenna phase offset, that would exactly explain why the geometric information visible on the release SDC disappears on the dev SDC.

    Logs: happy to share. Which format is most useful — raw per-channel dumps of (channel, φ_AP0, φ_AP1, amplitudes) at a few known angles on both SDC versions, or full HCI subevent logs? We can capture either.

    Best regards

Children
Related