📄 chan_dec.c
字号:
/* Silence */
EndLoop = NBitsSID;
for (i=0;i<EndLoop;i++) BitOrder[i] = BitOrderSID[i];
crc_window = CrcWindowSID;
nbit_all = NInfoBitsSID+CrcLen+4;
}
if( (G723_mode_r & 0x3) == 3) {
/* not used */
exit;
}
for (i = 0; i < crc_window; ++i) { /* without CRC */
info_bit_hd[i] = info_bit_r[i];
}
for (i=crc_window+CrcLen; i<nbit_all-4; ++i) { /* without Tail */
info_bit_hd[i-CrcLen] = info_bit_r[i];
}
for( i=0; i < 25; i++ ) CInfoBitStream_r[i]=0;
for( i=0; i < EndLoop; i++ ) {
pw = i/8;
pb = i - pw*8;
j = (pw*8)+7-pb;
if (BitOrder[j] != (-1)){
if (info_bit_hd[BitOrder[j]] == 1) setbit( CInfoBitStream_r[pw], pb );
}
}
CInfoBitStream_r[0] = CInfoBitStream_r[0] | G723_mode_r;
return;
}
static void CrcDecoder(Word16 info_bit_r[], Word16 *bad_frame, Word16 G723_mode_r)
{
Word16 crc_window;
Word16 CrcCarry, ShiftReg, i;
if ((G723_mode_r & 0x3) == 0){
/* Rate 6.3 */
crc_window = CrcWindow63;
}
if ((G723_mode_r & 0x3) == 1){
/* Rate 5.3 */
crc_window = CrcWindow53;
}
if( (G723_mode_r & 0x3) == 2) {
/* Silence */
crc_window = CrcWindowSID;
}
if( (G723_mode_r & 0x3) == 3) {
/* not used */
exit;
}
ShiftReg = 0;
for (i = 0; i < crc_window; ++i) {
CrcCarry = (info_bit_r[i] ^ ShiftReg) & 1;
ShiftReg = shr(ShiftReg, 1);
if (CrcCarry != 0) ShiftReg = ShiftReg ^ CrcGen;
}
/* determine CRC-badframe */
/* ---------------------- */
*bad_frame = 0;
for (i=CrcLen-1;i>=0;i--){
if (info_bit_r[crc_window + i] != (ShiftReg & (Word16) 1)) *bad_frame=1;
ShiftReg = shr(ShiftReg, 1);
}
return;
}
static void LSP_Reorder_decoder (LINEDEF *Line)
{
/* Band0Tb8 */
static Word16 tabd2_10[LspCbSize] = {
140, 185, 135, 137, 169, 168, 164, 166,
187, 192, 238, 191, 180, 141, 177, 179,
181, 183, 195, 184, 172, 173, 165, 161,
194, 197, 196, 198, 188, 186, 189, 190,
7, 43, 16, 17, 5, 40, 8, 9,
20, 19, 22, 21, 42, 130, 131, 240,
246, 249, 250, 251, 182, 239, 241, 242,
23, 24, 247, 248, 253, 254, 252, 255,
201, 143, 144, 136, 115, 114, 203, 202,
139, 158, 28, 157, 97, 98, 228, 121,
211, 171, 0, 174, 227, 27, 199, 200,
87, 210, 25, 1, 219, 151, 162, 163,
146, 142, 145, 170, 154, 138, 176, 178,
243, 244, 236, 237, 105, 153, 155, 156,
11, 175, 160, 159, 14, 132, 104, 103,
15, 106, 18, 245, 134, 133, 193, 129,
68, 67, 110, 65, 93, 92, 72, 71,
90, 89, 88, 55, 225, 85, 224, 223,
61, 60, 59, 50, 66, 234, 233, 230,
205, 204, 51, 47, 231, 58, 147, 44,
57, 69, 207, 56, 209, 53, 12, 208,
26, 32, 29, 229, 33, 206, 31, 13,
63, 62, 34, 37, 39, 38, 35, 45,
36, 10, 41, 6, 46, 4, 2, 3,
100, 102, 128, 101, 96, 95, 126, 222,
74, 94, 220, 73, 77, 78, 75, 76,
213, 221, 116, 122, 80, 82, 235, 216,
86, 91, 54, 70, 83, 84, 81, 226,
119, 120, 117, 118, 149, 150, 167, 152,
214, 215, 30, 113, 217, 232, 212, 218,
111, 112, 127, 99, 64, 109, 52, 108,
148, 107, 123, 124, 49, 48, 79, 125
};
/* Band1Tb8 */
static Word16 tabd1_10[LspCbSize] = {
250, 249, 255, 254, 248, 251, 253, 252,
150, 238, 243, 242, 226, 225, 227, 213,
237, 234, 247, 246, 148, 147, 146, 145,
240, 230, 244, 232, 239, 149, 212, 231,
137, 221, 224, 223, 135, 134, 136, 141,
220, 217, 222, 158, 153, 102, 105, 104,
144, 143, 218, 219, 215, 157, 216, 152,
151, 98, 75, 74, 155, 156, 103, 101,
245, 241, 236, 235, 66, 65, 68, 67,
70, 69, 64, 63, 208, 207, 60, 209,
233, 140, 127, 126, 229, 228, 125, 139,
131, 117, 123, 122, 133, 142, 124, 121,
138, 214, 108, 106, 211, 210, 111, 109,
120, 119, 113, 112, 206, 107, 18, 205,
99, 76, 73, 160, 132, 130, 118, 129,
97, 94, 0, 72, 110, 96, 95, 33,
115, 114, 10, 116, 83, 81, 11, 9,
8, 78, 128, 71, 12, 79, 163, 159,
23, 25, 15, 24, 84, 87, 1, 82,
22, 19, 62, 61, 20, 91, 21, 85,
50, 45, 49, 48, 182, 51, 164, 47,
40, 39, 77, 100, 35, 37, 36, 154,
161, 43, 46, 38, 162, 41, 42, 44,
165, 34, 80, 88, 166, 89, 93, 90,
180, 28, 172, 171, 86, 27, 92, 26,
181, 2, 184, 185, 29, 30, 168, 167,
17, 16, 179, 177, 5, 3, 4, 178,
13, 174, 14, 173, 195, 175, 199, 176,
191, 192, 183, 187, 194, 188, 186, 169,
52, 55, 53, 54, 57, 56, 58, 59,
196, 197, 198, 193, 7, 200, 6, 203,
32, 31, 202, 201, 170, 189, 204, 190
};
/* Band0Tb8 */
static Word16 tabd0_10[LspCbSize] = {
183, 196, 195, 179, 165, 180, 220, 221,
203, 187, 206, 205, 36, 23, 198, 199,
214, 178, 216, 26, 176, 177, 218, 219,
141, 136, 142, 224, 155, 137, 229, 228,
124, 117, 122, 123, 161, 169, 194, 170,
138, 127, 134, 135, 201, 204, 149, 150,
147, 168, 172, 171, 166, 167, 162, 164,
133, 132, 130, 129, 121, 120, 128, 131,
222, 223, 248, 249, 208, 209, 31, 32,
35, 37, 24, 25, 28, 27, 30, 29,
240, 253, 241, 242, 250, 252, 254, 255,
234, 235, 236, 237, 246, 251, 239, 247,
233, 230, 244, 238, 211, 245, 227, 210,
152, 151, 215, 173, 154, 153, 207, 217,
157, 158, 231, 232, 156, 226, 225, 243,
140, 148, 146, 144, 145, 139, 126, 143,
76, 185, 77, 41, 15, 43, 107, 110,
58, 64, 65, 66, 6, 112, 60, 59,
19, 78, 14, 21, 22, 163, 39, 40,
92, 86, 1, 106, 93, 104, 18, 105,
101, 102, 97, 100, 11, 12, 10, 103,
9, 5, 3, 8, 69, 68, 67, 61,
116, 114, 95, 87, 89, 88, 99, 98,
94, 96, 108, 111, 7, 4, 2, 109,
53, 192, 190, 55, 52, 54, 33, 34,
48, 49, 56, 57, 42, 44, 63, 62,
202, 72, 193, 174, 197, 212, 213, 175,
13, 188, 186, 189, 38, 191, 182, 181,
73, 47, 50, 51, 71, 46, 45, 184,
85, 91, 17, 90, 80, 81, 74, 75,
70, 200, 16, 0, 118, 119, 160, 159,
83, 125, 79, 115, 20, 84, 113, 82
};
Word16 lsp0,lsp1,lsp2;
/* Extract and reorder Band 2 */
lsp2 = (Word16) (Line->LspId & (Word32) 0x000000FF);
lsp2 = tabd2_10[lsp2];
/* Extract and reorder Band 1 */
lsp1 = (Word16) ((Line->LspId >> 8) & (Word32) 0x000000FF);
lsp1 = tabd1_10[lsp1];
/* Extract and reorder Band 0 */
lsp0 = (Word16) ((Line->LspId >> 16) & (Word32) 0x000000FF);
lsp0 = tabd0_10[lsp0];
/* Construct new Line->LspId */
Line->LspId = (Word32) lsp0;
Line->LspId = (Line->LspId << 8) + (Word32) lsp1;
Line->LspId = (Line->LspId << 8) + (Word32) lsp2;
return;
}
static void speech_decoder_adaptation (char CInfoBitStream_r[],
char InfoBitStream_r[],Word16 IndexError[])
{
Word16 FrType, i;
LINEDEF Line ;
FrType = CInfoBitStream_r[0] & 3;
if (FrType < 2) {
Line = Line_Unpk_Channel( CInfoBitStream_r, IndexError) ;
LSP_Reorder_decoder (&Line);
/* This is a G.723.1 routine which uses the global "WrkRate"*/
if (FrType == 0) WrkRate=Rate63;
if (FrType == 1) WrkRate=Rate53;
Line_Pack( &Line, InfoBitStream_r, (Word16) 1 ) ; /* Ftyp = 1 */
InfoBitStream_r[0] = InfoBitStream_r[0] & 0xFC;
InfoBitStream_r[0] = InfoBitStream_r[0] | FrType;
}else{
for (i=0;i<4;i++) InfoBitStream_r[i] = CInfoBitStream_r[i];
for (i=0;i<3;i++) IndexError[i] = 0;
}
return;
}
static LINEDEF Line_Unpk_Channel( char *Vinp, Word16 IndexError[] )
{
Word32 i,j;
Word16 InfoBitStream_tmp[195] ;
Word16 *Bsp = InfoBitStream_tmp ;
Word16 FrType,error, Bound_AcGn ;
LINEDEF Line ;
Word32 Temp ;
static Word16 MapIndexMamp[24]={0,1,2,3,4,5,6, 7, 8, 9,10,11,12,13,
14,15,16,17,18,19,20,21,22,23};
static Word16 Olp0_old={0},Olp1_old={0},AcGn_old={0},Mamp_old={0};
static Word16 Tran_old={0};
/* Clear index error counters */
for (i=0;i<3;i++) IndexError[i]=0;
/* Unpack the byte info to InfoBitStream vector */
for ( i = 0 ; i < 192+3 ; i ++ )
InfoBitStream_tmp[i] = ( Vinp[i>>3] >> (i & (Word16)0x0007) ) & (Word16)1 ;
/* Decode the first two bits */
FrType = (Word16)Ser2Par( &Bsp, 2 ) ;
/* Decode the LspId */
Line.LspId = Ser2Par( &Bsp, 24 ) ;
if ( FrType == 2 ) {
/* Decode the Noise Gain */
return Line ;
}
/*
Decode the common information to both rates
*/
/* Decode the adaptive codebook lags */
Temp = Ser2Par( &Bsp, 7 ) ;
if( Temp <= 123) {
Line.Olp[0] = (Word16) Temp + (Word16)PitchMin ;
Olp0_old = Line.Olp[0];
}else {
Line.Olp[0] = Olp0_old;
IndexError[0] += 1;
}
Line.Sfs[1].AcLg = (Word16) Ser2Par( &Bsp, 2 ) ;
Temp = Ser2Par( &Bsp, 7 ) ;
if( Temp <= 123) {
Line.Olp[1] = (Word16) Temp + (Word16)PitchMin ;
Olp1_old = Line.Olp[1];
}else {
Line.Olp[1] = Olp1_old;
IndexError[0] += 2;
}
Line.Sfs[3].AcLg = (Word16) Ser2Par( &Bsp, 2 ) ;
Line.Sfs[0].AcLg = 1 ;
Line.Sfs[2].AcLg = 1 ;
/* Decode the 8 bit adaptive gains */
for ( i = 0 ; i < SubFrames ; i ++ ) {
Temp = Ser2Par( &Bsp, 8 ) ;
Line.Sfs[i].Tran = 0 ;
Bound_AcGn = NbFilt170 ;
if ( (FrType == 0) && (Line.Olp[i>>1] < (SubFrLen-2) ) ) {
Line.Sfs[i].Tran = (Word16)(Temp >> 7) ;
Temp &= 0x0000007fL ;
Bound_AcGn = NbFilt085 ;
}
Line.Sfs[i].AcGn = (Word16) Temp;
if((Line.Sfs[i].AcGn < Bound_AcGn)&&( (IndexError[0]&(1<<(i>>1)) ) == 0) ) {
AcGn_old = Line.Sfs[i].AcGn;
Tran_old = Line.Sfs[i].Tran;
}else{
Line.Sfs[i].Tran = Tran_old ;
Line.Sfs[i].AcGn = AcGn_old;
IndexError[1]++;
}
}
/* Decode the 5 bit fixed gains */
for ( i = 0 ; i < SubFrames ; i ++ ) {
Line.Sfs[i].Mamp = (Word16) Ser2Par( &Bsp, 5 ) ;
error = 1;
for (j=0;j<NumOfGainLev;j++){
if (Line.Sfs[i].Mamp == MapIndexMamp[j]){
Line.Sfs[i].Mamp = j;
error = 0;
}
}
if (error == 0){
Mamp_old = Line.Sfs[i].Mamp;
}else{
Line.Sfs[i].Mamp = Mamp_old;
IndexError[2]++;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -