📄 g7231_decod.c
字号:
#include "typedef.h"
#include "G7231_basop.h"
#include "G7231_cst_lbc.h"
#include "G7231_tab_lbc.h"
#include "G7231_lbccodec.h"
#include "G7231_decod.h"
#include "G7231_util_lbc.h"
#include "G7231_lpc.h"
#include "G7231_lsp.h"
#include "G7231_exc_lbc.h"
#include "G7231_dec_cng.h"
#include "intrindefs.h"
G7231DECSTATDEF G7231DecStat ;
void G7231Init_Decod(int rate)
{
int i ;
memset(&G7231DecStat, 0, sizeof(G7231DECSTATDEF));
G7231DecStat.WrkRate = (rate ? Rate53 : Rate63);
for ( i = 0 ; i < G7231LpcOrder ; i ++ )
G7231DecStat.PrevLsp[i] = G7231LspDcTable[i] ;
G7231DecStat.Gain = (Word16) 0x1000 ;
//Init_Dec_Cng( );
return;
}
Flag G7231Decod( Word16 *DataBuff, char *Vinp, Word16 Crc )
{
int i,j ;
Word32 Senr ;
Word16 QntLpc[G7231SubFrames*G7231LpcOrder] ;
Word16 AcbkCont[G7231SubFrLen] ;
Word16 LspVect[G7231LpcOrder] ;
Word16 Temp[G7231PitchMax+G7231Frame] ;
Word16 *Dpnt ;
G7231LINEDEF Line ;
G7231PFDEF Pf[G7231SubFrames] ;
Word16 Ftyp;
Line = G7231Line_Unpk( Vinp, &Ftyp, Crc ) ;
if ( Line.Crc != (Word16) 0 ) {
if(G7231DecCng.PastFtyp == 1) Ftyp = 1;
else Ftyp = 0;
}
if(Ftyp != 1) {
G7231Dec_Cng(Ftyp, &Line, DataBuff, QntLpc);
}
else {
if ( Line.Crc != (Word16) 0 )
G7231DecStat.Ecount = G7231add( G7231DecStat.Ecount, (Word16) 1 ) ;
else
G7231DecStat.Ecount = (Word16) 0 ;
if ( G7231DecStat.Ecount > (Word16) G7231ErrMaxNum )
G7231DecStat.Ecount = (Word16) G7231ErrMaxNum ;
G7231Lsp_Inq( LspVect, G7231DecStat.PrevLsp, Line.LspId, Line.Crc ) ;
G7231Lsp_Int( QntLpc, LspVect, G7231DecStat.PrevLsp ) ;
for ( i = 0 ; i < G7231LpcOrder ; i ++ )
G7231DecStat.PrevLsp[i] = LspVect[i] ;
if ( G7231DecStat.Ecount == (Word16) 0 ) {
G7231DecStat.InterGain = G7231add( Line.Sfs[G7231SubFrames-2].Mamp,
Line.Sfs[G7231SubFrames-1].Mamp ) ;
G7231DecStat.InterGain = G7231shr( G7231DecStat.InterGain, (Word16) 1 ) ;
G7231DecStat.InterGain = G7231FcbkGainTable[G7231DecStat.InterGain] ;
}
else
G7231DecStat.InterGain = G7231mult_r( G7231DecStat.InterGain, (Word16) 0x6000 ) ;
for ( i = 0 ; i < G7231PitchMax ; i ++ )
Temp[i] = G7231DecStat.PrevExc[i] ;
Dpnt = &Temp[G7231PitchMax] ;
if ( G7231DecStat.Ecount == (Word16) 0 ) {
for ( i = 0 ; i < G7231SubFrames ; i ++ ) {
G7231Fcbk_Unpk_De( Dpnt, Line.Sfs[i], Line.Olp[i>>1], (Word16) i ) ;
G7231Decod_Acbk_De( AcbkCont, &Temp[G7231SubFrLen*i], Line.Olp[i>>1],
Line.Sfs[i].AcLg, Line.Sfs[i].AcGn ) ;
for ( j = 0 ; j < G7231SubFrLen ; j ++ ) {
Dpnt[j] = G7231shl( Dpnt[j], (Word16) 1 ) ;
Dpnt[j] = G7231add( Dpnt[j], AcbkCont[j] ) ;
}
Dpnt += G7231SubFrLen ;
}
for ( j = 0 ; j < G7231Frame ; j ++ )
DataBuff[j] = Temp[G7231PitchMax+j] ;
G7231DecStat.InterIndx = G7231Comp_Info( Temp, Line.Olp[G7231SubFrames/2-1],
&G7231DecCng.SidGain, &G7231DecCng.CurGain ) ;
if ( G7231UsePf )
for ( i = 0 ; i < G7231SubFrames ; i ++ )
Pf[i] = G7231Comp_Lpf( Temp, Line.Olp[i>>1], (Word16) i ) ;
for ( j = 0 ; j < G7231PitchMax ; j ++ )
Temp[j] = G7231DecStat.PrevExc[j] ;
for ( j = 0 ; j < G7231Frame ; j ++ )
Temp[G7231PitchMax+j] = DataBuff[j] ;
if ( G7231UsePf )
for ( i = 0 ; i < G7231SubFrames ; i ++ )
G7231Filt_Lpf( DataBuff, Temp, Pf[i], (Word16) i ) ;
for(i=0; i< G7231LpcOrder; i++)
G7231DecCng.LspSid[i] = G7231DecStat.PrevLsp[i];
}
else {
G7231Regen( DataBuff, Temp, G7231DecStat.InterIndx, G7231DecStat.InterGain,
G7231DecStat.Ecount, &G7231DecStat.Rseed ) ;
}
for ( j = 0 ; j < G7231PitchMax ; j ++ )
G7231DecStat.PrevExc[j] = Temp[G7231Frame+j] ;
G7231DecCng.RandSeed = 12345;
}
G7231DecCng.PastFtyp = Ftyp;
Dpnt = DataBuff ;
for ( i = 0 ; i < G7231SubFrames ; i ++ ) {
G7231Synt( Dpnt, &QntLpc[i*G7231LpcOrder] ) ;
if ( G7231UsePf ) {
Senr = G7231Spf( Dpnt, &QntLpc[i*G7231LpcOrder] ) ;
G7231Scale( Dpnt, Senr ) ;
}
Dpnt += G7231SubFrLen ;
}
return (Flag) True ;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -