
   /******************************************************************

       iLBC Speech Coder ANSI-C Source Code

       iLBC_define.h

       Copyright (C) The Internet Society (2004).
       All Rights Reserved.

   ******************************************************************/
#include <string.h>

#ifndef __iLBC_ILBCDEFINE_H
#define __iLBC_ILBCDEFINE_H

   /* general codec settings */

#define FS                      (float)8000.0
#define BLOCKL_20MS             160
#define BLOCKL_30MS             240
#define BLOCKL_MAX              240
#define NSUB_20MS               4
#define NSUB_30MS               6
#define NSUB_MAX            6
#define NASUB_20MS              2





#define NASUB_30MS              4
#define NASUB_MAX               4
#define SUBL                40
#define STATE_LEN               80
#define STATE_SHORT_LEN_30MS    58
#define STATE_SHORT_LEN_20MS    57

   /* LPC settings */

#define LPC_FILTERORDER         10
#define LPC_CHIRP_SYNTDENUM     (float)0.9025
#define LPC_CHIRP_WEIGHTDENUM   (float)0.4222
#define LPC_LOOKBACK        60
#define LPC_N_20MS              1
#define LPC_N_30MS              2
#define LPC_N_MAX               2
#define LPC_ASYMDIFF        20
#define LPC_BW                  (float)60.0
#define LPC_WN                  (float)1.0001
#define LSF_NSPLIT              3
#define LSF_NUMBER_OF_STEPS     4
#define LPC_HALFORDER           (LPC_FILTERORDER/2)

   /* cb settings */

#define CB_NSTAGES              3
#define CB_EXPAND               2
#define CB_MEML                 147
#define CB_FILTERLEN        2*4
#define CB_HALFFILTERLEN    4
#define CB_RESRANGE             34
#define CB_MAXGAIN              (float)1.3

   /* enhancer */

#define ENH_BLOCKL              80      /* block length */
#define ENH_BLOCKL_HALF         (ENH_BLOCKL/2)
#define ENH_HL                  3       /* 2*ENH_HL+1 is number blocks
                                           in said second sequence */
#define ENH_SLOP            2   /* max difference estimated and
                                   correct pitch period */
#define ENH_PLOCSL              20      /* pitch-estimates and pitch-
                                           locations buffer length */
#define ENH_OVERHANG        2
#define ENH_UPS0            4   /* upsampling rate */
#define ENH_FL0                 3       /* 2*FLO+1 is the length of
                                           each filter */
#define ENH_VECTL               (ENH_BLOCKL+2*ENH_FL0)





#define ENH_CORRDIM             (2*ENH_SLOP+1)
#define ENH_NBLOCKS             (BLOCKL_MAX/ENH_BLOCKL)
#define ENH_NBLOCKS_EXTRA       5
#define ENH_NBLOCKS_TOT         8       /* ENH_NBLOCKS +
                                           ENH_NBLOCKS_EXTRA */
#define ENH_BUFL            (ENH_NBLOCKS_TOT)*ENH_BLOCKL
#define ENH_ALPHA0              (float)0.05

   /* Down sampling */

#define FILTERORDER_DS          7
#define DELAY_DS            3
#define FACTOR_DS               2

   /* bit stream defs */

#define NO_OF_BYTES_20MS    38
#define NO_OF_BYTES_30MS    50
#define NO_OF_WORDS_20MS    19
#define NO_OF_WORDS_30MS    25
#define STATE_BITS              3
#define BYTE_LEN            8
#define ULP_CLASSES             3

   /* help parameters */

#define FLOAT_MAX               (float)1.0e37
#define EPS                     (float)2.220446049250313e-016
#define PI                      (float)3.14159265358979323846
#define MIN_SAMPLE              -32768
#define MAX_SAMPLE              32767
#define TWO_PI                  (float)6.283185307
#define PI2                     (float)0.159154943

   /* type definition encoder instance */
typedef struct iLBC_ULP_Inst_t_ {
  int lsf_bits[6][ULP_CLASSES + 2];
  int start_bits[ULP_CLASSES + 2];
  int startfirst_bits[ULP_CLASSES + 2];
  int scale_bits[ULP_CLASSES + 2];
  int state_bits[ULP_CLASSES + 2];
  int extra_cb_index[CB_NSTAGES][ULP_CLASSES + 2];
  int extra_cb_gain[CB_NSTAGES][ULP_CLASSES + 2];
  int cb_index[NSUB_MAX][CB_NSTAGES][ULP_CLASSES + 2];
  int cb_gain[NSUB_MAX][CB_NSTAGES][ULP_CLASSES + 2];
} iLBC_ULP_Inst_t;

   /* type definition encoder instance */





typedef struct iLBC_Enc_Inst_t_ {

  /* flag for frame size mode */
  int mode;

  /* basic parameters for different frame sizes */
  int blockl;
  int nsub;
  int nasub;
  int no_of_bytes, no_of_words;
  int lpc_n;
  int state_short_len;
  const iLBC_ULP_Inst_t *ULP_inst;

  /* analysis filter state */
  float anaMem[LPC_FILTERORDER];

  /* old lsf parameters for interpolation */
  float lsfold[LPC_FILTERORDER];
  float lsfdeqold[LPC_FILTERORDER];

  /* signal buffer for LP analysis */
  float lpc_buffer[LPC_LOOKBACK + BLOCKL_MAX];

  /* state of input HP filter */
  float hpimem[4];

} iLBC_Enc_Inst_t;

   /* type definition decoder instance */
typedef struct iLBC_Dec_Inst_t_ {

  /* flag for frame size mode */
  int mode;

  /* basic parameters for different frame sizes */
  int blockl;
  int nsub;
  int nasub;
  int no_of_bytes, no_of_words;
  int lpc_n;
  int state_short_len;
  const iLBC_ULP_Inst_t *ULP_inst;

  /* synthesis filter state */
  float syntMem[LPC_FILTERORDER];

  /* old LSF for interpolation */





  float lsfdeqold[LPC_FILTERORDER];

  /* pitch lag estimated in enhancer and used in PLC */
  int last_lag;

  /* PLC state information */
  int prevLag, consPLICount, prevPLI, prev_enh_pl;
  float prevLpc[LPC_FILTERORDER + 1];
  float prevResidual[NSUB_MAX * SUBL];
  float per;
  unsigned long seed;

  /* previous synthesis filter parameters */
  float old_syntdenum[(LPC_FILTERORDER + 1) * NSUB_MAX];

  /* state of output HP filter */
  float hpomem[4];

  /* enhancer state information */
  int use_enhancer;
  float enh_buf[ENH_BUFL];
  float enh_period[ENH_NBLOCKS_TOT];

} iLBC_Dec_Inst_t;

#endif
