关于蓝牙spec5.3中“白话”和“去白话

电子说

1.3w人已加入

描述

一、前言

今天分享的话题是在蓝牙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++;
    }
}  
      审核编辑:彭静
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分