蓝牙协议中的SBC编解码原理和仿真

1、SBC的原理

  SBC是subband codec的缩写,中文叫作次频带编码,也叫子带编码。其基本原理是把信号的频率分为若干子带,而后对每一个子带进行编码,并根据每一个子带的重要性及特色分配不一样的位数(采样深度)来表示数据。
例如,在音频编码中,因为人耳对不一样频率的敏感度不一样,能够在对人耳敏感的子带使用较细的量化(较大的采样深度),对人耳不敏感的子带使用较粗糙的量化(较小的采样深度),从而在不下降主观听觉效果的状况下达到较好的压缩效果。
又例如,离散余弦变换(DCT)时一种处理数字信号的方法,普遍应用有语音和图像压缩。声音通过离散余弦变换(DCT)之后,其系数更多的集中在较低序号的部分。对变换后的高序号部分的编码就很简单,能够用很小的采样深度对其进行编码。html


上图是变换前的信号,下图是DCT变化之后的序号,变换后适合子带编码。
linux

2、SBC编码过程


SBC编码的输入是PCM数据,即采样后的时间序列,输出是二进制流。
时间序列通过分析过程,转化为频域信号,而后对频域信号分段编码。为每个子频段指定一个scalfactor及采样深度,对这个子频段的数据进行自适应PCM编码(Adaptive Pulse Code Modulation)。而后把各个子频段编码后的数据打包,做为一帧数据,以二进制流的方式输出。svn

    1. Analysis Filter
      其目的是为了把时间序列变换到频域,使用的方法是多相滤波器组。子频段的个数能够是4个或8个,对应不一样的多相滤波器组。
    2. Scale Factors计算
      每个子频段的幅值的范围是不一样的,取每个子频段幅值的最大值做为这个子频段的scale factor。好比子频段1的幅值分布在(0, 128)区间,子频段2的幅值分布在(0, 32)区间,那么自定子频段1的scale factor为128, 子频段2的scale factor为32。
    3. Bit Allocation
      每个子频段有若干幅值须要编码,每一个幅值须要用若干比特数来表示。同一个子频段中每一个幅值的比特数相同,不一样子频段幅值分配的比特数不一样。为每一个子频段分配幅值比特数的过程叫作bit allocation。
    4. APCM
      根据每一个子频段的scale factor及每一个幅值须要的比特数,对每个子频段进行编码的过程。获得每一个子频段的量化结果,即Quantized Subband。
    5. BItStream packing
      把每一个子频段编码后的结果组合起来,加上校验码、帧头信息等的过程。

3、SBC解码过程


SBC解码过程是编码过程的逆过程,其输入是二进制流,输出是PCM数据。
首先对二进制流进行解包,获得一帧一帧的数据。每一帧中都包含子频段数(4或8)、每一个子频段的scale factor、每一个子频段幅值须要的比特数,根据这些信息及每一个子频段编码以后的数据,重建(Reconstruction)子频段的编码前的数据。而后通过逆向的多相滤波器组,获得原始的PCM数据。将全部子频段的PCM数据合并,获得解码后的PCM数据。ui

4、关于SBC编码的一些性质

    1. SBC是有损编码
      因为无线传输的带宽有限,SBC在对每一个子频段进行编码时,进行了有损处理,以达到数据压缩的目的。即通过SBC编解码之后,PCM数据发生了变化。所以蓝牙设备的音质不是很好。
    2. SBC支持的采样率
      包括44.1kHz、48kHz、32kHz、16kHz。
    3. SBC支持的声道
      支持单声道(MONO CHANNEL)、双声道(DUAL CHANNEL)、立体声(stereo)、联合立体声(Joint Stereo)。

5、编解码仿真

 

  1 下载信息:编码

    2 编译和运行:

./configure --prefix=/usr --disable-static --disable-tester &&
make

    3 使用方法:

      编码:

sbcenc test9a.au > test9.sbc

     解码:

sbcdec -f test9b.au test9.sbc

  亲测有效。

 

参考文档:

https://www.cnblogs.com/huahuahu/p/lan-ya-xie-yi-zhong-deSBC-bian-ma.html

http://www.linuxfromscratch.org/blfs/view/svn/multimedia/sbc.html

相关文章
相关标签/搜索