缩放因子信息
边信息之后,就是缩放因子区(也称增益因子),紧跟着的是哈夫曼编码区。
帧头+边信息+缩放因子+哈夫曼码 形成一个数据帧,这个存储的数据帧,包含若干个pcm采样的哈夫曼码,解码出来的音频帧,每帧每声道需要576个值。
长块
这576个值代表576条频率线上的值,它们是时域中576个pcm值经过时频变换的结果。这576条频率线从低到高分为32个子带,每个子带包含18条频率线。解出来的这576个值是整数,需要进行反量化变成浮点数,反量化的过程并不是一条频率线为单位进行的,而是若干条频率线为单位进行的,这若干条频率线组成了频带(band),叫做缩放因子频带(scalefactorband),顾名思义,在一个缩放因子频带内的频率线在反量化时共用缩放因子。
scalefactor band | width of band | index of start | index of end |
---|---|---|---|
0 | 4 | 0 | 3 |
1 | 4 | 4 | 7 |
2 | 4 | 8 | 11 |
3 | 4 | 12 | 15 |
4 | 4 | 16 | 19 |
5 | 4 | 20 | 23 |
6 | 6 | 24 | 29 |
7 | 6 | 30 | 35 |
8 | 8 | 36 | 43 |
9 | 8 | 44 | 51 |
10 | 10 | 52 | 61 |
11 | 12 | 62 | 73 |
12 | 16 | 74 | 89 |
13 | 20 | 90 | 109 |
14 | 24 | 110 | 133 |
15 | 28 | 134 | 161 |
16 | 34 | 162 | 195 |
17 | 42 | 196 | 237 |
18 | 50 | 238 | 287 |
19 | 54 | 288 | 341 |
20 | 76 | 342 | 417 |
短块
这576个值代表192条频率线上的值,这192条频率线从低到高分为32个子带,每个子带包含6条频率线。每一条频率线上有三个值,分别属于三个窗(window0、window1和window2)。这192条频率线被划分为若干缩放因子频带。
短块 44.1
scalefactor band | width of band | index of start | index of end |
---|---|---|---|
0 | 4 | 0 | 3 |
1 | 4 | 4 | 7 |
2 | 4 | 8 | 11 |
3 | 4 | 12 | 15 |
4 | 6 | 16 | 21 |
5 | 8 | 22 | 29 |
6 | 10 | 30 | 39 |
7 | 12 | 40 | 51 |
8 | 14 | 52 | 65 |
9 | 18 | 66 | 83 |
10 | 22 | 84 | 105 |
11 | 30 | 106 | 135 |
混块
在这种情况下,按先后顺序解出来的576个值分为两部分,第一部分(前36个值)是长块部分,故它们代表36条频率线,这36条频率线划分为8个缩放因子频带;
第二部分(后540个值)是短块部分,它们代表180个频率线,每个频率线上有三个值,分别属于window0、window1和window2,这180个频率线划分为9个缩放因子频带。
以上三个块缩放因子带的描述引用:博文
在44.1K采样率下,长块需要解码21个缩放因子,短块需要解码12 * 3个缩放因子,混快需要解码 8+ 9*3个缩放因子。缩放因子的长度是不固定的,需要查表获得slen。
//长块slen1表示0-10缩放因子带的长度,slen2表示11-20的缩放因子带的因子长度
//短块slen1表示0-5缩放因子带的因子长度,slen2表示6-11缩放因子带的因子长度
//混快长块部分sfb0-sfb7和短块部分sfb3-sfb5所用到的缩放因子长度相同,为slen1,短块部分sfb6-sfb11所用用到的缩放因子长度相同,为slen2
int slen[2][16]={
{0,0,0,0,3,1,1,1,2,2,2,3,3,3,4,4},
{0,1,2,3,0,1,2,3,1,2,3,1,2,3,2,3}
};
int scalefac_l[GR][CH][lSFB]; //长块缩放因子
int scalefac_s[GR][CH][SSFB][WINDOW]; //短块缩放因子
slen[][]中,第一个index =0 取长块slen, =1,取短块 slen。第二个index为边信息中的ScalefacCompress。取出对应N个slen bits放到scalefac_l和scalefac_s中,混块前8个放在scalefac_l,后面的放在scalefac_s[][][6+i][]。
长块的粒度1可能会使用粒度0(gr)的缩放因子,边信息共有的4个缩放因子选择信息(Scfsi)指示了粒度1是否共用粒度0的缩放因子,如果共用,则无需从码流中提取对应的缩放因子。
在边信息解码中,存放着每声道4bits的缩放因子选择信息,每一个bit指示了粒度1若干个缩放因子带共用粒度0的缩放因子。
scfsi_band | scalefactor bands (see Annex B,Table3-B.8) |
---|---|
0 | 0,1,2,3,4,5 |
1 | 6,7,8,9,10 |
2 | 11…15 |
3 | 16…20 |
若block_type的值为0、1或3:slen1表示缩放带0-10的缩放因子的长度;slen2表示缩放带11-20的缩放因子的长度。//长块
若block_type的值为2且mixed_block_flag的值为0:slen1表示缩放带0-5的缩放因子的长度:slen2表示表示缩放带6-11的缩放因子的长度。//短块
若block_type的值为2且mixed_block_flag的值为1:由于mixed_block_flag的值为1,所以该粒度由长窗和短窗混合组成,//混快
对于长窗部分,slen1表示0-7缩放带的缩放因子的长度;
对于短窗部分,slen1表示3-5缩放带的缩放因子的长度,slen2表示缩放带6-11的缩放因子的长度。
–《MP3软件解码器的研究与实现》李箐箐