Stores Scale factors for subbands and subframes.
Member of Audio Frame
The task is to encode up to 96 scale factors for the current frame. These are SCF0 . . . 2 (0 . . . 31) in the following diagram:
| previous Frame | current Frame | ||||||||||||||||||||||||||||||||||||||||||||||||
|
|
Only SCF's for subbands which can carry subband samples != 0 due to the allocation field are transmitted.
First step is decode a value via a huffman table. The result with select the prediction strategy:
| c = DecodeHuffman (table11) | |
| if (c < 64) | |
| on (c % 4) | Subframe 0 Scalefactors SCF0 () encoded using . . . |
| 0 | spectral prediction |
| 1 | mixed prediction |
| 2 | temporal prediction |
| 3 | temporal prediction + LPC |
| on (c / 4 % 4) | Subframe 1 Scalefactors SCF1 () encoded using . . . |
| 0 | spectral prediction |
| 1 | mixed prediction |
| 2 | temporal prediction |
| 3 | temporal prediction + LPC |
| on (c / 16) | Subframe 2 Scalefactors SCF2 () encoded using . . . |
| 0 | spectral prediction |
| 1 | mixed prediction |
| 2 | temporal prediction |
| 3 | temporal prediction + LPC |
| if c == 64 | |
| for each subband | Vector book coded Scalefactors SCF0 . . . 2 () encoded using . . . temporal prediction |
| if c == 65 | |
| for each subband | Vector book coded Scalefactors SCF0 . . . 2 () encoded using . . . temporal prediction + LPC |
Stationary Frame:
| 0 | 1 bit |
| for each subband n: Subband Scalefactors SCF(n) | ? bit |
Non-stationary Frame:
| 1 | 1 bit |
| Subframe Scalefactors SCF0() | ? bit |
| Subframe Scalefactors SCF1() | ? bit |
| Subframe Scalefactors SCF2() | ? bit |
| previous Frame | current Frame | ||||||||||||
|
|
int code;
code = Decode_Huffman (table1);
if ( code < 125 ) { // 3 differential SCFs using a vector codebook
SCF [0] [band] = SCF_last [band] + code % 5 - 2;
SCF [1] [band] = SCF [0] [band] + code / 5 % 5 - 2;
SCF [2] [band] = SCF [1] [band] + code /25 - 2;
SCF_last [band] = SCF [2] [band];
predict [band] = false;
}
else if ( code < 134 ) { // 1 differential SCF-block using a vector codebook, prediction
SCF [0] [band] = SCF_last [band] + code % 5 - 4;
SCF [1] [band] = SCF [0] [band];
SCF [2] [band] = SCF [1] [band];
SCF_last [band] = SCF [2] [band];
predict [band] = true;
}
else { // 3 differential SCFs using normal huffman coding
SCF [0] [band] = SCF_last [band] + Decode_Huffman (table2);
SCF [1] [band] = SCF [0] [band] + Decode_Huffman (table2);
SCF [2] [band] = SCF [1] [band] + Decode_Huffman (table2);
SCF_last [band] = SCF [2] [band];
predict [band] = true;
}
| Last Subframe | Current Subframe |
| SCFprev ( 0) | SCFcurr ( 0) |
| SCFprev ( 1) | SCFcurr ( 1) |
| SCFprev ( 2) | SCFcurr ( 2) |
| SCFprev ( 3) | SCFcurr ( 3) |
| SCFprev ( 4) | SCFcurr ( 4) |
| SCFprev ( 5) | SCFcurr ( 5) |
| SCFprev ( 6) | SCFcurr ( 6) |
| SCFprev ( 7) | SCFcurr ( 7) |
| SCFprev ( 8) | SCFcurr ( 8) |
| SCFprev ( 9) | SCFcurr ( 9) |
| SCFprev (10) | SCFcurr (10) |
| SCFprev (11) | SCFcurr (11) |
| SCFprev (12) | SCFcurr (12) |
| SCFprev (13) | SCFcurr (13) |
| SCFprev (14) | SCFcurr (14) |
| SCFprev (15) | SCFcurr (15) |
| SCFprev (16) | SCFcurr (16) |
| SCFprev (17) | SCFcurr (17) |
| SCFprev (18) | SCFcurr (18) |
| SCFprev (19) | SCFcurr (19) |
| SCFprev (20) | SCFcurr (20) |
| SCFprev (21) | SCFcurr (21) |
| SCFprev (22) | SCFcurr (22) |
| SCFprev (23) | SCFcurr (23) |
| SCFprev (24) | SCFcurr (24) |
| SCFprev (25) | SCFcurr (25) |
| SCFprev (26) | SCFcurr (26) |
| SCFprev (27) | SCFcurr (27) |
| SCFprev (28) | SCFcurr (28) |
| SCFprev (29) | SCFcurr (29) |
| SCFprev (30) | SCFcurr (30) |
| SCFprev (31) | SCFcurr (31) |
Spectral Predictor:
static signed char Tab [32] = { ?, -5, -2, -1, -1, -1, -1, -1, -1 };
Huffman_Table* Huff [32] = { ?, tab1, tab2, tab2, tab2, tab3, tab3, tab3, tab3, tab3, tab3, tab3, tab4, ... };
int code;
int band;
int tmp;
tmp = Read_Bits (7);
SCF [][0] = tmp;
for ( band = 1; band <= Max_Band; band++ ) {
SCF [][band] = tmp += Decode_Huffman (Huff[band]) + Tab [band];
}
Mixed Spectral + Temporal Predictor:
int code;
int band;
SCF [][0] = SCF_last [0] + Decode_Huffman (table); // ???
for ( band = 1; band <= Max_Band; band++ ) {
SCF [][band] = ( ( SCF_last [band] + SCF [][band-1] ) >> 1 ) + Decode_Huffman (table);
}
Temporal Predictor:
int code;
int band;
for ( band = 0; band <= Max_Band; band++ ) {
SCF [][band] = SCF_last [band] + Decode_Huffman (table);
}