SBC音频编解码算法浅析
1. SBC算法简介
- SBC是sub band code的缩写,也可称为子带编码
- 在A2DP协议中,SBC算法是默认支持的
- 蓝牙SBC算法是一种以中等比特率传递高质量音频数据的低计算复杂度的音频编码算法
1.1 算法基本框图
- SBC系统使用一个余弦调制的滤波器组,用来解析和同步。滤波器组可设定成4或8个子带
- 子带信号的量化采用比特分配器和自适应脉冲编码器组调制
- 可用的比特位数和编码器的块数都是可配置的
- 编码后的数据由比特流打包器打包,以有线或无线方式传输
- 解码是编码的逆过程
1.1 算法所用参数
- sampling_frequency:采样频率。常用的是16KHz,32KHz,44.1KHz和48KHz
- channel mode:通道模式。可以是单声道,双声道,立体声和联合立体声
- block length:块长度。可以是4,8,12,16
- subbands:子带数量。可以是4或8
- allocation method:分配方式。可以是SNR或loudness
- bitpool:比特池。范围是2-250。此值越大,编码产生的数据越长
2 SBC算法实现
2.1 SBC编码算法实现
- PCM格式的左右声道进入多相解析器,输出尺度因子和子带采样数据
- 每个尺度因子分别对应一个子带
- 量化后的子带采样数据需要进行打包,打包方式可以是分段或不分段
- 多相解析器的代码实现较为复杂,流程图如下[具体请看参考文献2的Appendix B]:
2.2 SBC解码算法实现
- 解码过程是编码过程的逆
- 多相综合器的代码实现较为复杂,流程图如下[具体请看参考文献2的Appendix B]:
3 SBC解码算法在某蓝牙主设备上的应用
3.1 帧格式
3.2 参数选择
- sampling frequency:16
- channel mode:单声道
- number of subbands:8
- number of channels:1
- number of blocks:15
- allocation method:SNR
- bitpool:26
3.3 代码示例
void SBC_Decode(uint8_t * DataIn, FILE * fOutput)
{
#define SBC_SAMPLING_FREQ 16
#define SBC_CHANNEL_MODE 0
#define SBC_NUM_OF_SUBBANDS 8
#define SBC_NUM_OF_CHANNELS 1
#define SBC_NUM_OF_BLOCKS 15
#define SBC_ALLOC_METHOD 0
#define SBC_BITPOOL 26
#define SBC_DECODED_BUFFER_SIZE (16*8)
uint8_t blocks_per_packet = SBC_NUM_OF_BLOCKS;
uint8_t num_bits = SBC_BITPOOL;
const<