参考A2DP_v1.3.1.pdf的附录B
SBC is an audio coding system specially designed for Bluetooth AV applications to obtain high quality audio at medium bit rates, and having a low computational complexity. SBC uses 4 or 8 subbands, an adaptive bit allocation algorithm, and simple adaptive block PCM quantizers. The SBC audio coding system is based on an earlier system, which was presented on [11]. Reference executables of both the encoder and the decoder of SBC codec are available in [19] for Win32 platform. For further information, refer to Section 9.4.3 in [9]. Note that source code of SBC neither encoder or decoder is available as part of the specification.
使用4或8个子带
自适应比特分配算法
简单的自适应块PCM量化器
Win32平台上的编码器和解码器参考实现
[19] Conformance Test Bitstreams and Reference Implementation of SBC, http://www.bluetooth.org
术语
frame - 可独立解码的basic unit
bit_count - 比特计数器
bitneed - 分配比特的过程中记录剩余比特的计数器
Syntax
Syntax No. of bits Mnemonic
audio_frame()
{
frame_header()
scale_factors()
audio_samples()
padding()
}
Table 12.11: Syntax of audio_frame
frame_header()
{
syncword 8 BsMsbf 0x9C
sampling_frequency 2 UiMsbf 00 - 16000
01 - 32000
10 - 44100
11 - 48000
blocks 2 UiMsbf 00 - 4
01 - 8
10 - 12
11 - 16
channel_mode 2 UiMsbf 00 - MONO
01 - DUAL_CHANNEL
10 - STEREO
11 - JOINT_STEREO
allocation_method 1 UiMsbf 0 - LOUDNESS
1 - SNR
subbands 1 UiMsbf 0 - 4
1 - 8
bitpool 8 UiMsbf
crc_check 8 UiMsbf
If (channel_mode==JOINT_STEREO)
{
for (sb=0;sb<nrof_subbands-1;sb++)
{
join[sb] 1 UiMsbf
}
RFA 1 UiMsbf
}
}
Table 12.12: Syntax of frame_header
scale_factors()
{
for (ch=0;ch<nrof_channels;ch++)
{
for (sb=0;sb<nrof_subbands;sb++)
{
scale_factor[ch][sb] 4 UiMsbf
}
}
}
Table 12.13: Syntax of scale_factors
audio_samples()
{
for (blk=0;blk<nrof_blocks;blk++)
{
for (ch=0;ch<nrof_channels;ch++)
{
for (sb=0;sb<nrof_subbands;sb++)
{
if (bits[ch][sb]!=0)
{
audio_sample[blk][ch][sb] 1..16 UiMsbf
}
}
}
}
}
Table 12.14: Syntax of audio_samples
可以看到压缩后的音频数据区里,先按块b0、b1排列,然后是通道c0、c1,然后是子带sb0、sb1、sb2、sb3,最后是子带内的样点压缩比特
+-------------------------------+-------------------------------+
|b0 |b1 |
+---------------+---------------+---------------+---------------+
|c0 |c1 |c0 |c1 |
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
|sb0|sb1|sb2|sb3|sb0|sb1|sb2|sb3|sb0|sb1|sb2|sb3|sb0|sb1|sb2|sb3|
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
泰凌葳电子的SDK默认的SBC参数
#define SBC SYNCWORD 0x9C
#define MSBC SYNCWORD 0xAD
#define SBC_MODE_MONO 0x00
#define SBC_MODE_DUAL_CHANNEL 0x01
#define SBC_MODE_STEREO 0x02
#define SBC_MODE_JOINT_STEREO 0x03
#define QUALITY_LOWEST 1 //you may notice the quality reduction
#define OUALITY MEDIUM 2 //pretty good
#define OUALITY GREAT 3 //as good as it will get without an FPU
#define SBC SUBBANDS 8
#define SBC BLOCKS 10
#define SBC BITPOOL 12
#define SBC CHANNELS 1
#define SBC_MODE SBC_MODE_MONO
#define SBC_SNR 0 // Loudness
#define SBC_SAMPLE_RATE 16000 //116000//44100//46545
#define SBC_SUBBANDS 8
+-------------------------------+-------------------------------+
|b0 |b1 |
+-------------------------------+-------------------------------+
|c0 |c0 |
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
|sb0|sb1|sb2|sb3|sb4|sb5|sb6|sb7|sb0|sb1|sb2|sb3|sb4|sb5|sb6|sb7|
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
一、SBC参数说明
1.1、Sampling Frequency
采样率,1s中可以采集多少个点
1.2、Channel Mode
声道模式,包括单声道,双声道,立体音,联合立体音
1.3、Block Length
每个块的大小
1.4、allocation_method
分配bit的方法
1.5、subbands
子带数量
1.6、bitpool
编码流位分配池的大小
1.7、crc_check
crc校验位
1.8、scale_factors
比例因子,占4位,channel*subbands*4
1.9、audio_samples
表示channel中的block的对于子带的音频样本
1.10、padding
补充位
二、帧长度计算
2.1、基础介绍
nrof_channels:声道数
nrof_subbands:子带数
nrof_blocks:块数
bitpool:一个块所能使用的最大bit数
一个SBC帧可能包含多个块,一个块中包含多个子带
2.2、单声道与双声道
固定开销header:4字节
尺度(比例)因子:4*nrof_channels*nrof_subbands(bit)
audio_samples:nrof_channels * nrof_blocks * bitpool
Frame_length = 4 + (4*nrof_channels*nrof_subbands)/8 + (nrof_channels * nrof_blocks * bitpool)/8
2.3、立体声与联合立体声
固定开销header:4字节 + nrof_subbands
尺度(比例)因子:4*nrof_channels*nrof_subbands(bit)
audio_samples:
nrof_blocks * bitpool
Frame_length = 4 + nrof_subbands/8 + (4*nrof_channels*nrof_subbands)/8 + ( nrof_blocks * bitpool)/8
nrof_blocks * bitpool:多少个采样点*每个采样点所能使用的最大位数
三、bit rate计算
bit rate指的是1s内传输的bit数
A2DP spec中给出的计算方式为:
bit_rate = Frame_length * fs / (nrof_subbands *nrof_blocks)* 8
Frame_length /(nrof_subbands *nrof_blocks)*8就是每个子带的bit rate,再乘以采样率就是每秒的bit rate