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

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

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

SBC解码过程是编码过程的逆过程,其输入是二进制流,输出是PCM数据。
首先对二进制流进行解包,获得一帧一帧的数据。每一帧中都包含子频段数(4或8)、每一个子频段的scale factor、每一个子频段幅值须要的比特数,根据这些信息及每一个子频段编码以后的数据,重建(Reconstruction)子频段的编码前的数据。而后通过逆向的多相滤波器组,获得原始的PCM数据。将全部子频段的PCM数据合并,获得解码后的PCM数据。ui
1 下载信息:编码
Download (HTTP): https://www.kernel.org/pub/linux/bluetooth/sbc-1.4.tar.xzspa
Download MD5 sum: 800fb0908899baa48dc216d8e156cc05code
Download size: 248 KBhtm
Estimated disk space required: 2.9 MBblog
Estimated build time: Less than 0.1 SBU文档
2 编译和运行:
./configure --prefix=/usr --disable-static --disable-tester && make
3 使用方法:
编码:
sbcenc test9a.au > test9.sbc
解码:
sbcdec -f test9b.au test9.sbc
亲测有效。
参考文档:
1 https://www.cnblogs.com/huahuahu/p/lan-ya-xie-yi-zhong-deSBC-bian-ma.html
2 http://www.linuxfromscratch.org/blfs/view/svn/multimedia/sbc.html