1470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com/*
2470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *  Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
3470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
4470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *  Use of this source code is governed by a BSD-style license
5470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *  that can be found in the LICENSE file in the root of the source
6470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *  tree. An additional intellectual property rights grant can be found
7470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *  in the file PATENTS.  All contributing project authors may
8470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *  be found in the AUTHORS file in the root of the source tree.
9470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com */
10470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
11470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com/******************************************************************
12470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
13470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com iLBC Speech Coder ANSI-C Source Code
14470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
15470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com WebRtcIlbcfix_GetLspPoly.c
16470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
17470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com******************************************************************/
18470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
19470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#include "defines.h"
20470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
21470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com/*----------------------------------------------------------------*
22470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Construct the polynomials F1(z) and F2(z) from the LSP
23470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * (Computations are done in Q24)
24470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
25470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * The expansion is performed using the following recursion:
26470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
27470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * f[0] = 1;
28470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * tmp = -2.0 * lsp[0];
29470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * f[1] = tmp;
30470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * for (i=2; i<=5; i++) {
31470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *    b = -2.0 * lsp[2*i-2];
32470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *    f[i] = tmp*f[i-1] + 2.0*f[i-2];
33470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *    for (j=i; j>=2; j--) {
34470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *       f[j] = f[j] + tmp*f[j-1] + f[j-2];
35470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *    }
36470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *    f[i] = f[i] + tmp;
37470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * }
38470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *---------------------------------------------------------------*/
39470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
40470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comvoid WebRtcIlbcfix_GetLspPoly(
410946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org    int16_t *lsp, /* (i) LSP in Q15 */
420946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org    int32_t *f)  /* (o) polonymial in Q24 */
43470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com{
440946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org  int32_t tmpW32;
45470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  int i, j;
460946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org  int16_t high, low;
470946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org  int16_t *lspPtr;
480946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org  int32_t *fPtr;
49470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
50470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  lspPtr = lsp;
51470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  fPtr = f;
52470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  /* f[0] = 1.0 (Q24) */
530946a56023d821e0deca04029bb016ae1f23aa82pbos@webrtc.org  (*fPtr) = (int32_t)16777216;
54470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  fPtr++;
55470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
56470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  (*fPtr) = WEBRTC_SPL_MUL((*lspPtr), -1024);
57470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  fPtr++;
58470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  lspPtr+=2;
59470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
60470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  for(i=2; i<=5; i++)
61470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  {
62470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    (*fPtr) = fPtr[-2];
63470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
64470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    for(j=i; j>1; j--)
65470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    {
66470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com      /* Compute f[j] = f[j] + tmp*f[j-1] + f[j-2]; */
6778ea06dd34a584acad4a2cf2142de218cb06eef4bjornv@webrtc.org      high = (int16_t)(fPtr[-1] >> 16);
6878ea06dd34a584acad4a2cf2142de218cb06eef4bjornv@webrtc.org      low = (int16_t)((fPtr[-1] - ((int32_t)high << 16)) >> 1);
69470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
704ab23d0e8f468d9f1e3ce4ffb50df070d8d06c6dbjornv@webrtc.org      tmpW32 = ((high * *lspPtr) << 2) + (((low * *lspPtr) >> 15) << 2);
71470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
72470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com      (*fPtr) += fPtr[-2];
73470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com      (*fPtr) -= tmpW32;
74470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com      fPtr--;
75470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    }
764ab23d0e8f468d9f1e3ce4ffb50df070d8d06c6dbjornv@webrtc.org    *fPtr -= *lspPtr << 10;
77470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
78470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    fPtr+=i;
79470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    lspPtr+=2;
80470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  }
81470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com  return;
82470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}
83