zoukankan      html  css  js  c++  java
  • 蓝牙协议中的SBC编解码原理和仿真

    一、SBC的原理

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


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

    二、SBC编码过程


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

      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
        把每个子频段编码后的结果组合起来,加上校验码、帧头信息等的过程。

    三、SBC解码过程


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

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

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

    五、编解码仿真

      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

  • 相关阅读:
    Linux查看占用内存前10的命令
    使用RestTemplate调用SpringCloud注册中心内的服务
    Eureka集群配置
    MySQL常用命令集合(偏向运维管理)
    pytest: error: unrecognized arguments报错解决
    MongoDB的安装
    MongoDB多条件分组聚合查询
    在排序数组中查找元素的第一个和最后一个位置
    搜索二维矩阵
    搜索旋转排序数组
  • 原文地址:https://www.cnblogs.com/dylancao/p/10678450.html
Copyright © 2011-2022 走看看