亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? encoder.cpp

?? G711語音壓縮源碼
?? CPP
?? 第 1 頁 / 共 5 頁
字號:
//#include "stdafx.h"

#include <memory.h>
#include <math.h>
#include "LanAudio.h"
#include "Global.h"


unsigned char linear2alaw(_int16	pcm_val);
_int16 alaw2linear(unsigned char  a_val);
unsigned char linear2ulaw(_int16	pcm_val);
_int16 ulaw2linear(unsigned char	u_val);
unsigned char alaw2ulaw(unsigned char	aval);
unsigned char ulaw2alaw(unsigned char	uval);

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CLanAudioEncoder::CLanAudioEncoder(int iBitRate, BOOL bHighPassFilter, BOOL bVad,EAudioCodec nCodec)
{
	UseHp = bHighPassFilter;
	UseVx = bVad;
	WrkRate = iBitRate;
	m_nCodec = nCodec;
	m_bMute = FALSE;

    Init_Coder();

    // Init Comfort Noise Functions 
    Init_Vad();
    Init_Cod_Cng();
///	OutputDebugString("Audio Encoder Inited\n");
}

CLanAudioEncoder::~CLanAudioEncoder()
{
}
int CLanAudioEncoder::EncodeG723(const short * iFrame, char * cCode)
{
	int i, iInfo, iSize;

    if (WrkRate == Rate53) reset_max_time();

	for (i = 0; i < Frame; i ++) DataBuff[i] = (float)iFrame[i];

	Coder(DataBuff, cCode);

    iInfo = cCode[0] & 0x0003;

    /* Check frame type and rate information */
    switch (iInfo) 
	{
        case 0x0002 : {  /* SID frame */
            iSize = 4;
            break;
        }

        case 0x0003 : {  /* untransmitted silence frame */
            iSize = 1;
            break;
        }

        case 0x0001 : {  /* active frame, low rate */
            iSize = 20;
            break;
        }

        default : {      /* active frame, high rate */
            iSize = 24;
        }
    }
	return iSize;
}
int CLanAudioEncoder::EncodeG711(const short* input,unsigned char* code)
{
	const short* org_input = input;
	unsigned char * org_code = code;

	if(m_bMute){
		if(m_nCodec==G711_A)
			for(int i = 0; i < G711_Frame; i++){
				*code = linear2alaw((_int16)0);
				code ++;
			}
		else
			for(int i = 0; i < G711_Frame; i++){
				*code = linear2ulaw((_int16)0);
				code ++;
			}
	}
	else {
		if(m_nCodec==G711_A)
			for(int i = 0; i < G711_Frame; i++){
				*code = linear2alaw(*input);
				input ++;
				code ++;
			}
		else
			for(int i = 0; i < G711_Frame; i++){
				*code = linear2ulaw(*input);
				input ++;
				code ++;
			}
	}
	input = org_input;
	code = org_code;

	return G711_Frame;
}
int CLanAudioEncoder::Encode(const short * iFrame, char * cCode)
{
	switch (m_nCodec){
	case G711_A:
	case G711_U:
		return(EncodeG711(iFrame,(unsigned char *)cCode));
		break;
	case G723:
		return(EncodeG723(iFrame,cCode));
		break;
	default:
		return(0);
		break;
	}
}

/*
**
** Function:        Init_Coder()
**
** Description:     Initializes non-zero state variables
**          for the coder.
**
** Links to text:   Section 2.21
**
** Arguments:       None
**
** Outputs:     None
**
** Return value:    None
**
*/
void  CLanAudioEncoder::Init_Coder(void)
{
    int i;

    /* Initialize encoder data structure with zeros */
    ::memset(&CodStat,0,sizeof(CODSTATDEF));

    /* Initialize the previously decoded LSP vector to the DC vector */

    for (i=0; i < LpcOrder; i++)
        CodStat.PrevLsp[i] = LspDcTable[i];

    /* Initialize the taming procedure */
    for(i=0; i<SizErr; i++)
        CodStat.Err[i] = Err0;

    return;
}

void CLanAudioEncoder::Init_Vad(void)
{
    int i ;

    VadStat.Hcnt = 3 ;
    VadStat.Vcnt = 0 ;
    VadStat.Penr = (float) 1024.0;
    VadStat.Nlev = (float) 1024.0;

    VadStat.Aen = 0;

    VadStat.Polp[0] = 1;
    VadStat.Polp[1] = 1;
    VadStat.Polp[2] = SubFrLen;
    VadStat.Polp[3] = SubFrLen;

    for (i=0; i < LpcOrder; i++)
        VadStat.NLpc[i] = (float)0.0;

}

/*
**
** Function:        Init_Cod_Cng()
**
** Description:     Initialize Cod_Cng static variables
**
** Links to text:
**
** Arguments:       None
**
** Outputs:         None
**
** Return value:    None
**
*/
void CLanAudioEncoder::Init_Cod_Cng(void)
{
    int i;

    CodCng.CurGain = (float)0.0;

    for (i=0; i< SizAcf; i++)
        CodCng.Acf[i] = (float)0.0;

    for (i=0; i < LpcOrder; i++)
        CodCng.SidLpc[i] = (float)0.0;

    CodCng.PastFtyp = 1;

    CodCng.RandSeed = 12345;

    return;
}


void CLanAudioEncoder::reset_max_time(void)
{
    extra = 120;
    return;
}

/*
**
** Function:        Coder()
**
** Description:     Implements G.723.1 dual-rate coder for    a frame
**          of speech
**
** Links to text:   Section 2
**
** Arguments:
**
**  float  DataBuff[]   frame (240 samples)
**
** Outputs:
**
**  char   Vout[]       Encoded frame (0/4/20/24 bytes)
**
** Return value:
**
**  BOOL            Always TRUE
**
*/
BOOL  CLanAudioEncoder::Coder(float *DataBuff, char *Vout)
{
    int i,j;

    /*
     *  Local variables
     */
    float   UnqLpc[SubFrames*LpcOrder];
    float   QntLpc[SubFrames*LpcOrder];
    float   PerLpc[2*SubFrames*LpcOrder];

    float   LspVect[LpcOrder];
    LINEDEF Line;
    PWDEF   Pw[SubFrames];

    float   ImpResp[SubFrLen];
    float   *Dpnt;

    short  Ftyp = 1;

    /*  Coder Start  */

    Line.Crc = 0;

    Rem_Dc(DataBuff);

    /* Compute the Unquantized Lpc set for whole frame */
    Comp_Lpc(UnqLpc, CodStat.PrevDat, DataBuff);

    /* Convert to Lsp */
    AtoLsp(LspVect, &UnqLpc[LpcOrder*(SubFrames-1)], CodStat.PrevLsp);

    /* Compute the Vad */
    Ftyp = Comp_Vad(DataBuff) ? 1 : 0;

    /* VQ Lsp vector */
    Line.LspId = Lsp_Qnt(LspVect, CodStat.PrevLsp);

    Mem_Shift(CodStat.PrevDat, DataBuff);

    /* Compute Percetual filter Lpc coefficeints */
    Wght_Lpc(PerLpc, UnqLpc);

    /* Apply the perceptual weighting filter */
    Error_Wght(DataBuff, PerLpc);

    /*  Compute Open loop pitch estimates  */

    //Dpnt = (float *) malloc(sizeof(float)*(PitchMax+Frame));
	Dpnt = new float[PitchMax+Frame];

    /* Construct the buffer */
    for (i=0; i < PitchMax;i++)
        Dpnt[i] = CodStat.PrevWgt[i];

    for (i=0;i < Frame;i++)
        Dpnt[PitchMax+i] = DataBuff[i];

    j = PitchMax;
    for (i=0; i < SubFrames/2; i++) {
        Line.Olp[i] = Estim_Pitch(Dpnt, j);
        VadStat.Polp[i+2] = (short) Line.Olp[i];
        j += 2*SubFrLen;
    }

    if (Ftyp != 1) {

        /*
        // Case of inactive signal
        */
        //free((char *) Dpnt);
		delete Dpnt;

        /* Save PrevWgt */
        for ( i = 0 ; i < PitchMax ; i ++ )
            CodStat.PrevWgt[i] = DataBuff[i+Frame-PitchMax];

        /* CodCng => Ftyp = 0 (untransmitted) or 2 (SID) */
        Cod_Cng(DataBuff, &Ftyp, &Line, QntLpc);

        /* Update the ringing delays */
        Dpnt = DataBuff;
        for ( i = 0 ; i < SubFrames; i++ ) {

            /* Update exc_err */
            Update_Err(Line.Olp[i>>1], Line.Sfs[i].AcLg, Line.Sfs[i].AcGn);

            Upd_Ring( Dpnt, &QntLpc[i*LpcOrder], &PerLpc[i*2*LpcOrder],
                                                        CodStat.PrevErr);
            Dpnt += SubFrLen;
        }
    }
    else {

        /* Compute the Hmw */
        j = PitchMax;
        for (i=0; i < SubFrames; i++) {
            Pw[i] = Comp_Pw(Dpnt, j, Line.Olp[i>>1]);
            j += SubFrLen;
        }

        /* Reload the buffer */
        for (i=0; i < PitchMax; i++)
            Dpnt[i] = CodStat.PrevWgt[i];
        for (i=0; i < Frame; i++)
            Dpnt[PitchMax+i] = DataBuff[i];

        /* Save PrevWgt */
        for (i=0; i < PitchMax; i++)
          CodStat.PrevWgt[i] = Dpnt[Frame+i];

        /* Apply the Harmonic filter */
        j = 0;
        for (i=0; i < SubFrames; i++) {
            Filt_Pw(DataBuff, Dpnt, j , Pw[i]);
            j += SubFrLen;
        }

        //free((char *) Dpnt);
		delete Dpnt;

        /* Inverse quantization of the LSP */
        Lsp_Inq(LspVect, CodStat.PrevLsp, Line.LspId, Line.Crc);

        /* Interpolate the Lsp vectors */
        Lsp_Int(QntLpc, LspVect, CodStat.PrevLsp);

        /* Copy the LSP vector for the next frame */
        for ( i = 0 ; i < LpcOrder ; i ++ )
            CodStat.PrevLsp[i] = LspVect[i];

        /*  Start the sub frame processing loop  */

        Dpnt = DataBuff;

        for (i=0; i < SubFrames; i++) {

            /* Compute full impulse response */
            Comp_Ir(ImpResp, &QntLpc[i*LpcOrder], &PerLpc[i*2*LpcOrder], Pw[i]);

            /* Subtruct the ringing of previos sub-frame */
            Sub_Ring(Dpnt, &QntLpc[i*LpcOrder], &PerLpc[i*2*LpcOrder],
                     CodStat.PrevErr, Pw[i]);

            /* Compute adaptive code book contribution */
            Find_Acbk(Dpnt, ImpResp, CodStat.PrevExc, &Line, i);

            /* Compute fixed code book contribution */
            Find_Fcbk(Dpnt, ImpResp, &Line, i);

            /* Reconstruct the excitation */
            Decod_Acbk(ImpResp, CodStat.PrevExc, Line.Olp[i>>1],
                       Line.Sfs[i].AcLg, Line.Sfs[i].AcGn);

            for (j=SubFrLen; j < PitchMax; j++)
                CodStat.PrevExc[j-SubFrLen] = CodStat.PrevExc[j];

            for (j=0; j < SubFrLen; j++) {
                Dpnt[j] = Dpnt[j] + ImpResp[j];
                CodStat.PrevExc[PitchMax-SubFrLen+j] = Dpnt[j];

                /* Clip the new samples */
                if (CodStat.PrevExc[PitchMax-SubFrLen+j] < (float)-32767.5)
                    CodStat.PrevExc[PitchMax-SubFrLen+j] = (float)-32768.0;
                else if (CodStat.PrevExc[PitchMax-SubFrLen+j] > (float)32766.5)
                    CodStat.PrevExc[PitchMax-SubFrLen+j] = (float)32767.0;
            }

            /* Update exc_err */
            Update_Err(Line.Olp[i>>1], Line.Sfs[i].AcLg, Line.Sfs[i].AcGn);

            /* Update the ringing delays  */
            Upd_Ring(Dpnt, &QntLpc[i*LpcOrder], &PerLpc[i*2*LpcOrder],
                     CodStat.PrevErr);

            Dpnt += SubFrLen;
        }  /* end of subframes loop */

        /*
        // Save Vad information and reset CNG random generator
        */
        CodCng.PastFtyp = 1;
        CodCng.RandSeed = 12345;

    } /* End of active frame case */

    /* Pack the Line structure */
    Line_Pack(&Line, Vout, Ftyp);

    return TRUE;
}


/*
**
** Function:           Cod_Cng()
**
** Description:        Computes Ftyp for inactive frames
**                              0  :  for untransmitted frames
**                              2  :  for SID frames
**                     Computes current frame excitation
**                     Computes current frame LSPs
**                     Computes the coded parameters of SID frames
**
** Links to text:
**
** Arguments:
**
**  float   *DataExc   Current frame synthetic excitation
**  short  *Ftyp      Characterizes the frame type for CNG
**  LINEDEF *Line      Quantized parameters (used for SID frames)
**  float   *QntLpc    Interpolated frame LPC coefficients
**
** Outputs:
**
**  float   *DataExc
**  short  *Ftyp
**  LINEDEF *Line
**  float   *QntLpc
**
** Return value:       None
**
*/
void CLanAudioEncoder::Cod_Cng(float *DataExc, short *Ftyp, LINEDEF *Line, float *QntLpc)
{
    float   curCoeff[LpcOrder];
    short  curQGain;
    float   temp;
    int     i;

    /*
     * Update Ener
     */
    for (i=NbAvGain-1; i>=1; i--) {
        CodCng.Ener[i] = CodCng.Ener[i-1];
    }

    /*
     * Compute LPC filter of present frame
     */
    CodCng.Ener[0] = Durbin(curCoeff, &CodCng.Acf[1], CodCng.Acf[0], &temp);

    /*
     * if first frame of silence => SID frame
     */
    if (CodCng.PastFtyp == 1) {
        *Ftyp = 2;
        CodCng.NbEner = 1;
        curQGain = Qua_SidGain(CodCng.Ener, CodCng.NbEner);
    }

    else {
        CodCng.NbEner++;
        if (CodCng.NbEner > NbAvGain)
            CodCng.NbEner = NbAvGain;
        curQGain = Qua_SidGain(CodCng.Ener, CodCng.NbEner);

        /*
         * Compute stationarity of current filter

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美一区二区三区日韩视频| 国产网站一区二区| 精品国产网站在线观看| 国产精品电影一区二区| 蓝色福利精品导航| 欧美影视一区二区三区| 日本一区二区三区电影| 精一区二区三区| 欧美美女直播网站| 亚洲欧美日韩一区二区| 国产成人精品免费网站| 日韩美女在线视频| 亚洲18色成人| 欧美在线三级电影| 亚洲色图清纯唯美| www.日韩av| 国产午夜久久久久| 国产乱人伦精品一区二区在线观看 | 国产在线精品一区二区不卡了 | 欧美日韩小视频| 伊人一区二区三区| 99精品热视频| 国产精品对白交换视频 | 国产麻豆欧美日韩一区| 这里只有精品视频在线观看| 亚洲尤物在线视频观看| 色狠狠综合天天综合综合| 综合久久久久久久| 91在线视频18| 日韩美女精品在线| 一本色道久久综合精品竹菊| 亚洲色图视频网站| 在线观看一区二区视频| 一区二区三区不卡视频| 欧美三级资源在线| 视频一区二区国产| 日韩一级黄色片| 麻豆精品在线视频| 久久男人中文字幕资源站| 国产成人一区在线| 中文字幕欧美国产| 91一区二区三区在线观看| 亚洲激情自拍偷拍| 欧美精品高清视频| 美日韩一区二区| 久久久噜噜噜久久中文字幕色伊伊| 久久狠狠亚洲综合| 久久日韩精品一区二区五区| 风间由美中文字幕在线看视频国产欧美| 久久久精品黄色| 成人av在线电影| 一区av在线播放| 91精品蜜臀在线一区尤物| 另类小说综合欧美亚洲| 国产精品视频看| 欧美性三三影院| 久久99国产精品麻豆| 亚洲欧洲av另类| 欧美在线色视频| 国模娜娜一区二区三区| 亚洲色图丝袜美腿| 7777精品伊人久久久大香线蕉| 国内精品在线播放| 久久99精品久久久久久久久久久久| 亚洲精品在线观看视频| 99久久久国产精品免费蜜臀| 婷婷六月综合网| 国产午夜精品美女毛片视频| 欧美午夜宅男影院| 国产精品主播直播| 亚洲www啪成人一区二区麻豆| 久久蜜桃一区二区| 欧美人与z0zoxxxx视频| 国产a久久麻豆| 日韩电影免费一区| 亚洲色图第一区| 精品国产污污免费网站入口| 色婷婷精品大在线视频| 韩国欧美一区二区| 亚洲动漫第一页| 国产精品久久久久永久免费观看 | 亚洲综合丁香婷婷六月香| 精品欧美乱码久久久久久| 色婷婷狠狠综合| 国产一区二区三区黄视频| 午夜精品爽啪视频| 最近中文字幕一区二区三区| 精品日韩99亚洲| 欧美午夜精品一区| 99久久国产免费看| 国产一二精品视频| 麻豆91在线播放| 婷婷综合五月天| 夜夜嗨av一区二区三区| 一色屋精品亚洲香蕉网站| 久久久国产综合精品女国产盗摄| 91精品国产综合久久久久| 色国产精品一区在线观看| 成年人国产精品| 国产在线视视频有精品| 久久狠狠亚洲综合| 蜜臀av一区二区在线免费观看| 一区二区三区四区不卡在线 | 亚洲精品一区二区三区四区高清| 欧美羞羞免费网站| 日本精品裸体写真集在线观看| 国产成人在线色| 国产成人免费视频网站| 韩国欧美一区二区| 韩国视频一区二区| 国产精品资源网| 国产成人99久久亚洲综合精品| 激情综合色丁香一区二区| 奇米精品一区二区三区在线观看 | 91搞黄在线观看| 99精品国产视频| 91麻豆国产福利精品| av福利精品导航| 色婷婷激情久久| 欧美综合久久久| 在线成人高清不卡| 欧美成人精品3d动漫h| 欧美成人video| 国产网站一区二区| 国产精品久线在线观看| 一区二区免费在线| 亚洲成人一二三| 久久er99精品| 国产黄色成人av| 91视频com| 欧美蜜桃一区二区三区| 精品嫩草影院久久| 国产欧美一区二区精品性 | 欧美精品一区二区三区蜜桃| 久久综合色播五月| 国产精品传媒入口麻豆| 亚洲综合色丁香婷婷六月图片| 午夜私人影院久久久久| 极品美女销魂一区二区三区| 国产999精品久久久久久绿帽| 91丝袜呻吟高潮美腿白嫩在线观看| 欧美影院一区二区| 久久亚洲精精品中文字幕早川悠里 | 亚洲精品videosex极品| 蜜臀av性久久久久蜜臀aⅴ| 国产乱码精品一区二区三区忘忧草 | 精品一区二区三区在线视频| 夫妻av一区二区| 欧美日韩黄色一区二区| 久久久91精品国产一区二区三区| 亚洲欧美日韩国产中文在线| 三级精品在线观看| 成人激情免费视频| 日韩午夜在线影院| 日韩码欧中文字| 久久99在线观看| 色综合视频一区二区三区高清| 欧美高清精品3d| 国产精品国产三级国产普通话99 | 亚洲乱码精品一二三四区日韩在线| 午夜精品久久久久影视| 国产成人免费视频一区| 欧美日韩国产一二三| 国产精品久久久一本精品 | 一区二区三区四区高清精品免费观看 | 在线免费视频一区二区| 久久免费精品国产久精品久久久久| 一区二区高清免费观看影视大全| 国产毛片一区二区| 3d动漫精品啪啪| 一区二区三区在线观看网站| 国产一本一道久久香蕉| 欧美高清一级片在线| 亚洲天堂av一区| 国产91丝袜在线播放九色| 91精品黄色片免费大全| 一级女性全黄久久生活片免费| 国产精品99久久久久久宅男| 日韩三区在线观看| 亚洲va在线va天堂| 欧美亚洲综合在线| 综合激情网...| 成人av中文字幕| 亚洲综合激情网| 91在线观看视频| 国产精品国产三级国产普通话99| 国产一区二区在线看| 精品国产一区a| 麻豆一区二区三区| 日韩一区二区三区四区| 午夜精品影院在线观看| 欧美午夜不卡视频| 亚洲专区一二三| 欧美亚洲免费在线一区| 一区二区成人在线| 欧美三日本三级三级在线播放| 亚洲制服丝袜在线| 欧美日产国产精品| 天天综合日日夜夜精品| 欧美乱妇15p|