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

📄 dtx_dec.c

📁 arm音频编解码库
💻 C
📖 第 1 页 / 共 2 页
字号:
/********************************************************************************      GSM AMR-NB speech codec   R98   Version 7.6.0   December 12, 2001*                                R99   Version 3.3.0                *                                REL-4 Version 4.1.0                ********************************************************************************      File             : dtx_dec.c*      Purpose          : Decode comfort noise when in DTX*******************************************************************************//*******************************************************************************                         MODULE INCLUDE FILE AND VERSION ID******************************************************************************/#include "dtx_dec.h"const char dtx_dec_id[] = "@(#)$Id $" dtx_dec_h; /*******************************************************************************                         INCLUDE FILES******************************************************************************/#include <stdlib.h>#include <stdio.h>#include "typedef.h"#include "basic_op.h"#include "oper_32b.h"#include "copy.h"#include "set_zero.h"#include "mode.h"#include "log2.h"#include "lsp_az.h"#include "pow2.h"#include "a_refl.h"#include "b_cn_cod.h"#include "syn_filt.h"#include "lsp_lsf.h"#include "reorder.h"#include "count.h"#include "q_plsf_5.tab"#include "lsp.tab"/*******************************************************************************                         LOCAL VARIABLES AND TABLES******************************************************************************/#define PN_INITIAL_SEED 0x70816958L   /* Pseudo noise generator seed value  *//*************************************************** * Scaling factors for the lsp variability operation * ***************************************************/static const Word16 lsf_hist_mean_scale[M] = {   20000,   20000,   20000,   20000,   20000,   18000,   16384,    8192,       0,       0};/************************************************* * level adjustment for different modes Q11      * *************************************************/static const Word16 dtx_log_en_adjust[9] ={  -1023, /* MR475 */   -878, /* MR515 */   -732, /* MR59  */   -586, /* MR67  */   -440, /* MR74  */   -294, /* MR795 */   -148, /* MR102 */      0, /* MR122 */      0, /* MRDTX */};/*******************************************************************************                         PUBLIC PROGRAM CODE******************************************************************************//*****************************************************************************  Function    : dtx_dec_init****************************************************************************/ int dtx_dec_init (dtx_decState **st){   dtx_decState* s;      if (st == (dtx_decState **) NULL){      fprintf(stderr, "dtx_dec_init: invalid parameter\n");      return -1;    }      *st = NULL;      /* allocate memory */   if ((s= (dtx_decState *) malloc(sizeof(dtx_decState))) == NULL){      fprintf(stderr, "dtx_dec_init: can not malloc state structure\n");      return -1;   }      dtx_dec_reset(s);   *st = s;      return 0;} /*****************************************************************************  Function    : dtx_dec_reset****************************************************************************/int dtx_dec_reset (dtx_decState *st){   int i;   if (st == (dtx_decState *) NULL){      fprintf(stderr, "dtx_dec_reset: invalid parameter\n");      return -1;   }      st->since_last_sid = 0;   st->true_sid_period_inv = (1 << 13);     st->log_en = 3500;     st->old_log_en = 3500;   /* low level noise for better performance in  DTX handover cases*/      st->L_pn_seed_rx = PN_INITIAL_SEED;   /* Initialize state->lsp [] and state->lsp_old [] */   Copy(lsp_init_data, &st->lsp[0], M);   Copy(lsp_init_data, &st->lsp_old[0], M);   st->lsf_hist_ptr = 0;   st->log_pg_mean = 0;   st->log_en_hist_ptr = 0;   /* initialize decoder lsf history */   Copy(mean_lsf, &st->lsf_hist[0], M);   for (i = 1; i < DTX_HIST_SIZE; i++)   {      Copy(&st->lsf_hist[0], &st->lsf_hist[M*i], M);   }   Set_zero(st->lsf_hist_mean, M*DTX_HIST_SIZE);   /* initialize decoder log frame energy */    for (i = 0; i < DTX_HIST_SIZE; i++)   {      st->log_en_hist[i] = st->log_en;   }   st->log_en_adjust = 0;   st->dtxHangoverCount = DTX_HANG_CONST;   st->decAnaElapsedCount = 32767;      st->sid_frame = 0;          st->valid_data = 0;                st->dtxHangoverAdded = 0;      st->dtxGlobalState = DTX;       st->data_updated = 0;    return 0;} /*****************************************************************************  Function    : dtx_dec_exit****************************************************************************/void dtx_dec_exit (dtx_decState **st){   if (st == NULL || *st == NULL)      return;      /* deallocate memory */   free(*st);   *st = NULL;      return;}/*****************************************************************************  Function    : dtx_dec*                ***************************************************************************/int dtx_dec(   dtx_decState *st,                /* i/o : State struct                    */   Word16 mem_syn[],                /* i/o : AMR decoder state               */   D_plsfState* lsfState,           /* i/o : decoder lsf states              */   gc_predState* predState,         /* i/o : prediction states               */   Cb_gain_averageState* averState, /* i/o : CB gain average states          */   enum DTXStateType new_state,     /* i   : new DTX state                   */   enum Mode mode,                  /* i   : AMR mode                        */   Word16 parm[],                   /* i   : Vector of synthesis parameters  */   Word16 synth[],                  /* o   : synthesised speech              */   Word16 A_t[]                     /* o   : decoded LP filter in 4 subframes*/   ){   Word16 log_en_index;   Word16 i, j;   Word16 int_fac;   Word32 L_log_en_int;   Word16 lsp_int[M];   Word16 log_en_int_e;   Word16 log_en_int_m;   Word16 level;   Word16 acoeff[M + 1];   Word16 refl[M];   Word16 pred_err;   Word16 ex[L_SUBFR];   Word16 ma_pred_init;   Word16 log_pg_e, log_pg_m;   Word16 log_pg;   Flag negative;   Word16 lsf_mean;   Word32 L_lsf_mean;   Word16 lsf_variab_index;   Word16 lsf_variab_factor;   Word16 lsf_int[M];   Word16 lsf_int_variab[M];   Word16 lsp_int_variab[M];   Word16 acoeff_variab[M + 1];   Word16 lsf[M];   Word32 L_lsf[M];   Word16 ptr;   Word16 tmp_int_length;   /*  This function is called if synthesis state is not SPEECH     *  the globally passed  inputs to this function are     * st->sid_frame     * st->valid_data     * st->dtxHangoverAdded    * new_state  (SPEECH, DTX, DTX_MUTE)    */   test(); test();   if ((st->dtxHangoverAdded != 0) &&        (st->sid_frame != 0))   {      /* sid_first after dtx hangover period */      /* or sid_upd after dtxhangover        */      /* set log_en_adjust to correct value */      st->log_en_adjust = dtx_log_en_adjust[mode];                ptr = add(st->lsf_hist_ptr, M);                               move16();       test();      if (sub(ptr, 80) == 0)      {         ptr = 0;                                                   move16();      }      Copy( &st->lsf_hist[st->lsf_hist_ptr],&st->lsf_hist[ptr],M);             ptr = add(st->log_en_hist_ptr,1);                             move16();      test();      if (sub(ptr, DTX_HIST_SIZE) == 0)      {         ptr = 0;                                                   move16();      }      move16();      st->log_en_hist[ptr] = st->log_en_hist[st->log_en_hist_ptr]; /* Q11 */            /* compute mean log energy and lsp *       * from decoded signal (SID_FIRST) */               st->log_en = 0;                                               move16();      for (i = 0; i < M; i++)      {         L_lsf[i] = 0;                                              move16();      }            /* average energy and lsp */      for (i = 0; i < DTX_HIST_SIZE; i++)      {         st->log_en = add(st->log_en,                          shr(st->log_en_hist[i],3));         for (j = 0; j < M; j++)         {            L_lsf[j] = L_add(L_lsf[j],                             L_deposit_l(st->lsf_hist[i * M + j]));         }      }             for (j = 0; j < M; j++)      {         lsf[j] = extract_l(L_shr(L_lsf[j],3)); /* divide by 8 */  move16();      }            Lsf_lsp(lsf, st->lsp, M);       /* make log_en speech coder mode independent */      /* added again later before synthesis        */      st->log_en = sub(st->log_en, st->log_en_adjust);      /* compute lsf variability vector */      Copy(st->lsf_hist, st->lsf_hist_mean, 80);      for (i = 0; i < M; i++)      {         L_lsf_mean = 0;                                           move32();         /* compute mean lsf */         for (j = 0; j < 8; j++)         {            L_lsf_mean = L_add(L_lsf_mean,                                L_deposit_l(st->lsf_hist_mean[i+j*M]));         }                  lsf_mean = extract_l(L_shr(L_lsf_mean, 3));               move16();         /* subtract mean and limit to within reasonable limits  *          * moreover the upper lsf's are attenuated              */         for (j = 0; j < 8; j++)         {            /* subtract mean */             st->lsf_hist_mean[i+j*M] =                sub(st->lsf_hist_mean[i+j*M], lsf_mean);            /* attenuate deviation from mean, especially for upper lsf's */            st->lsf_hist_mean[i+j*M] =                mult(st->lsf_hist_mean[i+j*M], lsf_hist_mean_scale[i]);            /* limit the deviation */            test();            if (st->lsf_hist_mean[i+j*M] < 0)            {               negative = 1;                                        move16();            }            else            {               negative = 0;                                        move16();            }            st->lsf_hist_mean[i+j*M] = abs_s(st->lsf_hist_mean[i+j*M]);            /* apply soft limit */            test();            if (sub(st->lsf_hist_mean[i+j*M], 655) > 0)            {               st->lsf_hist_mean[i+j*M] =                   add(655, shr(sub(st->lsf_hist_mean[i+j*M], 655), 2));            }                        /* apply hard limit */            test();            if (sub(st->lsf_hist_mean[i+j*M], 1310) > 0)            {               st->lsf_hist_mean[i+j*M] = 1310;                     move16();            }            test();            if (negative != 0)             {               st->lsf_hist_mean[i+j*M] = -st->lsf_hist_mean[i+j*M];move16();            }                     }      }   }      test();   if (st->sid_frame != 0 )   {      /* Set old SID parameters, always shift */      /* even if there is no new valid_data   */      Copy(st->lsp, st->lsp_old, M);      st->old_log_en = st->log_en;                                  move16();      test();      if (st->valid_data != 0 )  /* new data available (no CRC) */      {         /* Compute interpolation factor, since the division only works *          * for values of since_last_sid < 32 we have to limit the      *          * interpolation to 32 frames                                  */         tmp_int_length = st->since_last_sid;                       move16();         st->since_last_sid = 0;                                    move16();         test();         if (sub(tmp_int_length, 32) > 0)         {            tmp_int_length = 32;                                    move16();         }         test();         if (sub(tmp_int_length, 2) >= 0)         {            move16();            st->true_sid_period_inv = div_s(1 << 10, shl(tmp_int_length, 10));          }         else         {            st->true_sid_period_inv = 1 << 14; /* 0.5 it Q15 */     move16();         }                  Init_D_plsf_3(lsfState, parm[0]);  /* temporay initialization */          D_plsf_3(lsfState, MRDTX, 0, &parm[1], st->lsp);         Set_zero(lsfState->past_r_q, M);   /* reset for next speech frame */          log_en_index = parm[4];                                    move16();         /* Q11 and divide by 4 */         st->log_en = shl(log_en_index, (11 - 2));                  move16();                  /* Subtract 2.5 in Q11 */         st->log_en = sub(st->log_en, (2560 * 2));                  /* Index 0 is reserved for silence */         test();         if (log_en_index == 0)         {            st->log_en = MIN_16;                                    move16();         }                  /* no interpolation at startup after coder reset        */         /* or when SID_UPD has been received right after SPEECH */         test(); test();         if ((st->data_updated == 0) ||             (sub(st->dtxGlobalState, SPEECH) == 0)             )          {            Copy(st->lsp, st->lsp_old, M);            st->old_log_en = st->log_en;                            move16();         }               } /* endif valid_data */      /* initialize gain predictor memory of other modes */             ma_pred_init = sub(shr(st->log_en,1), 9000);                  move16();      test();      if (ma_pred_init > 0)      {                            ma_pred_init = 0;                                          move16();  

⌨️ 快捷键说明

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