Channel Sounding ranging accuracy and stability

Hi,

I have been testing Channel Sounding precision and am experiencing difficulty achieving stable ranging results. Regardless of the configuration changes I make, the ranging measurements remain highly susceptible to interference, and the accuracy is rarely better than 0.5 m.

Are there any additional configuration options I can adjust to improve the ranging accuracy? Would any code changes help improve the stability or precision of the measurements?

I have included the relevant configuration files and a small snippet of the changes I made to main.c below.

Hardware setup:

  • Initiator: nRF54L15 DK
  • Reflector: nRF54L15 Tag




prj.conf for ras_initiator

#
# Copyright (c) 2024 Nordic Semiconductor ASA
#
# SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
#

CONFIG_NCS_SAMPLES_DEFAULTS=y
CONFIG_DK_LIBRARY=y

CONFIG_BT=y
CONFIG_BT_SMP=y
CONFIG_BT_CENTRAL=y
CONFIG_BT_MAX_CONN=1
CONFIG_BT_BONDABLE=n

CONFIG_BT_GATT_CLIENT=y
CONFIG_BT_GATT_DYNAMIC_DB=y

CONFIG_BT_CHANNEL_SOUNDING=y
CONFIG_BT_RAS=y
CONFIG_BT_RAS_RREQ=y

CONFIG_BT_SCAN=y
CONFIG_BT_SCAN_FILTER_ENABLE=y
CONFIG_BT_SCAN_UUID_CNT=1

# The Ranging Profile recommends a MTU of at least 247 octets.
CONFIG_BT_L2CAP_TX_MTU=498
CONFIG_BT_BUF_ACL_TX_SIZE=502
CONFIG_BT_BUF_ACL_RX_SIZE=502
CONFIG_BT_ATT_PREPARE_COUNT=3
CONFIG_BT_CTLR_DATA_LENGTH_MAX=251

# This reduces RAM usage. Additional RAM is needed to support optional
# features such as multiantenna. Change or remove these if using those features
CONFIG_BT_RAS_MAX_ANTENNA_PATHS=4
CONFIG_BT_CS_DE_MAX_NUM_ANTENNA_PATHS=4
CONFIG_BT_CTLR_SDC_CS_MAX_ANTENNA_PATHS=4
CONFIG_BT_CTLR_SDC_CS_NUM_ANTENNAS=1
CONFIG_BT_CTLR_SDC_CS_ROLE_INITIATOR_ONLY=y
CONFIG_BT_RAS_MODE_3_SUPPORTED=y
CONFIG_BT_CTLR_SDC_CS_STEP_MODE3=y
CONFIG_BT_CTLR_SDC_CS_BOARD_DISTANCE_OFFSET=100
CONFIG_BT_CTLR_SDC_CS_T_PM_LEN_40_US=y
CONFIG_SAMPLE_RAS_INITIATOR_STEP_MODE_3=y

# Disabling the CS Test command reduces flash usage
CONFIG_BT_CTLR_CHANNEL_SOUNDING_TEST=n

# This allows CS and ACL to use different PHYs
CONFIG_BT_TRANSMIT_POWER_CONTROL=y

# This improves the performance of floating-point operations
CONFIG_FPU=y
CONFIG_FPU_SHARING=y

CONFIG_CBPRINTF_FP_SUPPORT=y

CONFIG_BT_CS_DE=y
CONFIG_BT_CS_DE_1024_NFFT=y


CONFIG_LOG=y
CONFIG_LOG_DEFAULT_LEVEL=3
CONFIG_LOG_PRINTK=y
CONFIG_LOG_BUFFER_SIZE=8192

# SEGGER RTT console + log backend.
CONFIG_USE_SEGGER_RTT=y
CONFIG_RTT_CONSOLE=y
CONFIG_CONSOLE=y
CONFIG_UART_CONSOLE=n
CONFIG_LOG_BACKEND_RTT=y




prj.conf for ras_reflector

#
# Copyright (c) 2024 Nordic Semiconductor ASA
#
# SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
#

CONFIG_NCS_SAMPLES_DEFAULTS=y
CONFIG_DK_LIBRARY=y

CONFIG_BT=y
CONFIG_BT_PERIPHERAL=y
CONFIG_BT_SMP=y
CONFIG_BT_DEVICE_NAME="Nordic CS Reflector"
CONFIG_BT_MAX_CONN=1
CONFIG_BT_GAP_AUTO_UPDATE_CONN_PARAMS=n
CONFIG_BT_BONDABLE=n

# The Ranging Profile recommends a MTU of at least 247 octets.
CONFIG_BT_L2CAP_TX_MTU=498
CONFIG_BT_BUF_ACL_TX_SIZE=502
CONFIG_BT_BUF_ACL_RX_SIZE=502
CONFIG_BT_CTLR_DATA_LENGTH_MAX=251
CONFIG_BT_CTLR_PHY_2M=y

# This reduces RAM usage. Additional RAM is needed to support optional
# features such as multiantenna. Change or remove these if using those features
CONFIG_BT_RAS_MAX_ANTENNA_PATHS=4
CONFIG_BT_CS_DE_MAX_NUM_ANTENNA_PATHS=4
CONFIG_BT_CTLR_SDC_CS_MAX_ANTENNA_PATHS=4
CONFIG_BT_CTLR_SDC_CS_NUM_ANTENNAS=2
CONFIG_BT_CTLR_SDC_CS_ROLE_REFLECTOR_ONLY=y

# Required for Mode 3 CS procedures
CONFIG_BT_RAS_MODE_3_SUPPORTED=y
CONFIG_BT_CTLR_SDC_CS_STEP_MODE3=y

# Disabling the CS Test command reduces flash usage
CONFIG_BT_CTLR_CHANNEL_SOUNDING_TEST=n

# This allows CS and ACL to use different PHYs
CONFIG_BT_TRANSMIT_POWER_CONTROL=y

# Let the initiating device control the PHY updates
CONFIG_BT_AUTO_PHY_UPDATE=n

CONFIG_BT_CHANNEL_SOUNDING=y
CONFIG_BT_RAS=y
CONFIG_BT_RAS_RRSP=y


CONFIG_LOG=y
CONFIG_LOG_DEFAULT_LEVEL=3
CONFIG_LOG_PRINTK=y
CONFIG_LOG_BUFFER_SIZE=8192

# SEGGER RTT console + log backend.
CONFIG_USE_SEGGER_RTT=y
CONFIG_RTT_CONSOLE=y
CONFIG_CONSOLE=y
CONFIG_UART_CONSOLE=n
CONFIG_LOG_BACKEND_RTT=y




diff from main.c ras_initiator

#line ~955 in the ras_initiator main.c 
	const struct bt_le_cs_set_procedure_parameters_param procedure_params = {
		.config_id = CS_CONFIG_ID,
		.max_procedure_len = desired_max_procedure_length,
		.min_procedure_interval = desired_procedure_interval,
		.max_procedure_interval = desired_procedure_interval,
		.max_procedure_count = 0,
		.min_subevent_len = 16000,
		.max_subevent_len = 16000,
---		.tone_antenna_config_selection = BT_LE_CS_TONE_ANTENNA_CONFIGURATION_A1_B1
+++		.tone_antenna_config_selection = BT_LE_CS_TONE_ANTENNA_CONFIGURATION_A1_B2,
		.phy = BT_LE_CS_PROCEDURE_PHY_2M,
		.tx_power_delta = 0x80,
---     .preferred_peer_antenna = BT_LE_CS_PROCEDURE_PREFERRED_PEER_ANTENNA_1,
+++		.preferred_peer_antenna = BT_LE_CS_PROCEDURE_PREFERRED_PEER_ANTENNA_1 |
					 BT_LE_CS_PROCEDURE_PREFERRED_PEER_ANTENNA_2,
		.snr_control_initiator = BT_LE_CS_SNR_CONTROL_NOT_USED,
		.snr_control_reflector = BT_LE_CS_SNR_CONTROL_NOT_USED,
	};


nRF Connect SDK version: 3.4.0 (LTS)
Toolchain version: Zephyr SDK 1.0.1, GCC 14.3.0
Target boards: nRF54L15 DK and nRF54L15 Tag
Sample: Bluetooth Channel Sounding RAS initiator/reflector
West version: 1.5.0

Any guidance on recommended settings, antenna configuration, interference mitigation, or measurement filtering would be greatly appreciated.

Best regards,
Nikola Horvat

  • Hi Nikola,

    Regardless of the configuration changes I make, the ranging measurements remain highly susceptible to interference, and the accuracy is rarely better than 0.5 m.

    What is important to remember here is that channel sounding won't get you anything as accurate as eg. UWB. My understanding is that the theoretical best case scenario is a result within half a meter. 

    With that said, an additional limitation here is that you are to a large degree reliant on using a good algorithm to get the distances from the raw IQ values etc. What we mainly provide is the back-end BLE compliant solution to get these values, not the distances. There are multiple impressive ways to get the distances from these I/Q values. A third party algorithm provider might get you some of these. 

    We do have an algorithm in the SDK as well that is being used in the samples you mention, we used to say in the documentation that we would recommend exchanging this for something better, though with some new changes to the algos I guess we've removed this recommendation. Though if you find that the accuracy that you get is not to your liking, aquiring a third party algorithm, or improving it yourself is something I would recommend. When it comes to how to do this though, I am not sure what to say, as this is a different technical field in a way. There is not a main way to go about doing this, not atleast to my knowledge. 

    Regards,

    Elfving

Related