跳转至

定位解决方案


AOA/AOD

Telink定位解决方案支持Core 5.1中定义的到达角(Angle of Arrival, AOA)/离开角(Angle of Departure, AOD)功能。客户端设备在下文中为“想要获得方向信息的低功耗射频”。服务器设备在下文中为“设置方向信息基点的低功耗射频”。客户端设备可以通过AOA/AOD方法获得服务器设备的方向信息。客户端射频可以通过来自多个服务器设备的方向信息和提供其位置的配置文件级别信息,计算出自己的位置。

Telink定位解决方案可以通过其嵌入式MCU提供估算角,同时提供3种天线阵列参考设计,包括PCB天线。

到达角(AOA)方法

客户端设备可以通过使用单个天线发送启用测向的数据包,使其到达角信息可用于服务器设备。

由射频开关和天线阵列组成的服务器设备,在接收这些数据包的同时切换天线并捕获IQ样本。IQ样本可用于计算使用天线阵列的不同元素接收到的无线电信号中的相位差,进而可用于估算角。

到达角方法

离开角(AOD)方法

由射频开关和天线阵列组成的客户端设备,可以通过发送启用测向的数据包,在传输过程中切换天线来检测其离开角。

服务器设备接收这些数据包并捕获IQ样本。IQ样本可用于计算使用天线阵列的不同元素接收到的无线电信号中的相位差,进而可用于估算角。

离开角方法

数据包格式

数据包格式

Telink定位解决方案支持针对AOA和AOD功能指定的数据包格式:由Preamble、Access-Address、PDU、CRC(循环冗余校验)和Constant Tone Extension(恒定频率扩展)组成。PDU中的Header包含AOA AOD的控制信息。

恒定频率扩展

恒定频率扩展是AOA AOD功能特有的。恒定频率扩展具有可变长度:至少为16 µs且不大于160 µs。

恒定频率扩展的前4 µs被称作保护周期,接下来的8 µs被称作参考周期。在参考周期之后,恒定频率扩展由一系列交替的切换时隙和采样时隙组成,由主机指定每个时隙为1 µs或2 µs。恒定频率扩展的结构如下所示。

恒定频率扩展结构

天线切换

当设备在接收AoA恒定频率扩展或在发送AoD恒定频率扩展时,需要在天线之间进行切换,切换操作发生在称作切换时隙的时间段内。恒定频率扩展的前4 µs被称作保护周期,接下来的8 µs被称作参考周期。接收链路层在参考周期和称作采样时隙的时间段内捕获IQ样本。

模式中的第一根天线将在参考周期使用。模式中的第二根天线将在第一个采样时隙期间使用,第三根天线将在第二个采样时隙期间使用,依此类推。相同的天线ID可能在模式中出现多次,使用中的天线只会在保护周期和切换时隙期间发生变化。

IQ 采样

当接收到包含AoD恒定频率扩展的数据包时,接收器不需要切换天线。

当接收到包含AoA恒定频率扩展的数据包时,接收器会按照该速率执行天线切换,并遵循主机配置的切换模式。

接收器在参考周期内每微秒采集⼀个IQ样本,每个采样时隙进⾏⼀个IQ采样(因此,将有8个参考IQ样本),对于2 µs时隙的情况,将有最多37个IQ样本,对于1 µs时隙的情况,将有最多74个IQ样本。控制器将IQ样本报告给主机。无论其长度如何,接收器都将会对整个恒定频率扩展进行采样,除非它会与其他活动发生冲突。

RSSI

接收器用于接收数据包主体的天线上测量接收到数据包的RSSI(这两种情况均不包括任何恒定频率扩展)。

电缆测试

我们根据规范“RF-PHY.TS.5.1.1”测试8278芯片。8278通过了所有AOA/AOD测试用例。以下是有关这些测试用例的一些详细信息。

天线切换完整性

芯片8278实现了3个GPIO端口来控制PA转换,切换模式可由软件配置。8278最多支持8根天线,16个非循环切换。

IQ样本动态范围

为了实现MUSIC等高阶算法,IQ样本应显示出与接收信号强度相对应的不同幅度。规范中的测试用例:将信号-52、-49、-57和-62dBm发送到天线1、2、3和4,要求MEAN ANT4 < MEAN ANT3 < MEAN ANT 1 < MEAN ANT 2,“MEAN ANT n”指天线n的IQ样本幅度平均值。

芯片8278以8位精度输出IQ样本。下图显示了平均值和标准差(STD)。不同端口的,逐采样点的IQ值,由参考信号进行归一化处理,幅度分辨率小于1dB。

动态范围结果

IQ样本一致性

为了计算不同天线发射信号的相位差来获得角度,同一天线在不同时刻的相位应该是一致的,不同天线在不同时刻的相位差应该是一致的。详细信息请参阅Core 5.1的5.2章节。

使用功分器将信号传输到芯片8278的4个端口,所有数据包均附有160µs CW,校准电缆差和功率分流差,用参考信号校准初始相位差。规范要求同一天线的相位变化(v-MRP)应小于0.52,而不同天线之间的相位变化(MRPD)应小于1.125。8278收集的数据包中不同端口的相位标准差低于0.025 rad。下图是4个端口的IQ样本的相位。

不同天线的相位

硬件

参考设计有3种选择,参考设计1适用于墙上的板子,参考设计2适用于天花板上的板子,参考设计3使用PCB天线来替代参考设计2中的外部天线。

参考板设计1如图4.1所示,图4.2是角度说明,X轴指向0度,Y轴指向90度。

参考板设计 1

参考板设计的角度说明 1

参考板设计2见图4.3,角度说明见图4.4,RF8-RF1作为X轴指向0度,RF5-RF4作为Y轴指向90度。

参考板设计 2

参考板设计的角度说明 2

参考板设计3如图4.5所示,角度说明与参考板2相同。

参考板设计 3

固件和API

为了方便客户使用,我们提供了用于计算角度和原始数据的API。客户可以选择使用我们提供的API(通过我们提供的算法)直接获取输入角度或者通过原始数据来自己开发算法进行角度计算。同时我们提供了demo来帮助客户进行AOA或者AOD相关演示和功能验证。客户可以通过下面的链接获取对应的SDK和Tscript工具。

SDK: http://wiki.telink-semi.cn/tools_and_sdk/Driver/telink_b85m_driver_sdk.zip

Tscript: http://wiki.telink-semi.cn/tools_and_sdk/BLE/827x_AOA_AOD_Solution.zip

API和原始数据

目前我们是将AOA/AOD收发相关配置的接口统一放在了rf_drv.h和rf_drv.c,而与数据拆分及角度计算等算法相关接口放在aoa.c和aoa.h中。因此客户在使用时需要将对应的libdriver.a以及rf_drv.h、aoa.h移植到对应的工程中。用户在使用时可以在配置完RF初始化后通过调用rf_drv.h相关接口,设置使能AOA/AOD功能以及配置天线数量、切换顺序、采样间隔等。具体设置可参照Demo部分结合自身需求进行调整。另外在aoa.c和aoa.h中提供了通过收包数据计算角度信息的API和获取原始数据的接口。

用户可以通过调用unsigned int raw_data_to_angle_no_z(unsigned char *ptr_packet)获取输入角度信息,该函数返回值为平面角度信息。也可以通过调用unsigned int raw_data_to_angle_with_z(unsigned char *ptr_packet,unsigned char *temp_theta)来获取角度信息,该函数除了返回一个平面角度信息外,还会将高度角信息输出到temp_theta变量,用户可通过该变量获取高度角信息。示例如下:

unsigned int angle_value;
unsigned char theta_angle;
angle_value = raw_data_to_angle_no_z(&rx_packet[0]);//仅获取平面角度信息
angle_value = raw_data_to_angle_with_z(&data_no_amplitude[0],(unsigned char *)&theta_angle);//获取平面角度和高度角

另外提供了获取原始数据的接口,用户可以通过该接口获取收包端获取到的IQ原始数,原始数据经过数据拆分,转换为有符号十进制数,等预处理后可以提供给算法进行角度的计算。

unsigned char raw_data[90];
get_raw_data(&raw_data[0],&rx_packet[0],90);

将原始数据复制到raw_data[0]、raw_data[1]、raw_data[2]……raw_data[89],它们分别代表IQ0的实部、IQ0的虚部、IQ1的实部……IQ44的虚部。用户需要一个至少有90个参数的unsigned char表,因为有45个样本数据,每个数据都包括实部和虚部。

Demo

Demo支持AOA/AOD模式,客户可以通过对应的宏定义选择自己使用的模式。下载demo程序到参考硬件,发送端会持续向接收端发送数据以输出角度。输出的角度可以通过UART打印,USB输出到BDT/Tscript或者SWS上传到Tscript。参考硬件设计AOA模式的角度输出只支持SWS上传到Tscript进行输出和图形化显示。

目前demo兼容芯片8278和8258,下面介绍demo时将以8278为例。下文中的82xx可根据实际情况用8258或者8278进行代替。

Demo参数

drivers/82xx/aoa.h中的变量参数:

#define RF_REAL_FREQ  2450  //设置 TX/RX 频率,这里是2450MHz。

定义了发送频率。

app.c中的变量参数:

以8278为例:

/***************选择IO作为天线控制脚*************************/
rf_ant_pin_sel_t ant_config =
{
   .antsel0_pin = RF_ANT_SEL0_PD6,
   .antsel1_pin = RF_ANT_SEL1_PB0,
   .antsel2_pin = RF_ANT_SEL2_PB1,
};

目前Demo兼容8258和8278,因此分别提供了一组IO作为天线控制脚。

/***************选择UART输出或者Tscript输出*************************/
#define BY_TSCRIPT          1
#define BY_UART             2
#define USER_MODE           BY_TSCRIPT

采用UART或者Tscript输出角度信息。

/***************选择 TX 或 RX*************************/
#define TX      1
#define RX      2

#define RF_TXRX_MODE       RX

将电路板定义为发送端或接收端。

/***************选择AOA或AOD***********************/
#define RF_AOD_EN       0       //0:AOA;1:AOD

将电路板定义为AOA或AOD。

#define calibration_no_Z   0    //0:采用返回带高度角信息的算法;1:使用只返回平面角信息的算法

决定采用的算法处理结果是否带有高度角信息。

8258芯片可调用如下函数:

/***************选择天线数量和切换顺序***********************/
/**
 * @brief   以4根天线为例说明天线切换顺序
 *          SWITCH_SEQ_MODE0    - 天线索引切换顺序 01230123
 *          SWITCH_SEQ_MODE1    - 天线索引切换顺序 0123210
 */
         rf_aoa_aod_ant_init(8,&ant_config,SWITCH_SEQ_MODE0);

注意:

  • 8258仅支持两种天线切换顺序,这部分可以参照rf_drv.h中两种天线切换模式的注释。

8278芯片则可参照如下设置:

unsigned char antenna_switch_seq[8] = {0,1,2,3,4,5,6,7};
rf_aoa_aod_ant_init(8,&ant_config,SWITCH_SEQ_MODE0,antenna_switch_seq);

8278在天线切换设置上相较于8258做的更加灵活,将原来直接设置天线切换顺序的方式修改为查表的方式,通过SWITCH_SEQ_MODEx(x= 0,1,2)来设置查表的顺序;通过antenna_switch_seq设置表内容,即实际的天线切换顺序。

/***************************TX/RX 频率**********************
[简要描述]:射频频率,为了改变频率,请在drivers/82xx/aoa.h中更改RF_REAL_FREQ。
**************************************************************/
#define RF_FREQ         RF_REAL_FREQ-2400    // TX/RX 频率
/***************TX Payload 长度***************************/
#define TX_PKT_PAYLOAD          0x12

定义了发送数据包的payload部分的长度,根据包结构可以使用payload length进行长度校验以及获取数据包中存储信息的偏移量。

射频频率应在aoa.h中通过更改RF_REAL_FREQ进行验证,不在此更改。

/***************TX 能量***************************/
#if (MCU_CORE_B85)
#define RF_POWER            RF_POWER_P10p46dBm
#elif (MCU_CORE_B87)
#define RF_POWER            RF_POWER_P11p26dBm
#endif

定义了发射能量(TX power),这部分根据芯片的能量表设置即可。

#define IQ_DATA_8_BIT_EN    0 // 0:采用20 bit长度的IQ数据;1:采用8 bit长度的IQ数据。

定义了IQ数据的长度,8258仅支持8 bit长度的IQ数据;8278目前支持8bit、16bit(low)、16bit(high)、20bit长度的IQ数据。目前8278部分demo仅以8 bit和20 bit长度数据作为示例。

/**************连接接入码*****************/
#define ACCESS_CODE             0xfcaab2c1

定义ACCESS_CODE.

/**************脚本指令空间*****************/
unsigned char para_buff[commandBuffSize] = {0};
unsigned char temp_para[commandBuffSize] = {0};

当采用Tscript进行角度显示时,该空间用于指令传输。

/**************记录 tx 或 rx cnt*****************/
volatile unsigned int rx_cnt=0;//用于表示收包个数。
volatile unsigned char tx_cnt=0;//发包个数,同时会将该数据放入包中,方便收包端确认数据来自不同的包。
/*******存储stimer tick值********/
unsigned int tick_now;//用于存储当前tick值以判断超时
/*******角度信息********/
unsigned int angle_value;     //用于存储平面角度信息
unsigned char theta_angle;   //将高度角结果存储为带有高度角信息的输出参数

这两个变量会作为结果传输到Tscript脚本供上层显示角度使用。

/*******原始数据获取空间********/
unsigned char raw_data[90];

用于存储算法使用的IQ原始数据,demo中在使用20 bit长度的IQ数据时会先将其转化为8 bit长度的数据,然后存储在原始数据中。

/*******上传结果到Tscript ********/
unsigned char trans_buff[136] = {0x00};
unsigned char trans_table[10];

用于将数据上传到Tscript。

/*******收包数据********/
unsigned char  rx_packet[280]  __attribute__ ((aligned (4))) = {0x00};//280 byte空间以满足20 bit长度的IQ数据,可根据不同的长度的IQ数据进行调整。
unsigned char  data_has_amplitude[256]  __attribute__ ((aligned (4))) = {0};
unsigned char  data_no_amplitude[256]  __attribute__ ((aligned (4))) = {0};

用于存储从rx_packet处理后得到的带有高度角信息和不带高度角信息的数据,供计算角度的算法使用。

/*******天线角度校准********/
int phase_rx_angle_cali_angle[8] = {0,-41,82,163,41,-122,122,122};

算法是针对rx_angle的校准。

User_init介绍:

void user_init()
{
        gpio_init(1);
#if (MCU_CORE_B87 || MCU_CORE_B85)
//用于使能usb,可以通过usb输出角度信息。
        usb_set_pin_en();
#endif
//对BLE模式进行初始化,不区分tx,rx。
        rf_drv_init(RF_MODE_BLE_1M_NO_PN);
#if(MCU_CORE_B85)
/*************************** 天线配置 **********************
[简要描述]:
主要配置天线的个数,控制天线切换的引脚,以及天线切换的顺序。
8:代表使能8根天线,目前kite最多支持8根天线。客户可根据需求使能相应数量。
ant_config:用于控制天线的引脚
SWITCH_SEQ_MODE0:天线切换模式
**************************************************************/

rf_aoa_aod_ant_init(8,&ant_config,SWITCH_SEQ_MODE0);
/*************************** IQ 采样配置**********************
[简要描述]:
该函数主要用于IQ数据长度、采样间隔和采样偏移。
IQ_8_BIT_MODE:8 bit长度的IQ数据
SAMPLE_AOA_4US_AOD_CTEINFO_INTERVAL:如果是AOA,那么4 us的采样间隔就对应于协议的2 us作为一个时隙;如果是AOD模式则需要根据CTEinfo来判断是4 us采样间隔还是2 us的采样间隔。这部分具体可以参照协议。
-4:该参数用来调整初始采样点的位置,为确保采样点为最优点。
**************************************************************/

rf_aoa_aod_sample_init(IQ_8_BIT_MODE,SAMPLE_AOA_4US_AOD_CTEINFO_INTERVAL,-4);
#else

/*************************** 天线配置**********************
[简要描述]:
主要配置天线的个数,控制天线切换的引脚,以及天线切换的顺序。需要注意的是8278相较于8258的天线切换顺序的设置有所不同。
8:代表使能8根天线,与8258含义相同
ant_config:用于控制天线的引脚,与8258含义一致
SWITCH_SEQ_MODE0:天线切换中的查表顺序,在8258中则为实际天线切换顺序
antenna_switch_seq:天线切换顺序表,在表中找到对应位置所需要切换的天线
**************************************************************/

rf_aoa_aod_ant_init(8,&ant_config,SWITCH_SEQ_MODE0,antenna_switch_seq);
#if(IQ_DATA_8_BIT_EN)
/*************************** IQ 采样配置**********************
[简要描述]:同上
**************************************************************/

rf_aoa_aod_sample_init(IQ_8_BIT_MODE,SAMPLE_AOA_4US_AOD_CTEINFO_INTERVAL,-4);
#else
rf_aoa_aod_sample_init(IQ_20_BIT_MODE,SAMPLE_AOA_4US_AOD_CTEINFO_INTERVAL,-4);
#endif
#endif

/***************************算法初始化***********************/
#if calibration_no_Z
    init_lookup_table_algorithm_no_Z();
#else
    init_lookup_table_algorithm_with_Z();
#endif

/***************************发送端使能AOA/AOD功能***********************/
#if(RF_TXRX_MODE==TX)
    rf_aoa_aod_set_tx_mode(RF_TX_ACL_AOA_AOD_EN);
    rf_set_power_level_index (RF_POWER);
#elif(RF_TXRX_MODE==RX)
    rf_aoa_aod_set_rx_mode(RF_RX_ACL_AOA_AOD_EN);
#endif

/***************************确保芯片处于idle状态***********************/
    rf_set_tx_rx_off();
    rf_set_tx_rx_off_auto_mode();

/**********************设置发送接收频点及接入码********************/
    rf_set_channel(RF_FREQ,0);
    rf_access_code_comm(ACCESS_CODE);

/**********************Tscript模式初始化指令和结果空间********************/
#if(USER_MODE == BY_TSCRIPT)
    //2.initiate parameter buffer to receive CMD and parameter
    ParaBuf_Init((unsigned int)commandBuff,commandBuffSize,commandBuffCnt);
    //3.initiate result buffer to send the result
    ResuBuf_Init((unsigned int)resultBuff,resultBuffSize,resultBuffCnt);
#endif
}

Main_loop 介绍:

Tx部分主要是使能tx模式,然后根据需求设置相应的发包间隔,进行AOA/AOD数据包的发送即可,具体可以参考如下代码。

/**********************Tx 部分********************/
rf_set_txmode();         //开启tx模式
    while(1)
    {
        while((unsigned int)(clock_time()-tick_now) < 400000);  //设置超时
        tick_now = clock_time();
        tx_cnt++;
//发送对应的数据包
#if RF_AOD_EN
        ble_tx_packet_AOD[7]  =tx_cnt;
        rf_tx_pkt (ble_tx_packet_AOD);
#else
        ble_tx_packet_AOA[7]  =tx_cnt;
        rf_tx_pkt (ble_tx_packet_AOA);
#endif
        while(!rf_tx_finish());     //等待发包结束
        rf_tx_finish_clear_flag();  //清除中断标志
    }

RX部分主要工作包含:收包、计算角度信息、输出角度信息。角度的输出包含通过UART打印和通过Tscript显示两种方式。其中在使用Tscript显示时,可以根据收包端与上位机连接是通过single wire还是usb table选择运行不同的脚本。

由于RX部分比较复杂,下面会根据功能分块简单介绍一下。

/**********************Rx 部分********************/
#elif(RF_TXRX_MODE==RX)
      rf_rx_buffer_set((unsigned char*)rx_packet,296, 0);
      rf_set_rxmode ();
      sleep_us(85);
      rx_tick = clock_time();
      //这部分的主要功能是设置收包buffer,使能收包功能

   while(1)
   {
    #if(USER_MODE == BY_TSCRIPT)
         if(is_ParaBuf_HaveData()!= 0)
         {
             ParaBuf_Read(para_buff,commandBuffSize);

             if(para_buff[0] == 0x33)
             {
                 trans_table[1] = RF_FREQ;
                 trans_table[2] = ACCESS_CODE&0xff;
                 trans_table[3] = (ACCESS_CODE>>8)&0xff;
                 trans_table[4] = (ACCESS_CODE>>16)&0xff;
                 trans_table[5] = (ACCESS_CODE>>24)&0xff;
                 trans_table[6] = 2;
    #if(MCU_CORE_B85)
                 trans_table[7] = 1;
    #else
                 trans_table[7] = IQ_DATA_8_BIT_EN;
    #endif
                 trans_table[8] = (TX_PKT_PAYLOAD&0xff);
                 ResuBuf_Write(trans_table, 32);
             }
         }
   }

在使用Tscript模式下等待脚本下达对应指令para_buff[0]==0x33时,上传程序的基本信息包括收发包频点,接入码等,供脚本显示信息或者处理数据使用。

    if(para_buff[0] == 0x55)
#endif
    {
        while(1)
        {
#if(USER_MODE == BY_TSCRIPT)
        if(is_ParaBuf_HaveData()!= 0)
        {
            ParaBuf_Read(para_buff,commandBuffSize);
            if(para_buff[0] == 0x11)
            {
                while(is_rf_receiving_packet());
                rf_set_tx_rx_off();
                Result_Buff_Clear();
                break;
            }
        }
        }
    }

获取指令0x55进入收包状态,判断是否需要清理result buffer,如需要清理等待收包结束。关闭收包状态,并清空result buffer。

完成收包并对收包数据进行处理

截图信息一直到main_loop结束这部分主要是完成收包,并对收包数据进行处理,通过算法得出角度信息。

同时会将包里面的数据得出的原始数据保存下来上传到Tscript。客户可以通过Tscript的脚本获取原始数据来简单验证自己的算法。

用户指南

软件:

  • Telink IDE 1.3
  • Telink Burning and Debugging Tool (BDT)

步骤:

a. 将app.c中的RF_TXRX_MODE改为TX,然后使用Telink IDE 1.3构建项目生成.\RF_AOA_Demo\RF_AOA_Demo.bin。

b. 用usb或SW连接单天线板,下载TX程序。

c. 将app.c中的RF_TXRX_MODE改为RX,然后重建项目,生成一个新的.\RF_AOA_Demo\RF_AOA_Demo.bin。

d. 通过usb或SW连接多天线板,下载RX程序。

e. 使用usb连接多天线RX板供电和通信,然后通过View -> usb log将BDT更改为usb log模式,如下图所示。

将BDT更改为USB log模式

f. 打开日志窗口。这样用户可以在收到AOA数据包后看到输入角度。如果使用程序中的打印功能,请确保将其打印出来,否则程序会出现未知的错误。

进入日志窗口界面

g. 如果用户想使用UART进行打印,需要在drivers/8258/printf.h中修改一些定义。将DEBUG_BUS改为DEBUG_IO,设置PRINT_BAUD_RATE和DEBUG_INFO_TX_PIN,然后GPIO将模拟UART并以高达1000000的波特率打印出信息。

使用UART进行打印的代码

泰凌解决方案发布

除了演示外,我们还提供了Telink AOA/AOD解决方案,用于显示AOA/AOD结果,并用所述硬件收集原始数据。解决方案包括bin文件和调试工具——Tscript,界面如下。

AOA/AOD工具界面 1(仅与8258的硬件兼容)

AOA/AOD工具界面 2

使用方法

步骤1:将指定的bin文件下载到芯片,然后使用USB或SWS将电路板连接到计算机以打开电源并进行通信。通过SWS将多边形板连接到计算机,特别是在使用多边形板测试AOA时,因为多边形板上没有USB。

步骤2:打开Tscript.exe,双击RF_AutoTest_Kite\AoA.lua,然后界面如下图所示。根据电脑和主板之间不同的连接方式,选择AoA_Sniffer_draw_by_sws_V1.4.lua或AoA_Sniffer_draw_by_usb_V1.4.lua。

Tscript界面

步骤3:选择连续模式或保存模式启动,这两种模式将在5.3.2 连续模式5.3.3 保存模式中介绍

连续模式

连续模式旨在显示内部API的计算角度结果。接收板收到AOA/AOD数据后会不断接收数据并计算角度。固定窗口的平均角度数据后,结果会显示在界面中,表中的指针会指向相应的位置。此外,接收到的数据包编号、频率、接入码和RSSI在界面中显示如下。当前界面支持显示高度角和水平角度。

连续模式(黄色:高度角;黑色:水平角度)

保存模式

保存模式旨在收集AOA/AOD原始数据。输入“保存文件名”和“数据包编号”后点击“开始”按钮,然后用户可以获得包含十进制采样IQ值的Save_File_Name.txt和包含十六进制原始接收数据的Save_File_Name_backup.txt。用户可以使用其他算法来处理这些数据或进行其他实验。

Save_File_Name.txt将包含n个数据包的十进制采样IQ值,其中n是用户设置的数据包数量。每个数据包包含45个组,包括对应于45个采样点信息的90个数字。每组包含两个数字,第一个数字表示采样点的实部,第二个数字表示采样点的虚部。下图显示了AoA接收端的时隙图。在参考周期内,芯片每1 us采样一次信息,共得到8组编号。之后,芯片将在每个采样时隙采样信息,共37组编号。所以每个数据包包含37 + 8 = 45组,共90个数字。

AoA接收端时隙图

例如,上图显示一个AOA测试数据包,其中包含前面提到的总共90个数字。第一行列出了在参考周期内采样的16个数字,采样结果如下:

-97 – 18i, 2 – 86i, 88 – 14i, 2 + 88i, -90 + 23i, -34 – 97i, 79 – 26i, 41 + 90i

用户还可以通过这种方式获取其他37组采样时隙数据。

测试数据

文件位于.\kite_RF_AoA\project\RF_AutoTest_Kite\AutoTest_Report。

默认传输频率为2460 MHz,天线切换顺序为:三角板为RF2-> RF4-> RF6-> RF8,RF2为参考周期的主天线;多边形板为RF1-> RF2-> RF3-> RF4-> RF5-> RF6-> RF7-> RF8,RF1为参考周期的主天线。

数据包格式

这部分将介绍数据包格式并举例说明。 数据包格式如下:

收包格式

例如,这里有一个由三角板(由Tscript保存)接收的2 us切换时隙的AOA数据包。如果多天线板是三角板,则可以根据数据包格式进行如下分析。在前面提到的解决方案的保存模式中,一旦接收到AOA/AOD数据包,接收端将会调用函数来计算角度和r的平方,然后将其放在rx_packet后面。Tscript将读取总共130个字节来获取它们。

三角板的数据包示例

rx_packet中的原始数据需要被看作char变量,所以最高位是符号位,较低的7位是数据位,它们可以用标准方法转换为十进制数。例如,示例中的原始数据可以转换为如下图所示。天线切换顺序为RF2-> RF4 -> RF6 -> RF8。

多边形板的数据包示例 1

例如,这里是多边形板(由Tscript保存)接收的2 µs切换时隙的AOA数据包,可以根据数据包格式进行如下分析。在前面提到的解决方案的保存模式中,接收端会在收到AOA/AOD数据包后调用函数来计算角度,然后将其放在rx_packet后面。Tscript将读取总共130个字节来获取它们。

多边形板的数据包示例 2

示例中的原始数据可以转换为如下图所示。天线切换顺序为RF1-> RF2-> RF3-> RF4-> RF5-> RF6-> RF7-> RF8。

多边形板的数据包示例 3

RSSI值代表接收数据的信号强度,可以从数据包中获取RSSI值。用从数据包中得到的数据减去110(D)就是RSSI。例如,数据是0x33,0x33减去110是-59。所以RSSI是-59。

三角板(RSSI)的数据包示例

现场测试结果

参考板1的现场测试结果

室内测试环境如图6.1所示。多天线的一端可以切换天线以发送或接收恒定单音,附着在距离地面2米高的墙壁上。在另一端,一个单天线BLE模块被放在距离多天线一端5米远的地方,以5度步长进行测试,测试结果如图6.2所示。

参考板 1的测试环境

5米室内测试结果

下图是不同场景下的测试结果,表示误差绝对值的均值vs实际角度。参考板1放置的高度为1米或2米,单天线BLE模块放置的高度为1米。按照下面的测试,从墙到单天线适配器的距离分别为0.5、1、2、3和5米。

误差绝对值均值 vs 实际角度

参考板2的现场测试结果

室内测试环境如图6.4所示。多天线的一端可以切换天线以发送或接收恒定频率扩展,挂在1.8米高的支架上。另一端是单天线BLE模块,放在地板上或0.9米高、距离支架1米或2米远的地方,将高度标记为H,距离标记为D。以5度步长进行测试,测试结果如图6.5和图6.6所示。

场景 1:D = 1,H = 0;

场景 2:D = 2,H = 0;

场景 3:D = 1,H = 0.9;

场景 4:D = 2,H = 0.9.

同时测量alpha和theta的角度。

参考板 2的测试环境

估算alpha vs 实际alpha

估算theta vs 实际alpha

参考板3的现场测试结果

测试环境如图6.7所示。多天线的一端可以切换天线以发送或接收恒定频率扩展,挂在2.5米高的支架上。另一边是单天线BLE模块,放在地板上或1.0米高、距离支架1米、2米或3米远的地方,将高度标记为H,距离标记为D。以5度步长进行测试,测试结果如图6.8至6.11所示。

场景 1:D = 1,H = 0;

场景 2:D = 2,H = 0;

场景 3:D = 3,H = 0;

场景 4:D = 1,H = 1;

场景 5:D = 2,H = 1;

场景 6:D = 3,H = 1.

同时测量alpha和theta的角度。

参考板 3的测试环境

场景1、2、3估算alpha vs 实际alpha

场景1、2、3估算theta vs 实际alpha

场景4、5、6估算alpha vs 实际alpha

场景4、5、6估算theta vs 实际alpha

参考板原理图

参考板原理图第1部分

参考板原理图第2部分