电子说
一、前言
今天分享的话题是在蓝牙spec5.3中有关于“白话”和“去白话”这一名词,做过这方面研究的相信都有所了解,在BLE中bit stream processing的处理流程就有包含这一过程,如下图所示。其最终终目的很简单就是为了让发视和接收的数据不要重复的出现0和1,降低数据的冗余性。例如:0b0000000或0b1111111,那其原理究竟是什么呢,小编头铁非要一探究竟!
二、何为白话
“白化”这个词最早来源于信号处理领域,跟其中最常见的一种噪声——白噪声有很大的联系。在信号处理理论中,白噪声指的是一种在不同频率都有相同功率的随机信号,即其功率谱密度为常数,功率与频率无关。“白噪声”这个名字来源于白光,白光包含了光谱中所有的颜色,其功率谱密度也呈平坦状,类似地,“白噪声”这种噪声中包含了所有频率的噪声,因此被冠上了“白”的称号。其他不满足该功率谱密度特性的噪声也被称为有色噪声,类似于非白光的其他颜色光。
上述关于白色信号(白光,白噪声)的定义是一个通俗的定义,其严格数学定义为:一个随机向量w称为一个白色随机向量当且仅当其平均值函数为0且自相关函数为一个单位矩阵的倍数。简单来讲,就是该信号的平均值为0,且各个分量之间互不相关。
当然这些解释都是网上可以找到的,无非就是信号处理的一种手段,在“机器学习”领域中对数据处理经常会用到,但其实现方式是怎样的呢?不妨看看下图,这是spec里的一种算法,从图中不难理解,是通过线性反馈移位的方式来处理数据,以达到白话效果。
三、白话代码实现方式
那这种算法在代码里是怎么体现的呢,以下是一些白话处理的相关sample,希望对大家理解起来有帮助:
sample1
#include Datawhitening.h static unint8_t WhiteningKeyMSB = 0x01; static unint8_t WhiteningKeyLSB = 0xFF; void RadioComputeWhitening(uint8_t *buffer, uint16_t bufferSize) { uint8_t i = 0; uint16_t j= 0; uint8_t WhiteningKeyMSBPrevious = 0; for(j=0;j> 5) & 0x01); WhiteningKeyLSB = ((WhiteningKeyLSB >> 1) & 0xFF) | ((WhiteningKeyMSBPrevious << 7) & 0x80); } } }
sample2
uint8_t swapBits(uint8_t a) { uint8_t v = 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; return v; } /** * @brief Implements whitening with LFSR * @note * @param data: location of the data to be whiten * len: data length * whitenCoeff: whitening coefficient * 它是一种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++; } }
全部0条评论
快来发表一下你的评论吧 !