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

📄 dec_sid.c

📁 g729b_pc.rar是G729语音压缩标准的附件B的C语言实现标准源代码。
💻 C
字号:
/*   ITU-T G.729A Annex B     ANSI-C Source Code   Version 1.3    Last modified: August 1997   Copyright (c) 1996, France Telecom, Rockwell International,                       Universite de Sherbrooke.   All rights reserved.*//***** File:            "dec_cng.c"**** Description:     Comfort noise generation**                  performed at the decoder part***//**** Fixed point version ***/#include <stdio.h>#include <stdlib.h>#include "typedef.h"#include "ld8a.h"#include "tab_ld8a.h"#include "basic_op.h"#include "vad.h"#include "dtx.h"#include "sid.h"#include "tab_dtx.h"static Word16 cur_gain;static Word16 lspSid[M];static Word16 sid_gain;/***** Function:        Init_Dec_cng()**** Description:     Initialize dec_cng static variables*****/void Init_Dec_cng(void){    Copy( freq_prev_reset, lspSid, M);  sid_gain = tab_Sidgain[0];  return;}/*-----------------------------------------------------------* * procedure Dec_cng:                                        * *           ~~~~~~~~                                        * *                     Receives frame type                   * *                     0  :  for untransmitted frames        * *                     2  :  for SID frames                  * *                     Decodes SID frames                    * *                     Computes current frame excitation     * *                     Computes current frame LSPs *-----------------------------------------------------------*/void Dec_cng(  Word16 past_ftyp,     /* (i)   : past frame type                      */  Word16 sid_sav,       /* (i)   : energy to recover SID gain           */  Word16 sh_sid_sav,    /* (i)   : corresponding scaling factor         */  Word16 *parm,         /* (i)   : coded SID parameters                 */  Word16 *exc,          /* (i/o) : excitation array                     */  Word16 *lsp_old,      /* (i/o) : previous lsp                         */  Word16 *A_t,          /* (o)   : set of interpolated LPC coefficients */  Word16 *seed,         /* (i/o) : random generator seed                */  Word16 freq_prev[MA_NP][M]                        /* (i/o) : previous LPS for quantization        */){  Word16 temp, ind;  Word16 dif;  dif = sub(past_ftyp, 1);    /* SID Frame */  /*************/  if(parm[0] != 0) {    sid_gain = tab_Sidgain[(int)parm[4]];                   /* Inverse quantization of the LSP */    sid_lsfq_decode(&parm[1], lspSid, freq_prev);      }  /* non SID Frame */  /*****************/  else {        /* Case of 1st SID frame erased : quantize-decode   */    /* energy estimate stored in sid_gain         */    if(dif == 0) {      Qua_Sidgain(&sid_sav, &sh_sid_sav, 0, &temp, &ind);      sid_gain = tab_Sidgain[(int)ind];    }      }    if(dif == 0) {    cur_gain = sid_gain;  }  else {    cur_gain = mult_r(cur_gain, A_GAIN0);    cur_gain = add(cur_gain, mult_r(sid_gain, A_GAIN1));  }   Calc_exc_rand(cur_gain, exc, seed, FLAG_DEC);  /* Interpolate the Lsp vectors */  Int_qlpc(lsp_old, lspSid, A_t);  Copy(lspSid, lsp_old, M);    return;}/*---------------------------------------------------------------------------* * Function  Init_lsfq_noise                                                 * * ~~~~~~~~~~~~~~~~~~~~~~~~~                                                 * *                                                                           * * -> Initialization of variables for the lsf quantization in the SID        * *                                                                           * *---------------------------------------------------------------------------*/void Init_lsfq_noise(void){  Word16 i, j;  Word32 acc0;  /* initialize the noise_fg */  for (i=0; i<4; i++)    Copy(fg[0][i], noise_fg[0][i], M);    for (i=0; i<4; i++)    for (j=0; j<M; j++){      acc0 = L_mult(fg[0][i][j], 19660);      acc0 = L_mac(acc0, fg[1][i][j], 13107);      noise_fg[1][i][j] = extract_h(acc0);    }}void sid_lsfq_decode(Word16 *index,             /* (i) : quantized indices    */                     Word16 *lspq,              /* (o) : quantized lsp vector */                     Word16 freq_prev[MA_NP][M] /* (i) : memory of predictor  */                     ){  Word32 acc0;  Word16 i, j, k, lsfq[M], tmpbuf[M];  /* get the lsf error vector */  Copy(lspcb1[PtrTab_1[index[1]]], tmpbuf, M);  for (i=0; i<M/2; i++)    tmpbuf[i] = add(tmpbuf[i], lspcb2[PtrTab_2[0][index[2]]][i]);  for (i=M/2; i<M; i++)    tmpbuf[i] = add(tmpbuf[i], lspcb2[PtrTab_2[1][index[2]]][i]);  /* guarantee minimum distance of 0.0012 (~10 in Q13) between tmpbuf[j]      and tmpbuf[j+1] */  for (j=1; j<M; j++){    acc0 = L_mult(tmpbuf[j-1], 16384);    acc0 = L_mac(acc0, tmpbuf[j], -16384);    acc0 = L_mac(acc0, 10, 16384);    k = extract_h(acc0);    if (k > 0){      tmpbuf[j-1] = sub(tmpbuf[j-1], k);      tmpbuf[j] = add(tmpbuf[j], k);    }  }    /* compute the quantized lsf vector */  Lsp_prev_compose(tmpbuf, lsfq, noise_fg[index[0]], freq_prev,                    noise_fg_sum[index[0]]);    /* update the prediction memory */  Lsp_prev_update(tmpbuf, freq_prev);    /* lsf stability check */  Lsp_stability(lsfq);  /* convert lsf to lsp */  Lsf_lsp2(lsfq, lspq, M);}

⌨️ 快捷键说明

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