📄 cod_amr.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 : cod_amr.c* Purpose : Main encoder routine operating on a frame basis.*******************************************************************************/#include "cod_amr.h"const char cod_amr_id[] = "@(#)$Id $" cod_amr_h;/******************************************************************************* INCLUDE FILES******************************************************************************/#include <stdio.h>#include <stdlib.h>#include "typedef.h"#include "basic_op.h"#include "count.h"#include "cnst.h"#include "copy.h"#include "set_zero.h"#include "qua_gain.h"#include "lpc.h"#include "lsp.h"#include "pre_big.h"#include "ol_ltp.h"#include "p_ol_wgh.h"#include "spreproc.h"#include "cl_ltp.h"#include "pred_lt.h"#include "spstproc.h"#include "cbsearch.h"#include "gain_q.h"#include "copy.h"#include "convolve.h"#include "ton_stab.h"#include "vad.h"#include "dtx_enc.h"/******************************************************************************* LOCAL VARIABLES AND TABLES******************************************************************************//******************************************************************************* PUBLIC VARIABLES AND TABLES******************************************************************************//* Spectral expansion factors */static const Word16 gamma1[M] ={ 30802, 28954, 27217, 25584, 24049, 22606, 21250, 19975, 18777, 17650};/* gamma1 differs for the 12k2 coder */static const Word16 gamma1_12k2[M] ={ 29491, 26542, 23888, 21499, 19349, 17414, 15672, 14105, 12694, 11425};static const Word16 gamma2[M] ={ 19661, 11797, 7078, 4247, 2548, 1529, 917, 550, 330, 198};/******************************************************************************* PUBLIC PROGRAM CODE******************************************************************************//***************************************************************************** Function : cod_amr_init* Purpose : Allocates memory and initializes state variables****************************************************************************/int cod_amr_init (cod_amrState **state, Flag dtx){ cod_amrState* s; if (state == (cod_amrState **) NULL){ fprintf(stderr, "cod_amr_init: invalid parameter\n"); return -1; } *state = NULL; /* allocate memory */ if ((s= (cod_amrState *) malloc(sizeof(cod_amrState))) == NULL){ fprintf(stderr, "cod_amr_init: can not malloc state structure\n"); return -1; } s->lpcSt = NULL; s->lspSt = NULL; s->clLtpSt = NULL; s->gainQuantSt = NULL; s->pitchOLWghtSt = NULL; s->tonStabSt = NULL; s->vadSt = NULL; s->dtx_encSt = NULL; s->dtx = dtx; /* Init sub states */ if (cl_ltp_init(&s->clLtpSt) || lsp_init(&s->lspSt) || gainQuant_init(&s->gainQuantSt) || p_ol_wgh_init(&s->pitchOLWghtSt) || ton_stab_init(&s->tonStabSt) || #ifndef VAD2 vad1_init(&s->vadSt) ||#else vad2_init(&s->vadSt) ||#endif dtx_enc_init(&s->dtx_encSt) || lpc_init(&s->lpcSt)) { cod_amr_exit(&s); return -1; } cod_amr_reset(s); *state = s; return 0;} /***************************************************************************** Function : cod_amr_reset* Purpose : Resets state memory****************************************************************************/int cod_amr_reset (cod_amrState *st){ Word16 i; if (st == (cod_amrState *) NULL){ fprintf(stderr, "cod_amr_reset: invalid parameter\n"); return -1; } /*-----------------------------------------------------------------------* * Initialize pointers to speech vector. * *-----------------------------------------------------------------------*/ st->new_speech = st->old_speech + L_TOTAL - L_FRAME; /* New speech */ st->speech = st->new_speech - L_NEXT; /* Present frame */ st->p_window = st->old_speech + L_TOTAL - L_WINDOW; /* For LPC window */ st->p_window_12k2 = st->p_window - L_NEXT; /* EFR LPC window: no lookahead */ /* Initialize static pointers */ st->wsp = st->old_wsp + PIT_MAX; st->exc = st->old_exc + PIT_MAX + L_INTERPOL; st->zero = st->ai_zero + MP1; st->error = st->mem_err + M; st->h1 = &st->hvec[L_SUBFR]; /* Static vectors to zero */ Set_zero(st->old_speech, L_TOTAL); Set_zero(st->old_exc, PIT_MAX + L_INTERPOL); Set_zero(st->old_wsp, PIT_MAX); Set_zero(st->mem_syn, M); Set_zero(st->mem_w, M); Set_zero(st->mem_w0, M); Set_zero(st->mem_err, M); Set_zero(st->zero, L_SUBFR); Set_zero(st->hvec, L_SUBFR); /* set to zero "h1[-L_SUBFR..-1]" */ /* OL LTP states */ for (i = 0; i < 5; i++) { st->old_lags[i] = 40; } /* Reset lpc states */ lpc_reset(st->lpcSt); /* Reset lsp states */ lsp_reset(st->lspSt); /* Reset clLtp states */ cl_ltp_reset(st->clLtpSt); gainQuant_reset(st->gainQuantSt); p_ol_wgh_reset(st->pitchOLWghtSt); ton_stab_reset(st->tonStabSt); #ifndef VAD2 vad1_reset(st->vadSt);#else vad2_reset(st->vadSt);#endif dtx_enc_reset(st->dtx_encSt); st->sharp = SHARPMIN; return 0;} /***************************************************************************** Function : cod_amr_exit* Purpose : The memory used for state memory is freed****************************************************************************/void cod_amr_exit (cod_amrState **state){ if (state == NULL || *state == NULL) return; /* dealloc members */ lpc_exit(&(*state)->lpcSt); lsp_exit(&(*state)->lspSt); gainQuant_exit(&(*state)->gainQuantSt); cl_ltp_exit(&(*state)->clLtpSt); p_ol_wgh_exit(&(*state)->pitchOLWghtSt); ton_stab_exit(&(*state)->tonStabSt);#ifndef VAD2 vad1_exit(&(*state)->vadSt);#else vad2_exit(&(*state)->vadSt);#endif dtx_enc_exit(&(*state)->dtx_encSt); /* deallocate memory */ free(*state); *state = NULL; return;}/*************************************************************************** * FUNCTION: cod_amr_first * * PURPOSE: Copes with look-ahead. * * INPUTS: * No input argument are passed to this function. However, before * calling this function, 40 new speech data should be copied to the * vector new_speech[]. This is a global pointer which is declared in * this file (it points to the end of speech buffer minus 200). * ***************************************************************************/ int cod_amr_first(cod_amrState *st, /* i/o : State struct */ Word16 new_speech[]) /* i : speech input (L_FRAME) */{ Copy(new_speech,&st->new_speech[-L_NEXT], L_NEXT); /* Copy(new_speech,st->new_speech,L_FRAME); */ return 0;}/*************************************************************************** * FUNCTION: cod_amr * * PURPOSE: Main encoder routine. * * DESCRIPTION: This function is called every 20 ms speech frame, * operating on the newly read 160 speech samples. It performs the * principle encoding functions to produce the set of encoded parameters * which include the LSP, adaptive codebook, and fixed codebook * quantization indices (addresses and gains). * * INPUTS: * No input argument are passed to this function. However, before * calling this function, 160 new speech data should be copied to the * vector new_speech[]. This is a global pointer which is declared in * this file (it points to the end of speech buffer minus 160). * * OUTPUTS: * * ana[]: vector of analysis parameters. * synth[]: Local synthesis speech (for debugging purposes) * ***************************************************************************/int cod_amr( cod_amrState *st, /* i/o : State struct */ enum Mode mode, /* i : AMR mode */ Word16 new_speech[], /* i : speech input (L_FRAME) */ Word16 ana[], /* o : Analysis parameters */ enum Mode *usedMode, /* o : used mode */ Word16 synth[] /* o : Local synthesis */){ /* LPC coefficients */ Word16 A_t[(MP1) * 4]; /* A(z) unquantized for the 4 subframes */ Word16 Aq_t[(MP1) * 4]; /* A(z) quantized for the 4 subframes */ Word16 *A, *Aq; /* Pointer on A_t and Aq_t */ Word16 lsp_new[M]; /* Other vectors */ Word16 xn[L_SUBFR]; /* Target vector for pitch search */ Word16 xn2[L_SUBFR]; /* Target vector for codebook search */ Word16 code[L_SUBFR]; /* Fixed codebook excitation */ Word16 y1[L_SUBFR]; /* Filtered adaptive excitation */ Word16 y2[L_SUBFR]; /* Filtered fixed codebook excitation */ Word16 gCoeff[6]; /* Correlations between xn, y1, & y2: */ Word16 res[L_SUBFR]; /* Short term (LPC) prediction residual */ Word16 res2[L_SUBFR]; /* Long term (LTP) prediction residual */ /* Vector and scalars needed for the MR475 */ Word16 xn_sf0[L_SUBFR]; /* Target vector for pitch search */ Word16 y2_sf0[L_SUBFR]; /* Filtered codebook innovation */ Word16 code_sf0[L_SUBFR]; /* Fixed codebook excitation */ Word16 h1_sf0[L_SUBFR]; /* The impulse response of sf0 */ Word16 mem_syn_save[M]; /* Filter memory */ Word16 mem_w0_save[M]; /* Filter memory */ Word16 mem_err_save[M]; /* Filter memory */ Word16 sharp_save; /* Sharpening */ Word16 evenSubfr; /* Even subframe indicator */ Word16 T0_sf0 = 0; /* Integer pitch lag of sf0 */ Word16 T0_frac_sf0 = 0; /* Fractional pitch lag of sf0 */ Word16 i_subfr_sf0 = 0; /* Position in exc[] for sf0 */ Word16 gain_pit_sf0; /* Quantized pitch gain for sf0 */ Word16 gain_code_sf0; /* Quantized codebook gain for sf0 */ /* Scalars */ Word16 i_subfr, subfrNr; Word16 T_op[L_FRAME/L_FRAME_BY2]; Word16 T0, T0_frac; Word16 gain_pit, gain_code; /* Flags */ Word16 lsp_flag = 0; /* indicates resonance in LPC filter */ Word16 gp_limit; /* pitch gain limit value */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -