📄 encg729.c
字号:
/*///////////////////////////////////////////////////////////////////////////////// INTEL CORPORATION PROPRIETARY INFORMATION// This software is supplied under the terms of a license agreement or// nondisclosure agreement with Intel Corporation and may not be copied// or disclosed except in accordance with the terms of that agreement.// Copyright(c) 2005-2007 Intel Corporation. All Rights Reserved.//// Intel(R) Integrated Performance Primitives// USC - Unified Speech Codec interface library//// By downloading and installing USC codec, you hereby agree that the// accompanying Materials are being provided to you under the terms and// conditions of the End User License Agreement for the Intel(R) Integrated// Performance Primitives product previously accepted by you. Please refer// to the file ippEULA.rtf or ippEULA.txt located in the root directory of your Intel(R) IPP// product installation for more information.//// A speech coding standards promoted by ITU, ETSI, 3GPP and other// organizations. Implementations of these standards, or the standard enabled// platforms may require licenses from various entities, including// Intel Corporation.////// Purpose: G.729/A/B/D/E speech codec: encoder API functions.//*/#include <ippsc.h>#include <ipps.h>#include "vadg729.h"#include "owng729.h"static __ALIGN32 CONST Ipp16s LUT1_6k[CDBK1_DIM_6K] = { 0, 4, 6, 5, 2, 1, 7, 3};static __ALIGN32 CONST Ipp16s LUT2_6k[CDBK2_DIM_6K] = { 0, 4, 3, 7, 5, 1, 6, 2};static __ALIGN32 CONST Ipp16s tab1[3] = { (1<<10)+875, -3798, (1<<10)+875};static __ALIGN32 CONST Ipp16s tab2[3] = { (1<<12), (1<<12)+3711, -3733};static __ALIGN32 CONST Ipp16s hammingWin[LP_WINDOW_DIM] = { (1<<11)+573, (1<<11)+575,(1<<11)+581, 2638, 2651, 2668, 2689, 2713, 2741, 2772, 2808, 2847, 2890, 2936, 2986, 3040, 3097, 3158, 3223, 3291, 3363, 3438, 3517, 3599, 3685, 3774, 3867, 3963, 4063, 4166, 4272, 4382, 4495, 4611, 4731, 4853, 4979, 5108, 5240, 5376, 5514, 5655, 5800, 5947, 6097, 6250, 6406, 6565, 6726, 6890, 7057, 7227, 7399, 7573, 7750, 7930, 8112, 8296, 8483, 8672, 8863, 9057, 9252, 9450, 9650, 9852, 10055, 10261, 10468, 10677, 10888, 11101, 11315, 11531, 11748, 11967, 12187, 12409, 12632, 12856, 13082, 13308, 13536, 13764, 13994, 14225, 14456, 14688, 14921, 15155, 15389, 15624, 15859, 16095, 16331, 16568, 16805, 17042, 17279, 17516, 17754, 17991, 18228, 18465, 18702, 18939, 19175, 19411, 19647, 19882, 20117, 20350, 20584, 20816, 21048, 21279, 21509, 21738, 21967, 22194, 22420, 22644, 22868, 23090, 23311, 23531, 23749, 23965, 24181, 24394, 24606, 24816, 25024, 25231, 25435, 25638, 25839, 26037, 26234, 26428, 26621, 26811, 26999, 27184, 27368, 27548, 27727, 27903, 28076, 28247, 28415, 28581, 28743, 28903, 29061, 29215, 29367, 29515, 29661, 29804, 29944, 30081, 30214, 30345, 30472, 30597, 30718, 30836, 30950, 31062, 31170, 31274, 31376, 31474, 31568, 31659, 31747, 31831, 31911, 31988, 32062, 32132, 32198, 32261, 32320, 32376, 32428, 32476, 32521, 32561, 32599, 32632, 32662, 32688, 32711, 32729, 32744, 32755, 32763, IPP_MAX_16S, IPP_MAX_16S, 32741, 32665, 32537, 32359, 32129, 31850, 31521, 31143, 30716, 30242, 29720, 29151, 28538, 27879, 27177, 26433, 25647, 24821, 23957, 23055, 22117, 21145, 20139, 19102, 18036, 16941, 15820, 14674, 13505, 12315, 11106, 9879, 8637, 7381, 6114, 4838, 3554, 2264, 971};static __ALIGN32 CONST Ipp16s CodecTypeToRate[5] = { 3, 3, 2, 4, 0};static __ALIGN32 CONST Ipp16s prevRCpreset[2]={ 0, 0};static void ACFsumUpd(Ipp16s *ACFsum,Ipp16s *ACFsumSfs,Ipp16s *pACF,Ipp16s *ACFsfs, Ipp32s* pSumMem);static Ipp32s EncoderObjSize(void) { Ipp32s fltSize; Ipp32s objSize=sizeof(G729Encoder_Obj); ippsHighPassFilterSize_G729(&fltSize); objSize += fltSize; SynthesisFilterSize_G729(&fltSize); objSize += 2 * fltSize; VoiceActivityDetectSize_G729(&fltSize); objSize += fltSize; objSize += 4*32; return objSize;}G729_CODECFUN( APIG729_Status, apiG729Codec_ScratchMemoryAlloc,(Ipp32s *pCodecSize)) { if(NULL==pCodecSize) return APIG729_StsBadArgErr; *pCodecSize = G729_ENCODER_SCRATCH_MEMORY_SIZE; return APIG729_StsNoErr;}G729_CODECFUN( APIG729_Status, apiG729Encoder_Alloc, (G729Codec_Type codecType, Ipp32s *pCodecSize)) { if((codecType != G729_CODEC)&&(codecType != G729A_CODEC) &&(codecType != G729D_CODEC)&&(codecType != G729E_CODEC)&&(codecType != G729I_CODEC)) { return APIG729_StsBadCodecType; } *pCodecSize = EncoderObjSize(); return APIG729_StsNoErr;}G729_CODECFUN( APIG729_Status, apiG729Encoder_Mode, (G729Encoder_Obj* encoderObj, G729Encode_Mode mode)) { if(G729Encode_VAD_Enabled != mode && G729Encode_VAD_Disabled != mode) { return APIG729_StsBadArgErr; } encoderObj->objPrm.mode = mode; return APIG729_StsNoErr;}G729_CODECFUN( APIG729_Status, apiG729Encoder_Init, (G729Encoder_Obj* encoderObj, G729Codec_Type codecType, G729Encode_Mode mode)) { Ipp32s i,fltSize; Ipp16s abEnc[6]; Ipp8s* oldMemBuff; if(NULL==encoderObj) return APIG729_StsBadArgErr; if((codecType != G729_CODEC)&&(codecType != G729A_CODEC) &&(codecType != G729D_CODEC)&&(codecType != G729E_CODEC)&&(codecType != G729I_CODEC)) { return APIG729_StsBadCodecType; } oldMemBuff = encoderObj->Mem.base; /* if Reinit */ ippsZero_16s((Ipp16s*)encoderObj,sizeof(*encoderObj)>>1) ; encoderObj->objPrm.objSize = EncoderObjSize(); encoderObj->objPrm.mode = mode; encoderObj->objPrm.key = ENC_KEY; encoderObj->objPrm.codecType=codecType; encoderObj->mode = mode; encoderObj->preProc = (Ipp8s*)encoderObj + sizeof(G729Encoder_Obj); encoderObj->preProc = IPP_ALIGNED_PTR(encoderObj->preProc, 16); ippsHighPassFilterSize_G729(&fltSize); encoderObj->synFltw = (Ipp8s*)encoderObj->preProc + fltSize; encoderObj->synFltw = IPP_ALIGNED_PTR(encoderObj->synFltw, 16); SynthesisFilterSize_G729(&fltSize); encoderObj->synFltw0 = (Ipp8s*)encoderObj->synFltw + fltSize; encoderObj->synFltw0 = IPP_ALIGNED_PTR(encoderObj->synFltw0, 16); encoderObj->vadMem = (Ipp8s*)encoderObj->synFltw0 + fltSize; encoderObj->vadMem = IPP_ALIGNED_PTR(encoderObj->vadMem, 16); abEnc[0] = tab2[0]; abEnc[1] = tab2[1]; abEnc[2] = tab2[2]; abEnc[3] = tab1[0]; abEnc[4] = tab1[1]; abEnc[5] = tab1[2]; for(i=0;i<4;i++) encoderObj->prevFrameQuantEn[i]=-14336; VoiceActivityDetectInit_G729(encoderObj->vadMem); ippsHighPassFilterInit_G729(abEnc,encoderObj->preProc); SynthesisFilterInit_G729(encoderObj->synFltw); SynthesisFilterInit_G729(encoderObj->synFltw0); ippsZero_16s(encoderObj->speechHistory,SPEECH_BUF_DIM); ippsZero_16s(encoderObj->prevExcitat, L_prevExcitat); ippsZero_16s(encoderObj->prevWgtSpeech, MAX_PITCH_LAG); ippsZero_16s(encoderObj->resFilMem0, BWLPCF_DIM); encoderObj->betaPreFilter = PITCH_SHARP_MIN; ippsCopy_16s(presetOldA, encoderObj->prevSubfrLPC, LPF_DIM+1); encoderObj->prevRC[0] = prevRCpreset[0]; encoderObj->prevRC[1] = prevRCpreset[1]; ippsCopy_16s(presetLSP, encoderObj->prevSubfrLSP, LPF_DIM); ippsCopy_16s(presetLSP, encoderObj->prevSubfrLSPquant, LPF_DIM); ippsZero_16s(encoderObj->zeroPostFiltVec1 + BWLPCF_DIM+1, LP_SUBFRAME_DIM); encoderObj->BWDcounter2 = 0; encoderObj->FWDcounter2 = 0; for(i=0; i<LSP_MA_ORDER; i++) ippsCopy_16s( &resetPrevLSP[0], &encoderObj->prevLSPfreq[i][0], LPF_DIM); for(i=0; i<4; i++) encoderObj->coderErr[i] = BWF_HARMONIC; if(encoderObj->objPrm.codecType == G729A_CODEC) { encoderObj->seed = SEED_INIT; encoderObj->CNGidx = 0; ippsZero_16s(encoderObj->encPrm, PARM_DIM+1); Init_CNG_encoder(encoderObj); } else { encoderObj->prevLAR[0]=encoderObj->prevLAR[1]=0; encoderObj->prevSubfrSmooth=1; encoderObj->seed = SEED_INIT; encoderObj->CNGidx = 0; encoderObj->dominantBWDmode = 0; encoderObj->interpCoeff2_2 = 4506; encoderObj->statGlobal = 10000; ippsZero_16s(encoderObj->resFilMem, BWLPCF_DIM); ippsZero_16s(encoderObj->pPrevFilt, BWLPCF1_DIM); encoderObj->pPrevFilt[0] = (1<<12); encoderObj->prevLPmode = 0; for(i=0; i<5; i++) { encoderObj->pLag[i] = 20; encoderObj->pGain[i] = 11469; } ippsZero_16s(encoderObj->encPrm, PARM_DIM+1); Init_CNG_encoder(encoderObj); ippsZero_16s(encoderObj->BWDsynth, TBWD_DIM); encoderObj->pSynth = encoderObj->BWDsynth + SYNTH_BWD_DIM; ippsWinHybridGetStateSize_G729E_16s(&fltSize); if(fltSize > BWLPCF1_DIM*sizeof(Ipp32s)) { return APIG729_StsNotInitialized; } ippsWinHybridInit_G729E_16s((IppsWinHybridState_G729E_16s*)&encoderObj->hwState); ippsZero_16s(encoderObj->pPrevBwdRC, 2); ippsZero_16s(encoderObj->pPrevBwdLPC, BWLPCF1_DIM); encoderObj->pPrevBwdLPC[0]=(1<<12); ippsZero_16s(encoderObj->pBwdLPC2, BWLPCF1_DIM); encoderObj->pBwdLPC2[0] = (1<<12); encoderObj->BWDFrameCounter = 0; encoderObj->val_BWDFrameCounter = 0; } apiG729Encoder_InitBuff(encoderObj,oldMemBuff); return APIG729_StsNoErr;}void Init_CNG_encoder(G729Encoder_Obj *encoderObj) { Ipp16s i; ippsZero_16s(encoderObj->ACFsum, TOTAL_ACF_DIM); for(i=0; i<ACF_TOTAL; i++) encoderObj->ACFsumSfs[i] = 40; ippsZero_16s(encoderObj->pACF, ACF_DIM);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -