1e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/* 2e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** Copyright 2003-2010, VisualOn, Inc. 3e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** 4e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** Licensed under the Apache License, Version 2.0 (the "License"); 5e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** you may not use this file except in compliance with the License. 6e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** You may obtain a copy of the License at 7e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** 8e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** http://www.apache.org/licenses/LICENSE-2.0 9e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** 10e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** Unless required by applicable law or agreed to in writing, software 11e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** distributed under the License is distributed on an "AS IS" BASIS, 12e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** See the License for the specific language governing permissions and 14e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** limitations under the License. 15e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard */ 16e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 17e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*********************************************************************** 18e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* File: apisf_2s.c * 19e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* * 20e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* Description: Coding/Decodeing of ISF parameters with predication 21e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* The ISF vector is quantized using two-stage VQ with split-by-2 * 22e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* in 1st stage and split-by-5(or 3) in the second stage * 23e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* * 24e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard************************************************************************/ 25e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 26e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "typedef.h" 27e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "basic_op.h" 28e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "cnst.h" 29e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "acelp.h" 30e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "qpisf_2s.tab" /* Codebooks of isfs */ 31e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 32e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define MU 10923 /* Prediction factor (1.0/3.0) in Q15 */ 33e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define N_SURV_MAX 4 /* 4 survivors max */ 34e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define ALPHA 29491 /* 0. 9 in Q15 */ 35e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define ONE_ALPHA (32768-ALPHA) /* (1.0 - ALPHA) in Q15 */ 36e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 37e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/* private functions */ 38e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic void VQ_stage1( 39e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 * x, /* input : ISF residual vector */ 40e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 * dico, /* input : quantization codebook */ 41e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 dim, /* input : dimention of vector */ 42e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 dico_size, /* input : size of quantization codebook */ 43e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 * index, /* output: indices of survivors */ 44e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 surv /* input : number of survivor */ 45e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ); 46e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 47e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/************************************************************************** 48e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* Function: Qpisf_2s_46B() * 49e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* * 50e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* Description: Quantization of isf parameters with prediction. (46 bits) * 51e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* * 52e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* The isf vector is quantized using two-stage VQ with split-by-2 in * 53e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* 1st stage and split-by-5 in the second stage. * 54e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard***************************************************************************/ 55e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 56e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardvoid Qpisf_2s_46b( 57e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 * isf1, /* (i) Q15 : ISF in the frequency domain (0..0.5) */ 58e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 * isf_q, /* (o) Q15 : quantized ISF (0..0.5) */ 59e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 * past_isfq, /* (io)Q15 : past ISF quantizer */ 60e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 * indice, /* (o) : quantization indices */ 61e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 nb_surv /* (i) : number of survivor (1, 2, 3 or 4) */ 62e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ) 63e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 64e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 tmp_ind[5]; 65e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 surv1[N_SURV_MAX]; /* indices of survivors from 1st stage */ 66e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word32 i, k, temp, min_err, distance; 67e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 isf[ORDER]; 68e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 isf_stage2[ORDER]; 69e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 70e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (i = 0; i < ORDER; i++) 71e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 72e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard isf[i] = vo_sub(isf1[i], mean_isf[i]); 73b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard isf[i] = vo_sub(isf[i], vo_mult(MU, past_isfq[i])); 74e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 75e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 76e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard VQ_stage1(&isf[0], dico1_isf, 9, SIZE_BK1, surv1, nb_surv); 77e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 78b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard distance = MAX_32; 79e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 80e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (k = 0; k < nb_surv; k++) 81e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 82e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (i = 0; i < 9; i++) 83e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 84b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard isf_stage2[i] = vo_sub(isf[i], dico1_isf[i + surv1[k] * 9]); 85e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 86b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard tmp_ind[0] = Sub_VQ(&isf_stage2[0], dico21_isf, 3, SIZE_BK21, &min_err); 87e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard temp = min_err; 88b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard tmp_ind[1] = Sub_VQ(&isf_stage2[3], dico22_isf, 3, SIZE_BK22, &min_err); 89e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard temp = vo_L_add(temp, min_err); 90b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard tmp_ind[2] = Sub_VQ(&isf_stage2[6], dico23_isf, 3, SIZE_BK23, &min_err); 91e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard temp = vo_L_add(temp, min_err); 92e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 93e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if(temp < distance) 94e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 95b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard distance = temp; 96b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard indice[0] = surv1[k]; 97e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (i = 0; i < 3; i++) 98e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 99e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard indice[i + 2] = tmp_ind[i]; 100e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 101e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 102e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 103e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 104e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 105e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard VQ_stage1(&isf[9], dico2_isf, 7, SIZE_BK2, surv1, nb_surv); 106e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 107b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard distance = MAX_32; 108e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 109e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (k = 0; k < nb_surv; k++) 110e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 111e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (i = 0; i < 7; i++) 112e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 113b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard isf_stage2[i] = vo_sub(isf[9 + i], dico2_isf[i + surv1[k] * 7]); 114e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 115e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 116e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard tmp_ind[0] = Sub_VQ(&isf_stage2[0], dico24_isf, 3, SIZE_BK24, &min_err); 117b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard temp = min_err; 118e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard tmp_ind[1] = Sub_VQ(&isf_stage2[3], dico25_isf, 4, SIZE_BK25, &min_err); 119e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard temp = vo_L_add(temp, min_err); 120e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 121e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if(temp < distance) 122e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 123b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard distance = temp; 124b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard indice[1] = surv1[k]; 125e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (i = 0; i < 2; i++) 126e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 127e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard indice[i + 5] = tmp_ind[i]; 128e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 129e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 130e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 131e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 132e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Dpisf_2s_46b(indice, isf_q, past_isfq, isf_q, isf_q, 0, 0); 133e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 134e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return; 135e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 136e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 137e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/***************************************************************************** 138e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* Function: Qpisf_2s_36B() * 139e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* * 140e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* Description: Quantization of isf parameters with prediction. (36 bits) * 141e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* * 142e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* The isf vector is quantized using two-stage VQ with split-by-2 in * 143e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* 1st stage and split-by-3 in the second stage. * 144e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard******************************************************************************/ 145e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 146e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardvoid Qpisf_2s_36b( 147e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 * isf1, /* (i) Q15 : ISF in the frequency domain (0..0.5) */ 148e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 * isf_q, /* (o) Q15 : quantized ISF (0..0.5) */ 149e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 * past_isfq, /* (io)Q15 : past ISF quantizer */ 150e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 * indice, /* (o) : quantization indices */ 151e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 nb_surv /* (i) : number of survivor (1, 2, 3 or 4) */ 152e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ) 153e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 154e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 i, k, tmp_ind[5]; 155e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 surv1[N_SURV_MAX]; /* indices of survivors from 1st stage */ 156e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word32 temp, min_err, distance; 157e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 isf[ORDER]; 158e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 isf_stage2[ORDER]; 159e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 160e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (i = 0; i < ORDER; i++) 161e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 162e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard isf[i] = vo_sub(isf1[i], mean_isf[i]); 163e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard isf[i] = vo_sub(isf[i], vo_mult(MU, past_isfq[i])); 164e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 165e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 166e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard VQ_stage1(&isf[0], dico1_isf, 9, SIZE_BK1, surv1, nb_surv); 167e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 168b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard distance = MAX_32; 169e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 170e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (k = 0; k < nb_surv; k++) 171e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 172e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (i = 0; i < 9; i++) 173e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 174b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard isf_stage2[i] = vo_sub(isf[i], dico1_isf[i + surv1[k] * 9]); 175e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 176e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 177b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard tmp_ind[0] = Sub_VQ(&isf_stage2[0], dico21_isf_36b, 5, SIZE_BK21_36b, &min_err); 178b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard temp = min_err; 179b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard tmp_ind[1] = Sub_VQ(&isf_stage2[5], dico22_isf_36b, 4, SIZE_BK22_36b, &min_err); 180e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard temp = vo_L_add(temp, min_err); 181e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 182e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if(temp < distance) 183e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 184b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard distance = temp; 185b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard indice[0] = surv1[k]; 186e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (i = 0; i < 2; i++) 187e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 188e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard indice[i + 2] = tmp_ind[i]; 189e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 190e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 191e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 192e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 193e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard VQ_stage1(&isf[9], dico2_isf, 7, SIZE_BK2, surv1, nb_surv); 194b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard distance = MAX_32; 195e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 196e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (k = 0; k < nb_surv; k++) 197e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 198e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (i = 0; i < 7; i++) 199e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 200b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard isf_stage2[i] = vo_sub(isf[9 + i], dico2_isf[i + surv1[k] * 7]); 201e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 202e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 203b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard tmp_ind[0] = Sub_VQ(&isf_stage2[0], dico23_isf_36b, 7, SIZE_BK23_36b, &min_err); 204b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard temp = min_err; 205e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 206e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if(temp < distance) 207e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 208b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard distance = temp; 209b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard indice[1] = surv1[k]; 210b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard indice[4] = tmp_ind[0]; 211e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 212e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 213e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 214e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Dpisf_2s_36b(indice, isf_q, past_isfq, isf_q, isf_q, 0, 0); 215e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 216e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return; 217e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 218e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 219e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/********************************************************************* 220e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* Function: Dpisf_2s_46b() * 221e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* * 222e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* Description: Decoding of ISF parameters * 223e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard**********************************************************************/ 224e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 225e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardvoid Dpisf_2s_46b( 226e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 * indice, /* input: quantization indices */ 227e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 * isf_q, /* output: quantized ISF in frequency domain (0..0.5) */ 228e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 * past_isfq, /* i/0 : past ISF quantizer */ 229e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 * isfold, /* input : past quantized ISF */ 230e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 * isf_buf, /* input : isf buffer */ 231e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 bfi, /* input : Bad frame indicator */ 232e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 enc_dec 233e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ) 234e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 235e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 ref_isf[M], tmp; 236e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word32 i, j, L_tmp; 237e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 238e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (bfi == 0) /* Good frame */ 239e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 240e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (i = 0; i < 9; i++) 241e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 242b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard isf_q[i] = dico1_isf[indice[0] * 9 + i]; 243e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 244e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (i = 0; i < 7; i++) 245e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 246b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard isf_q[i + 9] = dico2_isf[indice[1] * 7 + i]; 247e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 248e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 249e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (i = 0; i < 3; i++) 250e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 251b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard isf_q[i] = add1(isf_q[i], dico21_isf[indice[2] * 3 + i]); 252b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard isf_q[i + 3] = add1(isf_q[i + 3], dico22_isf[indice[3] * 3 + i]); 253b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard isf_q[i + 6] = add1(isf_q[i + 6], dico23_isf[indice[4] * 3 + i]); 254b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard isf_q[i + 9] = add1(isf_q[i + 9], dico24_isf[indice[5] * 3 + i]); 255e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 256e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 257e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (i = 0; i < 4; i++) 258e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 259b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard isf_q[i + 12] = add1(isf_q[i + 12], dico25_isf[indice[6] * 4 + i]); 260e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 261e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 262e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (i = 0; i < ORDER; i++) 263e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 264b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard tmp = isf_q[i]; 265b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard isf_q[i] = add1(tmp, mean_isf[i]); 266e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard isf_q[i] = add1(isf_q[i], vo_mult(MU, past_isfq[i])); 267b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard past_isfq[i] = tmp; 268e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 269e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 270e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (enc_dec) 271e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 272e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (i = 0; i < M; i++) 273e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 274e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (j = (L_MEANBUF - 1); j > 0; j--) 275e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 276b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard isf_buf[j * M + i] = isf_buf[(j - 1) * M + i]; 277e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 278b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard isf_buf[i] = isf_q[i]; 279e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 280e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 281e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } else 282e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { /* bad frame */ 283e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (i = 0; i < M; i++) 284e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 285e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_tmp = mean_isf[i] << 14; 286e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (j = 0; j < L_MEANBUF; j++) 287e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 288e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_tmp += (isf_buf[j * M + i] << 14); 289e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 290e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ref_isf[i] = vo_round(L_tmp); 291e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 292e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 293e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /* use the past ISFs slightly shifted towards their mean */ 294e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (i = 0; i < ORDER; i++) 295e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 296b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard isf_q[i] = add1(vo_mult(ALPHA, isfold[i]), vo_mult(ONE_ALPHA, ref_isf[i])); 297e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 298e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 299e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /* estimate past quantized residual to be used in next frame */ 300e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (i = 0; i < ORDER; i++) 301e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 302e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard tmp = add1(ref_isf[i], vo_mult(past_isfq[i], MU)); /* predicted ISF */ 303b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard past_isfq[i] = vo_sub(isf_q[i], tmp); 304e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard past_isfq[i] = (past_isfq[i] >> 1); /* past_isfq[i] *= 0.5 */ 305e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 306e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 307e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 308e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Reorder_isf(isf_q, ISF_GAP, ORDER); 309e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return; 310e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 311e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 312e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/********************************************************************* 313e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* Function: Disf_2s_36b() * 314e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* * 315e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* Description: Decoding of ISF parameters * 316e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*********************************************************************/ 317e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 318e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardvoid Dpisf_2s_36b( 319e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 * indice, /* input: quantization indices */ 320e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 * isf_q, /* output: quantized ISF in frequency domain (0..0.5) */ 321e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 * past_isfq, /* i/0 : past ISF quantizer */ 322e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 * isfold, /* input : past quantized ISF */ 323e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 * isf_buf, /* input : isf buffer */ 324e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 bfi, /* input : Bad frame indicator */ 325e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 enc_dec 326e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ) 327e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 328e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 ref_isf[M], tmp; 329e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word32 i, j, L_tmp; 330e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 331e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (bfi == 0) /* Good frame */ 332e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 333e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (i = 0; i < 9; i++) 334e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 335b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard isf_q[i] = dico1_isf[indice[0] * 9 + i]; 336e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 337e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (i = 0; i < 7; i++) 338e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 339b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard isf_q[i + 9] = dico2_isf[indice[1] * 7 + i]; 340e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 341e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 342e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (i = 0; i < 5; i++) 343e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 344b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard isf_q[i] = add1(isf_q[i], dico21_isf_36b[indice[2] * 5 + i]); 345e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 346e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (i = 0; i < 4; i++) 347e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 348b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard isf_q[i + 5] = add1(isf_q[i + 5], dico22_isf_36b[indice[3] * 4 + i]); 349e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 350e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (i = 0; i < 7; i++) 351e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 352b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard isf_q[i + 9] = add1(isf_q[i + 9], dico23_isf_36b[indice[4] * 7 + i]); 353e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 354e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 355e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (i = 0; i < ORDER; i++) 356e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 357e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard tmp = isf_q[i]; 358b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard isf_q[i] = add1(tmp, mean_isf[i]); 359b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard isf_q[i] = add1(isf_q[i], vo_mult(MU, past_isfq[i])); 360b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard past_isfq[i] = tmp; 361e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 362e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 363e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 364e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (enc_dec) 365e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 366e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (i = 0; i < M; i++) 367e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 368e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (j = (L_MEANBUF - 1); j > 0; j--) 369e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 370b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard isf_buf[j * M + i] = isf_buf[(j - 1) * M + i]; 371e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 372b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard isf_buf[i] = isf_q[i]; 373e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 374e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 375e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } else 376e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { /* bad frame */ 377e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (i = 0; i < M; i++) 378e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 379e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_tmp = (mean_isf[i] << 14); 380e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (j = 0; j < L_MEANBUF; j++) 381e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 382e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard L_tmp += (isf_buf[j * M + i] << 14); 383e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 384b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard ref_isf[i] = vo_round(L_tmp); 385e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 386e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 387e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /* use the past ISFs slightly shifted towards their mean */ 388e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (i = 0; i < ORDER; i++) 389e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 390b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard isf_q[i] = add1(vo_mult(ALPHA, isfold[i]), vo_mult(ONE_ALPHA, ref_isf[i])); 391e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 392e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 393e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /* estimate past quantized residual to be used in next frame */ 394e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (i = 0; i < ORDER; i++) 395e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 396e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard tmp = add1(ref_isf[i], vo_mult(past_isfq[i], MU)); /* predicted ISF */ 397b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard past_isfq[i] = vo_sub(isf_q[i], tmp); 398e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard past_isfq[i] = past_isfq[i] >> 1; /* past_isfq[i] *= 0.5 */ 399e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 400e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 401e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 402e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Reorder_isf(isf_q, ISF_GAP, ORDER); 403e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 404e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return; 405e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 406e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 407e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 408e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*************************************************************************** 409e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* Function: Reorder_isf() * 410e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* * 411e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* Description: To make sure that the isfs are properly order and to * 412e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* keep a certain minimum distance between consecutive isfs. * 413e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*--------------------------------------------------------------------------* 414e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* Argument description in/out * 415e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* * 416e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* isf[] vector of isfs i/o * 417e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* min_dist minimum required distance i * 418e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* n LPC order i * 419e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard****************************************************************************/ 420e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 421e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardvoid Reorder_isf( 422e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 * isf, /* (i/o) Q15: ISF in the frequency domain (0..0.5) */ 423e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 min_dist, /* (i) Q15 : minimum distance to keep */ 424e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 n /* (i) : number of ISF */ 425e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ) 426e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 427b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard Word32 i; 428e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 isf_min; 429e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 430b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard isf_min = min_dist; 431e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (i = 0; i < n - 1; i++) 432e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 433e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if(isf[i] < isf_min) 434e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 435b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard isf[i] = isf_min; 436e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 437e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard isf_min = (isf[i] + min_dist); 438e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 439e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return; 440e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 441e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 442e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 443e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardWord16 Sub_VQ( /* output: return quantization index */ 444e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 * x, /* input : ISF residual vector */ 445e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 * dico, /* input : quantization codebook */ 446e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 dim, /* input : dimention of vector */ 447e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 dico_size, /* input : size of quantization codebook */ 448e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word32 * distance /* output: error of quantization */ 449e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ) 450e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 451e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 temp, *p_dico; 452e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word32 i, j, index; 453e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word32 dist_min, dist; 454e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 455b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard dist_min = MAX_32; 456b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard p_dico = dico; 457e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 458b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard index = 0; 459e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (i = 0; i < dico_size; i++) 460e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 461b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard dist = 0; 462e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 463e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (j = 0; j < dim; j++) 464e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 465e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard temp = x[j] - (*p_dico++); 466e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard dist += (temp * temp)<<1; 467e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 468e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 469e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if(dist < dist_min) 470e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 471b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard dist_min = dist; 472b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard index = i; 473e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 474e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 475e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 476b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard *distance = dist_min; 477e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 478e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /* Reading the selected vector */ 479b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard p_dico = &dico[index * dim]; 480e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (j = 0; j < dim; j++) 481e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 482b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard x[j] = *p_dico++; 483e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 484e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 485e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return index; 486e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 487e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 488e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 489e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic void VQ_stage1( 490e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 * x, /* input : ISF residual vector */ 491e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 * dico, /* input : quantization codebook */ 492e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 dim, /* input : dimention of vector */ 493e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 dico_size, /* input : size of quantization codebook */ 494e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 * index, /* output: indices of survivors */ 495e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 surv /* input : number of survivor */ 496e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ) 497e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 498e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 temp, *p_dico; 499e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word32 i, j, k, l; 500e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word32 dist_min[N_SURV_MAX], dist; 501e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 502e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard dist_min[0] = MAX_32; 503e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard dist_min[1] = MAX_32; 504e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard dist_min[2] = MAX_32; 505e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard dist_min[3] = MAX_32; 506e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard index[0] = 0; 507e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard index[1] = 1; 508e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard index[2] = 2; 509e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard index[3] = 3; 510e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 511b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard p_dico = dico; 512e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 513e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (i = 0; i < dico_size; i++) 514e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 515b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard dist = 0; 516e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (j = 0; j < dim; j++) 517e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 518e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard temp = x[j] - (*p_dico++); 519e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard dist += (temp * temp)<<1; 520e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 521e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 522e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (k = 0; k < surv; k++) 523e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 524e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if(dist < dist_min[k]) 525e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 526e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (l = surv - 1; l > k; l--) 527e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 528b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard dist_min[l] = dist_min[l - 1]; 529b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard index[l] = index[l - 1]; 530e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 531b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard dist_min[k] = dist; 532b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard index[k] = i; 533e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard break; 534e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 535e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 536e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 537e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return; 538e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 539e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 540e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 541e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 542e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 543