⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 g7231_decod.c

📁 G723.1语音压缩解压在tms320c54系列上的实现代码,本人已在CCS上仿真通过. 包含全部源代码,主函数请自已写(本人的就不奉送了:
💻 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 + -