1219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard/* 2219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ** Copyright 2003-2010, VisualOn, Inc. 3219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ** 4219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ** Licensed under the Apache License, Version 2.0 (the "License"); 5219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ** you may not use this file except in compliance with the License. 6219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ** You may obtain a copy of the License at 7219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ** 8219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ** http://www.apache.org/licenses/LICENSE-2.0 9219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ** 10219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ** Unless required by applicable law or agreed to in writing, software 11219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ** distributed under the License is distributed on an "AS IS" BASIS, 12219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ** See the License for the specific language governing permissions and 14219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ** limitations under the License. 15219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard */ 16219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 17219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard/*********************************************************************** 18219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard* File: apisf_2s.c * 19219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard* * 20219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard* Description: Coding/Decodeing of ISF parameters with predication 21219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard* The ISF vector is quantized using two-stage VQ with split-by-2 * 22219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard* in 1st stage and split-by-5(or 3) in the second stage * 23219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard* * 24219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard************************************************************************/ 25219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 26219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard#include "typedef.h" 27219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard#include "basic_op.h" 28219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard#include "cnst.h" 29219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard#include "acelp.h" 30219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard#include "qpisf_2s.tab" /* Codebooks of isfs */ 31219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 32219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard#define MU 10923 /* Prediction factor (1.0/3.0) in Q15 */ 33219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard#define N_SURV_MAX 4 /* 4 survivors max */ 34219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard#define ALPHA 29491 /* 0. 9 in Q15 */ 35219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard#define ONE_ALPHA (32768-ALPHA) /* (1.0 - ALPHA) in Q15 */ 36219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 37219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard/* private functions */ 38219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgardstatic void VQ_stage1( 39219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Word16 * x, /* input : ISF residual vector */ 40219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Word16 * dico, /* input : quantization codebook */ 41219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Word16 dim, /* input : dimention of vector */ 42219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Word16 dico_size, /* input : size of quantization codebook */ 43219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Word16 * index, /* output: indices of survivors */ 44219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Word16 surv /* input : number of survivor */ 45219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ); 46219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 47219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard/************************************************************************** 48219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard* Function: Qpisf_2s_46B() * 49219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard* * 50219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard* Description: Quantization of isf parameters with prediction. (46 bits) * 51219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard* * 52219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard* The isf vector is quantized using two-stage VQ with split-by-2 in * 53219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard* 1st stage and split-by-5 in the second stage. * 54219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard***************************************************************************/ 55219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 56219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgardvoid Qpisf_2s_46b( 57219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Word16 * isf1, /* (i) Q15 : ISF in the frequency domain (0..0.5) */ 58219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Word16 * isf_q, /* (o) Q15 : quantized ISF (0..0.5) */ 59219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Word16 * past_isfq, /* (io)Q15 : past ISF quantizer */ 60219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Word16 * indice, /* (o) : quantization indices */ 61219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Word16 nb_surv /* (i) : number of survivor (1, 2, 3 or 4) */ 62219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ) 63219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard{ 64219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Word16 tmp_ind[5]; 65219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Word16 surv1[N_SURV_MAX]; /* indices of survivors from 1st stage */ 66219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Word32 i, k, temp, min_err, distance; 67219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Word16 isf[ORDER]; 68219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Word16 isf_stage2[ORDER]; 69219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 70219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard for (i = 0; i < ORDER; i++) 71219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard { 72219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard isf[i] = vo_sub(isf1[i], mean_isf[i]); 73219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard isf[i] = vo_sub(isf[i], vo_mult(MU, past_isfq[i])); 74219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard } 75219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 76219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard VQ_stage1(&isf[0], dico1_isf, 9, SIZE_BK1, surv1, nb_surv); 77219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 78219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard distance = MAX_32; 79219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 80219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard for (k = 0; k < nb_surv; k++) 81219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard { 82219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard for (i = 0; i < 9; i++) 83219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard { 84219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard isf_stage2[i] = vo_sub(isf[i], dico1_isf[i + surv1[k] * 9]); 85219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard } 86219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard tmp_ind[0] = Sub_VQ(&isf_stage2[0], dico21_isf, 3, SIZE_BK21, &min_err); 87219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard temp = min_err; 88219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard tmp_ind[1] = Sub_VQ(&isf_stage2[3], dico22_isf, 3, SIZE_BK22, &min_err); 89219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard temp = vo_L_add(temp, min_err); 90219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard tmp_ind[2] = Sub_VQ(&isf_stage2[6], dico23_isf, 3, SIZE_BK23, &min_err); 91219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard temp = vo_L_add(temp, min_err); 92219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 93219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard if(temp < distance) 94219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard { 95219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard distance = temp; 96219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard indice[0] = surv1[k]; 97219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard for (i = 0; i < 3; i++) 98219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard { 99219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard indice[i + 2] = tmp_ind[i]; 100219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard } 101219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard } 102219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard } 103219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 104219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 105219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard VQ_stage1(&isf[9], dico2_isf, 7, SIZE_BK2, surv1, nb_surv); 106219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 107219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard distance = MAX_32; 108219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 109219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard for (k = 0; k < nb_surv; k++) 110219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard { 111219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard for (i = 0; i < 7; i++) 112219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard { 113219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard isf_stage2[i] = vo_sub(isf[9 + i], dico2_isf[i + surv1[k] * 7]); 114219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard } 115219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 116219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard tmp_ind[0] = Sub_VQ(&isf_stage2[0], dico24_isf, 3, SIZE_BK24, &min_err); 117219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard temp = min_err; 118219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard tmp_ind[1] = Sub_VQ(&isf_stage2[3], dico25_isf, 4, SIZE_BK25, &min_err); 119219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard temp = vo_L_add(temp, min_err); 120219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 121219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard if(temp < distance) 122219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard { 123219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard distance = temp; 124219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard indice[1] = surv1[k]; 125219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard for (i = 0; i < 2; i++) 126219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard { 127219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard indice[i + 5] = tmp_ind[i]; 128219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard } 129219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard } 130219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard } 131219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 132219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Dpisf_2s_46b(indice, isf_q, past_isfq, isf_q, isf_q, 0, 0); 133219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 134219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard return; 135219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard} 136219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 137219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard/***************************************************************************** 138219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard* Function: Qpisf_2s_36B() * 139219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard* * 140219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard* Description: Quantization of isf parameters with prediction. (36 bits) * 141219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard* * 142219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard* The isf vector is quantized using two-stage VQ with split-by-2 in * 143219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard* 1st stage and split-by-3 in the second stage. * 144219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard******************************************************************************/ 145219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 146219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgardvoid Qpisf_2s_36b( 147219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Word16 * isf1, /* (i) Q15 : ISF in the frequency domain (0..0.5) */ 148219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Word16 * isf_q, /* (o) Q15 : quantized ISF (0..0.5) */ 149219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Word16 * past_isfq, /* (io)Q15 : past ISF quantizer */ 150219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Word16 * indice, /* (o) : quantization indices */ 151219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Word16 nb_surv /* (i) : number of survivor (1, 2, 3 or 4) */ 152219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ) 153219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard{ 154219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Word16 i, k, tmp_ind[5]; 155219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Word16 surv1[N_SURV_MAX]; /* indices of survivors from 1st stage */ 156219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Word32 temp, min_err, distance; 157219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Word16 isf[ORDER]; 158219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Word16 isf_stage2[ORDER]; 159219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 160219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard for (i = 0; i < ORDER; i++) 161219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard { 162219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard isf[i] = vo_sub(isf1[i], mean_isf[i]); 163219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard isf[i] = vo_sub(isf[i], vo_mult(MU, past_isfq[i])); 164219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard } 165219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 166219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard VQ_stage1(&isf[0], dico1_isf, 9, SIZE_BK1, surv1, nb_surv); 167219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 168219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard distance = MAX_32; 169219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 170219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard for (k = 0; k < nb_surv; k++) 171219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard { 172219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard for (i = 0; i < 9; i++) 173219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard { 174219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard isf_stage2[i] = vo_sub(isf[i], dico1_isf[i + surv1[k] * 9]); 175219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard } 176219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 177219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard tmp_ind[0] = Sub_VQ(&isf_stage2[0], dico21_isf_36b, 5, SIZE_BK21_36b, &min_err); 178219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard temp = min_err; 179219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard tmp_ind[1] = Sub_VQ(&isf_stage2[5], dico22_isf_36b, 4, SIZE_BK22_36b, &min_err); 180219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard temp = vo_L_add(temp, min_err); 181219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 182219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard if(temp < distance) 183219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard { 184219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard distance = temp; 185219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard indice[0] = surv1[k]; 186219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard for (i = 0; i < 2; i++) 187219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard { 188219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard indice[i + 2] = tmp_ind[i]; 189219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard } 190219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard } 191219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard } 192219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 193219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard VQ_stage1(&isf[9], dico2_isf, 7, SIZE_BK2, surv1, nb_surv); 194219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard distance = MAX_32; 195219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 196219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard for (k = 0; k < nb_surv; k++) 197219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard { 198219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard for (i = 0; i < 7; i++) 199219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard { 200219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard isf_stage2[i] = vo_sub(isf[9 + i], dico2_isf[i + surv1[k] * 7]); 201219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard } 202219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 203219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard tmp_ind[0] = Sub_VQ(&isf_stage2[0], dico23_isf_36b, 7, SIZE_BK23_36b, &min_err); 204219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard temp = min_err; 205219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 206219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard if(temp < distance) 207219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard { 208219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard distance = temp; 209219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard indice[1] = surv1[k]; 210219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard indice[4] = tmp_ind[0]; 211219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard } 212219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard } 213219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 214219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Dpisf_2s_36b(indice, isf_q, past_isfq, isf_q, isf_q, 0, 0); 215219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 216219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard return; 217219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard} 218219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 219219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard/********************************************************************* 220219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard* Function: Dpisf_2s_46b() * 221219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard* * 222219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard* Description: Decoding of ISF parameters * 223219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard**********************************************************************/ 224219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 225219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgardvoid Dpisf_2s_46b( 226219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Word16 * indice, /* input: quantization indices */ 227219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Word16 * isf_q, /* output: quantized ISF in frequency domain (0..0.5) */ 228219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Word16 * past_isfq, /* i/0 : past ISF quantizer */ 229219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Word16 * isfold, /* input : past quantized ISF */ 230219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Word16 * isf_buf, /* input : isf buffer */ 231219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Word16 bfi, /* input : Bad frame indicator */ 232219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Word16 enc_dec 233219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ) 234219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard{ 235219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Word16 ref_isf[M], tmp; 236219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Word32 i, j, L_tmp; 237219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 238219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard if (bfi == 0) /* Good frame */ 239219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard { 240219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard for (i = 0; i < 9; i++) 241219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard { 242219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard isf_q[i] = dico1_isf[indice[0] * 9 + i]; 243219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard } 244219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard for (i = 0; i < 7; i++) 245219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard { 246219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard isf_q[i + 9] = dico2_isf[indice[1] * 7 + i]; 247219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard } 248219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 249219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard for (i = 0; i < 3; i++) 250219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard { 251219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard isf_q[i] = add1(isf_q[i], dico21_isf[indice[2] * 3 + i]); 252219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard isf_q[i + 3] = add1(isf_q[i + 3], dico22_isf[indice[3] * 3 + i]); 253219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard isf_q[i + 6] = add1(isf_q[i + 6], dico23_isf[indice[4] * 3 + i]); 254219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard isf_q[i + 9] = add1(isf_q[i + 9], dico24_isf[indice[5] * 3 + i]); 255219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard } 256219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 257219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard for (i = 0; i < 4; i++) 258219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard { 259219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard isf_q[i + 12] = add1(isf_q[i + 12], dico25_isf[indice[6] * 4 + i]); 260219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard } 261219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 262219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard for (i = 0; i < ORDER; i++) 263219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard { 264219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard tmp = isf_q[i]; 265219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard isf_q[i] = add1(tmp, mean_isf[i]); 266219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard isf_q[i] = add1(isf_q[i], vo_mult(MU, past_isfq[i])); 267219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard past_isfq[i] = tmp; 268219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard } 269219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 270219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard if (enc_dec) 271219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard { 272219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard for (i = 0; i < M; i++) 273219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard { 274219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard for (j = (L_MEANBUF - 1); j > 0; j--) 275219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard { 276219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard isf_buf[j * M + i] = isf_buf[(j - 1) * M + i]; 277219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard } 278219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard isf_buf[i] = isf_q[i]; 279219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard } 280219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard } 281219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard } else 282219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard { /* bad frame */ 283219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard for (i = 0; i < M; i++) 284219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard { 285219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard L_tmp = mean_isf[i] << 14; 286219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard for (j = 0; j < L_MEANBUF; j++) 287219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard { 288219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard L_tmp += (isf_buf[j * M + i] << 14); 289219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard } 290219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ref_isf[i] = vo_round(L_tmp); 291219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard } 292219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 293219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard /* use the past ISFs slightly shifted towards their mean */ 294219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard for (i = 0; i < ORDER; i++) 295219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard { 296219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard isf_q[i] = add1(vo_mult(ALPHA, isfold[i]), vo_mult(ONE_ALPHA, ref_isf[i])); 297219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard } 298219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 299219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard /* estimate past quantized residual to be used in next frame */ 300219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard for (i = 0; i < ORDER; i++) 301219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard { 302219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard tmp = add1(ref_isf[i], vo_mult(past_isfq[i], MU)); /* predicted ISF */ 303219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard past_isfq[i] = vo_sub(isf_q[i], tmp); 304219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard past_isfq[i] = (past_isfq[i] >> 1); /* past_isfq[i] *= 0.5 */ 305219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard } 306219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard } 307219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 308219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Reorder_isf(isf_q, ISF_GAP, ORDER); 309219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard return; 310219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard} 311219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 312219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard/********************************************************************* 313219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard* Function: Disf_2s_36b() * 314219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard* * 315219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard* Description: Decoding of ISF parameters * 316219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard*********************************************************************/ 317219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 318219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgardvoid Dpisf_2s_36b( 319219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Word16 * indice, /* input: quantization indices */ 320219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Word16 * isf_q, /* output: quantized ISF in frequency domain (0..0.5) */ 321219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Word16 * past_isfq, /* i/0 : past ISF quantizer */ 322219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Word16 * isfold, /* input : past quantized ISF */ 323219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Word16 * isf_buf, /* input : isf buffer */ 324219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Word16 bfi, /* input : Bad frame indicator */ 325219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Word16 enc_dec 326219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ) 327219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard{ 328219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Word16 ref_isf[M], tmp; 329219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Word32 i, j, L_tmp; 330219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 331219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard if (bfi == 0) /* Good frame */ 332219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard { 333219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard for (i = 0; i < 9; i++) 334219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard { 335219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard isf_q[i] = dico1_isf[indice[0] * 9 + i]; 336219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard } 337219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard for (i = 0; i < 7; i++) 338219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard { 339219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard isf_q[i + 9] = dico2_isf[indice[1] * 7 + i]; 340219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard } 341219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 342219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard for (i = 0; i < 5; i++) 343219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard { 344219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard isf_q[i] = add1(isf_q[i], dico21_isf_36b[indice[2] * 5 + i]); 345219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard } 346219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard for (i = 0; i < 4; i++) 347219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard { 348219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard isf_q[i + 5] = add1(isf_q[i + 5], dico22_isf_36b[indice[3] * 4 + i]); 349219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard } 350219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard for (i = 0; i < 7; i++) 351219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard { 352219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard isf_q[i + 9] = add1(isf_q[i + 9], dico23_isf_36b[indice[4] * 7 + i]); 353219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard } 354219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 355219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard for (i = 0; i < ORDER; i++) 356219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard { 357219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard tmp = isf_q[i]; 358219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard isf_q[i] = add1(tmp, mean_isf[i]); 359219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard isf_q[i] = add1(isf_q[i], vo_mult(MU, past_isfq[i])); 360219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard past_isfq[i] = tmp; 361219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard } 362219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 363219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 364219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard if (enc_dec) 365219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard { 366219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard for (i = 0; i < M; i++) 367219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard { 368219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard for (j = (L_MEANBUF - 1); j > 0; j--) 369219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard { 370219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard isf_buf[j * M + i] = isf_buf[(j - 1) * M + i]; 371219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard } 372219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard isf_buf[i] = isf_q[i]; 373219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard } 374219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard } 375219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard } else 376219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard { /* bad frame */ 377219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard for (i = 0; i < M; i++) 378219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard { 379219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard L_tmp = (mean_isf[i] << 14); 380219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard for (j = 0; j < L_MEANBUF; j++) 381219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard { 382219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard L_tmp += (isf_buf[j * M + i] << 14); 383219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard } 384219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ref_isf[i] = vo_round(L_tmp); 385219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard } 386219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 387219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard /* use the past ISFs slightly shifted towards their mean */ 388219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard for (i = 0; i < ORDER; i++) 389219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard { 390219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard isf_q[i] = add1(vo_mult(ALPHA, isfold[i]), vo_mult(ONE_ALPHA, ref_isf[i])); 391219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard } 392219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 393219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard /* estimate past quantized residual to be used in next frame */ 394219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard for (i = 0; i < ORDER; i++) 395219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard { 396219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard tmp = add1(ref_isf[i], vo_mult(past_isfq[i], MU)); /* predicted ISF */ 397219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard past_isfq[i] = vo_sub(isf_q[i], tmp); 398219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard past_isfq[i] = past_isfq[i] >> 1; /* past_isfq[i] *= 0.5 */ 399219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard } 400219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard } 401219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 402219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Reorder_isf(isf_q, ISF_GAP, ORDER); 403219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 404219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard return; 405219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard} 406219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 407219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 408219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard/*************************************************************************** 409219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard* Function: Reorder_isf() * 410219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard* * 411219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard* Description: To make sure that the isfs are properly order and to * 412219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard* keep a certain minimum distance between consecutive isfs. * 413219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard*--------------------------------------------------------------------------* 414219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard* Argument description in/out * 415219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard* * 416219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard* isf[] vector of isfs i/o * 417219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard* min_dist minimum required distance i * 418219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard* n LPC order i * 419219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard****************************************************************************/ 420219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 421219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgardvoid Reorder_isf( 422219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Word16 * isf, /* (i/o) Q15: ISF in the frequency domain (0..0.5) */ 423219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Word16 min_dist, /* (i) Q15 : minimum distance to keep */ 424219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Word16 n /* (i) : number of ISF */ 425219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ) 426219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard{ 427219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Word32 i; 428219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Word16 isf_min; 429219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 430219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard isf_min = min_dist; 431219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard for (i = 0; i < n - 1; i++) 432219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard { 433219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard if(isf[i] < isf_min) 434219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard { 435219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard isf[i] = isf_min; 436219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard } 437219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard isf_min = (isf[i] + min_dist); 438219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard } 439219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard return; 440219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard} 441219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 442219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 443219e2627f1e062c10645664b0d2470d4dfaf5083Mans RullgardWord16 Sub_VQ( /* output: return quantization index */ 444219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Word16 * x, /* input : ISF residual vector */ 445219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Word16 * dico, /* input : quantization codebook */ 446219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Word16 dim, /* input : dimention of vector */ 447219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Word16 dico_size, /* input : size of quantization codebook */ 448219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Word32 * distance /* output: error of quantization */ 449219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ) 450219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard{ 451219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Word16 temp, *p_dico; 452219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Word32 i, j, index; 453219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Word32 dist_min, dist; 454219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 455219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard dist_min = MAX_32; 456219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard p_dico = dico; 457219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 458219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard index = 0; 459219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard for (i = 0; i < dico_size; i++) 460219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard { 461219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard dist = 0; 462219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 463219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard for (j = 0; j < dim; j++) 464219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard { 465219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard temp = x[j] - (*p_dico++); 466219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard dist += (temp * temp)<<1; 467219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard } 468219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 469219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard if(dist < dist_min) 470219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard { 471219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard dist_min = dist; 472219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard index = i; 473219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard } 474219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard } 475219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 476219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard *distance = dist_min; 477219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 478219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard /* Reading the selected vector */ 479219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard p_dico = &dico[index * dim]; 480219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard for (j = 0; j < dim; j++) 481219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard { 482219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard x[j] = *p_dico++; 483219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard } 484219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 485219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard return index; 486219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard} 487219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 488219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 489219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgardstatic void VQ_stage1( 490219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Word16 * x, /* input : ISF residual vector */ 491219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Word16 * dico, /* input : quantization codebook */ 492219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Word16 dim, /* input : dimention of vector */ 493219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Word16 dico_size, /* input : size of quantization codebook */ 494219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Word16 * index, /* output: indices of survivors */ 495219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Word16 surv /* input : number of survivor */ 496219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ) 497219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard{ 498219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Word16 temp, *p_dico; 499219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Word32 i, j, k, l; 500219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard Word32 dist_min[N_SURV_MAX], dist; 501219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 502219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard dist_min[0] = MAX_32; 503219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard dist_min[1] = MAX_32; 504219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard dist_min[2] = MAX_32; 505219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard dist_min[3] = MAX_32; 506219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard index[0] = 0; 507219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard index[1] = 1; 508219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard index[2] = 2; 509219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard index[3] = 3; 510219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 511219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard p_dico = dico; 512219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 513219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard for (i = 0; i < dico_size; i++) 514219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard { 515219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard dist = 0; 516219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard for (j = 0; j < dim; j++) 517219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard { 518219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard temp = x[j] - (*p_dico++); 519219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard dist += (temp * temp)<<1; 520219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard } 521219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 522219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard for (k = 0; k < surv; k++) 523219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard { 524219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard if(dist < dist_min[k]) 525219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard { 526219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard for (l = surv - 1; l > k; l--) 527219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard { 528219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard dist_min[l] = dist_min[l - 1]; 529219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard index[l] = index[l - 1]; 530219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard } 531219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard dist_min[k] = dist; 532219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard index[k] = i; 533219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard break; 534219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard } 535219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard } 536219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard } 537219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard return; 538219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard} 539219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 540219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 541219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 542219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard 543