音频编解码算法sbc使用说明
sbc资源包点这里
1、什么是sbc?
SBC, sub band code的缩写,也可称为子带编码。其原理是:通过带通滤波器将音频信号分成不同频段的子带信号,然后将这些信号经过频率搬移转变成基带信号,再对它们分别取样,量化和编码,最后合成一个总的码流传送出去,如下图所示。
这样做的好处是:舍弃或减小人耳听觉不敏感的频率部分,在敏感频率处采用较细的量化,在低比特率条件下获得更好的听觉效果。A2DP中规定SBC编码支持最大比特率是单声道320kbps,立体声512kbps。但按其推荐,实际上使用最多的是44.1KHz,328kbps的立体声传输。
2、关于SBC编解码的一些参数。
SBC支持音频采样率:16K,32K,44.1K,48K
实测,配置为16K,去压缩8K的音频,没有问题。
SBC支持位深:16bit(仅支持这个深度)
SBC每次压缩采样点:128点(仅支持这些点)
采样率,位深,采样点的解释:
举一个例子,MCU开启ADC采集模拟音频信号,频率为8Khz,ADC是12位的,此时采集到的数据就是采样率8k位深12bit。通常使用int16_t去存储采集到的12bit数据。8KHz,ADC每秒采集8000次。SBC每次固定处理128个点,也就是8k采样率下,sbc每次可以处理16ms的音频数据(128 / 8000Hz)。也可以累计到128的倍数个点(详见示例),再给到sbc编码/解码,循环处理完所有数据就好。
3、SBC编解码移植
文件:
共有以上几个文件,移植涉及修改的文件内容如下:
sbc.c中
文件默认使用的是freertos中的内存申请函数,如果使用其他内存管理方式,此处应该替换。如果跑的是裸机,没有动态内存分配,那就可以将malloc返回位置替换为5388byte大小的空闲内存指针。然后删除free函数。
移植只有这几处修改。加到工程中,编译即可。无需再做其他修改。
4、使用说明
a) 设置采样率,码率
修改sbc_set_defaults函数中定义参数
采样率,声道数量,码率。
其中,码率数值小,音频压缩的约厉害,压缩后的数据越小。 压缩比例16:1 ~ 4 : 1
int sbc_encode(sbc_t *sbc, void *input, int input_len, void *output,
int output_len, int *written)
修改bitpool,执行编码后,可以观察到written的长度变化。和input中数据长度变化。
编解码配置,要求参数一致。否则无法正常解码
b) 编解码函数接口说明
int sbc_encode(sbc_t *sbc, void *input, int input_len, void *output,
int output_len, int *written)
*sbc----sbc结构体(被sbc_init初始化过)
*input----待编码的PCM数据指针输入(16bit)
input_len----PCM数据输入大小(byte)
*output----编码后数据输出位置
output_len----输出编码位置的存储空间大小(byte)
*written----实际编码输出编码后数据长度
int sbc_decode(sbc_t *sbc, void *input, int input_len, void *output,
int output_len, int *written)
*sbc----sbc结构体(被sbc_init初始化过)
*input----编码压缩数据指针输入(byte)
input_len----编码压缩数据内存空间大小(byte)
*output----解码数据输出位置(16bit PCM数据输出)
output_len----解码数据输出位置空间大小 (byte)
written----解码数据实际输出大小(byte)
c) 实际案例见连接sbc资源包c语言
bitpool = 28的时候,128点压缩后大小为64byte
SBC压缩/解压,所占用ram、主频、flash信息
sbc资源包c语言链接
如有描述错误,还请指正,相互学习