1/* ------------------------------------------------------------------
2 * Copyright (C) 1998-2009 PacketVideo
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13 * express or implied.
14 * See the License for the specific language governing permissions
15 * and limitations under the License.
16 * -------------------------------------------------------------------
17 */
18/****************************************************************************************
19Portions of this file are derived from the following 3GPP standard:
20
21    3GPP TS 26.073
22    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
23    Available from http://www.3gpp.org
24
25(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
26Permission to distribute, modify and use this file under the standard license
27terms listed above has been obtained from the copyright holder.
28****************************************************************************************/
29/*
30 Filename: /audio/gsm_amr/c/src/reorder.c
31
32------------------------------------------------------------------------------
33 REVISION HISTORY
34
35 Description:
36              1. Eliminated unused include file add.h.
37              2. Replaced array addressing by pointers
38              3. Eliminated math operations that unnecessary checked for
39                 saturation
40              4. Replaced loop counter with decrement loops
41
42 Description:  Replaced "int" and/or "char" with OSCL defined types.
43
44 Who:                       Date:
45 Description:
46
47------------------------------------------------------------------------------
48*/
49
50
51/*----------------------------------------------------------------------------
52; INCLUDES
53----------------------------------------------------------------------------*/
54#include    "reorder.h"
55
56/*----------------------------------------------------------------------------
57; MACROS
58; [Define module specific macros here]
59----------------------------------------------------------------------------*/
60
61/*----------------------------------------------------------------------------
62; DEFINES
63; [Include all pre-processor statements here. Include conditional
64; compile variables also.]
65----------------------------------------------------------------------------*/
66
67/*----------------------------------------------------------------------------
68; LOCAL FUNCTION DEFINITIONS
69; [List function prototypes here]
70----------------------------------------------------------------------------*/
71
72/*----------------------------------------------------------------------------
73; LOCAL VARIABLE DEFINITIONS
74; [Variable declaration - defined here and used outside this module]
75----------------------------------------------------------------------------*/
76
77
78/*
79------------------------------------------------------------------------------
80 FUNCTION NAME: Reorder_lsf
81------------------------------------------------------------------------------
82 INPUT AND OUTPUT DEFINITIONS
83
84 Inputs:
85    lsf = vector of LSFs   (range: 0<=val<=0.5)(Word16)
86    min_dist = minimum required distance (Word16)
87    n = LPC order (Word16)
88    pOverflow = pointer to overflow (Flag)
89
90 Outputs:
91    pOverflow -> 1 if the add operation called by Reorder_lsf() results in
92     overflow
93    lsf -> reordered vector of LSFs (Word16)
94
95 Returns:
96    None
97
98 Global Variables Used:
99    None
100
101 Local Variables Needed:
102    None
103
104------------------------------------------------------------------------------
105 FUNCTION DESCRIPTION
106
107 This function makes sure that the LSFs are properly ordered keeps a certain
108 minimum distance between adjacent LSFs.
109
110------------------------------------------------------------------------------
111 REQUIREMENTS
112
113 None
114
115------------------------------------------------------------------------------
116 REFERENCES
117
118 [1] reorder.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
119
120------------------------------------------------------------------------------
121 PSEUDO-CODE
122
123void Reorder_lsf (
124    Word16 *lsf,        // (i/o)     : vector of LSFs   (range: 0<=val<=0.5)
125    Word16 min_dist,    // (i)       : minimum required distance
126    Word16 n            // (i)       : LPC order
127)
128{
129    Word16 i;
130    Word16 lsf_min;
131
132// The reference ETSI code uses a global flag for Overflow. In the actual
133// implementation a pointer to Overflow flag is passed into the function
134// for use by the math functions add() and sub()
135
136    lsf_min = min_dist;
137    for (i = 0; i < n; i++)
138    {
139        if (sub (lsf[i], lsf_min) < 0)
140        {
141            lsf[i] = lsf_min;
142        }
143        lsf_min = add (lsf[i], min_dist);
144    }
145}
146
147------------------------------------------------------------------------------
148 RESOURCES USED [optional]
149
150 When the code is written for a specific target processor the
151 the resources used should be documented below.
152
153 HEAP MEMORY USED: x bytes
154
155 STACK MEMORY USED: x bytes
156
157 CLOCK CYCLES: (cycle count equation for this function) + (variable
158                used to represent cycle count for each subroutine
159                called)
160     where: (cycle count variable) = cycle count for [subroutine
161                                     name]
162
163------------------------------------------------------------------------------
164 CAUTION [optional]
165 [State any special notes, constraints or cautions for users of this function]
166
167------------------------------------------------------------------------------
168*/
169
170/*----------------------------------------------------------------------------
171; FUNCTION CODE
172----------------------------------------------------------------------------*/
173void Reorder_lsf(
174    Word16 *lsf,        /* (i/o)    : vector of LSFs   (range: 0<=val<=0.5) */
175    Word16 min_dist,    /* (i)      : minimum required distance             */
176    Word16 n,           /* (i)      : LPC order                             */
177    Flag   *pOverflow   /* (i/o)    : Overflow flag                         */
178)
179{
180    Word16 i;
181    Word16 lsf_min;
182    Word16 *p_lsf = &lsf[0];
183    OSCL_UNUSED_ARG(pOverflow);
184
185    lsf_min = min_dist;
186    for (i = 0; i < n; i++)
187    {
188        if (*(p_lsf) < lsf_min)
189        {
190            *(p_lsf++) = lsf_min;
191            lsf_min +=  min_dist;
192        }
193        else
194        {
195            lsf_min = *(p_lsf++) + min_dist;
196        }
197    }
198}
199
200