BLE 自适应跳频及算法实现
BLE协议运行在2.4G ISM频段上,由于诸如Wi-Fi,ZigBee等都在此频段上,因此干扰是比较严重的。需要在此频段上进行有效的数据交互,自适应跳频技术是必不可少的,废话不多说,咱们直接进入主题,讨论下的BLE协议中的自适应跳频,以及跳频算法的实现。
我们称主设备为Master(手机、PC机等),从设备为Slave(手环等)。Master向Slave发送connect request,需要与slave建立连接。在slave收到Master发出的connect request时,在开始建立连接的同时也要更新和计算的Master的channel map表,以及下一个连接使用的频点。
如下图所示,为Master发出的CONNECT_REQ的Payload,图中的ChM和hop参数,分别表示Channel map表,即建立连接后有哪些channel是可以被使用的,有哪些channel是不可用的。hop表示跳数,表示跳频每次的跳频的间隔。
例如,ChM 和 Hop分别为 ChM[5] = {0x02, 0x56, 0x49, 0x13, 0x11]; hop = 5;
将ChM转换为二进制数,则为00010001 00010011 01001001 01010110 00000010,频道位被置为1的表示该信道可用,信道位被置为0表示该信道不可用。那么可用的频道used = [1, 9, 10, 12, 14, 16, 19, 22, 24, 25, 28,32, 36 ];可使用的信道数numUsed = 13。
接下来需要计算下一个连接使用的频道
fn+1 = (fn + hop) mod 37; fn+1 = (0 + 5) % 37; 即下一个频道的channel为5,但是5不是一个好的channel,因此需要从好的channel表里找一个channel,即used[5 % numused] = used[5 % 13] = 16;
再下一个连接使用上一个未映射的信道来计算,fn+1 = (fn + hop) mod 37; fn+1 = (5 + 5) % 37 = 10,channel 10是一个好的channel,在下一个连接就用channel 10。
对应的计算的计算连接channel的算法:
u8 chn_table[40];
u16 ll_chn_idx;
/**
**计算channel map,分辨哪些channel是好的, 哪些channel是“坏”的,将好的channel存储到table内
**根据跳频算法,和跳数(hop)来填满channel table,以便于在下个interval来获取
**
**
*********************************************/
u8 updata_chn[5] = { 0x02, 0x56, 0x49, 0x13, 0x11 };
u8 hop;
int chn_table_calc(u8 *chn_map, u8 hop)
{
u8 k = 0, numused = 0;
u8 tmp_table[37];
for (int i = 0; i < 37; i++) {
if (chn_map[i >> 3] & BIT(i & 0x07)) //chn map中某一个bit设置为1时,就认为这是个好channel
{
tmp_table[numused++] = i; //找出所有好的channel
}
}
u8 ll = 0;
for (int i = 0; i < 37; i++) {
k += hop;
if (k >= 37) {
k -= 37;
}
if (chn_map[k >> 3] & BIT(k & 0x7)) { //跳频后正好对应的是好channel
chn_table[ll] = k;
}
else { //跳频后未对应好的channel,则fn+1 = tmp_table[(hop + fn)% chn_cnt_num]
u8 m = k;
while (m >= numused) {
m -= numused;
}
chn_table[ll] = tmp_table[m]; //将下一个连接的channel映射到好的channel上
}
ll++;
}
return numused;
}
int main()
{
// init frequency hop param
hop = 5;
u8 num = chn_table_calc(updata_chn, hop);
printf("The num of channel be used is %d\n", num);
for (int i = 0; i < 37; i++) {
printf("Next channel is %d\n", chn_table[i]);
}
return 0;
}
最终运行的结果:
到此,BLE自适应跳频算法的原理,以及代码的实现就结束了。
BLE 自适应跳频及算法实现相关推荐
- BLE 信道和自适应跳频
信道 在物理层,因为调制参数放宽,所以BLE和经典蓝牙的信道并不相同,而是只有40个信道,因为功率谱更宽,为了避免相邻信道的干扰,采用2MHz的信道宽度. 在链路层,将40个信道分为广播信道和数据信道 ...
- 【BLE】跳频算法实例分析
[BLE]跳频算法实例分析 蓝牙协议:蓝牙4.2 抓包工具:frontline 计算公式 F(n+1) = (F(n) + hop) % 37 其中: F(n+1)为下一个连接事件使用的信道: F(n ...
- 基于matlab蓝牙跳频系统,基于Matlab软件的蓝牙跳频改进算法
60 基于Matlab软件的蓝牙跳频改进算法 [毛淑华 岩淑霞 雷伯录] 介绍了蓝牙跳频系统对跳频序列的要求,并且提出了一种改进的自适应跳频方案.基于C语言和MATLAB工具对原跳频系统和改进后系统分 ...
- 蓝牙的自适应跳频技术
原文链接:https://www.jianshu.com/p/c42ec414ad34?utm_campaign=maleskine&utm_content=note&utm_medi ...
- 基于特征点匹配的自适应目标跟踪算法
基于特征点匹配的自适应目标跟踪算法 2016-01-29 13:11 摘 要:由于实际场景复杂多变,目标在运动过程中往往会出现形变.遮挡等问题,增加了跟踪的难度.为了解决上述问题,提出一种基于特征点匹 ...
- C++Adaline自适应线性神经网络算法(附完整源码)
C++Adaline自适应线性神经网络算法 C++Adaline自适应线性神经网络算法完整源码(定义,实现,main函数测试) C++Adaline自适应线性神经网络算法完整源码(定义,实现,main ...
- OpenCV局部阙值分割的自适应阙值算法
前言: 当图片中的照明出现不均匀的情况时,图像的灰度值就会出现灰度值不均匀,如果我们采用全局阙值分割,对所有像素值共用同一个阙值,往往无法得到理想的分割.而局部阙值分割则可以解决这个问题,它所提供的思 ...
- 波束赋形技术lms算法在matlab仿真,自适应波束成形算法LMS、RLS、VSSLMS分解
1.传统的通信系统中,基站天线通常是全向天线,此时,基站在向某一个用户发射或接收信号时,不仅会造成发射功率的浪费,还会对处于其他方位的用户产生干扰.然而,虽然阵列天线的方向图是全向的,但是通过一定技术 ...
- 几类自适应波束形成算法推导
波束形成是声纳或者雷达信号处理的一个重要的步骤,它旨在使接收的阵列能够按照期望的方向接收信号,并且抑制其它方向信号的干扰.自适应波束形成往往具有比常规波束形成更尖的指向性和抗强干扰能力.在一些情况下更 ...
最新文章
- Spring Boot日志学习记录【2】
- Chaincode for Operators(运营商的链码手册)
- 计算机网络划分子网_电网小课堂|通信类:子网划分技术
- 浅析ProcessBuilder
- 语言逻辑运算符两侧运算对象_5.3 C语言逻辑运算符与表达式
- wps怎么投递简历发到boss直聘_BOSS直聘角逐招聘季:装机量、下载增量、增长率三料冠军...
- java集合升序降序
- LCA问题——倍增算法,Tarjan算法讲解
- python mock server_Mock Server 入门
- AMSim高级系统建模与仿真软件安装坡姐过程的踩坑心得
- C# 报错 provisional headers are shown learn more
- 波士顿学院的计算机科学,权威公布:美国最强商学院,TOP5里有你的梦校吗?...
- 温州大学X袋鼠云:高等人才教育建设,如何做到“心中有数”
- 制作一个电影分享网站的微信公众号
- 如何利用matlab做BP神经网络分析(包括利用matlab神经网络工具箱)
- C#中Math函数简介
- 从进化论的角度聊一聊大分子编码说和老王谬论
- pythonocc常见问题集锦
- 【转】我奋斗了18年不是为了和你一起喝咖啡
- Split Pairs