Hello,
I am currently testing LE Channel Sounding using the nRF54L15 DK.
I am performing an HCI LE CS Test using Main Mode 2, and I am parsing the HCI_LE_CS_Subevent_Result event to check the tone_pct values.
I am calculating the phase from the I/Q values contained in tone_pct using:
phase = atan2(Q, I)
However, even when measuring on the same channel, I observed that the calculated phase seemingly changes randomly within the range of −π to +π for each step.
I would like to understand how tone_pct is generated and processed, so I have the following questions:
1. How are the I/Q values in tone_pct measured and calculated?
I would like to know how the I/Q values are extracted internally after receiving the RF signal, and what characteristics of the received signal these I/Q values represent.
2. Is it expected that the phase changes significantly within the range of −π to +π for each step, even when measuring on the same channel?
I expected the phase calculated from I/Q to remain relatively constant if the frequency is the same, but I observed that the phase changes significantly from step to step.
I would like to know whether this behavior is expected or whether it can occur due to the characteristics of Channel Sounding.
3. Is any phase reference or compensation applied before tone_pct is reported in the HCI event?
For example, I would like to know whether any of the following processing is performed internally:
-
Phase referencing using a specific reference phase
-
Compensation for RF chain or LO phase offset
-
Phase compensation based on the previous step
-
Phase wrapping or phase unwrapping
In other words, I would like to know whether the I/Q values provided in tone_pct through HCI are raw measurements, or whether some kind of phase processing is applied internally.
4. Could you provide a detailed definition of tone_pct?
In particular, I would like to understand:
-
What I and Q each represent
-
The reference used for the I/Q values
-
The sign and scale of the I/Q values
-
The physical meaning of
tone_pct -
Whether the phase calculated from
tone_pctcan be directly used as a phase measurement for Channel Sounding
If possible, I would appreciate it if you could provide any documentation or information about how tone_pct is generated in the nRF54L15 Channel Sounding implementation.
Thank you.
The data below was parsed from the LE CS Subevent Result event that I measured.


[LE CS Subevent Result event] :
0x04 0x3e 0xfa 0x31 0xff 0x0f 0x00 0x00 0x00 0x00 0x00 0x00 0xc0 0xf4 0x01 0x01 0x00 0x01 0x14
0x00 0x15 0x03 0x00 0xe1 0x01 - (mode-0 1step)
0x02 0x15 0x09 0x00 0x78 0x80 0xfd 0x01 0xfe 0x0f 0x00 0x12 - (mode-2 1step)
0x02 0x15 0x09 0x00 0x47 0x10 0xfe 0x01 0xfe 0xef 0xff 0x12 - (mode-2 2step)
0x02 0x15 0x09 0x00 0x29 0x20 0x04 0x01 0xff 0xef 0xff 0x12 - (mode-2 3step)
0x02 0x15 0x09 0x00 0x24 0x50 0x04 0x01 0xfe 0x1f 0x00 0x12 - (mode-2 4step)
0x02 0x15 0x09 0x00 0xcf 0x2f 0xfc 0x01 0x02 0x00 0x00 0x12 - (mode-2 5step)
0x02 0x15 0x09 0x00 0x1b 0x90 0x04 0x01 0xff 0xef 0xff 0x12 - (mode-2 6step)
0x02 0x15 0x09 0x00 0xb2 0x4f 0xff 0x01 0xff 0xdf 0xff 0x12 - (mode-2 7step)
0x02 0x15 0x09 0x00 0x41 0xa0 0x02 0x01 0x00 0x20 0x00 0x12 - (mode-2 8step)
0x02 0x15 0x09 0x00 0x1f 0x80 0xfb 0x01 0x01 0xe0 0xff 0x12 - (mode-2 9step)
0x02 0x15 0x09 0x00 0xb7 0xcf 0x01 0x01 0xfe 0x2f 0x00 0x12 - (mode-2 10step)
0x02 0x15 0x09 0x00 0xe1 0x7f 0xfb 0x01 0xfe 0x1f 0x00 0x12 - (mode-2 11step)
0x02 0x15 0x09 0x00 0xe2 0x7f 0xfb 0x01 0xff 0xdf 0xff 0x12 - (mode-2 12step)
0x02 0x15 0x09 0x00 0x4c 0x10 0xff 0x01 0xfe 0x0f 0x00 0x12 - (mode-2 13step)
0x02 0x15 0x09 0x00 0xbb 0x5f 0x02 0x01 0x01 0xe0 0xff 0x12 - (mode-2 14step)
0x02 0x15 0x09 0x00 0xc9 0x7f 0x03 0x01 0xff 0xdf 0xff 0x12 - (mode-2 15step)
0x02 0x15 0x09 0x00 0xce 0x4f 0xfc 0x01 0x02 0xf0 0xff 0x12 - (mode-2 16step)
0x02 0x15 0x09 0x00 0xd1 0x1f 0xfc 0x01 0x00 0xe0 0xff 0x12 - (mode-2 17step)
0x02 0x15 0x09 0x00 0x4e 0xd0 0xff 0x01 0x02 0x10 0x00 0x12 - (mode-2 18step)
0x02 0x15 0x09 0x00 0xdd 0xaf 0xfb 0x01 0xfe 0xff 0xff 0x12 - (mode-2 19step)
In Mode 2, two signals are transmitted per step: the actual CS tone signal and the extension slot signal. Therefore, 19 × 2 = 38 data entries are parsed. Only when pct_index = 0 does the entry correspond to the actual CS tone signal.
[parsing data] :
[parse_cs_pct_only] pct_count=0, channel=21, pct_index=0, I=120, Q=-40, phase_rad=-0.321750554, phase_deg=-18.434949, tqi=0x00
[parse_cs_pct_only] pct_count=1, channel=21, pct_index=1, I=-511, Q=255, phase_rad=2.678728130, phase_deg=153.479816, tqi=0x12
[parse_cs_pct_only] pct_count=2, channel=21, pct_index=0, I=71, Q=-31, phase_rad=-0.411671343, phase_deg=-23.587031, tqi=0xFF
[parse_cs_pct_only] pct_count=3, channel=21, pct_index=1, I=-511, Q=-257, phase_rad=-2.675599466, phase_deg=-153.300557, tqi=0x12
[parse_cs_pct_only] pct_count=4, channel=21, pct_index=0, I=41, Q=66, phase_rad=1.014925518, phase_deg=58.150949, tqi=0xFF
[parse_cs_pct_only] pct_count=5, channel=21, pct_index=1, I=-255, Q=-257, phase_rad=-2.352288260, phase_deg=-134.776189, tqi=0x12
[parse_cs_pct_only] pct_count=6, channel=21, pct_index=0, I=36, Q=69, phase_rad=1.089909047, phase_deg=62.447188, tqi=0x00
[parse_cs_pct_only] pct_count=7, channel=21, pct_index=1, I=-511, Q=511, phase_rad=2.356194490, phase_deg=135.000000, tqi=0x12
[parse_cs_pct_only] pct_count=8, channel=21, pct_index=0, I=-49, Q=-62, phase_rad=-2.239608485, phase_deg=-128.320114, tqi=0x00
[parse_cs_pct_only] pct_count=9, channel=21, pct_index=1, I=513, Q=0, phase_rad=0.000000000, phase_deg=0.000000, tqi=0x12
[parse_cs_pct_only] pct_count=10, channel=21, pct_index=0, I=27, Q=73, phase_rad=1.216536904, phase_deg=69.702430, tqi=0xFF
[parse_cs_pct_only] pct_count=11, channel=21, pct_index=1, I=-255, Q=-257, phase_rad=-2.352288260, phase_deg=-134.776189, tqi=0x12
[parse_cs_pct_only] pct_count=12, channel=21, pct_index=0, I=-78, Q=-12, phase_rad=-2.988943325, phase_deg=-171.253838, tqi=0xFF
[parse_cs_pct_only] pct_count=13, channel=21, pct_index=1, I=-255, Q=-513, phase_rad=-2.032102020, phase_deg=-116.430869, tqi=0x12
[parse_cs_pct_only] pct_count=14, channel=21, pct_index=0, I=65, Q=42, phase_rad=0.573666668, phase_deg=32.868679, tqi=0x00
[parse_cs_pct_only] pct_count=15, channel=21, pct_index=1, I=1, Q=512, phase_rad=1.568843204, phase_deg=89.888094, tqi=0x12
[parse_cs_pct_only] pct_count=16, channel=21, pct_index=0, I=31, Q=-72, phase_rad=-1.164229500, phase_deg=-66.705437, tqi=0xFF
[parse_cs_pct_only] pct_count=17, channel=21, pct_index=1, I=257, Q=-512, phase_rad=-1.105587439, phase_deg=-63.345494, tqi=0x12
[parse_cs_pct_only] pct_count=18, channel=21, pct_index=0, I=-73, Q=28, phase_rad=2.775337093, phase_deg=159.015102, tqi=0x00
[parse_cs_pct_only] pct_count=19, channel=21, pct_index=1, I=-511, Q=767, phase_rad=2.158497997, phase_deg=123.672825, tqi=0x12
[parse_cs_pct_only] pct_count=20, channel=21, pct_index=0, I=-31, Q=-73, phase_rad=-1.972376867, phase_deg=-113.008870, tqi=0x00
[parse_cs_pct_only] pct_count=21, channel=21, pct_index=1, I=-511, Q=511, phase_rad=2.356194490, phase_deg=135.000000, tqi=0x12
[parse_cs_pct_only] pct_count=22, channel=21, pct_index=0, I=-30, Q=-73, phase_rad=-1.960714191, phase_deg=-112.340648, tqi=0xFF
[parse_cs_pct_only] pct_count=23, channel=21, pct_index=1, I=-255, Q=-513, phase_rad=-2.032102020, phase_deg=-116.430869, tqi=0x12
[parse_cs_pct_only] pct_count=24, channel=21, pct_index=0, I=76, Q=-15, phase_rad=-0.194863920, phase_deg=-11.164880, tqi=0x00
[parse_cs_pct_only] pct_count=25, channel=21, pct_index=1, I=-511, Q=255, phase_rad=2.678728130, phase_deg=153.479816, tqi=0x12
[parse_cs_pct_only] pct_count=26, channel=21, pct_index=0, I=-69, Q=37, phase_rad=2.649381387, phase_deg=151.798372, tqi=0xFF
[parse_cs_pct_only] pct_count=27, channel=21, pct_index=1, I=257, Q=-512, phase_rad=-1.105587439, phase_deg=-63.345494, tqi=0x12
[parse_cs_pct_only] pct_count=28, channel=21, pct_index=0, I=-55, Q=55, phase_rad=2.356194490, phase_deg=135.000000, tqi=0xFF
[parse_cs_pct_only] pct_count=29, channel=21, pct_index=1, I=-255, Q=-513, phase_rad=-2.032102020, phase_deg=-116.430869, tqi=0x12
[parse_cs_pct_only] pct_count=30, channel=21, pct_index=0, I=-50, Q=-60, phase_rad=-2.265534603, phase_deg=-129.805571, tqi=0xFF
[parse_cs_pct_only] pct_count=31, channel=21, pct_index=1, I=513, Q=-256, phase_rad=-0.462867578, phase_deg=-26.520359, tqi=0x12
[parse_cs_pct_only] pct_count=32, channel=21, pct_index=0, I=-47, Q=-63, phase_rad=-2.211752912, phase_deg=-126.724107, tqi=0xFF
[parse_cs_pct_only] pct_count=33, channel=21, pct_index=1, I=1, Q=-512, phase_rad=-1.568843204, phase_deg=-89.888094, tqi=0x12
[parse_cs_pct_only] pct_count=34, channel=21, pct_index=0, I=78, Q=-3, phase_rad=-0.038442590, phase_deg=-2.202598, tqi=0x00
[parse_cs_pct_only] pct_count=35, channel=21, pct_index=1, I=513, Q=256, phase_rad=0.462867578, phase_deg=26.520359, tqi=0x12
[parse_cs_pct_only] pct_count=36, channel=21, pct_index=0, I=-35, Q=-70, phase_rad=-2.034443936, phase_deg=-116.565051, tqi=0xFF
[parse_cs_pct_only] pct_count=37, channel=21, pct_index=1, I=-511, Q=-1, phase_rad=-3.139635709, phase_deg=-179.887875, tqi=0x12