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

📄 cod_amr.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             : 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 + -