一、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

蓝牙协议中的SBC编解码原理和仿真的更多相关文章

  1. 蓝牙协议中的SBC编码

    一.从信息的传输说起  上图是一个典型的蓝牙耳机应用场景.手机上的音频信息经过编码以后通过蓝牙协议被蓝牙耳机接收,经过解码以后,蓝牙耳机成功获取手机上的音频信息,然后再转化为振动被人耳识别.这是一个 ...

  2. SSD ECC中的LDPC编解码原理

    转自:http://blog.csdn.net/zhuzongpeng/article/details/78899198 目前SSD中ECC纠错代码主要两种BCH和LDPC.不过,随着SSD对ECC纠 ...

  3. 说说http协议中的编码和解码

    http://www.csdn1 2 3.com/html/itweb/20130730/29422_29378_29408.htm ****************************** 一. ...

  4. Protocol buffer序列化及其在微信蓝牙协议中的应用

    Protocol buffer是Google出品的一种轻便高效的结构化数据存储格式,可对结构化数据进行序列化,并具有语言无关.平台无关等特点,在通信协议和数据存储等领域已经得到广泛的应用.目前其已经提 ...

  5. 编解码原理,Python默认解码是ascii

    编解码原理,Python默认解码是ascii 首先我们知道,python里的字符默认是ascii码,英文当然没问题啦,碰到中文的时候立马给跪. 不知道你还记不记得,python里打印中文汉字的时候需要 ...

  6. Java Web中涉及的编解码

    用户从浏览器发起一个HTTP请求,存在编码的地方是URL.Cookie.Paramiter.服务器端接收到HTTP请求后要解析HTTP协议,其中URL.Cookie和POST表单参数要解码,服务器端可 ...

  7. JAVA WEB 中涉及的编解码

    1.对URL解码 1)URI部分解码:<Connector URIEncoding="UTF-8" /> 2)QueryString解码要么是 Header 中 Con ...

  8. HDBn编解码原理 n阶高密度双极性码

    /*------------------------------------------------------------------ HDB3 编码解码原理    // 转载 ---------- ...

  9. 高速理解掌握node.js 字符编码,确码过程 以及base64编解码原理

    var buf1 = new Buffer('a','ascii'); // 字符'a' -> ascii编码 -> 61 存在计算机中 console.log(buf1); var b ...

随机推荐

  1. springMVC简单的一些操作

    SpringMVC的模型-视图-控制器(MVC)框架是围绕一个DispatcherServlet来设计的,这个Servlet会把请求分发给各个处理器进行处理,由DispatcherServlet来统一 ...

  2. 把封装脚本做成jar包

    前提: eclipse, selenium, maven 把二次封装过的脚本做成jar包, 这样可以在新建工程里也调用封装过的方法. 实现步骤: 1. project 右键 => maven = ...

  3. 自动化测试基础二(Python基础)

    1.为什么学习Python 1)简单.易学 2)强大:交互性.解释性.编译性.跨平台 3)市场需求上升快.顺应市场需要 4)自动化测试需要使用编程语言来写脚本 2.需要学习Python哪些内容? 1) ...

  4. BZOJ_2038_[2009国家集训队]小Z的袜子(hose)_莫队

    BZOJ_2038_[2009国家集训队]小Z的袜子(hose)_莫队 Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无 ...

  5. Apache SkyWalking 为.NET Core带来开箱即用的分布式追踪和应用性能监控

    在大型网站系统设计中,随着分布式架构,特别是微服务架构的流行,我们将系统解耦成更小的单元,通过不断的添加新的.小的模块或者重用已经有的模块来构建复杂的系统.随着模块的不断增多,一次请求可能会涉及到十几 ...

  6. 单机配置kafka和zookeeper

    1:环境准备 jdk 推荐oracle,不建议open sdk 在/etc/profile加入下列环境变量 在PATH中将jdk和jre的bin加入path里面 $JAVA_HOME/bin:$JRE ...

  7. python 之 初识模块

    什么是模块 什么是模块 一个.py文件 就是一个模块 我们使用import加载的模块分为4个通用类别 1.py文件 2.包好一组模块的包(带__init__.py文件的文件夹) 3.内置模块 4.已被 ...

  8. linux命令----查看磁盘空间

    今天用“web发布平台”发布测试的服务,两个节点中发现有一个节点没有发布成功,压测TPS始终上不去,排查后发现只有一个节点在打日志,另一个节点的服务进程都没有在运行,由此断定应该是没有发布成功,有点坑 ...

  9. 聚焦“云开发圆桌论坛”,大前端Serverless大佬们释放了这些讯号!

    4月14日,由云加社区举办的TVP&腾讯云技术交流日云开发专场,暨"腾讯云-云开发圆桌论坛"在北京.深圳两地同步举行. 当天下午,一场主题为"基于大前端和node ...

  10. Java转Ruby【快速入门】

    最近参加实习了,公司的技术栈中需要用到 Ruby 以及 Rails 框架,所以算是开始了踩坑之旅吧.. Ruby 简介 网上的简介要搜都能搜到,具体涉及的包括历史啦之类这里不再赘述,提几个关键词吧: ...