1d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/* ------------------------------------------------------------------
2d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber * Copyright (C) 1998-2009 PacketVideo
3d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber *
4d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber * you may not use this file except in compliance with the License.
6d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber * You may obtain a copy of the License at
7d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber *
8d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber *
10d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber * Unless required by applicable law or agreed to in writing, software
11d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber * express or implied.
14d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber * See the License for the specific language governing permissions
15d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber * and limitations under the License.
16d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber * -------------------------------------------------------------------
17d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber */
18d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/****************************************************************************************
19d49b526dd2009270cb15f7fe4e70b74673950608Andreas HuberPortions of this file are derived from the following 3GPP standard:
20d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
21d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    3GPP TS 26.073
22d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
23d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Available from http://www.3gpp.org
24d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
25d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
26d49b526dd2009270cb15f7fe4e70b74673950608Andreas HuberPermission to distribute, modify and use this file under the standard license
27d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huberterms listed above has been obtained from the copyright holder.
28d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber****************************************************************************************/
29d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/*
30d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
31d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
32d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
33d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
34d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Pathname: ./audio/gsm-amr/c/src/levinson.c
35d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Funtions: Levinson_init
36d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber           Levinson_reset
37d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber           Levinson_exit
38d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber           Levinson
39d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
40d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
41d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber MODULE DESCRIPTION
42d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
43d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber This file contains the function the implements the Levinson-Durbin algorithm
44d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber using double-precision arithmetic. This file also includes functions to
45d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber initialize, allocate, and deallocate memory used by the Levinson function.
46d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
47d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
48d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber*/
49d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
50d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/*----------------------------------------------------------------------------
51d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; INCLUDES
52d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber----------------------------------------------------------------------------*/
53d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber#include <stdlib.h>
54d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber#include <string.h>
55d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
56d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber#include "levinson.h"
57d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber#include "basicop_malloc.h"
58d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber#include "basic_op.h"
59d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber#include "div_32.h"
60d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber#include "cnst.h"
61d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
62d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/*----------------------------------------------------------------------------
63d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; MACROS
64d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; Define module specific macros here
65d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber----------------------------------------------------------------------------*/
66d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
67d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/*----------------------------------------------------------------------------
68d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; DEFINES
69d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; Include all pre-processor statements here. Include conditional
70d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; compile variables also.
71d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber----------------------------------------------------------------------------*/
72d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
73d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/*----------------------------------------------------------------------------
74d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; LOCAL FUNCTION DEFINITIONS
75d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; Function Prototype declaration
76d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber----------------------------------------------------------------------------*/
77d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
78d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/*----------------------------------------------------------------------------
79d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; LOCAL VARIABLE DEFINITIONS
80d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber; Variable declaration - defined here and used outside this module
81d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber----------------------------------------------------------------------------*/
82d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
83d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
84d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/*
85d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
86d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber FUNCTION NAME: Levinson_init
87d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
88d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber INPUT AND OUTPUT DEFINITIONS
89d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
90d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Inputs:
91d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    state = pointer to an array of pointers to structures of type
92d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            LevinsonState
93d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
94d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Outputs:
95d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    pointer pointed to by state points to the newly allocated memory to
96d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber      be used by Levinson function
97d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
98d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Returns:
99d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    return_value = 0, if initialization was successful; -1, otherwise (int)
100d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
101d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Global Variables Used:
102d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    None
103d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
104d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Local Variables Needed:
105d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    None
106d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
107d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
108d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber FUNCTION DESCRIPTION
109d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
110d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber This function allocates and initializes the state memory used by the
111d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Levinson function.
112d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
113d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
114d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber REQUIREMENTS
115d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
116d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber None
117d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
118d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
119d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber REFERENCES
120d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
121d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber levinson.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
122d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
123d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
124d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber PSEUDO-CODE
125d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
126d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huberint Levinson_init (LevinsonState **state)
127d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber{
128d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber  LevinsonState* s;
129d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
130d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber  if (state == (LevinsonState **) NULL){
131d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber      //fprint(stderr, "Levinson_init: invalid parameter\n");
132d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber      return -1;
133d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber  }
134d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber  *state = NULL;
135d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
136d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber  // allocate memory
137d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber  if ((s= (LevinsonState *) malloc(sizeof(LevinsonState))) == NULL){
138d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber      //fprint(stderr, "Levinson_init: can not malloc state structure\n");
139d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber      return -1;
140d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber  }
141d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
142d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber  Levinson_reset(s);
143d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber  *state = s;
144d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
145d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber  return 0;
146d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber}
147d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
148d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
149d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber RESOURCES USED [optional]
150d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
151d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber When the code is written for a specific target processor the
152d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber the resources used should be documented below.
153d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
154d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber HEAP MEMORY USED: x bytes
155d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
156d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber STACK MEMORY USED: x bytes
157d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
158d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
159d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                used to represent cycle count for each subroutine
160d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                called)
161d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
162d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                                     name]
163d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
164d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
165d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber CAUTION [optional]
166d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber [State any special notes, constraints or cautions for users of this function]
167d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
168d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
169d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber*/
170d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
171d49b526dd2009270cb15f7fe4e70b74673950608Andreas HuberWord16 Levinson_init(LevinsonState **state)
172d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber{
173d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    LevinsonState* s;
174d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
175d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    if (state == (LevinsonState **) NULL)
176d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    {
177d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        /*  fprint(stderr, "Levinson_init: invalid parameter\n");  */
178d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        return(-1);
179d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
180d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    *state = NULL;
181d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
182d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    /* allocate memory */
183d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    if ((s = (LevinsonState *) malloc(sizeof(LevinsonState))) == NULL)
184d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    {
185d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        /*  fprint(stderr, "Levinson_init:
186d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                            can not malloc state structure\n");  */
187d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        return(-1);
188d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
189d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
190d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Levinson_reset(s);
191d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    *state = s;
192d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
193d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    return(0);
194d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber}
195d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
196d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/****************************************************************************/
197d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
198d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
199d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/*
200d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
201d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber FUNCTION NAME: Levinson_reset
202d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
203d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber INPUT AND OUTPUT DEFINITIONS
204d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
205d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Inputs:
206d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    state = pointer to structures of type LevinsonState
207d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
208d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Outputs:
209d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    old_A field of structure pointed to by state is initialized to 4096
210d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber      (first location) and the rest to zeros
211d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
212d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Returns:
213d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    return_value = 0, if reset was successful; -1, otherwise (int)
214d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
215d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Global Variables Used:
216d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    None
217d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
218d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Local Variables Needed:
219d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    None
220d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
221d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
222d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber FUNCTION DESCRIPTION
223d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
224d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber This function initializes the state memory used by the Levinson function to
225d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber zero.
226d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
227d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
228d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber REQUIREMENTS
229d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
230d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber None
231d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
232d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
233d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber REFERENCES
234d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
235d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber levinson.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
236d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
237d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
238d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber PSEUDO-CODE
239d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
240d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huberint Levinson_reset (LevinsonState *state)
241d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber{
242d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber  Word16 i;
243d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
244d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber  if (state == (LevinsonState *) NULL){
245d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber      fprint(stderr, "Levinson_reset: invalid parameter\n");
246d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber      return -1;
247d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber  }
248d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
249d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber  state->old_A[0] = 4096;
250d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber  for(i = 1; i < M + 1; i++)
251d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber      state->old_A[i] = 0;
252d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
253d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber  return 0;
254d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber}
255d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
256d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
257d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber RESOURCES USED [optional]
258d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
259d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber When the code is written for a specific target processor the
260d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber the resources used should be documented below.
261d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
262d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber HEAP MEMORY USED: x bytes
263d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
264d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber STACK MEMORY USED: x bytes
265d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
266d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
267d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                used to represent cycle count for each subroutine
268d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                called)
269d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
270d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                                     name]
271d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
272d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
273d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber CAUTION [optional]
274d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber [State any special notes, constraints or cautions for users of this function]
275d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
276d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
277d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber*/
278d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
279d49b526dd2009270cb15f7fe4e70b74673950608Andreas HuberWord16 Levinson_reset(LevinsonState *state)
280d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber{
281d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 i;
282d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
283d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    if (state == (LevinsonState *) NULL)
284d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    {
285d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        /*  fprint(stderr, "Levinson_reset: invalid parameter\n");  */
286d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        return(-1);
287d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
288d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
289d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    state->old_A[0] = 4096;
290d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    for (i = 1; i < M + 1; i++)
291d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    {
292d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        state->old_A[i] = 0;
293d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
294d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
295d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    return(0);
296d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber}
297d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
298d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/****************************************************************************/
299d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
300d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/*
301d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
302d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber FUNCTION NAME: Levinson_exit
303d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
304d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber INPUT AND OUTPUT DEFINITIONS
305d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
306d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Inputs:
307d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    state = pointer to an array of pointers to structures of type
308d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            LevinsonState
309d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
310d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Outputs:
311d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    pointer pointed to by state is set to the NULL address
312d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
313d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Returns:
314d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    None
315d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
316d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Global Variables Used:
317d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    None
318d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
319d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Local Variables Needed:
320d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    None
321d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
322d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
323d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber FUNCTION DESCRIPTION
324d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
325d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber This function deallocates the state memory used by the Levinson function.
326d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
327d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
328d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber REQUIREMENTS
329d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
330d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber None
331d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
332d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
333d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber REFERENCES
334d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
335d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber levinson.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
336d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
337d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
338d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber PSEUDO-CODE
339d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
340d49b526dd2009270cb15f7fe4e70b74673950608Andreas Hubervoid Levinson_exit (LevinsonState **state)
341d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber{
342d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber  if (state == NULL || *state == NULL)
343d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber      return;
344d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
345d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber  // deallocate memory
346d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber  free(*state);
347d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber  *state = NULL;
348d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
349d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber  return;
350d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber}
351d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
352d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
353d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber RESOURCES USED [optional]
354d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
355d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber When the code is written for a specific target processor the
356d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber the resources used should be documented below.
357d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
358d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber HEAP MEMORY USED: x bytes
359d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
360d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber STACK MEMORY USED: x bytes
361d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
362d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
363d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                used to represent cycle count for each subroutine
364d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                called)
365d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
366d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                                     name]
367d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
368d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
369d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber CAUTION [optional]
370d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber [State any special notes, constraints or cautions for users of this function]
371d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
372d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
373d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber*/
374d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
375d49b526dd2009270cb15f7fe4e70b74673950608Andreas Hubervoid Levinson_exit(LevinsonState **state)
376d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber{
377d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    if (state == NULL || *state == NULL)
378d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    {
379d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        return;
380d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
381d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
382d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    /* deallocate memory */
383d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    free(*state);
384d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    *state = NULL;
385d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
386d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    return;
387d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber}
388d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
389d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/****************************************************************************/
390d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
391d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
392d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber/*
393d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
394d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber FUNCTION NAME: Levinson
395d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
396d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber INPUT AND OUTPUT DEFINITIONS
397d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
398d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Inputs:
399d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    st = pointer to structures of type LevinsonState
400d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Rh = vector containing most significant byte of
401d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber         autocorrelation values (Word16)
402d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Rl = vector containing least significant byte of
403d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber         autocorrelation values (Word16)
404d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    A = vector of LPC coefficients (10th order) (Word16)
405d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    rc = vector containing first four reflection coefficients (Word16)
406d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    pOverflow = pointer to overflow indicator (Flag)
407d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
408d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Outputs:
409d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    A contains the newly calculated LPC coefficients
410d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    rc contains the newly calculated reflection coefficients
411d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
412d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Returns:
413d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    return_value = 0 (int)
414d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
415d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Global Variables Used:
416d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    None
417d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
418d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber Local Variables Needed:
419d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    None
420d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
421d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
422d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber FUNCTION DESCRIPTION
423d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
424d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber This function implements the Levinson-Durbin algorithm using double-
425d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber precision arithmetic. This is used to compute the Linear Predictive (LP)
426d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber filter parameters from the speech autocorrelation values.
427d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
428d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber The algorithm implemented is as follows:
429d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    A[0] = 1
430d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    K    = -R[1]/R[0]
431d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    A[1] = K
432d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Alpha = R[0] * (1-K**2]
433d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
434d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    FOR  i = 2 to M
435d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
436d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        S =  SUM ( R[j]*A[i-j] ,j=1,i-1 ) +  R[i]
437d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        K = -S / Alpha
438d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
439d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        FOR j = 1 to  i-1
440d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            An[j] = A[j] + K*A[i-j]  where   An[i] = new A[i]
441d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        ENDFOR
442d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
443d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        An[i]=K
444d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        Alpha=Alpha * (1-K**2)
445d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
446d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    END
447d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
448d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber where:
449d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    R[i] = autocorrelations
450d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    A[i] = filter coefficients
451d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    K = reflection coefficient
452d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Alpha = prediction gain
453d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
454d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
455d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber REQUIREMENTS
456d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
457d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber None
458d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
459d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
460d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber REFERENCES
461d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
462d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber levinson.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
463d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
464d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
465d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber PSEUDO-CODE
466d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
467d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huberint Levinson (
468d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    LevinsonState *st,
469d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 Rh[],       // i : Rh[m+1] Vector of autocorrelations (msb)
470d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 Rl[],       // i : Rl[m+1] Vector of autocorrelations (lsb)
471d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 A[],        // o : A[m]    LPC coefficients  (m = 10)
472d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 rc[]        // o : rc[4]   First 4 reflection coefficients
473d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber)
474d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber{
475d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 i, j;
476d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 hi, lo;
477d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 Kh, Kl;                // reflexion coefficient; hi and lo
478d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 alp_h, alp_l, alp_exp; // Prediction gain; hi lo and exponent
479d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 Ah[M + 1], Al[M + 1];  // LPC coef. in double prec.
480d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 Anh[M + 1], Anl[M + 1];// LPC coef.for next iteration in double
481d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                                     prec.
482d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word32 t0, t1, t2;            // temporary variable
483d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
484d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    // K = A[1] = -R[1] / R[0]
485d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
486d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    t1 = L_Comp (Rh[1], Rl[1]);
487d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    t2 = L_abs (t1);                    // abs R[1]
488d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    t0 = Div_32 (t2, Rh[0], Rl[0]);     // R[1]/R[0]
489d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    if (t1 > 0)
490d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber       t0 = L_negate (t0);             // -R[1]/R[0]
491d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    L_Extract (t0, &Kh, &Kl);           // K in DPF
492d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
493d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    rc[0] = pv_round (t0);
494d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
495d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    t0 = L_shr (t0, 4);                 // A[1] in
496d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    L_Extract (t0, &Ah[1], &Al[1]);     // A[1] in DPF
497d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
498d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    //  Alpha = R[0] * (1-K**2)
499d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
500d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    t0 = Mpy_32 (Kh, Kl, Kh, Kl);       // K*K
501d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    t0 = L_abs (t0);                    // Some case <0 !!
502d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    t0 = L_sub ((Word32) 0x7fffffffL, t0); // 1 - K*K
503d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    L_Extract (t0, &hi, &lo);           // DPF format
504d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    t0 = Mpy_32 (Rh[0], Rl[0], hi, lo); // Alpha in
505d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
506d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    // Normalize Alpha
507d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
508d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    alp_exp = norm_l (t0);
509d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    t0 = L_shl (t0, alp_exp);
510d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    L_Extract (t0, &alp_h, &alp_l);     // DPF format
511d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
512d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber     *--------------------------------------*
513d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber     * ITERATIONS  I=2 to M                 *
514d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber     *--------------------------------------*
515d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
516d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    for (i = 2; i <= M; i++)
517d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    {
518d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber       // t0 = SUM ( R[j]*A[i-j] ,j=1,i-1 ) +  R[i]
519d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
520d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber       t0 = 0;
521d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber       for (j = 1; j < i; j++)
522d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber       {
523d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber          t0 = L_add (t0, Mpy_32 (Rh[j], Rl[j], Ah[i - j], Al[i - j]));
524d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber       }
525d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber       t0 = L_shl (t0, 4);
526d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
527d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber       t1 = L_Comp (Rh[i], Rl[i]);
528d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber       t0 = L_add (t0, t1);            // add R[i]
529d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
530d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber       // K = -t0 / Alpha
531d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
532d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber       t1 = L_abs (t0);
533d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber       t2 = Div_32 (t1, alp_h, alp_l); // abs(t0)/Alpha
534d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber       if (t0 > 0)
535d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber          t2 = L_negate (t2);         // K =-t0/Alpha
536d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber       t2 = L_shl (t2, alp_exp);       // denormalize; compare to Alpha
537d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber       L_Extract (t2, &Kh, &Kl);       // K in DPF
538d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
539d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber       if (sub (i, 5) < 0)
540d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber       {
541d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber          rc[i - 1] = pv_round (t2);
542d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber       }
543d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber       // Test for unstable filter. If unstable keep old A(z)
544d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
545d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber       if (sub (abs_s (Kh), 32750) > 0)
546d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber       {
547d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber          for (j = 0; j <= M; j++)
548d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber          {
549d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber             A[j] = st->old_A[j];
550d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber          }
551d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
552d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber          for (j = 0; j < 4; j++)
553d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber          {
554d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber             rc[j] = 0;
555d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber          }
556d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
557d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber          return 0;
558d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber       }
559d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        *------------------------------------------*
560d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        *  Compute new LPC coeff. -> An[i]         *
561d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        *  An[j]= A[j] + K*A[i-j]     , j=1 to i-1 *
562d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        *  An[i]= K                                *
563d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        *------------------------------------------*
564d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
565d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber       for (j = 1; j < i; j++)
566d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber       {
567d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber          t0 = Mpy_32 (Kh, Kl, Ah[i - j], Al[i - j]);
568d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber          t0 = L_add(t0, L_Comp(Ah[j], Al[j]));
569d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber          L_Extract (t0, &Anh[j], &Anl[j]);
570d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber       }
571d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber       t2 = L_shr (t2, 4);
572d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber       L_Extract (t2, &Anh[i], &Anl[i]);
573d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
574d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber       //  Alpha = Alpha * (1-K**2)
575d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
576d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber       t0 = Mpy_32 (Kh, Kl, Kh, Kl);           // K*K
577d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber       t0 = L_abs (t0);                        // Some case <0 !!
578d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber       t0 = L_sub ((Word32) 0x7fffffffL, t0);  // 1 - K*K
579d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber       L_Extract (t0, &hi, &lo);               // DPF format
580d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber       t0 = Mpy_32 (alp_h, alp_l, hi, lo);
581d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
582d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber       // Normalize Alpha
583d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
584d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber       j = norm_l (t0);
585d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber       t0 = L_shl (t0, j);
586d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber       L_Extract (t0, &alp_h, &alp_l);         // DPF format
587d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber       alp_exp = add (alp_exp, j);             // Add normalization to
588d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                                                  alp_exp
589d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
590d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber       // A[j] = An[j]
591d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
592d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber       for (j = 1; j <= i; j++)
593d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber       {
594d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber          Ah[j] = Anh[j];
595d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber          Al[j] = Anl[j];
596d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber       }
597d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
598d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
599d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    A[0] = 4096;
600d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    for (i = 1; i <= M; i++)
601d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    {
602d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber       t0 = L_Comp (Ah[i], Al[i]);
603d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber       st->old_A[i] = A[i] = pv_round (L_shl (t0, 1));
604d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
605d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
606d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    return 0;
607d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber}
608d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
609d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
610d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber RESOURCES USED [optional]
611d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
612d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber When the code is written for a specific target processor the
613d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber the resources used should be documented below.
614d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
615d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber HEAP MEMORY USED: x bytes
616d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
617d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber STACK MEMORY USED: x bytes
618d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
619d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
620d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                used to represent cycle count for each subroutine
621d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                called)
622d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
623d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber                                     name]
624d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
625d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
626d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber CAUTION [optional]
627d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber [State any special notes, constraints or cautions for users of this function]
628d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
629d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber------------------------------------------------------------------------------
630d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber*/
631d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
632d49b526dd2009270cb15f7fe4e70b74673950608Andreas HuberWord16 Levinson(
633d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    LevinsonState *st,
634d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 Rh[],       /* i : Rh[m+1] Vector of autocorrelations (msb) */
635d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 Rl[],       /* i : Rl[m+1] Vector of autocorrelations (lsb) */
636d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 A[],        /* o : A[m]    LPC coefficients  (m = 10)       */
637d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 rc[],       /* o : rc[4]   First 4 reflection coefficients  */
638d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Flag   *pOverflow
639d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber)
640d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber{
641d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    register Word16 i;
642d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    register Word16 j;
643d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 hi;
644d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 lo;
645d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 Kh;                    /* reflexion coefficient; hi and lo   */
646d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 Kl;
647d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 alp_h;                 /* Prediction gain; hi lo and exponent*/
648d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 alp_l;
649d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 alp_exp;
650d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 Ah[M + 1];             /* LPC coef. in double prec.          */
651d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 Al[M + 1];
652d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 Anh[M + 1];            /* LPC coef.for next iteration in     */
653d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 Anl[M + 1];            /* double prec.                       */
654d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    register Word32 t0;           /* temporary variable                 */
655d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    register Word32 t1;           /* temporary variable                 */
656d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    register Word32 t2;           /* temporary variable                 */
657d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
658d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 *p_Rh;
659d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 *p_Rl;
660d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 *p_Ah;
661d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 *p_Al;
662d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 *p_Anh;
663d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 *p_Anl;
664d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Word16 *p_A;
665d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
666d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    /* K = A[1] = -R[1] / R[0] */
667d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    t1 = ((Word32) * (Rh + 1)) << 16;
668d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    t1 += *(Rl + 1) << 1;
669d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
670d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    t2 = L_abs(t1);         /* abs R[1] - required by Div_32 */
671d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    t0 = Div_32(t2, *Rh, *Rl, pOverflow);  /* R[1]/R[0]        */
672d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
673d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    if (t1 > 0)
674d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    {
675d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        t0 = L_negate(t0);  /* -R[1]/R[0]       */
676d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
677d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
678d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    /* K in DPF         */
679d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Kh = (Word16)(t0 >> 16);
680d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    Kl = (Word16)((t0 >> 1) - ((Word32)(Kh) << 15));
681d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
682d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    *rc = pv_round(t0, pOverflow);
683d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
684d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    t0 = t0 >> 4;
685d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
686d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    /* A[1] in DPF      */
687d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    *(Ah + 1) = (Word16)(t0 >> 16);
688d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
689d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    *(Al + 1) = (Word16)((t0 >> 1) - ((Word32)(*(Ah + 1)) << 15));
690d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
691d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    /*  Alpha = R[0] * (1-K**2) */
692d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    t0 = Mpy_32(Kh, Kl, Kh, Kl, pOverflow);         /* K*K              */
693d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    t0 = L_abs(t0);                                 /* Some case <0 !!  */
694d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    t0 = 0x7fffffffL - t0;                          /* 1 - K*K          */
695d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
696d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    /* DPF format       */
697d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    hi = (Word16)(t0 >> 16);
698d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    lo = (Word16)((t0 >> 1) - ((Word32)(hi) << 15));
699d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
700d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    t0 = Mpy_32(*Rh, *Rl, hi, lo, pOverflow);      /* Alpha in         */
701d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
702d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    /* Normalize Alpha */
703d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
704d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    alp_exp = norm_l(t0);
705d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    t0 = t0 << alp_exp;
706d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
707d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    /* DPF format       */
708d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    alp_h = (Word16)(t0 >> 16);
709d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    alp_l = (Word16)((t0 >> 1) - ((Word32)(alp_h) << 15));
710d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
711d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    /*--------------------------------------*
712d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    * ITERATIONS  I=2 to M                 *
713d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    *--------------------------------------*/
714d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
715d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    for (i = 2; i <= M; i++)
716d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    {
717d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        /* t0 = SUM ( R[j]*A[i-j] ,j=1,i-1 ) +  R[i] */
718d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
719d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        t0 = 0;
720d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        p_Rh = &Rh[1];
721d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        p_Rl = &Rl[1];
722d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        p_Ah = &Ah[i-1];
723d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        p_Al = &Al[i-1];
724d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        for (j = 1; j < i; j++)
725d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        {
726d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            t0 += (((Word32) * (p_Rh)* *(p_Al--)) >> 15);
727d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            t0 += (((Word32) * (p_Rl++)* *(p_Ah)) >> 15);
728d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            t0 += ((Word32) * (p_Rh++)* *(p_Ah--));
729d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        }
730d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
731d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        t0 = t0 << 5;
732d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
733d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        t1 = ((Word32) * (Rh + i) << 16) + ((Word32)(*(Rl + i)) << 1);
734d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        t0 += t1;
735d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
736d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        /* K = -t0 / Alpha */
737d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
738d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        t1 = L_abs(t0);
739d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        t2 = Div_32(t1, alp_h, alp_l, pOverflow);  /* abs(t0)/Alpha        */
740d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
741d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        if (t0 > 0)
742d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        {
743d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            t2 = L_negate(t2);          /* K =-t0/Alpha     */
744d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        }
745d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
746d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        t2 = L_shl(t2, alp_exp, pOverflow);  /* denormalize; compare to Alpha */
747d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        Kh = (Word16)(t2 >> 16);
748d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        Kl = (Word16)((t2 >> 1) - ((Word32)(Kh) << 15));
749d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
750d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        if (i < 5)
751d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        {
752d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            *(rc + i - 1) = (Word16)((t2 + 0x00008000L) >> 16);
753d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        }
754d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        /* Test for unstable filter. If unstable keep old A(z) */
755d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        if ((abs_s(Kh)) > 32750)
756d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        {
757d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            memcpy(A, &(st->old_A[0]), sizeof(Word16)*(M + 1));
758d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            memset(rc, 0, sizeof(Word16)*4);
759d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            return(0);
760d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        }
761d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        /*------------------------------------------*
762d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        *  Compute new LPC coeff. -> An[i]         *
763d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        *  An[j]= A[j] + K*A[i-j]     , j=1 to i-1 *
764d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        *  An[i]= K                                *
765d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        *------------------------------------------*/
766d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        p_Ah = &Ah[i-1];
767d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        p_Al = &Al[i-1];
768d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        p_Anh = &Anh[1];
769d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        p_Anl = &Anl[1];
770d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        for (j = 1; j < i; j++)
771d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        {
772d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            t0  = (((Word32)Kh* *(p_Al--)) >> 15);
773d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            t0 += (((Word32)Kl* *(p_Ah)) >> 15);
774d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            t0 += ((Word32)Kh* *(p_Ah--));
775d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
776d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            t0 += (Ah[j] << 15) + Al[j];
777d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
778d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            *(p_Anh) = (Word16)(t0 >> 15);
779d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber            *(p_Anl++) = (Word16)(t0 - ((Word32)(*(p_Anh++)) << 15));
780d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        }
781d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
782d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        *(p_Anh) = (Word16)(t2 >> 20);
783d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        *(p_Anl) = (Word16)((t2 >> 5) - ((Word32)(*(Anh + i)) << 15));
784d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
785d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        /*  Alpha = Alpha * (1-K**2) */
786d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
787d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        t0 = Mpy_32(Kh, Kl, Kh, Kl, pOverflow);  /* K*K             */
788d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        t0 = L_abs(t0);                          /* Some case <0 !! */
789d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        t0 = 0x7fffffffL - t0;                   /* 1 - K*K          */
790d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
791d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        hi = (Word16)(t0 >> 16);
792d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        lo = (Word16)((t0 >> 1) - ((Word32)(hi) << 15));
793d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
794d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        t0  = (((Word32)alp_h * lo) >> 15);
795d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        t0 += (((Word32)alp_l * hi) >> 15);
796d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        t0 += ((Word32)alp_h * hi);
797d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
798d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        t0 <<= 1;
799d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        /* Normalize Alpha */
800d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
801d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        j = norm_l(t0);
802d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        t0 <<= j;
803d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        alp_h = (Word16)(t0 >> 16);
804d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        alp_l = (Word16)((t0 >> 1) - ((Word32)(alp_h) << 15));
805d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        alp_exp += j;             /* Add normalization to alp_exp */
806d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
807d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        /* A[j] = An[j] */
808d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        memcpy(&Ah[1], &Anh[1], sizeof(Word16)*i);
809d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        memcpy(&Al[1], &Anl[1], sizeof(Word16)*i);
810d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
811d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
812d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    p_A = &A[0];
813d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    *(p_A++) = 4096;
814d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    p_Ah = &Ah[1];
815d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    p_Al = &Al[1];
816d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
817d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    for (i = 1; i <= M; i++)
818d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    {
819d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        t0 = ((Word32) * (p_Ah++) << 15) + *(p_Al++);
820d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber        st->old_A[i] = *(p_A++) = (Word16)((t0 + 0x00002000) >> 14);
821d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    }
822d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber
823d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber    return(0);
824d49b526dd2009270cb15f7fe4e70b74673950608Andreas Huber}
825