Home | History | Annotate | Download | only in ilbc
      1 /*
      2  *  Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
      3  *
      4  *  Use of this source code is governed by a BSD-style license
      5  *  that can be found in the LICENSE file in the root of the source
      6  *  tree. An additional intellectual property rights grant can be found
      7  *  in the file PATENTS.  All contributing project authors may
      8  *  be found in the AUTHORS file in the root of the source tree.
      9  */
     10 
     11 /******************************************************************
     12 
     13  iLBC Speech Coder ANSI-C Source Code
     14 
     15  define.h
     16 
     17 ******************************************************************/
     18 #ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_DEFINES_H_
     19 #define WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_DEFINES_H_
     20 
     21 #include <string.h>
     22 #include "signal_processing_library.h"
     23 #include "webrtc/typedefs.h"
     24 
     25 /* general codec settings */
     26 
     27 #define FS       8000
     28 #define BLOCKL_20MS     160
     29 #define BLOCKL_30MS     240
     30 #define BLOCKL_MAX     240
     31 #define NSUB_20MS     4
     32 #define NSUB_30MS     6
     33 #define NSUB_MAX     6
     34 #define NASUB_20MS     2
     35 #define NASUB_30MS     4
     36 #define NASUB_MAX     4
     37 #define SUBL      40
     38 #define STATE_LEN     80
     39 #define STATE_SHORT_LEN_30MS  58
     40 #define STATE_SHORT_LEN_20MS  57
     41 
     42 /* LPC settings */
     43 
     44 #define LPC_FILTERORDER    10
     45 #define LPC_LOOKBACK    60
     46 #define LPC_N_20MS     1
     47 #define LPC_N_30MS     2
     48 #define LPC_N_MAX     2
     49 #define LPC_ASYMDIFF    20
     50 #define LSF_NSPLIT     3
     51 #define LSF_NUMBER_OF_STEPS   4
     52 #define LPC_HALFORDER    5
     53 #define COS_GRID_POINTS 60
     54 
     55 /* cb settings */
     56 
     57 #define CB_NSTAGES     3
     58 #define CB_EXPAND     2
     59 #define CB_MEML      147
     60 #define CB_FILTERLEN    (2*4)
     61 #define CB_HALFFILTERLEN   4
     62 #define CB_RESRANGE     34
     63 #define CB_MAXGAIN_FIXQ6   83 /* error = -0.24% */
     64 #define CB_MAXGAIN_FIXQ14   21299
     65 
     66 /* enhancer */
     67 
     68 #define ENH_BLOCKL     80  /* block length */
     69 #define ENH_BLOCKL_HALF    (ENH_BLOCKL/2)
     70 #define ENH_HL      3  /* 2*ENH_HL+1 is number blocks
     71                                                                            in said second sequence */
     72 #define ENH_SLOP     2  /* max difference estimated and
     73                                                                            correct pitch period */
     74 #define ENH_PLOCSL     8  /* pitch-estimates and
     75                                                                            pitch-locations buffer length */
     76 #define ENH_OVERHANG    2
     77 #define ENH_UPS0     4  /* upsampling rate */
     78 #define ENH_FL0      3  /* 2*FLO+1 is the length of each filter */
     79 #define ENH_FLO_MULT2_PLUS1   7
     80 #define ENH_VECTL     (ENH_BLOCKL+2*ENH_FL0)
     81 #define ENH_CORRDIM     (2*ENH_SLOP+1)
     82 #define ENH_NBLOCKS     (BLOCKL/ENH_BLOCKL)
     83 #define ENH_NBLOCKS_EXTRA   5
     84 #define ENH_NBLOCKS_TOT    8 /* ENH_NBLOCKS+ENH_NBLOCKS_EXTRA */
     85 #define ENH_BUFL     (ENH_NBLOCKS_TOT)*ENH_BLOCKL
     86 #define ENH_BUFL_FILTEROVERHEAD  3
     87 #define ENH_A0      819   /* Q14 */
     88 #define ENH_A0_MINUS_A0A0DIV4  848256041 /* Q34 */
     89 #define ENH_A0DIV2     26843546 /* Q30 */
     90 
     91 /* PLC */
     92 
     93 /* Down sampling */
     94 
     95 #define FILTERORDER_DS_PLUS1  7
     96 #define DELAY_DS     3
     97 #define FACTOR_DS     2
     98 
     99 /* bit stream defs */
    100 
    101 #define NO_OF_BYTES_20MS   38
    102 #define NO_OF_BYTES_30MS   50
    103 #define NO_OF_WORDS_20MS   19
    104 #define NO_OF_WORDS_30MS   25
    105 #define STATE_BITS     3
    106 #define BYTE_LEN     8
    107 #define ULP_CLASSES     3
    108 
    109 /* help parameters */
    110 
    111 #define TWO_PI_FIX     25736 /* Q12 */
    112 
    113 /* Constants for codebook search and creation */
    114 
    115 #define ST_MEM_L_TBL  85
    116 #define MEM_LF_TBL  147
    117 
    118 
    119 /* Struct for the bits */
    120 typedef struct iLBC_bits_t_ {
    121   int16_t lsf[LSF_NSPLIT*LPC_N_MAX];
    122   int16_t cb_index[CB_NSTAGES*(NASUB_MAX+1)];  /* First CB_NSTAGES values contains extra CB index */
    123   int16_t gain_index[CB_NSTAGES*(NASUB_MAX+1)]; /* First CB_NSTAGES values contains extra CB gain */
    124   size_t idxForMax;
    125   int16_t state_first;
    126   int16_t idxVec[STATE_SHORT_LEN_30MS];
    127   int16_t firstbits;
    128   size_t startIdx;
    129 } iLBC_bits;
    130 
    131 /* type definition encoder instance */
    132 typedef struct IlbcEncoder_ {
    133 
    134   /* flag for frame size mode */
    135   int16_t mode;
    136 
    137   /* basic parameters for different frame sizes */
    138   size_t blockl;
    139   size_t nsub;
    140   int16_t nasub;
    141   size_t no_of_bytes, no_of_words;
    142   int16_t lpc_n;
    143   size_t state_short_len;
    144 
    145   /* analysis filter state */
    146   int16_t anaMem[LPC_FILTERORDER];
    147 
    148   /* Fix-point old lsf parameters for interpolation */
    149   int16_t lsfold[LPC_FILTERORDER];
    150   int16_t lsfdeqold[LPC_FILTERORDER];
    151 
    152   /* signal buffer for LP analysis */
    153   int16_t lpc_buffer[LPC_LOOKBACK + BLOCKL_MAX];
    154 
    155   /* state of input HP filter */
    156   int16_t hpimemx[2];
    157   int16_t hpimemy[4];
    158 
    159 #ifdef SPLIT_10MS
    160   int16_t weightdenumbuf[66];
    161   int16_t past_samples[160];
    162   uint16_t bytes[25];
    163   int16_t section;
    164   int16_t Nfor_flag;
    165   int16_t Nback_flag;
    166   int16_t start_pos;
    167   size_t diff;
    168 #endif
    169 
    170 } IlbcEncoder;
    171 
    172 /* type definition decoder instance */
    173 typedef struct IlbcDecoder_ {
    174 
    175   /* flag for frame size mode */
    176   int16_t mode;
    177 
    178   /* basic parameters for different frame sizes */
    179   size_t blockl;
    180   size_t nsub;
    181   int16_t nasub;
    182   size_t no_of_bytes, no_of_words;
    183   int16_t lpc_n;
    184   size_t state_short_len;
    185 
    186   /* synthesis filter state */
    187   int16_t syntMem[LPC_FILTERORDER];
    188 
    189   /* old LSF for interpolation */
    190   int16_t lsfdeqold[LPC_FILTERORDER];
    191 
    192   /* pitch lag estimated in enhancer and used in PLC */
    193   size_t last_lag;
    194 
    195   /* PLC state information */
    196   int consPLICount, prev_enh_pl;
    197   int16_t perSquare;
    198 
    199   int16_t prevScale, prevPLI;
    200   size_t prevLag;
    201   int16_t prevLpc[LPC_FILTERORDER+1];
    202   int16_t prevResidual[NSUB_MAX*SUBL];
    203   int16_t seed;
    204 
    205   /* previous synthesis filter parameters */
    206 
    207   int16_t old_syntdenum[(LPC_FILTERORDER + 1)*NSUB_MAX];
    208 
    209   /* state of output HP filter */
    210   int16_t hpimemx[2];
    211   int16_t hpimemy[4];
    212 
    213   /* enhancer state information */
    214   int use_enhancer;
    215   int16_t enh_buf[ENH_BUFL+ENH_BUFL_FILTEROVERHEAD];
    216   size_t enh_period[ENH_NBLOCKS_TOT];
    217 
    218 } IlbcDecoder;
    219 
    220 #endif
    221