📄 dtx_dec.c
字号:
/******************************************************************************** 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******************************************************************************/#ifdef __PRINT_TEST
#include <stdio.h>
#include <stdlib.h>
#endif //#ifdef __PRINT_TEST
#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){#ifdef __PRINT_TEST
fprintf(stderr, "dtx_dec_init: invalid parameter\n");
#endif //#ifdef __PRINT_TEST
return -1; } *st = NULL; /* allocate memory */ if ((s= (dtx_decState *) malloc(sizeof(dtx_decState))) == NULL){#ifdef __PRINT_TEST
fprintf(stderr, "dtx_dec_init: can not malloc state structure\n");
#endif //#ifdef __PRINT_TEST
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){#ifdef __PRINT_TEST
fprintf(stderr, "dtx_dec_reset: invalid parameter\n");
#endif //#ifdef __PRINT_TEST
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(); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -