aboutsummaryrefslogtreecommitdiffstats
path: root/codecs/ilbc/iCBConstruct.c
blob: acbf54e3cc81b848f1dede8f728018b4142fbfa9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
 
/****************************************************************** 
 
    iLBC Speech Coder ANSI-C Source Code 
 
    iCBConstruct.c  
 
    Copyright (c) 2001, 
    Global IP Sound AB. 
    All rights reserved. 
 
******************************************************************/ 
 
#include <math.h> 
 
#include "iLBC_define.h" 
#include "gainquant.h" 
#include "getCBvec.h" 
#include "iCBConstruct.h"
 
/*----------------------------------------------------------------* 
 *  Convert the codebook indexes to make the search easier 
 *---------------------------------------------------------------*/ 
 
void index_conv_enc( 
    int *index          /* (i/o) Codebook indexes */ 
){ 
    int k; 
 
    for (k=1;k<CB_NSTAGES;k++) { 
         
        if ((index[k]>=108)&&(index[k]<172)) { 
            index[k]-=64; 
        } else if (index[k]>=236) { 
            index[k]-=128; 
        } else { 
            /* ERROR */ 
        } 
    } 
} 
 
void index_conv_dec( 
    int *index          /* (i/o) Codebook indexes */ 
){ 
    int k; 
 
    for (k=1;k<CB_NSTAGES;k++) { 
         
        if ((index[k]>=44)&&(index[k]<108)) { 
            index[k]+=64; 
        } else if ((index[k]>=108)&&(index[k]<128)) { 
            index[k]+=128; 
        } else { 
            /* ERROR */ 
        } 
    } 
} 
 
/*----------------------------------------------------------------* 
 *  Construct decoded vector from codebook and gains. 
 *---------------------------------------------------------------*/ 
 
void iCBConstruct( 
    float *decvector,   /* (o) Decoded vector */ 
    int *index,         /* (i) Codebook indices */ 
    int *gain_index,/* (i) Gain quantization indices */ 
    float *mem,         /* (i) Buffer for codevector construction */ 
    int lMem,           /* (i) Length of buffer */ 
    int veclen,         /* (i) Length of vector */ 
    int nStages         /* (i) Number of codebook stages */ 
){ 
    int j,k; 
    float gain[CB_NSTAGES]; 
    float cbvec[SUBL]; 
 
    /* gain de-quantization */ 
 
    gain[0] = gaindequant(gain_index[0], 1.0, 32); 
    if (nStages > 1) { 
        gain[1] = gaindequant(gain_index[1],  
            (float)fabs(gain[0]), 16);   
    } 
    if (nStages > 2) { 
        gain[2] = gaindequant(gain_index[2],  
            (float)fabs(gain[1]), 8); 
    } 
 
    /* codebook vector construction and construction of  
    total vector */ 
 
    getCBvec(cbvec, mem, index[0], lMem, veclen); 
    for (j=0;j<veclen;j++){ 
        decvector[j] = gain[0]*cbvec[j]; 
    } 
    if (nStages > 1) { 
        for (k=1; k<nStages; k++) { 
            getCBvec(cbvec, mem, index[k], lMem, veclen); 
            for (j=0;j<veclen;j++) { 
                decvector[j] += gain[k]*cbvec[j]; 
            } 
        } 
    } 
}