📄 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******************************************************************************/#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 + -