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