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

   iLBC Speech Coder ANSI-C Source Code 

   iLBC_define.h     

   Copyright (c) 2001, 
   Global IP Sound AB. 
   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 

/* PLC */ 

 


#define PLC_BWEXPAND        (float)0.99 

/* 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 
