1a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/* ------------------------------------------------------------------
2a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * Copyright (C) 1998-2009 PacketVideo
3a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *
4a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * you may not use this file except in compliance with the License.
6a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * You may obtain a copy of the License at
7a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *
8a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *
10a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * Unless required by applicable law or agreed to in writing, software
11a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * express or implied.
14a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * See the License for the specific language governing permissions
15a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * and limitations under the License.
16a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * -------------------------------------------------------------------
17a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber */
18a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/****************************************************************************************
19a30d40083856cb4edd225faf8b488fab156e5976Andreas HuberPortions of this file are derived from the following 3GPP standard:
20a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
21a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    3GPP TS 26.073
22a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
23a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Available from http://www.3gpp.org
24a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
25a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
26a30d40083856cb4edd225faf8b488fab156e5976Andreas HuberPermission to distribute, modify and use this file under the standard license
27a30d40083856cb4edd225faf8b488fab156e5976Andreas Huberterms listed above has been obtained from the copyright holder.
28a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber****************************************************************************************/
29a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*
30a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
31a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Pathname: ./audio/gsm-amr/c/src/q_plsf_3.c
32a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Funtions: Vq_subvec4
33a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           Test_Vq_subvec4
34a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           Vq_subvec3
35a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           Test_Vq_subvec3
36a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           Q_plsf_3
37a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
38a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
39a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REVISION HISTORY
40a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
41a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Description: Updated template used to PV coding template. First attempt at
42a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber          optimizing C code.
43a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
44a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Description: Updated modules per Phase 2/3 review comments. Updated
45a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber          Vq_subvec3 pseudo-code to reflect the new restructured code.
46a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
47a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Description: Added setting of Overflow flag in inlined code.
48a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
49a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Description: Synchronized file with UMTS version 3.2.0. Updated coding
50a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber              template. Removed unnecessary include files.
51a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
52a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Description: Replaced basic_op.h with the header file of the math functions
53a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber              used in the file.
54a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
55a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Description: Made the following changes per comments from Phase 2/3 review:
56a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber              1. Fixed typecasting issue with TI C compiler.
57a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber              2. Optimized IF stament in Vq_subvec3() function.
58a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber              3. Updated copyright year.
59a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
60a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Description: Removed redundancy in the Vq_subvec4 function.
61a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
62a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Description: Updated to accept new parameter, Flag *pOverflow.
63a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
64a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Description: Per review comments, added pOverflow flag description
65a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber to the input/outputs section.
66a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
67a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Description: Corrected missed Overflow global variables -- changed to
68a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber proper pOverflow.
69a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
70a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Description: Optimized all functions to further reduce clock cycle usage.
71a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber              Updated copyright year.
72a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
73a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Description: Added left shift by 1 in line 1050 of Q_plsf_3().
74a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
75a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Description:  Replaced OSCL mem type functions and eliminated include
76a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber               files that now are chosen by OSCL definitions
77a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
78a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Description:  Replaced "int" and/or "char" with OSCL defined types.
79a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
80a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Description: Added #ifdef __cplusplus around extern'ed table.
81a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
82a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Who:                           Date:
83a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Description:
84a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
85a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
86a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber MODULE DESCRIPTION
87a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
88a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber This file contains the functions that perform the quantization of LSF
89a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber parameters with first order MA prediction and split by 3 vector
90a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber quantization (split-VQ).
91a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
92a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
93a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber*/
94a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
95a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*----------------------------------------------------------------------------
96a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber; INCLUDES
97a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber----------------------------------------------------------------------------*/
98a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
99a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include <string.h>
100a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
101a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "q_plsf.h"
102a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "typedef.h"
103a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "lsp_lsf.h"
104a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "reorder.h"
105a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "lsfwt.h"
106a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
107a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*--------------------------------------------------------------------------*/
108a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#ifdef __cplusplus
109a30d40083856cb4edd225faf8b488fab156e5976Andreas Huberextern "C"
110a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{
111a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#endif
112a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
113a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /*----------------------------------------------------------------------------
114a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    ; MACROS
115a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    ; Define module specific macros here
116a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    ----------------------------------------------------------------------------*/
117a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
118a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /*----------------------------------------------------------------------------
119a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    ; DEFINES
120a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    ; Include all pre-processor statements here. Include conditional
121a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    ; compile variables also.
122a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    ----------------------------------------------------------------------------*/
123a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#define PAST_RQ_INIT_SIZE 8
124a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
125a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /*----------------------------------------------------------------------------
126a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    ; LOCAL FUNCTION DEFINITIONS
127a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    ; Function Prototype declaration
128a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    ----------------------------------------------------------------------------*/
129a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
130a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /*----------------------------------------------------------------------------
131a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    ; LOCAL VARIABLE DEFINITIONS
132a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    ; Variable declaration - defined here and used outside this module
133a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    ----------------------------------------------------------------------------*/
134a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
135a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /*----------------------------------------------------------------------------
136a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    ; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
137a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    ; Declare variables used in this module but defined elsewhere
138a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    ----------------------------------------------------------------------------*/
139a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* Codebooks of LSF prediction residual */
140a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    extern const Word16 mean_lsf_3[];
141a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
142a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    extern const Word16 pred_fac_3[];
143a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
144a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    extern const Word16 dico1_lsf_3[];
145a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    extern const Word16 dico2_lsf_3[];
146a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    extern const Word16 dico3_lsf_3[];
147a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
148a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    extern const Word16 mr515_3_lsf[];
149a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    extern const Word16 mr795_1_lsf[];
150a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
151a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    extern const Word16 past_rq_init[];
152a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
153a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /*--------------------------------------------------------------------------*/
154a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#ifdef __cplusplus
155a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber}
156a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#endif
157a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
158a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*
159a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
160a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION NAME: Vq_subvec4
161a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
162a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber INPUT AND OUTPUT DEFINITIONS
163a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
164a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Inputs:
165a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    lsf_r1 = pointer to the first LSF residual vector (Q15) (Word16)
166a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    dico = pointer to the quantization codebook (Q15) (const Word16)
167a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    wf1 = pointer to the first LSF weighting factor (Q13) (Word16)
168a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    dico_size = size of quantization codebook (Q0) (Word16)
169a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
170a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Outputs:
171a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    buffer pointed to by lsf_r1 contains the selected vector
172a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    pOverflow -- pointer to Flag -- Flag set when overflow occurs
173a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
174a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Returns:
175a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    index = quantization index (Q0) (Word16)
176a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
177a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Global Variables Used:
178a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
179a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
180a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Local Variables Needed:
181a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
182a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
183a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
184a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION DESCRIPTION
185a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
186a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber This function performs the quantization of a 4-dimensional subvector.
187a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
188a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
189a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REQUIREMENTS
190a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
191a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber None
192a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
193a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
194a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REFERENCES
195a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
196a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber q_plsf_3.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
197a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
198a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
199a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber PSEUDO-CODE
200a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
201a30d40083856cb4edd225faf8b488fab156e5976Andreas Huberstatic Word16
202a30d40083856cb4edd225faf8b488fab156e5976Andreas HuberVq_subvec4(             // o: quantization index,            Q0
203a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 * lsf_r1,    // i: 1st LSF residual vector,       Q15
204a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 * dico,      // i: quantization codebook,         Q15
205a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 * wf1,       // i: 1st LSF weighting factors,     Q13
206a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 dico_size)   // i: size of quantization codebook, Q0
207a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{
208a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 i, index = 0;
209a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 *p_dico, temp;
210a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word32 dist_min, dist;
211a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
212a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    dist_min = MAX_32;
213a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    p_dico = dico;
214a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
215a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    for (i = 0; i < dico_size; i++)
216a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
217a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        temp = sub (lsf_r1[0], *p_dico++);
218a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        temp = mult (wf1[0], temp);
219a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        dist = L_mult (temp, temp);
220a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
221a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        temp = sub (lsf_r1[1], *p_dico++);
222a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        temp = mult (wf1[1], temp);
223a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        dist = L_mac (dist, temp, temp);
224a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
225a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        temp = sub (lsf_r1[2], *p_dico++);
226a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        temp = mult (wf1[2], temp);
227a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        dist = L_mac (dist, temp, temp);
228a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
229a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        temp = sub (lsf_r1[3], *p_dico++);
230a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        temp = mult (wf1[3], temp);
231a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        dist = L_mac (dist, temp, temp);
232a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
233a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
234a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        if (L_sub (dist, dist_min) < (Word32) 0)
235a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {
236a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            dist_min = dist;
237a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            index = i;
238a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
239a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
240a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
241a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    // Reading the selected vector
242a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
243a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    p_dico = &dico[shl (index, 2)];
244a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    lsf_r1[0] = *p_dico++;
245a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    lsf_r1[1] = *p_dico++;
246a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    lsf_r1[2] = *p_dico++;
247a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    lsf_r1[3] = *p_dico;
248a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
249a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    return index;
250a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
251a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber}
252a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
253a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
254a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber RESOURCES USED [optional]
255a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
256a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber When the code is written for a specific target processor the
257a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber the resources used should be documented below.
258a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
259a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber HEAP MEMORY USED: x bytes
260a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
261a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber STACK MEMORY USED: x bytes
262a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
263a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
264a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                used to represent cycle count for each subroutine
265a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                called)
266a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
267a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                                     name]
268a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
269a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
270a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CAUTION [optional]
271a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber [State any special notes, constraints or cautions for users of this function]
272a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
273a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
274a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber*/
275a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
276a30d40083856cb4edd225faf8b488fab156e5976Andreas Huberstatic Word16 Vq_subvec4( /* o: quantization index,            Q0  */
277a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 * lsf_r1,      /* i: 1st LSF residual vector,       Q15 */
278a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    const Word16 * dico,  /* i: quantization codebook,         Q15 */
279a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 * wf1,         /* i: 1st LSF weighting factors,     Q13 */
280a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 dico_size,     /* i: size of quantization codebook, Q0  */
281a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Flag  *pOverflow      /* o : Flag set when overflow occurs     */
282a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber)
283a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{
284a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    register Word16 i;
285a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 temp;
286a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    const Word16 *p_dico;
287a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 index = 0;
288a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word32 dist_min;
289a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word32 dist;
290a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
291a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 lsf_r1_0;
292a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 lsf_r1_1;
293a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 lsf_r1_2;
294a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 lsf_r1_3;
295a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
296a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 wf1_0;
297a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 wf1_1;
298a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 wf1_2;
299a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 wf1_3;
300a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
301a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    OSCL_UNUSED_ARG(pOverflow);
302a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
303a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    dist_min = MAX_32;
304a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    p_dico = dico;
305a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
306a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    lsf_r1_0 = lsf_r1[0];
307a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    lsf_r1_1 = lsf_r1[1];
308a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    lsf_r1_2 = lsf_r1[2];
309a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    lsf_r1_3 = lsf_r1[3];
310a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
311a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    wf1_0 = wf1[0];
312a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    wf1_1 = wf1[1];
313a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    wf1_2 = wf1[2];
314a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    wf1_3 = wf1[3];
315a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
316a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    for (i = 0; i < dico_size; i++)
317a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
318a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        temp = lsf_r1_0 - (*p_dico++);
319a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        temp = (Word16)((((Word32) wf1_0) * temp) >> 15);
320a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        dist = ((Word32) temp) * temp;
321a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
322a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        temp = lsf_r1_1 - (*p_dico++);
323a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        temp = (Word16)((((Word32) wf1_1) * temp) >> 15);
324a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        dist += ((Word32) temp) * temp;
325a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
326a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        temp = lsf_r1_2 - (*p_dico++);
327a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        temp = (Word16)((((Word32) wf1_2) * temp) >> 15);
328a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        dist += ((Word32) temp) * temp;
329a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
330a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        temp = lsf_r1_3 - (*p_dico++);
331a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        temp = (Word16)((((Word32) wf1_3) * temp) >> 15);
332a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        dist += ((Word32) temp) * temp;
333a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
334a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        if (dist < dist_min)
335a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {
336a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            dist_min = dist;
337a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            index = i;
338a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
339a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
340a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
341a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* Reading the selected vector */
342a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
343a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    p_dico = dico + (index << 2);
344a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    *lsf_r1++ = *p_dico++;
345a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    *lsf_r1++ = *p_dico++;
346a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    *lsf_r1++ = *p_dico++;
347a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    *lsf_r1 = *p_dico;
348a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
349a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    return(index);
350a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
351a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber}
352a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
353a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/****************************************************************************/
354a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
355a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
356a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*
357a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
358a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION NAME: Test_Vq_subvec4
359a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
360a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber INPUT AND OUTPUT DEFINITIONS
361a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
362a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Inputs:
363a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    lsf_r1 = pointer to the first LSF residual vector (Q15) (Word16)
364a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    dico = pointer to the quantization codebook (Q15) (const Word16)
365a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    wf1 = pointer to the first LSF weighting factor (Q13) (Word16)
366a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    dico_size = size of quantization codebook (Q0) (Word16)
367a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
368a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Outputs:
369a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    buffer pointed to by lsf_r1 contains the selected vector
370a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    pOverflow -- pointer to Flag -- Flag set when overflow occurs
371a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
372a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Returns:
373a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    index = quantization index (Q0) (Word16)
374a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
375a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Global Variables Used:
376a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
377a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
378a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Local Variables Needed:
379a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
380a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
381a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
382a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION DESCRIPTION
383a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
384a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber This function calls the static function Vq_subvec4. It is used for testing
385a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber purposes only
386a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
387a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
388a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REQUIREMENTS
389a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
390a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber None
391a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
392a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
393a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REFERENCES
394a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
395a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber None
396a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
397a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
398a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber PSEUDO-CODE
399a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
400a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
401a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CALL Vq_subvec4(lsf_r1 = lsf_r1
402a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                 dico = dico
403a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                 wf1 = wf1
404a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                 dico_size = dico_size)
405a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber   MODIFYING(nothing)
406a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber   RETURNING(index = tst_index4)
407a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
408a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
409a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber RESOURCES USED [optional]
410a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
411a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber When the code is written for a specific target processor the
412a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber the resources used should be documented below.
413a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
414a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber HEAP MEMORY USED: x bytes
415a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
416a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber STACK MEMORY USED: x bytes
417a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
418a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
419a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                used to represent cycle count for each subroutine
420a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                called)
421a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
422a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                                     name]
423a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
424a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
425a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CAUTION [optional]
426a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber [State any special notes, constraints or cautions for users of this function]
427a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
428a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
429a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber*/
430a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
431a30d40083856cb4edd225faf8b488fab156e5976Andreas HuberWord16 Test_Vq_subvec4(
432a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 * lsf_r1,
433a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    const Word16 * dico,
434a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 * wf1,
435a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 dico_size,
436a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Flag   *pOverflow)
437a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{
438a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16  tst_index4 = 0;
439a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
440a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /*------------------------------------------------------------------------
441a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     CALL Vq_subvec4(lsf_r1 = lsf_r1
442a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                     dico = dico
443a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                     wf1 = wf1
444a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                     dico_size = dico_size)
445a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber       MODIFYING(nothing)
446a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber       RETURNING(index = index)
447a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    ------------------------------------------------------------------------*/
448a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    tst_index4 =
449a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        Vq_subvec4(
450a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            lsf_r1,
451a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            dico,
452a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            wf1,
453a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            dico_size,
454a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            pOverflow);
455a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
456a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    return(tst_index4);
457a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
458a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber}
459a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
460a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/****************************************************************************/
461a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
462a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*
463a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
464a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION NAME: Vq_subvec3
465a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
466a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber INPUT AND OUTPUT DEFINITIONS
467a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
468a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Inputs:
469a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    lsf_r1 = pointer to the first LSF residual vector (Q15) (Word16)
470a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    dico = pointer to the quantization codebook (Q15) (const Word16)
471a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    wf1 = pointer to the first LSF weighting factor (Q13) (Word16)
472a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    dico_size = size of quantization codebook (Q0) (Word16)
473a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    use_half = flag to indicate use of every second entry in the
474a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber               codebook (Flag)
475a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
476a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Outputs:
477a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    buffer pointed to by lsf_r1 contains the selected vector
478a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    pOverflow -- pointer to Flag -- Flag set when overflow occurs
479a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
480a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Returns:
481a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    index = quantization index (Q0) (Word16)
482a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
483a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Global Variables Used:
484a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
485a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
486a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Local Variables Needed:
487a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
488a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
489a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
490a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION DESCRIPTION
491a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
492a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber This function performs the quantization of a 3 dimensional subvector.
493a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
494a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
495a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REQUIREMENTS
496a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
497a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber None
498a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
499a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
500a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REFERENCES
501a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
502a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber q_plsf_3.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
503a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
504a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
505a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber PSEUDO-CODE
506a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
507a30d40083856cb4edd225faf8b488fab156e5976Andreas Huberstatic Word16
508a30d40083856cb4edd225faf8b488fab156e5976Andreas HuberVq_subvec3(             // o: quantization index,            Q0
509a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 * lsf_r1,    // i: 1st LSF residual vector,       Q15
510a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 * dico,      // i: quantization codebook,         Q15
511a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 * wf1,       // i: 1st LSF weighting factors,     Q13
512a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 dico_size,   // i: size of quantization codebook, Q0
513a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Flag use_half)      // i: use every second entry in codebook
514a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{
515a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 i, index = 0;
516a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 *p_dico, temp;
517a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word32 dist_min, dist;
518a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
519a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    dist_min = MAX_32;
520a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    p_dico = dico;
521a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
522a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    if (use_half == 0) {
523a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber       for (i = 0; i < dico_size; i++)
524a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber       {
525a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber          temp = sub(lsf_r1[0], *p_dico++);
526a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber          temp = mult(wf1[0], temp);
527a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber          dist = L_mult(temp, temp);
528a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
529a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber          temp = sub(lsf_r1[1], *p_dico++);
530a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber          temp = mult(wf1[1], temp);
531a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber          dist = L_mac(dist, temp, temp);
532a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
533a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber          temp = sub(lsf_r1[2], *p_dico++);
534a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber          temp = mult(wf1[2], temp);
535a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber          dist = L_mac(dist, temp, temp);
536a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
537a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber          if (L_sub(dist, dist_min) < (Word32) 0) {
538a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber             dist_min = dist;
539a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber             index = i;
540a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber          }
541a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber       }
542a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber       p_dico = &dico[add(index, add(index, index))];
543a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
544a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    else
545a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
546a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber       for (i = 0; i < dico_size; i++)
547a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber       {
548a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber          temp = sub(lsf_r1[0], *p_dico++);
549a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber          temp = mult(wf1[0], temp);
550a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber          dist = L_mult(temp, temp);
551a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
552a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber          temp = sub(lsf_r1[1], *p_dico++);
553a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber          temp = mult(wf1[1], temp);
554a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber          dist = L_mac(dist, temp, temp);
555a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
556a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber          temp = sub(lsf_r1[2], *p_dico++);
557a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber          temp = mult(wf1[2], temp);
558a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber          dist = L_mac(dist, temp, temp);
559a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
560a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber          if (L_sub(dist, dist_min) < (Word32) 0)
561a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber          {
562a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber             dist_min = dist;
563a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber             index = i;
564a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber          }
565a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber          p_dico = p_dico + 3; add(0,0);
566a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber       }
567a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber       p_dico = &dico[shl(add(index, add(index, index)),1)];
568a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
569a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
570a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
571a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    // Reading the selected vector
572a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    lsf_r1[0] = *p_dico++;
573a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    lsf_r1[1] = *p_dico++;
574a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    lsf_r1[2] = *p_dico++;
575a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
576a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    return index;
577a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber}
578a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
579a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
580a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber RESOURCES USED [optional]
581a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
582a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber When the code is written for a specific target processor the
583a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber the resources used should be documented below.
584a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
585a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber HEAP MEMORY USED: x bytes
586a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
587a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber STACK MEMORY USED: x bytes
588a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
589a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
590a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                used to represent cycle count for each subroutine
591a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                called)
592a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
593a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                                     name]
594a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
595a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
596a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CAUTION [optional]
597a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber [State any special notes, constraints or cautions for users of this function]
598a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
599a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
600a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber*/
601a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
602a30d40083856cb4edd225faf8b488fab156e5976Andreas Huberstatic Word16 Vq_subvec3( /* o: quantization index,            Q0  */
603a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 * lsf_r1,      /* i: 1st LSF residual vector,       Q15 */
604a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    const Word16 * dico,  /* i: quantization codebook,         Q15 */
605a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 * wf1,         /* i: 1st LSF weighting factors,     Q13 */
606a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 dico_size,     /* i: size of quantization codebook, Q0  */
607a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Flag use_half,        /* i: use every second entry in codebook */
608a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Flag  *pOverflow)     /* o : Flag set when overflow occurs     */
609a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{
610a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    register Word16 i;
611a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 temp;
612a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
613a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    const Word16 *p_dico;
614a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
615a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 p_dico_index = 0;
616a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 index = 0;
617a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
618a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word32 dist_min;
619a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word32 dist;
620a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
621a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 lsf_r1_0;
622a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 lsf_r1_1;
623a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 lsf_r1_2;
624a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
625a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 wf1_0;
626a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 wf1_1;
627a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 wf1_2;
628a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
629a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    OSCL_UNUSED_ARG(pOverflow);
630a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
631a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    dist_min = MAX_32;
632a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    p_dico = dico;
633a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
634a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    lsf_r1_0 = lsf_r1[0];
635a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    lsf_r1_1 = lsf_r1[1];
636a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    lsf_r1_2 = lsf_r1[2];
637a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
638a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    wf1_0 = wf1[0];
639a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    wf1_1 = wf1[1];
640a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    wf1_2 = wf1[2];
641a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
642a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    if (use_half != 0)
643a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
644a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        p_dico_index = 3;
645a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
646a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
647a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    for (i = 0; i < dico_size; i++)
648a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
649a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        temp = lsf_r1_0 - (*p_dico++);
650a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        temp = (Word16)((((Word32) wf1_0) * temp) >> 15);
651a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        dist = ((Word32) temp) * temp;
652a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
653a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        temp = lsf_r1_1 - (*p_dico++);
654a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        temp = (Word16)((((Word32) wf1_1) * temp) >> 15);
655a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        dist += ((Word32) temp) * temp;
656a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
657a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        temp = lsf_r1_2 - (*p_dico++);
658a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        temp = (Word16)((((Word32) wf1_2) * temp) >> 15);
659a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        dist += ((Word32) temp) * temp;
660a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
661a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        if (dist < dist_min)
662a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {
663a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            dist_min = dist;
664a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            index = i;
665a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
666a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
667a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        p_dico = p_dico + p_dico_index;
668a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
669a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
670a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    p_dico = dico + (3 * index);
671a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
672a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    if (use_half != 0)
673a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
674a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        p_dico += (3 * index);
675a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
676a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
677a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* Reading the selected vector */
678a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    *lsf_r1++ = *p_dico++;
679a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    *lsf_r1++ = *p_dico++;
680a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    *lsf_r1 = *p_dico;
681a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
682a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    return(index);
683a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber}
684a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
685a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/****************************************************************************/
686a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
687a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
688a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*
689a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
690a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION NAME: Test_Vq_subvec3
691a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
692a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber INPUT AND OUTPUT DEFINITIONS
693a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
694a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Inputs:
695a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    lsf_r1 = pointer to the first LSF residual vector (Q15) (Word16)
696a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    dico = pointer to the quantization codebook (Q15) (const Word16)
697a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    wf1 = pointer to the first LSF weighting factor (Q13) (Word16)
698a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    dico_size = size of quantization codebook (Q0) (Word16)
699a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    use_half = flag to indicate use of every second entry in the
700a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber               codebook (Flag)
701a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
702a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Outputs:
703a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    buffer pointed to by lsf_r1 contains the selected vector
704a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    pOverflow -- pointer to Flag -- Flag set when overflow occurs
705a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
706a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Returns:
707a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    index = quantization index (Q0) (Word16)
708a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
709a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Global Variables Used:
710a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
711a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
712a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Local Variables Needed:
713a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
714a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
715a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
716a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION DESCRIPTION
717a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
718a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber This function calls the static function Vq_subvec3. It is used for testing
719a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber purposes only
720a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
721a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
722a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REQUIREMENTS
723a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
724a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber None
725a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
726a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
727a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REFERENCES
728a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
729a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber None
730a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
731a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
732a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber PSEUDO-CODE
733a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
734a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CALL Vq_subvec3(lsf_r1 = lsf_r1
735a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                 dico = dico
736a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                 wf1 = wf1
737a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                 dico_size = dico_size
738a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                 use_half = use_half)
739a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber   MODIFYING(nothing)
740a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber   RETURNING(index = tst_index3)
741a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
742a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
743a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber RESOURCES USED [optional]
744a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
745a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber When the code is written for a specific target processor the
746a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber the resources used should be documented below.
747a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
748a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber HEAP MEMORY USED: x bytes
749a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
750a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber STACK MEMORY USED: x bytes
751a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
752a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
753a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                used to represent cycle count for each subroutine
754a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                called)
755a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
756a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                                     name]
757a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
758a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
759a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CAUTION [optional]
760a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber [State any special notes, constraints or cautions for users of this function]
761a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
762a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
763a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber*/
764a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
765a30d40083856cb4edd225faf8b488fab156e5976Andreas HuberWord16 Test_Vq_subvec3(
766a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 * lsf_r1,
767a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    const Word16 * dico,
768a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 * wf1,
769a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 dico_size,
770a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Flag use_half,
771a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Flag *pOverflow)
772a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{
773a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16  tst_index3 = 0;
774a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
775a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /*------------------------------------------------------------------------
776a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     CALL Vq_subvec3(lsf_r1 = lsf_r1
777a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                     dico = dico
778a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                     wf1 = wf1
779a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                     dico_size = dico_size
780a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                     use_half = use_half)
781a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber       MODIFYING(nothing)
782a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber       RETURNING(index = index)
783a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    ------------------------------------------------------------------------*/
784a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    tst_index3 =
785a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        Vq_subvec3(
786a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            lsf_r1,
787a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            dico,
788a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            wf1,
789a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            dico_size,
790a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            use_half,
791a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            pOverflow);
792a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
793a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    return(tst_index3);
794a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
795a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber}
796a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
797a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/****************************************************************************/
798a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
799a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
800a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*
801a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
802a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION NAME: Q_plsf_3
803a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
804a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber INPUT AND OUTPUT DEFINITIONS
805a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
806a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Inputs:
807a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    st = pointer to structures of type Q_plsfState (Q_plsfState)
808a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    mode = coder mode (enum)
809a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    lsp1 = pointer to the first LSP vector (Word16)
810a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    lsp1_q = pointer to the quantized first LSP vector (Word16)
811a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    indice = pointer to the quantization indices of 3 vectors (Word16)
812a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    pred_init_i = pointer to the index of the initial value for
813a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                  MA prediction in DTX mode (Word16)
814a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
815a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Outputs:
816a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    lsp1_q points to a vector containing the new quantized LSPs
817a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    indice points to the new quantization indices of 3 vectors
818a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    pred_init_i points to the new initial index for MA prediction
819a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber      in DTX mode
820a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    past_rq field of structure pointed to by st contains the current
821a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber      quantized LSF parameters
822a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    pOverflow -- pointer to Flag -- Flag set when overflow occurs
823a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
824a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Returns:
825a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
826a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
827a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Global Variables Used:
828a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    pred_fac = table containing prediction factors (const Word16)
829a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    dico1_lsf = quantization table for split_MQ of 2 sets of LSFs
830a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                in a 20 ms frame (const Word16)
831a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    dico2_lsf = quantization table for split_MQ of 2 sets of LSFs
832a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                in a 20 ms frame (const Word16)
833a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    dico3_lsf = quantization table for split_MQ of 2 sets of LSFs
834a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                in a 20 ms frame (const Word16)
835a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    mr515_3_lsf = third codebook for MR475 and MR515 modes (const Word16)
836a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    mr795_1_lsf = first codebook for MR795 mode (const Word16)
837a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    mean_lsf = table of mean LSFs (const Word16)
838a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    past_rq_init = initalization table for MA predictor in DTX mode
839a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                   (const Word16)
840a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
841a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
842a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Local Variables Needed:
843a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    None
844a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
845a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
846a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber FUNCTION DESCRIPTION
847a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
848a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber This function performs quantization of LSF parameters with 1st order MA
849a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber prediction and split by 3 vector quantization (split-VQ)
850a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
851a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
852a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REQUIREMENTS
853a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
854a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber None
855a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
856a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
857a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber REFERENCES
858a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
859a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber q_plsf_3.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
860a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
861a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
862a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber PSEUDO-CODE
863a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
864a30d40083856cb4edd225faf8b488fab156e5976Andreas Hubervoid Q_plsf_3(
865a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Q_plsfState *st,    // i/o: state struct
866a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    enum Mode mode,     // i  : coder mode
867a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 *lsp1,       // i  : 1st LSP vector                      Q15
868a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 *lsp1_q,     // o  : quantized 1st LSP vector            Q15
869a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 *indice,     // o  : quantization indices of 3 vectors   Q0
870a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 *pred_init_i // o  : init index for MA prediction in DTX mode
871a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber)
872a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{
873a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 i, j;
874a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 lsf1[M], wf1[M], lsf_p[M], lsf_r1[M];
875a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 lsf1_q[M];
876a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
877a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word32 L_pred_init_err;
878a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word32 L_min_pred_init_err;
879a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 temp_r1[M];
880a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 temp_p[M];
881a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
882a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    // convert LSFs to normalize frequency domain 0..16384
883a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
884a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Lsp_lsf(lsp1, lsf1, M);
885a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
886a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    // compute LSF weighting factors (Q13)
887a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
888a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Lsf_wt(lsf1, wf1);
889a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
890a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    // Compute predicted LSF and prediction error
891a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    if (test(), sub(mode, MRDTX) != 0)
892a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
893a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber       for (i = 0; i < M; i++)
894a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber       {
895a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber          lsf_p[i] = add(mean_lsf[i],
896a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                         mult(st->past_rq[i],
897a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                              pred_fac[i]));
898a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber          lsf_r1[i] = sub(lsf1[i], lsf_p[i]);
899a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber      }
900a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
901a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    else
902a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
903a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber       // DTX mode, search the init vector that yields
904a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber       // lowest prediction resuidual energy
905a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber       *pred_init_i = 0;
906a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber       L_min_pred_init_err = 0x7fffffff; // 2^31 - 1
907a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber       for (j = 0; j < PAST_RQ_INIT_SIZE; j++)
908a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber       {
909a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber          L_pred_init_err = 0;
910a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber          for (i = 0; i < M; i++)
911a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber          {
912a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber             temp_p[i] = add(mean_lsf[i], past_rq_init[j*M+i]);
913a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber             temp_r1[i] = sub(lsf1[i],temp_p[i]);
914a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber             L_pred_init_err = L_mac(L_pred_init_err, temp_r1[i], temp_r1[i]);
915a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber          }  // next i
916a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
917a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
918a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber          if (L_sub(L_pred_init_err, L_min_pred_init_err) < (Word32) 0)
919a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber          {
920a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber             L_min_pred_init_err = L_pred_init_err;
921a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber             Copy(temp_r1, lsf_r1, M);
922a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber             Copy(temp_p, lsf_p, M);
923a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber             // Set zerom
924a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber             Copy(&past_rq_init[j*M], st->past_rq, M);
925a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber             *pred_init_i = j;
926a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber          } // endif
927a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber       } // next j
928a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    } // endif MRDTX
929a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
930a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    //---- Split-VQ of prediction error ----
931a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    if (sub (mode, MR475) == 0 || sub (mode, MR515) == 0)
932a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {   // MR475, MR515
933a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
934a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
935a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber      indice[0] = Vq_subvec3(&lsf_r1[0], dico1_lsf, &wf1[0], DICO1_SIZE, 0);
936a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
937a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber      indice[1] = Vq_subvec3(&lsf_r1[3], dico2_lsf, &wf1[3], DICO2_SIZE/2, 1);
938a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
939a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber      indice[2] = Vq_subvec4(&lsf_r1[6], mr515_3_lsf, &wf1[6], MR515_3_SIZE);
940a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
941a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
942a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    else if (sub (mode, MR795) == 0)
943a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {   // MR795
944a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
945a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
946a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber      indice[0] = Vq_subvec3(&lsf_r1[0], mr795_1_lsf, &wf1[0], MR795_1_SIZE, 0);
947a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
948a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber      indice[1] = Vq_subvec3(&lsf_r1[3], dico2_lsf, &wf1[3], DICO2_SIZE, 0);
949a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
950a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber      indice[2] = Vq_subvec4(&lsf_r1[6], dico3_lsf, &wf1[6], DICO3_SIZE);
951a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
952a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
953a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    else
954a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {   // MR59, MR67, MR74, MR102 , MRDTX
955a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
956a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
957a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber      indice[0] = Vq_subvec3(&lsf_r1[0], dico1_lsf, &wf1[0], DICO1_SIZE, 0);
958a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
959a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber      indice[1] = Vq_subvec3(&lsf_r1[3], dico2_lsf, &wf1[3], DICO2_SIZE, 0);
960a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
961a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber      indice[2] = Vq_subvec4(&lsf_r1[6], dico3_lsf, &wf1[6], DICO3_SIZE);
962a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
963a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
964a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
965a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
966a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    // Compute quantized LSFs and update the past quantized residual
967a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
968a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    for (i = 0; i < M; i++)
969a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
970a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        lsf1_q[i] = add(lsf_r1[i], lsf_p[i]);
971a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        st->past_rq[i] = lsf_r1[i];
972a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
973a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
974a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    // verification that LSFs has mimimum distance of LSF_GAP Hz
975a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
976a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Reorder_lsf(lsf1_q, LSF_GAP, M);
977a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
978a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    //  convert LSFs to the cosine domain
979a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
980a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Lsf_lsp(lsf1_q, lsp1_q, M);
981a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber}
982a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
983a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
984a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber RESOURCES USED [optional]
985a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
986a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber When the code is written for a specific target processor the
987a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber the resources used should be documented below.
988a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
989a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber HEAP MEMORY USED: x bytes
990a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
991a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber STACK MEMORY USED: x bytes
992a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
993a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
994a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                used to represent cycle count for each subroutine
995a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                called)
996a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
997a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                                     name]
998a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
999a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1000a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber CAUTION [optional]
1001a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber [State any special notes, constraints or cautions for users of this function]
1002a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1003a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber------------------------------------------------------------------------------
1004a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber*/
1005a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1006a30d40083856cb4edd225faf8b488fab156e5976Andreas Hubervoid Q_plsf_3(
1007a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Q_plsfState *st,    /* i/o: state struct                             */
1008a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    enum Mode mode,     /* i  : coder mode                               */
1009a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 *lsp1,       /* i  : 1st LSP vector                      Q15  */
1010a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 *lsp1_q,     /* o  : quantized 1st LSP vector            Q15  */
1011a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 *indice,     /* o  : quantization indices of 3 vectors   Q0   */
1012a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 *pred_init_i,/* o  : init index for MA prediction in DTX mode */
1013a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Flag  *pOverflow    /* o : Flag set when overflow occurs             */
1014a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber)
1015a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{
1016a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    register Word16 i, j;
1017a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 lsf1[M];
1018a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 wf1[M];
1019a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 lsf_p[M];
1020a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 lsf_r1[M];
1021a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 lsf1_q[M];
1022a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1023a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word32 L_pred_init_err;
1024a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word32 L_min_pred_init_err;
1025a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word32 L_temp;
1026a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 temp_r1[M];
1027a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 temp_p[M];
1028a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Word16 temp;
1029a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1030a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* convert LSFs to normalize frequency domain 0..16384 */
1031a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1032a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Lsp_lsf(
1033a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        lsp1,
1034a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        lsf1,
1035a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        M,
1036a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        pOverflow);
1037a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1038a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* compute LSF weighting factors (Q13) */
1039a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1040a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Lsf_wt(
1041a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        lsf1,
1042a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        wf1,
1043a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        pOverflow);
1044a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1045a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* Compute predicted LSF and prediction error */
1046a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    if (mode != MRDTX)
1047a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
1048a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        for (i = 0; i < M; i++)
1049a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {
1050a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            temp = (Word16)((((Word32) st->past_rq[i]) *
1051a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                             (*(pred_fac_3 + i))) >> 15);
1052a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1053a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            *(lsf_p + i) = *(mean_lsf_3 + i) + temp;
1054a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1055a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            *(lsf_r1 + i) = *(lsf1 + i) - *(lsf_p + i);
1056a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
1057a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
1058a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    else
1059a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
1060a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        /* DTX mode, search the init vector that yields */
1061a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        /* lowest prediction resuidual energy           */
1062a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        *pred_init_i = 0;
1063a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        L_min_pred_init_err = 0x7fffffff; /* 2^31 - 1 */
1064a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1065a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        for (j = 0; j < PAST_RQ_INIT_SIZE; j++)
1066a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {
1067a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            L_pred_init_err = 0;
1068a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            for (i = 0; i < M; i++)
1069a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            {
1070a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                *(temp_p + i) = *(mean_lsf_3 + i) + *(past_rq_init + j * M + i);
1071a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1072a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                *(temp_r1 + i) = *(lsf1 + i) - *(temp_p + i);
1073a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1074a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                L_temp = ((Word32) * (temp_r1 + i)) * *(temp_r1 + i);
1075a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1076a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                L_pred_init_err = L_pred_init_err + (L_temp << 1);
1077a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1078a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            }  /* next i */
1079a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1080a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1081a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            if (L_pred_init_err < L_min_pred_init_err)
1082a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            {
1083a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                L_min_pred_init_err = L_pred_init_err;
1084a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1085a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                memcpy(
1086a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    lsf_r1,
1087a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    temp_r1,
1088a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    M*sizeof(Word16));
1089a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1090a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                memcpy(
1091a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    lsf_p,
1092a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    temp_p,
1093a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    M*sizeof(Word16));
1094a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1095a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                /* Set zerom */
1096a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                memcpy(
1097a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    st->past_rq,
1098a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    &past_rq_init[j*M],
1099a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    M*sizeof(Word16));
1100a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1101a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                *pred_init_i = j;
1102a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1103a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            } /* endif */
1104a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        } /* next j */
1105a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    } /* endif MRDTX */
1106a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1107a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /*---- Split-VQ of prediction error ----*/
1108a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    if ((mode == MR475) || (mode == MR515))
1109a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {   /* MR475, MR515 */
1110a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1111a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        *indice =
1112a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            Vq_subvec3(
1113a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                lsf_r1,
1114a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                dico1_lsf_3,
1115a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                wf1,
1116a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                DICO1_SIZE,
1117a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                0,
1118a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                pOverflow);
1119a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1120a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        *(indice + 1) =
1121a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            Vq_subvec3(
1122a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                lsf_r1 + 3,
1123a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                dico2_lsf_3,
1124a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                wf1 + 3,
1125a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                DICO2_SIZE / 2,
1126a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                1,
1127a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                pOverflow);
1128a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1129a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        *(indice + 2) =
1130a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            Vq_subvec4(
1131a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                lsf_r1 + 6,
1132a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                mr515_3_lsf,
1133a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                wf1 + 6,
1134a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                MR515_3_SIZE,
1135a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                pOverflow);
1136a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1137a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
1138a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    else if (mode == MR795)
1139a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {   /* MR795 */
1140a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1141a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        *indice =
1142a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            Vq_subvec3(
1143a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                lsf_r1,
1144a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                mr795_1_lsf,
1145a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                wf1,
1146a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                MR795_1_SIZE,
1147a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                0,
1148a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                pOverflow);
1149a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1150a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        *(indice + 1) =
1151a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            Vq_subvec3(
1152a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                lsf_r1 + 3,
1153a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                dico2_lsf_3,
1154a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                wf1 + 3,
1155a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                DICO2_SIZE,
1156a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                0,
1157a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                pOverflow);
1158a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1159a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        *(indice + 2) =
1160a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            Vq_subvec4(
1161a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                lsf_r1 + 6,
1162a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                dico3_lsf_3,
1163a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                wf1 + 6,
1164a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                DICO3_SIZE,
1165a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                pOverflow);
1166a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1167a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
1168a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    else
1169a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {   /* MR59, MR67, MR74, MR102 , MRDTX */
1170a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1171a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        *indice =
1172a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            Vq_subvec3(
1173a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                lsf_r1,
1174a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                dico1_lsf_3,
1175a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                wf1,
1176a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                DICO1_SIZE,
1177a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                0,
1178a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                pOverflow);
1179a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1180a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        *(indice + 1) =
1181a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            Vq_subvec3(
1182a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                lsf_r1 + 3,
1183a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                dico2_lsf_3,
1184a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                wf1 + 3,
1185a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                DICO2_SIZE,
1186a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                0,
1187a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                pOverflow);
1188a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1189a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        *(indice + 2) =
1190a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            Vq_subvec4(
1191a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                lsf_r1 + 6,
1192a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                dico3_lsf_3,
1193a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                wf1 + 6,
1194a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                DICO3_SIZE,
1195a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                pOverflow);
1196a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1197a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
1198a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1199a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1200a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* Compute quantized LSFs and update the past quantized residual */
1201a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1202a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    for (i = 0; i < M; i++)
1203a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
1204a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        *(lsf1_q + i) = *(lsf_r1 + i) + *(lsf_p + i);
1205a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        st->past_rq[i] = *(lsf_r1 + i);
1206a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
1207a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1208a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* verification that LSFs has mimimum distance of LSF_GAP Hz */
1209a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1210a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Reorder_lsf(
1211a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        lsf1_q,
1212a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        LSF_GAP,
1213a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        M,
1214a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        pOverflow);
1215a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1216a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /*  convert LSFs to the cosine domain */
1217a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1218a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Lsf_lsp(
1219a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        lsf1_q,
1220a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        lsp1_q,
1221a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        M,
1222a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        pOverflow);
1223a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1224a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    return;
1225a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
1226a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber}
1227