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

📄 dec_sid.c

📁 ITU-T在1996年3月公布了G.729建议的8Kbit/s共轭结构代数码激励线性预测(CS-ACELP)语音编码方案
💻 C
字号:
/*
    ITU-T G.729 Annex I  - Reference C code for fixed point
                         implementation of G.729 Annex I
                         Version 1.1 of October 1999
  */
/*
 File : dec_sid.c
 */

/* from dec_sid.c G729 Annex B Version 1.3  Last modified: August 1997 */
/*
**
** 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 "ld8k.h"
#include "tab_ld8k.h"
#include "ld8cp.h"
#include "tabld8cp.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)
{
    Word16 i;
    for (i=0; i<M; i++ ) lspSid[i] = lspSid_reset[i];
    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 + -