aboutsummaryrefslogtreecommitdiffstats
path: root/codecs/ilbc/StateConstructW.c
blob: 2b2114f3ce47d394aace6bd15a7bbf9ca6235a4a (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
 
/****************************************************************** 
 
    iLBC Speech Coder ANSI-C Source Code 
 
    StateConstructW.c  
 
    Copyright (c) 2001, 
    Global IP Sound AB. 
    All rights reserved. 
 
******************************************************************/ 
 
#include <math.h>  
#include <string.h> 
 
#include "iLBC_define.h" 
#include "constants.h" 
#include "filter.h" 
#include "StateConstructW.h"
 
/*----------------------------------------------------------------* 
 *  decoding of the start state 
 *---------------------------------------------------------------*/ 
 
void StateConstructW(  
    int idxForMax,      /* (i) 6-bit index for the quantization of  
                               max amplitude */ 
    int *idxVec,    /* (i) vector of quantization indexes */ 
    float *syntDenum,   /* (i) synthesis filter denumerator */ 
    float *out,         /* (o) the decoded state vector */ 
    int len             /* (i) length of a state vector */ 
){ 
    float maxVal, tmpbuf[LPC_FILTERORDER+2*STATE_LEN], *tmp,  
        numerator[LPC_FILTERORDER+1]; 
    float foutbuf[LPC_FILTERORDER+2*STATE_LEN], *fout; 
    int k,tmpi; 
     
    /* decoding of the maximum value */ 
 
    maxVal = state_frgqTbl[idxForMax]; 
    maxVal = (float)pow(10,maxVal)/(float)4.5; 
         
    /* initialization of buffers and coefficients */ 
     
    memset(tmpbuf, 0, LPC_FILTERORDER*sizeof(float)); 
    memset(foutbuf, 0, LPC_FILTERORDER*sizeof(float)); 
    for(k=0; k<LPC_FILTERORDER; k++){ 
        numerator[k]=syntDenum[LPC_FILTERORDER-k]; 
    } 
    numerator[LPC_FILTERORDER]=syntDenum[0]; 
    tmp = &tmpbuf[LPC_FILTERORDER]; 
    fout = &foutbuf[LPC_FILTERORDER]; 
 
    /* decoding of the sample values */ 
     
    for(k=0; k<len; k++){ 
        tmpi = len-1-k; 
        /* maxVal = 1/scal */ 
        tmp[k] = maxVal*state_sq3Tbl[idxVec[tmpi]]; 
    } 
 
    /* circular convolution with all-pass filter */ 
 
    memset(tmp+len, 0, len*sizeof(float)); 
    ZeroPoleFilter(tmp, numerator, syntDenum, 2*len,  
        LPC_FILTERORDER, fout); 
    for(k=0;k<len;k++){ 
        out[k] = fout[len-1-k]+fout[2*len-1-k]; 
    } 
}