14f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber/* ------------------------------------------------------------------
24f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * Copyright (C) 1998-2009 PacketVideo
34f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber *
44f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
54f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * you may not use this file except in compliance with the License.
64f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * You may obtain a copy of the License at
74f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber *
84f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
94f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber *
104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * Unless required by applicable law or agreed to in writing, software
114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * express or implied.
144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * See the License for the specific language governing permissions
154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * and limitations under the License.
164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber * -------------------------------------------------------------------
174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber */
184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber/****************************************************************************************
194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas HuberPortions of this file are derived from the following 3GPP standard:
204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    3GPP TS 26.073
224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Available from http://www.3gpp.org
244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas HuberPermission to distribute, modify and use this file under the standard license
274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huberterms listed above has been obtained from the copyright holder.
284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber****************************************************************************************/
294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber/*
304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Pathname: ./audio/gsm-amr/c/src/q_plsf_3.c
324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Funtions: Vq_subvec4
334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           Test_Vq_subvec4
344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           Vq_subvec3
354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           Test_Vq_subvec3
364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber           Q_plsf_3
374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber REVISION HISTORY
404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Description: Updated template used to PV coding template. First attempt at
424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber          optimizing C code.
434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Description: Updated modules per Phase 2/3 review comments. Updated
454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber          Vq_subvec3 pseudo-code to reflect the new restructured code.
464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Description: Added setting of Overflow flag in inlined code.
484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Description: Synchronized file with UMTS version 3.2.0. Updated coding
504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber              template. Removed unnecessary include files.
514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Description: Replaced basic_op.h with the header file of the math functions
534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber              used in the file.
544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Description: Made the following changes per comments from Phase 2/3 review:
564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber              1. Fixed typecasting issue with TI C compiler.
574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber              2. Optimized IF stament in Vq_subvec3() function.
584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber              3. Updated copyright year.
594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Description: Removed redundancy in the Vq_subvec4 function.
614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Description: Updated to accept new parameter, Flag *pOverflow.
634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Description: Per review comments, added pOverflow flag description
654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber to the input/outputs section.
664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Description: Corrected missed Overflow global variables -- changed to
684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber proper pOverflow.
694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Description: Optimized all functions to further reduce clock cycle usage.
714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber              Updated copyright year.
724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Description: Added left shift by 1 in line 1050 of Q_plsf_3().
744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Description:  Replaced OSCL mem type functions and eliminated include
764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber               files that now are chosen by OSCL definitions
774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Description:  Replaced "int" and/or "char" with OSCL defined types.
794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Description: Added #ifdef __cplusplus around extern'ed table.
814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Who:                           Date:
834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Description:
844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber MODULE DESCRIPTION
874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber This file contains the functions that perform the quantization of LSF
894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber parameters with first order MA prediction and split by 3 vector
904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber quantization (split-VQ).
914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber*/
944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber/*----------------------------------------------------------------------------
964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber; INCLUDES
974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber----------------------------------------------------------------------------*/
984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include <string.h>
1004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "q_plsf.h"
1024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "typedef.h"
1034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "lsp_lsf.h"
1044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "reorder.h"
1054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#include "lsfwt.h"
1064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber/*--------------------------------------------------------------------------*/
1084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#ifdef __cplusplus
1094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huberextern "C"
1104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber{
1114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#endif
1124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /*----------------------------------------------------------------------------
1144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    ; MACROS
1154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    ; Define module specific macros here
1164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    ----------------------------------------------------------------------------*/
1174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /*----------------------------------------------------------------------------
1194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    ; DEFINES
1204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    ; Include all pre-processor statements here. Include conditional
1214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    ; compile variables also.
1224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    ----------------------------------------------------------------------------*/
1234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#define PAST_RQ_INIT_SIZE 8
1244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /*----------------------------------------------------------------------------
1264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    ; LOCAL FUNCTION DEFINITIONS
1274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    ; Function Prototype declaration
1284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    ----------------------------------------------------------------------------*/
1294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /*----------------------------------------------------------------------------
1314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    ; LOCAL VARIABLE DEFINITIONS
1324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    ; Variable declaration - defined here and used outside this module
1334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    ----------------------------------------------------------------------------*/
1344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /*----------------------------------------------------------------------------
1364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    ; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
1374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    ; Declare variables used in this module but defined elsewhere
1384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    ----------------------------------------------------------------------------*/
1394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* Codebooks of LSF prediction residual */
1404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    extern const Word16 mean_lsf_3[];
1414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    extern const Word16 pred_fac_3[];
1434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    extern const Word16 dico1_lsf_3[];
1454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    extern const Word16 dico2_lsf_3[];
1464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    extern const Word16 dico3_lsf_3[];
1474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    extern const Word16 mr515_3_lsf[];
1494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    extern const Word16 mr795_1_lsf[];
1504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    extern const Word16 past_rq_init[];
1524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /*--------------------------------------------------------------------------*/
1544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#ifdef __cplusplus
1554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber}
1564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber#endif
1574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber/*
1594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
1604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber FUNCTION NAME: Vq_subvec4
1614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
1624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber INPUT AND OUTPUT DEFINITIONS
1634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Inputs:
1654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    lsf_r1 = pointer to the first LSF residual vector (Q15) (Word16)
1664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    dico = pointer to the quantization codebook (Q15) (const Word16)
1674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    wf1 = pointer to the first LSF weighting factor (Q13) (Word16)
1684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    dico_size = size of quantization codebook (Q0) (Word16)
1694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Outputs:
1714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    buffer pointed to by lsf_r1 contains the selected vector
1724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    pOverflow -- pointer to Flag -- Flag set when overflow occurs
1734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Returns:
1754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    index = quantization index (Q0) (Word16)
1764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Global Variables Used:
1784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    None
1794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Local Variables Needed:
1814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    None
1824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
1844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber FUNCTION DESCRIPTION
1854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber This function performs the quantization of a 4-dimensional subvector.
1874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
1894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber REQUIREMENTS
1904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber None
1924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
1944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber REFERENCES
1954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber q_plsf_3.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
1974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
1984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
1994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber PSEUDO-CODE
2004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huberstatic Word16
2024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas HuberVq_subvec4(             // o: quantization index,            Q0
2034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 * lsf_r1,    // i: 1st LSF residual vector,       Q15
2044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 * dico,      // i: quantization codebook,         Q15
2054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 * wf1,       // i: 1st LSF weighting factors,     Q13
2064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 dico_size)   // i: size of quantization codebook, Q0
2074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber{
2084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 i, index = 0;
2094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 *p_dico, temp;
2104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word32 dist_min, dist;
2114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    dist_min = MAX_32;
2134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    p_dico = dico;
2144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    for (i = 0; i < dico_size; i++)
2164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
2174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        temp = sub (lsf_r1[0], *p_dico++);
2184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        temp = mult (wf1[0], temp);
2194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        dist = L_mult (temp, temp);
2204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        temp = sub (lsf_r1[1], *p_dico++);
2224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        temp = mult (wf1[1], temp);
2234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        dist = L_mac (dist, temp, temp);
2244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        temp = sub (lsf_r1[2], *p_dico++);
2264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        temp = mult (wf1[2], temp);
2274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        dist = L_mac (dist, temp, temp);
2284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        temp = sub (lsf_r1[3], *p_dico++);
2304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        temp = mult (wf1[3], temp);
2314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        dist = L_mac (dist, temp, temp);
2324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        if (L_sub (dist, dist_min) < (Word32) 0)
2354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
2364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            dist_min = dist;
2374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            index = i;
2384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
2394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
2404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    // Reading the selected vector
2424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    p_dico = &dico[shl (index, 2)];
2444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    lsf_r1[0] = *p_dico++;
2454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    lsf_r1[1] = *p_dico++;
2464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    lsf_r1[2] = *p_dico++;
2474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    lsf_r1[3] = *p_dico;
2484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    return index;
2504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber}
2524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
2544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber RESOURCES USED [optional]
2554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber When the code is written for a specific target processor the
2574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber the resources used should be documented below.
2584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber HEAP MEMORY USED: x bytes
2604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber STACK MEMORY USED: x bytes
2624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
2644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                used to represent cycle count for each subroutine
2654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                called)
2664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
2674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                                     name]
2684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
2704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber CAUTION [optional]
2714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber [State any special notes, constraints or cautions for users of this function]
2724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
2744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber*/
2754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huberstatic Word16 Vq_subvec4( /* o: quantization index,            Q0  */
2774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 * lsf_r1,      /* i: 1st LSF residual vector,       Q15 */
2784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    const Word16 * dico,  /* i: quantization codebook,         Q15 */
2794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 * wf1,         /* i: 1st LSF weighting factors,     Q13 */
2804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 dico_size,     /* i: size of quantization codebook, Q0  */
2814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Flag  *pOverflow      /* o : Flag set when overflow occurs     */
2824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber)
2834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber{
2844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    register Word16 i;
2854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 temp;
2864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    const Word16 *p_dico;
2874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 index = 0;
2884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word32 dist_min;
2894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word32 dist;
2904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 lsf_r1_0;
2924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 lsf_r1_1;
2934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 lsf_r1_2;
2944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 lsf_r1_3;
2954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
2964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 wf1_0;
2974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 wf1_1;
2984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 wf1_2;
2994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 wf1_3;
3004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    OSCL_UNUSED_ARG(pOverflow);
3024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    dist_min = MAX_32;
3044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    p_dico = dico;
3054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    lsf_r1_0 = lsf_r1[0];
3074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    lsf_r1_1 = lsf_r1[1];
3084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    lsf_r1_2 = lsf_r1[2];
3094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    lsf_r1_3 = lsf_r1[3];
3104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    wf1_0 = wf1[0];
3124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    wf1_1 = wf1[1];
3134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    wf1_2 = wf1[2];
3144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    wf1_3 = wf1[3];
3154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    for (i = 0; i < dico_size; i++)
3174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
3184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        temp = lsf_r1_0 - (*p_dico++);
3194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        temp = (Word16)((((Word32) wf1_0) * temp) >> 15);
3204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        dist = ((Word32) temp) * temp;
3214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        temp = lsf_r1_1 - (*p_dico++);
3234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        temp = (Word16)((((Word32) wf1_1) * temp) >> 15);
3244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        dist += ((Word32) temp) * temp;
3254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        temp = lsf_r1_2 - (*p_dico++);
3274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        temp = (Word16)((((Word32) wf1_2) * temp) >> 15);
3284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        dist += ((Word32) temp) * temp;
3294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        temp = lsf_r1_3 - (*p_dico++);
3314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        temp = (Word16)((((Word32) wf1_3) * temp) >> 15);
3324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        dist += ((Word32) temp) * temp;
3334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        if (dist < dist_min)
3354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
3364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            dist_min = dist;
3374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            index = i;
3384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
3394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
3404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* Reading the selected vector */
3424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    p_dico = dico + (index << 2);
3444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    *lsf_r1++ = *p_dico++;
3454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    *lsf_r1++ = *p_dico++;
3464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    *lsf_r1++ = *p_dico++;
3474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    *lsf_r1 = *p_dico;
3484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    return(index);
3504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber}
3524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber/****************************************************************************/
3544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber/*
3574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
3584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber FUNCTION NAME: Test_Vq_subvec4
3594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
3604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber INPUT AND OUTPUT DEFINITIONS
3614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Inputs:
3634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    lsf_r1 = pointer to the first LSF residual vector (Q15) (Word16)
3644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    dico = pointer to the quantization codebook (Q15) (const Word16)
3654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    wf1 = pointer to the first LSF weighting factor (Q13) (Word16)
3664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    dico_size = size of quantization codebook (Q0) (Word16)
3674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Outputs:
3694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    buffer pointed to by lsf_r1 contains the selected vector
3704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    pOverflow -- pointer to Flag -- Flag set when overflow occurs
3714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Returns:
3734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    index = quantization index (Q0) (Word16)
3744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Global Variables Used:
3764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    None
3774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Local Variables Needed:
3794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    None
3804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
3824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber FUNCTION DESCRIPTION
3834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber This function calls the static function Vq_subvec4. It is used for testing
3854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber purposes only
3864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
3884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber REQUIREMENTS
3894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber None
3914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
3934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber REFERENCES
3944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber None
3964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
3974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
3984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber PSEUDO-CODE
3994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber CALL Vq_subvec4(lsf_r1 = lsf_r1
4024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                 dico = dico
4034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                 wf1 = wf1
4044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                 dico_size = dico_size)
4054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   MODIFYING(nothing)
4064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   RETURNING(index = tst_index4)
4074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
4094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber RESOURCES USED [optional]
4104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber When the code is written for a specific target processor the
4124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber the resources used should be documented below.
4134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber HEAP MEMORY USED: x bytes
4154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber STACK MEMORY USED: x bytes
4174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
4194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                used to represent cycle count for each subroutine
4204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                called)
4214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
4224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                                     name]
4234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
4254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber CAUTION [optional]
4264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber [State any special notes, constraints or cautions for users of this function]
4274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
4294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber*/
4304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas HuberWord16 Test_Vq_subvec4(
4324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 * lsf_r1,
4334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    const Word16 * dico,
4344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 * wf1,
4354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 dico_size,
4364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Flag   *pOverflow)
4374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber{
4384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16  tst_index4 = 0;
4394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /*------------------------------------------------------------------------
4414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     CALL Vq_subvec4(lsf_r1 = lsf_r1
4424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                     dico = dico
4434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                     wf1 = wf1
4444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                     dico_size = dico_size)
4454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       MODIFYING(nothing)
4464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       RETURNING(index = index)
4474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    ------------------------------------------------------------------------*/
4484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    tst_index4 =
4494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        Vq_subvec4(
4504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            lsf_r1,
4514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            dico,
4524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            wf1,
4534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            dico_size,
4544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            pOverflow);
4554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    return(tst_index4);
4574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber}
4594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber/****************************************************************************/
4614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber/*
4634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
4644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber FUNCTION NAME: Vq_subvec3
4654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
4664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber INPUT AND OUTPUT DEFINITIONS
4674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Inputs:
4694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    lsf_r1 = pointer to the first LSF residual vector (Q15) (Word16)
4704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    dico = pointer to the quantization codebook (Q15) (const Word16)
4714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    wf1 = pointer to the first LSF weighting factor (Q13) (Word16)
4724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    dico_size = size of quantization codebook (Q0) (Word16)
4734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    use_half = flag to indicate use of every second entry in the
4744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber               codebook (Flag)
4754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Outputs:
4774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    buffer pointed to by lsf_r1 contains the selected vector
4784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    pOverflow -- pointer to Flag -- Flag set when overflow occurs
4794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Returns:
4814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    index = quantization index (Q0) (Word16)
4824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Global Variables Used:
4844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    None
4854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Local Variables Needed:
4874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    None
4884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
4904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber FUNCTION DESCRIPTION
4914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber This function performs the quantization of a 3 dimensional subvector.
4934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
4954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber REQUIREMENTS
4964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber None
4984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
4994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
5004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber REFERENCES
5014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber q_plsf_3.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
5034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
5054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber PSEUDO-CODE
5064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huberstatic Word16
5084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas HuberVq_subvec3(             // o: quantization index,            Q0
5094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 * lsf_r1,    // i: 1st LSF residual vector,       Q15
5104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 * dico,      // i: quantization codebook,         Q15
5114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 * wf1,       // i: 1st LSF weighting factors,     Q13
5124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 dico_size,   // i: size of quantization codebook, Q0
5134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Flag use_half)      // i: use every second entry in codebook
5144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber{
5154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 i, index = 0;
5164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 *p_dico, temp;
5174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word32 dist_min, dist;
5184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    dist_min = MAX_32;
5204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    p_dico = dico;
5214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    if (use_half == 0) {
5234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       for (i = 0; i < dico_size; i++)
5244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       {
5254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber          temp = sub(lsf_r1[0], *p_dico++);
5264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber          temp = mult(wf1[0], temp);
5274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber          dist = L_mult(temp, temp);
5284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber          temp = sub(lsf_r1[1], *p_dico++);
5304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber          temp = mult(wf1[1], temp);
5314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber          dist = L_mac(dist, temp, temp);
5324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber          temp = sub(lsf_r1[2], *p_dico++);
5344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber          temp = mult(wf1[2], temp);
5354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber          dist = L_mac(dist, temp, temp);
5364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber          if (L_sub(dist, dist_min) < (Word32) 0) {
5384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber             dist_min = dist;
5394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber             index = i;
5404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber          }
5414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       }
5424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       p_dico = &dico[add(index, add(index, index))];
5434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
5444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    else
5454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
5464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       for (i = 0; i < dico_size; i++)
5474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       {
5484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber          temp = sub(lsf_r1[0], *p_dico++);
5494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber          temp = mult(wf1[0], temp);
5504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber          dist = L_mult(temp, temp);
5514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber          temp = sub(lsf_r1[1], *p_dico++);
5534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber          temp = mult(wf1[1], temp);
5544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber          dist = L_mac(dist, temp, temp);
5554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber          temp = sub(lsf_r1[2], *p_dico++);
5574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber          temp = mult(wf1[2], temp);
5584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber          dist = L_mac(dist, temp, temp);
5594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber          if (L_sub(dist, dist_min) < (Word32) 0)
5614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber          {
5624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber             dist_min = dist;
5634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber             index = i;
5644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber          }
5654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber          p_dico = p_dico + 3; add(0,0);
5664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       }
5674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       p_dico = &dico[shl(add(index, add(index, index)),1)];
5684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
5694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    // Reading the selected vector
5724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    lsf_r1[0] = *p_dico++;
5734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    lsf_r1[1] = *p_dico++;
5744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    lsf_r1[2] = *p_dico++;
5754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    return index;
5774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber}
5784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
5804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber RESOURCES USED [optional]
5814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber When the code is written for a specific target processor the
5834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber the resources used should be documented below.
5844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber HEAP MEMORY USED: x bytes
5864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber STACK MEMORY USED: x bytes
5884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
5904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                used to represent cycle count for each subroutine
5914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                called)
5924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
5934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                                     name]
5944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
5964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber CAUTION [optional]
5974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber [State any special notes, constraints or cautions for users of this function]
5984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
5994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
6004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber*/
6014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
6024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huberstatic Word16 Vq_subvec3( /* o: quantization index,            Q0  */
6034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 * lsf_r1,      /* i: 1st LSF residual vector,       Q15 */
6044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    const Word16 * dico,  /* i: quantization codebook,         Q15 */
6054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 * wf1,         /* i: 1st LSF weighting factors,     Q13 */
6064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 dico_size,     /* i: size of quantization codebook, Q0  */
6074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Flag use_half,        /* i: use every second entry in codebook */
6084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Flag  *pOverflow)     /* o : Flag set when overflow occurs     */
6094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber{
6104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    register Word16 i;
6114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 temp;
6124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
6134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    const Word16 *p_dico;
6144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
6154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 p_dico_index = 0;
6164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 index = 0;
6174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
6184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word32 dist_min;
6194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word32 dist;
6204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
6214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 lsf_r1_0;
6224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 lsf_r1_1;
6234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 lsf_r1_2;
6244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
6254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 wf1_0;
6264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 wf1_1;
6274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 wf1_2;
6284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
6294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    OSCL_UNUSED_ARG(pOverflow);
6304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
6314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    dist_min = MAX_32;
6324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    p_dico = dico;
6334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
6344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    lsf_r1_0 = lsf_r1[0];
6354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    lsf_r1_1 = lsf_r1[1];
6364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    lsf_r1_2 = lsf_r1[2];
6374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
6384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    wf1_0 = wf1[0];
6394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    wf1_1 = wf1[1];
6404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    wf1_2 = wf1[2];
6414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
6424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    if (use_half != 0)
6434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
6444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        p_dico_index = 3;
6454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
6464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
6474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    for (i = 0; i < dico_size; i++)
6484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
6494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        temp = lsf_r1_0 - (*p_dico++);
6504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        temp = (Word16)((((Word32) wf1_0) * temp) >> 15);
6514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        dist = ((Word32) temp) * temp;
6524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
6534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        temp = lsf_r1_1 - (*p_dico++);
6544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        temp = (Word16)((((Word32) wf1_1) * temp) >> 15);
6554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        dist += ((Word32) temp) * temp;
6564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
6574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        temp = lsf_r1_2 - (*p_dico++);
6584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        temp = (Word16)((((Word32) wf1_2) * temp) >> 15);
6594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        dist += ((Word32) temp) * temp;
6604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
6614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        if (dist < dist_min)
6624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
6634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            dist_min = dist;
6644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            index = i;
6654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
6664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
6674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        p_dico = p_dico + p_dico_index;
6684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
6694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
6704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    p_dico = dico + (3 * index);
6714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
6724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    if (use_half != 0)
6734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
6744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        p_dico += (3 * index);
6754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
6764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
6774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* Reading the selected vector */
6784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    *lsf_r1++ = *p_dico++;
6794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    *lsf_r1++ = *p_dico++;
6804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    *lsf_r1 = *p_dico;
6814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
6824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    return(index);
6834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber}
6844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
6854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber/****************************************************************************/
6864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
6874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
6884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber/*
6894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
6904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber FUNCTION NAME: Test_Vq_subvec3
6914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
6924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber INPUT AND OUTPUT DEFINITIONS
6934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
6944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Inputs:
6954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    lsf_r1 = pointer to the first LSF residual vector (Q15) (Word16)
6964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    dico = pointer to the quantization codebook (Q15) (const Word16)
6974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    wf1 = pointer to the first LSF weighting factor (Q13) (Word16)
6984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    dico_size = size of quantization codebook (Q0) (Word16)
6994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    use_half = flag to indicate use of every second entry in the
7004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber               codebook (Flag)
7014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
7024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Outputs:
7034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    buffer pointed to by lsf_r1 contains the selected vector
7044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    pOverflow -- pointer to Flag -- Flag set when overflow occurs
7054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
7064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Returns:
7074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    index = quantization index (Q0) (Word16)
7084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
7094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Global Variables Used:
7104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    None
7114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
7124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Local Variables Needed:
7134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    None
7144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
7154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
7164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber FUNCTION DESCRIPTION
7174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
7184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber This function calls the static function Vq_subvec3. It is used for testing
7194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber purposes only
7204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
7214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
7224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber REQUIREMENTS
7234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
7244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber None
7254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
7264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
7274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber REFERENCES
7284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
7294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber None
7304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
7314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
7324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber PSEUDO-CODE
7334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
7344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber CALL Vq_subvec3(lsf_r1 = lsf_r1
7354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                 dico = dico
7364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                 wf1 = wf1
7374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                 dico_size = dico_size
7384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                 use_half = use_half)
7394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   MODIFYING(nothing)
7404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber   RETURNING(index = tst_index3)
7414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
7424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
7434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber RESOURCES USED [optional]
7444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
7454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber When the code is written for a specific target processor the
7464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber the resources used should be documented below.
7474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
7484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber HEAP MEMORY USED: x bytes
7494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
7504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber STACK MEMORY USED: x bytes
7514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
7524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
7534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                used to represent cycle count for each subroutine
7544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                called)
7554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
7564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                                     name]
7574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
7584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
7594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber CAUTION [optional]
7604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber [State any special notes, constraints or cautions for users of this function]
7614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
7624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
7634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber*/
7644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
7654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas HuberWord16 Test_Vq_subvec3(
7664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 * lsf_r1,
7674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    const Word16 * dico,
7684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 * wf1,
7694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 dico_size,
7704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Flag use_half,
7714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Flag *pOverflow)
7724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber{
7734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16  tst_index3 = 0;
7744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
7754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /*------------------------------------------------------------------------
7764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     CALL Vq_subvec3(lsf_r1 = lsf_r1
7774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                     dico = dico
7784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                     wf1 = wf1
7794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                     dico_size = dico_size
7804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                     use_half = use_half)
7814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       MODIFYING(nothing)
7824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       RETURNING(index = index)
7834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    ------------------------------------------------------------------------*/
7844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    tst_index3 =
7854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        Vq_subvec3(
7864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            lsf_r1,
7874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            dico,
7884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            wf1,
7894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            dico_size,
7904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            use_half,
7914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            pOverflow);
7924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
7934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    return(tst_index3);
7944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
7954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber}
7964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
7974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber/****************************************************************************/
7984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
7994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
8004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber/*
8014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
8024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber FUNCTION NAME: Q_plsf_3
8034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
8044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber INPUT AND OUTPUT DEFINITIONS
8054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
8064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Inputs:
8074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    st = pointer to structures of type Q_plsfState (Q_plsfState)
8084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    mode = coder mode (enum)
8094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    lsp1 = pointer to the first LSP vector (Word16)
8104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    lsp1_q = pointer to the quantized first LSP vector (Word16)
8114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    indice = pointer to the quantization indices of 3 vectors (Word16)
8124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    pred_init_i = pointer to the index of the initial value for
8134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                  MA prediction in DTX mode (Word16)
8144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
8154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Outputs:
8164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    lsp1_q points to a vector containing the new quantized LSPs
8174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    indice points to the new quantization indices of 3 vectors
8184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    pred_init_i points to the new initial index for MA prediction
8194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      in DTX mode
8204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    past_rq field of structure pointed to by st contains the current
8214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      quantized LSF parameters
8224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    pOverflow -- pointer to Flag -- Flag set when overflow occurs
8234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
8244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Returns:
8254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    None
8264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
8274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Global Variables Used:
8284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    pred_fac = table containing prediction factors (const Word16)
8294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    dico1_lsf = quantization table for split_MQ of 2 sets of LSFs
8304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                in a 20 ms frame (const Word16)
8314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    dico2_lsf = quantization table for split_MQ of 2 sets of LSFs
8324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                in a 20 ms frame (const Word16)
8334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    dico3_lsf = quantization table for split_MQ of 2 sets of LSFs
8344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                in a 20 ms frame (const Word16)
8354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    mr515_3_lsf = third codebook for MR475 and MR515 modes (const Word16)
8364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    mr795_1_lsf = first codebook for MR795 mode (const Word16)
8374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    mean_lsf = table of mean LSFs (const Word16)
8384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    past_rq_init = initalization table for MA predictor in DTX mode
8394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                   (const Word16)
8404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
8414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
8424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber Local Variables Needed:
8434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    None
8444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
8454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
8464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber FUNCTION DESCRIPTION
8474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
8484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber This function performs quantization of LSF parameters with 1st order MA
8494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber prediction and split by 3 vector quantization (split-VQ)
8504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
8514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
8524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber REQUIREMENTS
8534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
8544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber None
8554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
8564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
8574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber REFERENCES
8584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
8594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber q_plsf_3.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
8604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
8614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
8624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber PSEUDO-CODE
8634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
8644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Hubervoid Q_plsf_3(
8654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Q_plsfState *st,    // i/o: state struct
8664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    enum Mode mode,     // i  : coder mode
8674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 *lsp1,       // i  : 1st LSP vector                      Q15
8684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 *lsp1_q,     // o  : quantized 1st LSP vector            Q15
8694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 *indice,     // o  : quantization indices of 3 vectors   Q0
8704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 *pred_init_i // o  : init index for MA prediction in DTX mode
8714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber)
8724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber{
8734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 i, j;
8744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 lsf1[M], wf1[M], lsf_p[M], lsf_r1[M];
8754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 lsf1_q[M];
8764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
8774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word32 L_pred_init_err;
8784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word32 L_min_pred_init_err;
8794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 temp_r1[M];
8804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 temp_p[M];
8814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
8824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    // convert LSFs to normalize frequency domain 0..16384
8834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
8844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Lsp_lsf(lsp1, lsf1, M);
8854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
8864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    // compute LSF weighting factors (Q13)
8874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
8884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Lsf_wt(lsf1, wf1);
8894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
8904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    // Compute predicted LSF and prediction error
8914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    if (test(), sub(mode, MRDTX) != 0)
8924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
8934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       for (i = 0; i < M; i++)
8944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       {
8954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber          lsf_p[i] = add(mean_lsf[i],
8964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                         mult(st->past_rq[i],
8974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                              pred_fac[i]));
8984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber          lsf_r1[i] = sub(lsf1[i], lsf_p[i]);
8994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      }
9004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
9014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    else
9024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
9034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       // DTX mode, search the init vector that yields
9044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       // lowest prediction resuidual energy
9054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       *pred_init_i = 0;
9064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       L_min_pred_init_err = 0x7fffffff; // 2^31 - 1
9074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       for (j = 0; j < PAST_RQ_INIT_SIZE; j++)
9084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       {
9094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber          L_pred_init_err = 0;
9104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber          for (i = 0; i < M; i++)
9114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber          {
9124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber             temp_p[i] = add(mean_lsf[i], past_rq_init[j*M+i]);
9134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber             temp_r1[i] = sub(lsf1[i],temp_p[i]);
9144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber             L_pred_init_err = L_mac(L_pred_init_err, temp_r1[i], temp_r1[i]);
9154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber          }  // next i
9164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
9174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
9184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber          if (L_sub(L_pred_init_err, L_min_pred_init_err) < (Word32) 0)
9194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber          {
9204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber             L_min_pred_init_err = L_pred_init_err;
9214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber             Copy(temp_r1, lsf_r1, M);
9224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber             Copy(temp_p, lsf_p, M);
9234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber             // Set zerom
9244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber             Copy(&past_rq_init[j*M], st->past_rq, M);
9254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber             *pred_init_i = j;
9264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber          } // endif
9274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber       } // next j
9284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    } // endif MRDTX
9294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
9304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    //---- Split-VQ of prediction error ----
9314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    if (sub (mode, MR475) == 0 || sub (mode, MR515) == 0)
9324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {   // MR475, MR515
9334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
9344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
9354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      indice[0] = Vq_subvec3(&lsf_r1[0], dico1_lsf, &wf1[0], DICO1_SIZE, 0);
9364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
9374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      indice[1] = Vq_subvec3(&lsf_r1[3], dico2_lsf, &wf1[3], DICO2_SIZE/2, 1);
9384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
9394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      indice[2] = Vq_subvec4(&lsf_r1[6], mr515_3_lsf, &wf1[6], MR515_3_SIZE);
9404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
9414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
9424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    else if (sub (mode, MR795) == 0)
9434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {   // MR795
9444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
9454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
9464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      indice[0] = Vq_subvec3(&lsf_r1[0], mr795_1_lsf, &wf1[0], MR795_1_SIZE, 0);
9474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
9484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      indice[1] = Vq_subvec3(&lsf_r1[3], dico2_lsf, &wf1[3], DICO2_SIZE, 0);
9494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
9504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      indice[2] = Vq_subvec4(&lsf_r1[6], dico3_lsf, &wf1[6], DICO3_SIZE);
9514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
9524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
9534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    else
9544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {   // MR59, MR67, MR74, MR102 , MRDTX
9554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
9564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
9574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      indice[0] = Vq_subvec3(&lsf_r1[0], dico1_lsf, &wf1[0], DICO1_SIZE, 0);
9584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
9594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      indice[1] = Vq_subvec3(&lsf_r1[3], dico2_lsf, &wf1[3], DICO2_SIZE, 0);
9604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
9614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber      indice[2] = Vq_subvec4(&lsf_r1[6], dico3_lsf, &wf1[6], DICO3_SIZE);
9624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
9634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
9644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
9654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
9664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    // Compute quantized LSFs and update the past quantized residual
9674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
9684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    for (i = 0; i < M; i++)
9694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
9704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        lsf1_q[i] = add(lsf_r1[i], lsf_p[i]);
9714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        st->past_rq[i] = lsf_r1[i];
9724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
9734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
9744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    // verification that LSFs has mimimum distance of LSF_GAP Hz
9754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
9764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Reorder_lsf(lsf1_q, LSF_GAP, M);
9774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
9784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    //  convert LSFs to the cosine domain
9794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
9804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Lsf_lsp(lsf1_q, lsp1_q, M);
9814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber}
9824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
9834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
9844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber RESOURCES USED [optional]
9854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
9864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber When the code is written for a specific target processor the
9874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber the resources used should be documented below.
9884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
9894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber HEAP MEMORY USED: x bytes
9904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
9914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber STACK MEMORY USED: x bytes
9924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
9934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber CLOCK CYCLES: (cycle count equation for this function) + (variable
9944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                used to represent cycle count for each subroutine
9954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                called)
9964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber     where: (cycle count variable) = cycle count for [subroutine
9974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                                     name]
9984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
9994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
10004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber CAUTION [optional]
10014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber [State any special notes, constraints or cautions for users of this function]
10024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
10034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber------------------------------------------------------------------------------
10044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber*/
10054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
10064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Hubervoid Q_plsf_3(
10074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Q_plsfState *st,    /* i/o: state struct                             */
10084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    enum Mode mode,     /* i  : coder mode                               */
10094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 *lsp1,       /* i  : 1st LSP vector                      Q15  */
10104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 *lsp1_q,     /* o  : quantized 1st LSP vector            Q15  */
10114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 *indice,     /* o  : quantization indices of 3 vectors   Q0   */
10124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 *pred_init_i,/* o  : init index for MA prediction in DTX mode */
10134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Flag  *pOverflow    /* o : Flag set when overflow occurs             */
10144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber)
10154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber{
10164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    register Word16 i, j;
10174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 lsf1[M];
10184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 wf1[M];
10194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 lsf_p[M];
10204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 lsf_r1[M];
10214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 lsf1_q[M];
10224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
10234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word32 L_pred_init_err;
10244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word32 L_min_pred_init_err;
10254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word32 L_temp;
10264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 temp_r1[M];
10274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 temp_p[M];
10284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Word16 temp;
10294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
10304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* convert LSFs to normalize frequency domain 0..16384 */
10314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
10324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Lsp_lsf(
10334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        lsp1,
10344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        lsf1,
10354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        M,
10364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        pOverflow);
10374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
10384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* compute LSF weighting factors (Q13) */
10394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
10404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Lsf_wt(
10414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        lsf1,
10424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        wf1,
10434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        pOverflow);
10444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
10454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* Compute predicted LSF and prediction error */
10464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    if (mode != MRDTX)
10474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
10484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        for (i = 0; i < M; i++)
10494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
10504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            temp = (Word16)((((Word32) st->past_rq[i]) *
10514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                             (*(pred_fac_3 + i))) >> 15);
10524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
10534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            *(lsf_p + i) = *(mean_lsf_3 + i) + temp;
10544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
10554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            *(lsf_r1 + i) = *(lsf1 + i) - *(lsf_p + i);
10564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        }
10574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
10584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    else
10594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
10604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        /* DTX mode, search the init vector that yields */
10614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        /* lowest prediction resuidual energy           */
10624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        *pred_init_i = 0;
10634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        L_min_pred_init_err = 0x7fffffff; /* 2^31 - 1 */
10644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
10654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        for (j = 0; j < PAST_RQ_INIT_SIZE; j++)
10664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        {
10674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            L_pred_init_err = 0;
10684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            for (i = 0; i < M; i++)
10694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            {
10704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                *(temp_p + i) = *(mean_lsf_3 + i) + *(past_rq_init + j * M + i);
10714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
10724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                *(temp_r1 + i) = *(lsf1 + i) - *(temp_p + i);
10734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
10744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                L_temp = ((Word32) * (temp_r1 + i)) * *(temp_r1 + i);
10754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
10764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                L_pred_init_err = L_pred_init_err + (L_temp << 1);
10774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
10784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            }  /* next i */
10794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
10804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
10814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            if (L_pred_init_err < L_min_pred_init_err)
10824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            {
10834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                L_min_pred_init_err = L_pred_init_err;
10844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
10854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                memcpy(
10864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    lsf_r1,
10874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    temp_r1,
10884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    M*sizeof(Word16));
10894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
10904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                memcpy(
10914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    lsf_p,
10924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    temp_p,
10934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    M*sizeof(Word16));
10944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
10954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                /* Set zerom */
10964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                memcpy(
10974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    st->past_rq,
10984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    &past_rq_init[j*M],
10994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                    M*sizeof(Word16));
11004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
11014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                *pred_init_i = j;
11024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
11034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            } /* endif */
11044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        } /* next j */
11054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    } /* endif MRDTX */
11064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
11074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /*---- Split-VQ of prediction error ----*/
11084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    if ((mode == MR475) || (mode == MR515))
11094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {   /* MR475, MR515 */
11104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
11114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        *indice =
11124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            Vq_subvec3(
11134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                lsf_r1,
11144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                dico1_lsf_3,
11154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                wf1,
11164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                DICO1_SIZE,
11174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                0,
11184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                pOverflow);
11194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
11204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        *(indice + 1) =
11214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            Vq_subvec3(
11224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                lsf_r1 + 3,
11234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                dico2_lsf_3,
11244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                wf1 + 3,
11254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                DICO2_SIZE / 2,
11264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                1,
11274f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                pOverflow);
11284f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
11294f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        *(indice + 2) =
11304f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            Vq_subvec4(
11314f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                lsf_r1 + 6,
11324f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                mr515_3_lsf,
11334f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                wf1 + 6,
11344f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                MR515_3_SIZE,
11354f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                pOverflow);
11364f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
11374f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
11384f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    else if (mode == MR795)
11394f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {   /* MR795 */
11404f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
11414f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        *indice =
11424f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            Vq_subvec3(
11434f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                lsf_r1,
11444f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                mr795_1_lsf,
11454f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                wf1,
11464f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                MR795_1_SIZE,
11474f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                0,
11484f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                pOverflow);
11494f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
11504f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        *(indice + 1) =
11514f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            Vq_subvec3(
11524f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                lsf_r1 + 3,
11534f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                dico2_lsf_3,
11544f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                wf1 + 3,
11554f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                DICO2_SIZE,
11564f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                0,
11574f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                pOverflow);
11584f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
11594f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        *(indice + 2) =
11604f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            Vq_subvec4(
11614f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                lsf_r1 + 6,
11624f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                dico3_lsf_3,
11634f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                wf1 + 6,
11644f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                DICO3_SIZE,
11654f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                pOverflow);
11664f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
11674f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
11684f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    else
11694f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {   /* MR59, MR67, MR74, MR102 , MRDTX */
11704f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
11714f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        *indice =
11724f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            Vq_subvec3(
11734f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                lsf_r1,
11744f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                dico1_lsf_3,
11754f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                wf1,
11764f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                DICO1_SIZE,
11774f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                0,
11784f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                pOverflow);
11794f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
11804f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        *(indice + 1) =
11814f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            Vq_subvec3(
11824f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                lsf_r1 + 3,
11834f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                dico2_lsf_3,
11844f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                wf1 + 3,
11854f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                DICO2_SIZE,
11864f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                0,
11874f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                pOverflow);
11884f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
11894f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        *(indice + 2) =
11904f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber            Vq_subvec4(
11914f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                lsf_r1 + 6,
11924f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                dico3_lsf_3,
11934f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                wf1 + 6,
11944f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                DICO3_SIZE,
11954f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber                pOverflow);
11964f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
11974f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
11984f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
11994f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
12004f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* Compute quantized LSFs and update the past quantized residual */
12014f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
12024f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    for (i = 0; i < M; i++)
12034f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    {
12044f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        *(lsf1_q + i) = *(lsf_r1 + i) + *(lsf_p + i);
12054f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        st->past_rq[i] = *(lsf_r1 + i);
12064f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    }
12074f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
12084f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /* verification that LSFs has mimimum distance of LSF_GAP Hz */
12094f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
12104f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Reorder_lsf(
12114f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        lsf1_q,
12124f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        LSF_GAP,
12134f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        M,
12144f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        pOverflow);
12154f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
12164f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    /*  convert LSFs to the cosine domain */
12174f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
12184f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    Lsf_lsp(
12194f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        lsf1_q,
12204f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        lsp1_q,
12214f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        M,
12224f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber        pOverflow);
12234f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
12244f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber    return;
12254f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber
12264f1efc098cb5791c3e9f483f2af84aef70d2d0a0Andreas Huber}
1227