Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / third_party / webrtc / modules / audio_coding / codecs / ilbc / lsp_to_lsf.c
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  WebRtcIlbcfix_Lsp2Lsf.c
16
17 ******************************************************************/
18
19 #include "defines.h"
20 #include "constants.h"
21
22 /*----------------------------------------------------------------*
23  *  conversion from LSP coefficients to LSF coefficients
24  *---------------------------------------------------------------*/
25
26 void WebRtcIlbcfix_Lsp2Lsf(
27     int16_t *lsp, /* (i) lsp vector -1...+1 in Q15 */
28     int16_t *lsf, /* (o) Lsf vector 0...Pi in Q13
29                            (ordered, so that lsf[i]<lsf[i+1]) */
30     int16_t m  /* (i) Number of coefficients */
31                            )
32 {
33   int16_t i, k;
34   int16_t diff; /* diff between table value and desired value (Q15) */
35   int16_t freq; /* lsf/(2*pi) (Q16) */
36   int16_t *lspPtr, *lsfPtr, *cosTblPtr;
37   int16_t tmp;
38
39   /* set the index to maximum index value in WebRtcIlbcfix_kCos */
40   k = 63;
41
42   /*
43      Start with the highest LSP and then work the way down
44      For each LSP the lsf is calculated by first order approximation
45      of the acos(x) function
46   */
47   lspPtr = &lsp[9];
48   lsfPtr = &lsf[9];
49   cosTblPtr=(int16_t*)&WebRtcIlbcfix_kCos[k];
50   for(i=m-1; i>=0; i--)
51   {
52     /*
53        locate value in the table, which is just above lsp[i],
54        basically an approximation to acos(x)
55     */
56     while( (((int32_t)(*cosTblPtr)-(*lspPtr)) < 0)&&(k>0) )
57     {
58       k-=1;
59       cosTblPtr--;
60     }
61
62     /* Calculate diff, which is used in the linear approximation of acos(x) */
63     diff = (*lspPtr)-(*cosTblPtr);
64
65     /*
66        The linear approximation of acos(lsp[i]) :
67        acos(lsp[i])= k*512 + (WebRtcIlbcfix_kAcosDerivative[ind]*offset >> 11)
68     */
69
70     /* tmp (linear offset) in Q16 */
71     tmp = (int16_t)WEBRTC_SPL_MUL_16_16_RSFT(WebRtcIlbcfix_kAcosDerivative[k],diff, 11);
72
73     /* freq in Q16 */
74     freq = (k << 9) + tmp;
75
76     /* lsf = freq*2*pi */
77     (*lsfPtr) = (int16_t)(((int32_t)freq*25736)>>15);
78
79     lsfPtr--;
80     lspPtr--;
81   }
82
83   return;
84 }