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

📄 lpcdecode.cpp

📁 KphoneSI (kpsi) is a SIP (Session Initiation Protocol) user agent for Linux, with which you can in
💻 CPP
字号:
   /******************************************************************       iLBC Speech Coder ANSI-C Source Code       LPC_decode.c       Copyright (C) The Internet Society (2004).       All Rights Reserved.   ******************************************************************/   #include <math.h>   #include <string.h>   #include "helpfun.h"   #include "lsf.h"   #include "iLBC_define.h"   #include "constants.h"   /*---------------------------------------------------------------*    *  interpolation of lsf coefficients for the decoder    *--------------------------------------------------------------*/   void LSFinterpolate2a_dec(       float *a,           /* (o) lpc coefficients for a sub-frame */       float *lsf1,    /* (i) first lsf coefficient vector */       float *lsf2,    /* (i) second lsf coefficient vector */       float coef,         /* (i) interpolation weight */       int length          /* (i) length of lsf vectors */   ){       float  lsftmp[LPC_FILTERORDER];       interpolate(lsftmp, lsf1, lsf2, coef, length);       lsf2a(a, lsftmp);   }   /*---------------------------------------------------------------*    *  obtain dequantized lsf coefficients from quantization index    *--------------------------------------------------------------*/   void SimplelsfDEQ(       float *lsfdeq,    /* (o) dequantized lsf coefficients */       int *index,         /* (i) quantization index */       int lpc_n           /* (i) number of LPCs */   ){       int i, j, pos, cb_pos;       /* decode first LSF */       pos = 0;       cb_pos = 0;       for (i = 0; i < LSF_NSPLIT; i++) {           for (j = 0; j < dim_lsfCbTbl[i]; j++) {               lsfdeq[pos + j] = lsfCbTbl[cb_pos +                   (long)(index[i])*dim_lsfCbTbl[i] + j];           }           pos += dim_lsfCbTbl[i];           cb_pos += size_lsfCbTbl[i]*dim_lsfCbTbl[i];       }       if (lpc_n>1) {           /* decode last LSF */           pos = 0;           cb_pos = 0;           for (i = 0; i < LSF_NSPLIT; i++) {               for (j = 0; j < dim_lsfCbTbl[i]; j++) {                   lsfdeq[LPC_FILTERORDER + pos + j] =                       lsfCbTbl[cb_pos +                       (long)(index[LSF_NSPLIT + i])*                       dim_lsfCbTbl[i] + j];               }               pos += dim_lsfCbTbl[i];               cb_pos += size_lsfCbTbl[i]*dim_lsfCbTbl[i];           }       }   }   /*----------------------------------------------------------------*    *  obtain synthesis and weighting filters form lsf coefficients    *---------------------------------------------------------------*/   void DecoderInterpolateLSF(       float *syntdenum, /* (o) synthesis filter coefficients */       float *weightdenum, /* (o) weighting denumerator                                  coefficients */       float *lsfdeq,       /* (i) dequantized lsf coefficients */       int length,         /* (i) length of lsf coefficient vector */       iLBC_Dec_Inst_t *iLBCdec_inst                           /* (i) the decoder state structure */   ){       int    i, pos, lp_length;       float  lp[LPC_FILTERORDER + 1], *lsfdeq2;       lsfdeq2 = lsfdeq + length;       lp_length = length + 1;       if (iLBCdec_inst->mode==30) {           /* sub-frame 1: Interpolation between old and first */           LSFinterpolate2a_dec(lp, iLBCdec_inst->lsfdeqold, lsfdeq,               lsf_weightTbl_30ms[0], length);           memcpy(syntdenum,lp,lp_length*sizeof(float));           bwexpand(weightdenum, lp, LPC_CHIRP_WEIGHTDENUM,               lp_length);           /* sub-frames 2 to 6: interpolation between first              and last LSF */           pos = lp_length;           for (i = 1; i < 6; i++) {               LSFinterpolate2a_dec(lp, lsfdeq, lsfdeq2,                   lsf_weightTbl_30ms[i], length);               memcpy(syntdenum + pos,lp,lp_length*sizeof(float));               bwexpand(weightdenum + pos, lp,                   LPC_CHIRP_WEIGHTDENUM, lp_length);               pos += lp_length;           }       }       else {           pos = 0;           for (i = 0; i < iLBCdec_inst->nsub; i++) {               LSFinterpolate2a_dec(lp, iLBCdec_inst->lsfdeqold,                   lsfdeq, lsf_weightTbl_20ms[i], length);               memcpy(syntdenum+pos,lp,lp_length*sizeof(float));               bwexpand(weightdenum+pos, lp, LPC_CHIRP_WEIGHTDENUM,                   lp_length);               pos += lp_length;           }       }       /* update memory */       if (iLBCdec_inst->mode==30)           memcpy(iLBCdec_inst->lsfdeqold, lsfdeq2,                       length*sizeof(float));       else           memcpy(iLBCdec_inst->lsfdeqold, lsfdeq,                       length*sizeof(float));   }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -