SBC音频压缩编解码,MCU上也能用,最大可压缩16倍

音频编解码算法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语言链接

如有描述错误,还请指正,相互学习

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值