Asterisk - The Open Source Telephony Project GIT-master-a358458
LPCdecode.c
Go to the documentation of this file.
1
2 /******************************************************************
3
4 iLBC Speech Coder ANSI-C Source Code
5
6 LPC_decode.c
7
8 Copyright (C) The Internet Society (2004).
9 All Rights Reserved.
10
11 ******************************************************************/
12
13 #include <math.h>
14 #include <string.h>
15
16 #include "helpfun.h"
17 #include "lsf.h"
18 #include "iLBC_define.h"
19 #include "constants.h"
20
21 /*---------------------------------------------------------------*
22 * interpolation of lsf coefficients for the decoder
23 *--------------------------------------------------------------*/
24
26 float *a, /* (o) lpc coefficients for a sub-frame */
27 float *lsf1, /* (i) first lsf coefficient vector */
28 float *lsf2, /* (i) second lsf coefficient vector */
29 float coef, /* (i) interpolation weight */
30 int length /* (i) length of lsf vectors */
31 ){
32 float lsftmp[LPC_FILTERORDER];
33
34 interpolate(lsftmp, lsf1, lsf2, coef, length);
35 lsf2a(a, lsftmp);
36 }
37
38 /*---------------------------------------------------------------*
39 * obtain dequantized lsf coefficients from quantization index
40 *--------------------------------------------------------------*/
41
43 float *lsfdeq, /* (o) dequantized lsf coefficients */
44 int *index, /* (i) quantization index */
45 int lpc_n /* (i) number of LPCs */
46 ){
47 int i, j, pos, cb_pos;
48
49
50
51
52
53 /* decode first LSF */
54
55 pos = 0;
56 cb_pos = 0;
57 for (i = 0; i < LSF_NSPLIT; i++) {
58 for (j = 0; j < dim_lsfCbTbl[i]; j++) {
59 lsfdeq[pos + j] = lsfCbTbl[cb_pos +
60 (long)(index[i])*dim_lsfCbTbl[i] + j];
61 }
62 pos += dim_lsfCbTbl[i];
63 cb_pos += size_lsfCbTbl[i]*dim_lsfCbTbl[i];
64 }
65
66 if (lpc_n>1) {
67
68 /* decode last LSF */
69
70 pos = 0;
71 cb_pos = 0;
72 for (i = 0; i < LSF_NSPLIT; i++) {
73 for (j = 0; j < dim_lsfCbTbl[i]; j++) {
74 lsfdeq[LPC_FILTERORDER + pos + j] =
75 lsfCbTbl[cb_pos +
76 (long)(index[LSF_NSPLIT + i])*
77 dim_lsfCbTbl[i] + j];
78 }
79 pos += dim_lsfCbTbl[i];
80 cb_pos += size_lsfCbTbl[i]*dim_lsfCbTbl[i];
81 }
82 }
83 }
84
85 /*----------------------------------------------------------------*
86 * obtain synthesis and weighting filters form lsf coefficients
87 *---------------------------------------------------------------*/
88
90 float *syntdenum, /* (o) synthesis filter coefficients */
91 float *weightdenum, /* (o) weighting denumerator
92 coefficients */
93 float *lsfdeq, /* (i) dequantized lsf coefficients */
94 int length, /* (i) length of lsf coefficient vector */
95 iLBC_Dec_Inst_t *iLBCdec_inst
96 /* (i) the decoder state structure */
97 ){
98 int i, pos, lp_length;
99 float lp[LPC_FILTERORDER + 1], *lsfdeq2;
100
101
102
103
104
105
106 lsfdeq2 = lsfdeq + length;
107 lp_length = length + 1;
108
109 if (iLBCdec_inst->mode==30) {
110 /* sub-frame 1: Interpolation between old and first */
111
112 LSFinterpolate2a_dec(lp, iLBCdec_inst->lsfdeqold, lsfdeq,
113 lsf_weightTbl_30ms[0], length);
114 memcpy(syntdenum,lp,lp_length*sizeof(float));
115 bwexpand(weightdenum, lp, LPC_CHIRP_WEIGHTDENUM,
116 lp_length);
117
118 /* sub-frames 2 to 6: interpolation between first
119 and last LSF */
120
121 pos = lp_length;
122 for (i = 1; i < 6; i++) {
123 LSFinterpolate2a_dec(lp, lsfdeq, lsfdeq2,
124 lsf_weightTbl_30ms[i], length);
125 memcpy(syntdenum + pos,lp,lp_length*sizeof(float));
126 bwexpand(weightdenum + pos, lp,
127 LPC_CHIRP_WEIGHTDENUM, lp_length);
128 pos += lp_length;
129 }
130 }
131 else {
132 pos = 0;
133 for (i = 0; i < iLBCdec_inst->nsub; i++) {
134 LSFinterpolate2a_dec(lp, iLBCdec_inst->lsfdeqold,
135 lsfdeq, lsf_weightTbl_20ms[i], length);
136 memcpy(syntdenum+pos,lp,lp_length*sizeof(float));
137 bwexpand(weightdenum+pos, lp, LPC_CHIRP_WEIGHTDENUM,
138 lp_length);
139 pos += lp_length;
140 }
141 }
142
143 /* update memory */
144
145 if (iLBCdec_inst->mode==30)
146 memcpy(iLBCdec_inst->lsfdeqold, lsfdeq2,
147 length*sizeof(float));
148 else
149 memcpy(iLBCdec_inst->lsfdeqold, lsfdeq,
150 length*sizeof(float));
151
152 }
void LSFinterpolate2a_dec(float *a, float *lsf1, float *lsf2, float coef, int length)
Definition: LPCdecode.c:25
void DecoderInterpolateLSF(float *syntdenum, float *weightdenum, float *lsfdeq, int length, iLBC_Dec_Inst_t *iLBCdec_inst)
Definition: LPCdecode.c:89
void SimplelsfDEQ(float *lsfdeq, int *index, int lpc_n)
Definition: LPCdecode.c:42
float lsf_weightTbl_20ms[4]
Definition: constants.c:220
int size_lsfCbTbl[LSF_NSPLIT]
Definition: constants.c:203
int dim_lsfCbTbl[LSF_NSPLIT]
Definition: constants.c:202
float lsfCbTbl[64 *3+128 *3+128 *4]
Definition: constants.c:413
float lsf_weightTbl_30ms[6]
Definition: constants.c:216
void interpolate(float *out, float *in1, float *in2, float coef, int length)
Definition: helpfun.c:114
void bwexpand(float *out, float *in, float coef, int length)
Definition: helpfun.c:136
#define LPC_FILTERORDER
Definition: iLBC_define.h:40
#define LPC_CHIRP_WEIGHTDENUM
Definition: iLBC_define.h:42
#define LSF_NSPLIT
Definition: iLBC_define.h:50
void lsf2a(float *a_coef, float *freq)
Definition: lsf.c:170
float lsfdeqold[LPC_FILTERORDER]
Definition: iLBC_define.h:185
static struct test_val a