一、前言
今天分享的话题是在蓝牙spec5.3中有关于“白话”和“去白话”这一名词,做过这方面研究的相信都有所了解,在BLE中bit stream processing的处理流程就有包含这一过程,如下图所示。其最终终目的很简单就是为了让发视和接收的数据不要重复的出现0和1,降低数据的冗余性。例如:0b0000000或0b1111111,那其原理究竟是什么呢,小编头铁非要一探究竟!
二、何为白话
“白化”这个词最早来源于信号处理领域,跟其中最常见的一种噪声——白噪声有很大的联系。在信号处理理论中,白噪声指的是一种在不同频率都有相同功率的随机信号,即其功率谱密度为常数,功率与频率无关。“白噪声”这个名字来源于白光,白光包含了光谱中所有的颜色,其功率谱密度也呈平坦状,类似地,“白噪声”这种噪声中包含了所有频率的噪声,因此被冠上了“白”的称号。其他不满足该功率谱密度特性的噪声也被称为有色噪声,类似于非白光的其他颜色光。
上述关于白色信号(白光,白噪声)的定义是一个通俗的定义,其严格数学定义为:一个随机向量w称为一个白色随机向量当且仅当其平均值函数为0且自相关函数为一个单位矩阵的倍数。简单来讲,就是该信号的平均值为0,且各个分量之间互不相关。
当然这些解释都是网上可以找到的,无非就是信号处理的一种手段,在“机器学习”领域中对数据处理经常会用到,但其实现方式是怎样的呢?不妨看看下图,这是spec里的一种算法,从图中不难理解,是通过线性反馈移位的方式来处理数据,以达到白话效果。
三、白话代码实现方式
那这种算法在代码里是怎么体现的呢,以下是一些白话处理的相关sample,希望对大家理解起来有帮助:
sample1
#includeDatawhitening.h staticunint8_tWhiteningKeyMSB=0x01; staticunint8_tWhiteningKeyLSB=0xFF; voidRadioComputeWhitening(uint8_t*buffer,uint16_tbufferSize) { uint8_ti=0; uint16_tj=0; uint8_tWhiteningKeyMSBPrevious=0; for(j=0;j>5)&0x01); WhiteningKeyLSB=((WhiteningKeyLSB>>1)&0xFF)|((WhiteningKeyMSBPrevious<< 7) & 0x80); } } }
sample2
uint8_tswapBits(uint8_ta) { uint8_tv=0; if(a&0x80) v|=0x01; if(a&0x40) v|=0x02; if(a&0x20) v|=0x04; if(a&0x10) v|=0x08; if(a&0x08) v|=0x10; if(a&0x04) v|=0x20; if(a&0x02) v|=0x40; if(a&0x01) v|=0x80; returnv; } /** *@briefImplementswhiteningwithLFSR *@note *@paramdata:locationofthedatatobewhiten *len:datalength *whitenCoeff:whiteningcoefficient *它是一种7位线性移位反馈样式,并通过等于(channelNum<< 1)+ 1的值进行初始化 * @retval */ void bleWhiten(uint8_t *data, uint8_t len, uint8_t whitenCoeff) { uint8_t m; while (len--) { for (m = 1; m; m <<= 1) { if (whitenCoeff & 0x80) { whitenCoeff ^= 0x11; (*data) ^= m; } whitenCoeff <<= 1; } printf("0x%x ", *data); data++; } }
-
蓝牙
+关注
关注
114文章
5814浏览量
170221 -
代码
+关注
关注
30文章
4780浏览量
68542 -
机器学习
+关注
关注
66文章
8408浏览量
132580 -
AIoT
+关注
关注
8文章
1406浏览量
30657
原文标题:whitening
文章出处:【微信号:嵌入式开发AIoT,微信公众号:嵌入式开发AIoT】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论