Valid I/Q Samples For Angle Calculation
BLE規(guī)范定義了兩個(gè)術(shù)語(yǔ)“Switch slot” 和 “Sample slot”。“Switch slot”和 “Sample slot”的長(zhǎng)度必須相等搀继,且只能設(shè)置兩個(gè)值(1us和2us)吼畏。
在CTE開(kāi)始時(shí),要丟棄的元素?cái)?shù)量取決于“Switch slot” 和 “Sample slot”的長(zhǎng)度以及采樣頻率秧了。
-
When using 1us slots:
- the guard period is 4us(guard period不采樣/不需要丟棄任何樣本)
- 參考周期是8us。在參考周期內(nèi)采集的所有樣本都必須丟棄(例如,如果采樣頻率為4MHz税灌,則意味著必須丟棄32=8us x 4個(gè)/us 個(gè)樣本-如果采樣頻率為1Mhz則必須丟棄8個(gè)樣本)
- 第一個(gè)開(kāi)關(guān)槽(和所有其他)持續(xù)1us。在一個(gè)開(kāi)關(guān)槽期間采樣的數(shù)據(jù)必須被丟棄(例如硬耍,如果采樣頻率是4MHz垄琐,這意味著在每個(gè)開(kāi)關(guān)槽期間必須丟棄4個(gè)樣本-如果采樣頻率是1MHz,每個(gè)開(kāi)關(guān)槽必須丟棄1個(gè)樣本)经柴。
因此狸窘,當(dāng)采樣頻率為4MHz時(shí),首先考慮的是第37個(gè)樣本坯认。當(dāng)采樣頻率為1MHz時(shí)翻擒,首先考慮的是第10個(gè)樣本氓涣。
-
When using 2us slots:
- the guard period is still 4us (guard period不采樣/不需要丟棄任何樣本)
- 參考時(shí)間仍然是8us。在參考周期內(nèi)采集的所有樣本都必須丟棄(例如陋气,如果采樣頻率為4MHz劳吠,則意味著必須丟棄32個(gè)樣本-如果采樣頻率為1Mhz則必須丟棄8個(gè)樣本)
- 第一個(gè)開(kāi)關(guān)槽(和所有其他)持續(xù)2us。在一個(gè)開(kāi)關(guān)槽期間采樣的數(shù)據(jù)必須被丟棄(例如巩趁,如果采樣頻率是4MHz痒玩,這意味著在每個(gè)開(kāi)關(guān)槽期間必須丟棄8個(gè)樣本-如果采樣頻率是1MHz,每個(gè)開(kāi)關(guān)槽必須丟棄2個(gè)樣本)议慰。
-
the sampling slots are divided in two:
1.一個(gè)1us的空閑槽(用來(lái)使天線穩(wěn)定)蠢古。在空閑槽中采樣的數(shù)據(jù)必須被丟棄(例如,如果采樣頻率是4MHz别凹,這意味著在每個(gè)空閑槽中必須丟棄4個(gè)樣本-如果采樣頻率是1MHz草讶,每個(gè)空閑槽必須丟棄1個(gè)樣本)。
2.一個(gè)1us的采樣槽(例如炉菲,如果采樣頻率為4MHz堕战,每個(gè)采樣槽記錄4個(gè)樣本-如果采樣頻率為1MHz,每個(gè)采樣槽記錄1個(gè)樣本)
因此拍霜,當(dāng)采樣頻率為4MHz時(shí)嘱丢,首先考慮的是第45個(gè)樣本。當(dāng)采樣頻率為1MHz時(shí)沉御,首先考慮的是第12個(gè)樣本屿讽。
下圖展示了每個(gè)樣本槽是如何劃分的:
需要注意的是,只有天線能夠切換并安置在小于1us的位置吠裆,才可以使用1us交換槽伐谈。如果天線不能切換和安置在小于1us的采樣槽期間的部分?jǐn)?shù)據(jù)將不正確,將不得不被丟棄试疙。
確定I/Q樣本的另一個(gè)好方法是繪制所有的I/Q樣本诵棵。
下圖顯示了使用4MHz采樣率和2us槽位的rtls_passive和rtls_master和rtls_slave的I/Q樣本。
在沒(méi)有天線切換的情況下祝旷,在參考周期內(nèi)采集前32個(gè)(0~31)樣本履澳。因此,I/Q曲線看起來(lái)就像正弦波怀跛。
在第32個(gè)之后距贷,你可以看到當(dāng)切換發(fā)生時(shí),I/Q樣本出現(xiàn)了不連續(xù)吻谋。
當(dāng)確實(shí)存在相位差時(shí)忠蝗,比較容易看出相的不連續(xù)。因此漓拾,在采集I/Q數(shù)據(jù)前阁最,請(qǐng)確保rtls_passive和rtls_slave的夾角不為0度戒祠。
Angle Compensation(角度補(bǔ)償)
在AoA_getPairAngles()下,獲得基于I和Q數(shù)據(jù)的相位差速种。之后姜盈,添加角度補(bǔ)償。請(qǐng)看下面的代碼配阵。這是因?yàn)榻嵌裙烙?jì)受天線對(duì)和頻率的影響馏颂。p->gain, p->offset,channelOffset_A1和channelOffset_A2的值是基于實(shí)驗(yàn)室測(cè)量的闸餐。不同的天線板設(shè)計(jì)和頻率會(huì)給你不同的p->gain, p->offset, channelOffset_A1和channelOffset_A2饱亮。下面的代碼可以在AOA.c AoA_getPairAngles()中找到,這是天線對(duì)補(bǔ)償舍沙。
// Write back result for antenna pairs
for (int pair = 0; pair < numPairs; ++pair)
{
const AoA_AntennaPair *p = &gAoaReport.antConfig->pairs[pair];
gAoaReport.antResult->pairAngle[pair] = (int)((p->sign * antenna_versus_avg[p->a][p->b] + p->offset) * p->gain);
}
正如你從上面的圖中看到的,偏移量是用來(lái)確保在0度處接收到的數(shù)據(jù)在計(jì)算后會(huì)得到0度剔宪,然后改變斜率拂铡,使其更好地適應(yīng)所有其他角度。
天線陣1的補(bǔ)償值見(jiàn):ant_array1_config_boostxl_rev1v1.c AoA_AntennaPair pair_A1[]
AoA_AntennaPair pair_A1[] =
{
{// v12
.a = 0, // First antenna in pair
.b = 1, // Second antenna in pair
.sign = 1, // Sign for the result
.offset = -5, // Measurement offset compensation
.gain = 0.95, // Measurement gain compensation
},
{// v23
.a = 1,
.b = 2,
.sign = 1,
.offset = -20,
.gain = 0.9,
},
{// v13
.a = 0,
.b = 2,
.sign = 1,
.offset = -20,
.gain = 0.50,
},
};
在天線對(duì)補(bǔ)償?shù)幕A(chǔ)上葱绒,增加了頻率補(bǔ)償感帅。對(duì)于天線陣1,用于頻率補(bǔ)償?shù)闹悼梢栽赼nt_array1_config_boostxl_rev1v1.c int8_t channelOffset_A1[40]中找到地淀。
int8_t channelOffset_A1[40] = {2, // Channel 0
2, // Channel 1
1, // Channel 2
1, // Channel 3
1, // Channel 4
1, // Channel 5
1, // Channel 6
1, // Channel 7
0, // Channel 8
0, // Channel 9
0, // Channel 10
3, // Channel 11
3, // Channel 12
2, // Channel 13
3, // Channel 14
3, // Channel 15
3, // Channel 16
3, // Channel 17
3, // Channel 17
3, // Channel 18
3, // Channel 20
3, // Channel 21
2, // Channel 22
3, // Channel 23
3, // Channel 24
3, // Channel 25
3, // Channel 26
3, // Channel 27
3, // Channel 28
2, // Channel 29
2, // Channel 30
2, // Channel 31
2, // Channel 32
2, // Channel 33
2, // Channel 34
2, // Channel 35
1, // Channel 36
0, // Channel 37
0, // Channel 38
0, // Channel 39
};
AoA Functions Overview
Here is the list of the most important functions for AoA users.
Python
-
aoa_set_params
:
class AoaSetParamsReq(NpiRequest, SyncReq, FromAp):
command = Commands.RTLS_CMD_AOA_SET_PARAMS
struct = Struct(
"aoaRole" / Enum(Int8ul, AoaRole), # AOA_MASTER, AOA_SLAVE, AOA_PASSIVE
"aoaResultMode" / Enum(Int8ul, AoaResultMode), # AOA_MODE_ANGLE, AOA_MODE_PAIR_ANGLES, AOA_MODE_RAW
"connHandle" / Int16ul,
"slotDurations" / Int8ul, # 1us/2us sampling slots
"sampleRate" / Int8ul, # 1Mhz (BT5.1 spec), 2Mhz, 3Mhz or 4Mhz - this enables oversampling
"sampleSize" / Int8ul, # 8 bit sample (as defined by BT5.1 spec), 16 bit sample (higher accuracy)
"sampleCtrl" / Int8ul, # sample control flags 0x0-default filtering, 0x1-RAW_RF no filtering
"samplingEnable" / Int8ul,
# 0 = mask CTE even if enabled, 1 = don't mask CTE, even if disabled (support Unrequested CTE)
"numAnt" / Int8ul, # Number of antennas in antenna array
"antArray" / Int8ul[this.numAnt], # GPIO's of antennas
)
slotDurations Setting
Value Description 2 2us for antenna switching and 2us for I/Q sampling. 1 1us for antenna switching and 1us for I/Q sampling.
Note:
對(duì)于選擇slotDuration = 1的用戶(hù)失球,需要確保自定義板上的RF開(kāi)關(guān)能在1 us內(nèi)穩(wěn)定下來(lái)。
sampleRate Setting
Value Description 4 Process packets with AoA present in the header and sample CTE at 4 MHz. 3 Process packets with AoA present in the header and sample CTE at 3 MHz. 2 Process packets with AoA present in the header and sample CTE at 2 MHz. 1 Process packets with AoA present in the header and sample CTE at 1 MHz.
sampleSize Setting
Value Description 2 I/Q samples returned with 13 bits resolution. 1 I/Q samples returned with 8 bits resolution.
sampleCtrl I/Q data Filter Setting
bit[0] Description 1 BLE5-Stack returns whole I/Q data to the application. 0 BLE5-Stack filters out the I/Q data from switching period and returns the rest to application.
sampleCtrl Antenna Array Setting
bit[4:5] Description 0b01 Application use only antenna array 1. 0b10 Application use only antenna array 2.
Integration
發(fā)射載波頻率+ 250khz tone(音頻)的I帮毁、Q采樣可以在主MCU不工作的情況下由射頻核進(jìn)行采集实苞、預(yù)處理和緩沖。
對(duì)于rtls_passive, I/Q采樣率目前不可配置, 固定為4Mhz灯抛。每個(gè)I/Q對(duì)在radio RAM中占用32位空間金赦,radio RAM可以存儲(chǔ)512個(gè)樣本(即2048字節(jié)- 2 kB)。這種限制僅僅是由于微型堆棧限制了無(wú)線RAM中讀取的數(shù)據(jù)量对嚼。無(wú)線電RAM長(zhǎng)度為4 kB夹抗。
當(dāng)采樣率為4MHz時(shí),每4us將有16個(gè)I/Q對(duì)猪半,等于16 * 4(一個(gè)I/Q對(duì)占用4字節(jié)空間)= 64字節(jié)每4us兔朦。
這意味著即使CTE是160us長(zhǎng)偷线,4MHz采樣率,rtls_passive的無(wú)線電RAM也只能存儲(chǔ)I/Q數(shù)據(jù)沽甥,持續(xù)時(shí)間為128us声邦。目前沒(méi)有解決的辦法,除非我們縮短CTE的長(zhǎng)度摆舟。這對(duì)rtls_master來(lái)說(shuō)不是問(wèn)題亥曹。
Note:對(duì)于rtls_passive, I和Q樣本只有13位的分辨率,即使它們占用RF核心RAM中的16位空間恨诱。因?yàn)樗鼈冎挥?3位的分辨率媳瞪,你將觀察到的有符號(hào)整數(shù)的最大值和最小值是[4095,-4096]照宝。
對(duì)于rtls_master, I/Q采樣設(shè)置是可配置的蛇受,從1MHz到4MHz。每個(gè)I/Q對(duì)在無(wú)線RAM中占用32位空間厕鹃,無(wú)線RAM最多可以存儲(chǔ)624個(gè)樣本(2496字節(jié)-約2.5kB)兢仰。當(dāng)采樣頻率達(dá)到最大值(4Mhz)時(shí),在每個(gè)CTE中正好存儲(chǔ)624個(gè)樣本剂碴。(CTE持續(xù)160us把将,減去4us的守衛(wèi)時(shí)間。當(dāng)采樣頻率為4Mhz時(shí)忆矛,在156 us中存儲(chǔ)156*4 = 624個(gè)樣本察蹲。更多細(xì)節(jié)可在有效I/Q樣本中提供,用于角度計(jì)算催训。)
對(duì)于rtls_master, I和Q樣本分辨率是可配置的洽议,請(qǐng)參見(jiàn)sampleSize設(shè)置。您可以選擇只有13位分辨率的16位或8位分辨率瞳腌,這是藍(lán)牙核心規(guī)范版本5.1標(biāo)準(zhǔn)绞铃。選擇哪個(gè)分辨率無(wú)關(guān)緊要,每個(gè)I/Q對(duì)總是在無(wú)線RAM中占用32位空間嫂侍。
應(yīng)用層將天線切換表傳入射頻核儿捧,射頻核在采集I/Q樣本的同時(shí)進(jìn)行天線切換。
在從機(jī)中挑宠,射頻核心保證CTE被插入到連接事件包的末尾而不被白噪聲濾波器扭曲菲盾。
在passive 和 master 中,射頻核心分析數(shù)據(jù)包并在同步天線切換時(shí)在正確的時(shí)間開(kāi)始捕獲樣本各淀。樣本留在RF核心RAM中懒鉴,由主MCU進(jìn)行分析
AoA Driver
對(duì)于rtls_passive,一個(gè)使用Micro BLE Stack的例子,AoA驅(qū)動(dòng)程序負(fù)責(zé)pin初始化临谱,AoA啟用璃俗,數(shù)據(jù)提取和角度估計(jì)。
rtls_master中的AoA功能實(shí)現(xiàn)為符合藍(lán)牙核心規(guī)范5.1版悉默,因此城豁,初始化、支持AoA和數(shù)據(jù)提取都被移到主機(jī)模塊抄课。然而唱星,用戶(hù)仍然可以使用RTLS控制模塊來(lái)設(shè)置需要的參數(shù)。
Configurations Supported
- Sampling frequency supported: 1 Mhz, 2 Mhz, 3 Mhz or 4 Mhz
- Sampling slot length supported: 1 us* or 2 us .注意:根據(jù)BLE規(guī)格跟磨,采樣槽和交換槽必須有相同的持續(xù)時(shí)間间聊。
- Sample size supported: 8bit or 16bit
Sampling slot of 1us is supported by the AoA driver but some limitations exist when using the BOOSTXL-AOA hardware. The antennas of the BOOSTXL-AOA require 1.6 us to switch and settle (leaving 0.4 us in the sampling period to collect data). Other designs with faster RF switches can support 1us switching.
Data Collection Flow
當(dāng)RF Core檢測(cè)到AoA包時(shí),根據(jù)用戶(hù)定義的周期切換天線的同時(shí)開(kāi)始采樣音頻上的I/Q抵拘。
對(duì)于rtls_master, IQ樣本將從RTLS服務(wù)主機(jī)模塊發(fā)送到應(yīng)用程序哎榴,事件類(lèi)型為RTLSSRV_CONNECTION_CTE_IQ_REPORT_EVT。
根據(jù)python設(shè)置的AoA結(jié)果模式僵蛛,調(diào)用不同的函數(shù)集并返回相應(yīng)的數(shù)據(jù)集叹话,如下圖所示:
Note:對(duì)于rtls_master,當(dāng)使用AOA_MODE_RAW時(shí)墩瞳,如果sampleCtrl中的[0]位設(shè)置為0,則BLE5-Stack將過(guò)濾掉切換周期中的I/Q數(shù)據(jù)氏豌。要獲得完整的I/Q數(shù)據(jù)集喉酌,需要將sampleCtrl中的[0]位設(shè)置為1。請(qǐng)參閱sampleCtrl I/Q數(shù)據(jù)過(guò)濾器設(shè)置概述泵喘。
Warning:對(duì)于rtls_master泪电,當(dāng)sampleCtrl= 1的[0]位時(shí),不支持AOA_MODE_PAIR_ANGLE和AOA_MODE_ANGLE纪铺。
class AoaSetParamsReq(NpiRequest, SyncReq, FromAp):
command = Commands.RTLS_CMD_AOA_SET_PARAMS
struct = Struct(
"aoaRole" / Enum(Int8ul, AoaRole), # AOA_MASTER, AOA_SLAVE, AOA_PASSIVE
"aoaResultMode" / Enum(Int8ul, AoaResultMode), # AOA_MODE_ANGLE, AOA_MODE_PAIR_ANGLES, AOA_MODE_RAW
"connHandle" / Int16ul,
"slotDurations" / Int8ul, # 1us/2us sampling slots
"sampleRate" / Int8ul, # 1Mhz (BT5.1 spec), 2Mhz, 3Mhz or 4Mhz - this enables oversampling
"sampleSize" / Int8ul, # 8 bit sample (as defined by BT5.1 spec), 16 bit sample (higher accuracy)
"sampleCtrl" / Int8ul, # sample control flags bit[0] = 0-default filtering, bit[0]= 1-RAW_RF no filtering
# bit 4,5 - 0x10 - ONLY_ANT_1, 0x20 - ONLY_ANT_2
# 0x00 is not a valid option.
"samplingEnable" / Int8ul,
# 0 = mask CTE even if enabled, 1 = don't mask CTE, even if disabled (support Unrequested CTE)
"numAnt" / Int8ul, # Number of antennas in antenna array
"antArray" / Int8ul[this.numAnt], # GPIO's of antennas
)
當(dāng)使用AOA_MODE_ANGLE時(shí)相速,天線圖場(chǎng)必須為0、1鲜锚、2突诬,天線陣2時(shí)必須為3、4芜繁、5旺隙。
當(dāng)使用AOA_MODE_RAW模式時(shí),采樣率固定在4MHz骏令。
Connectionless AoA
為了不泛濫廣告通道蔬捷,connectionless AoA只被允許作為輔助包(即透過(guò)次要通道,參考 Bluetooth Core Specification Version 5.1 Vol 6, Part B, §2.3 for details on the PDUs allowed to be appended with a CTE
)。在BLE5-Stack中周拐,支持周期性廣告的無(wú)連接AoA