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( 395d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 * x, /* input : ISF residual vector */ 405d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 * dico, /* input : quantization codebook */ 415d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 dim, /* input : dimention of vector */ 425d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 dico_size, /* input : size of quantization codebook */ 435d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 * index, /* output: indices of survivors */ 445d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 surv /* input : number of survivor */ 455d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen ); 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( 575d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 * isf1, /* (i) Q15 : ISF in the frequency domain (0..0.5) */ 585d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 * isf_q, /* (o) Q15 : quantized ISF (0..0.5) */ 595d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 * past_isfq, /* (io)Q15 : past ISF quantizer */ 605d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 * indice, /* (o) : quantization indices */ 615d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 nb_surv /* (i) : number of survivor (1, 2, 3 or 4) */ 625d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen ) 63e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 645d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 tmp_ind[5]; 655d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 surv1[N_SURV_MAX]; /* indices of survivors from 1st stage */ 665d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word32 i, k, temp, min_err, distance; 675d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 isf[ORDER]; 685d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 isf_stage2[ORDER]; 695d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 705d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen for (i = 0; i < ORDER; i++) 715d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 725d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen isf[i] = vo_sub(isf1[i], mean_isf[i]); 735d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen isf[i] = vo_sub(isf[i], vo_mult(MU, past_isfq[i])); 745d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 755d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 765d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen VQ_stage1(&isf[0], dico1_isf, 9, SIZE_BK1, surv1, nb_surv); 775d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 785d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen distance = MAX_32; 795d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 805d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen for (k = 0; k < nb_surv; k++) 815d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 825d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen for (i = 0; i < 9; i++) 835d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 845d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen isf_stage2[i] = vo_sub(isf[i], dico1_isf[i + surv1[k] * 9]); 855d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 865d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen tmp_ind[0] = Sub_VQ(&isf_stage2[0], dico21_isf, 3, SIZE_BK21, &min_err); 875d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen temp = min_err; 885d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen tmp_ind[1] = Sub_VQ(&isf_stage2[3], dico22_isf, 3, SIZE_BK22, &min_err); 895d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen temp = vo_L_add(temp, min_err); 905d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen tmp_ind[2] = Sub_VQ(&isf_stage2[6], dico23_isf, 3, SIZE_BK23, &min_err); 915d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen temp = vo_L_add(temp, min_err); 925d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 935d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen if(temp < distance) 945d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 955d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen distance = temp; 965d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen indice[0] = surv1[k]; 975d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen for (i = 0; i < 3; i++) 985d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 995d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen indice[i + 2] = tmp_ind[i]; 1005d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 1015d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 1025d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 1035d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 1045d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 1055d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen VQ_stage1(&isf[9], dico2_isf, 7, SIZE_BK2, surv1, nb_surv); 1065d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 1075d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen distance = MAX_32; 1085d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 1095d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen for (k = 0; k < nb_surv; k++) 1105d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 1115d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen for (i = 0; i < 7; i++) 1125d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 1135d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen isf_stage2[i] = vo_sub(isf[9 + i], dico2_isf[i + surv1[k] * 7]); 1145d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 1155d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 1165d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen tmp_ind[0] = Sub_VQ(&isf_stage2[0], dico24_isf, 3, SIZE_BK24, &min_err); 1175d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen temp = min_err; 1185d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen tmp_ind[1] = Sub_VQ(&isf_stage2[3], dico25_isf, 4, SIZE_BK25, &min_err); 1195d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen temp = vo_L_add(temp, min_err); 1205d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 1215d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen if(temp < distance) 1225d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 1235d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen distance = temp; 1245d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen indice[1] = surv1[k]; 1255d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen for (i = 0; i < 2; i++) 1265d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 1275d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen indice[i + 5] = tmp_ind[i]; 1285d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 1295d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 1305d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 1315d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 1325d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Dpisf_2s_46b(indice, isf_q, past_isfq, isf_q, isf_q, 0, 0); 1335d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 1345d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 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( 1475d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 * isf1, /* (i) Q15 : ISF in the frequency domain (0..0.5) */ 1485d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 * isf_q, /* (o) Q15 : quantized ISF (0..0.5) */ 1495d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 * past_isfq, /* (io)Q15 : past ISF quantizer */ 1505d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 * indice, /* (o) : quantization indices */ 1515d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 nb_surv /* (i) : number of survivor (1, 2, 3 or 4) */ 1525d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen ) 153e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 1545d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 i, k, tmp_ind[5]; 1555d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 surv1[N_SURV_MAX]; /* indices of survivors from 1st stage */ 1565d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word32 temp, min_err, distance; 1575d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 isf[ORDER]; 1585d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 isf_stage2[ORDER]; 1595d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 1605d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen for (i = 0; i < ORDER; i++) 1615d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 1625d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen isf[i] = vo_sub(isf1[i], mean_isf[i]); 1635d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen isf[i] = vo_sub(isf[i], vo_mult(MU, past_isfq[i])); 1645d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 1655d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 1665d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen VQ_stage1(&isf[0], dico1_isf, 9, SIZE_BK1, surv1, nb_surv); 1675d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 1685d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen distance = MAX_32; 1695d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 1705d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen for (k = 0; k < nb_surv; k++) 1715d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 1725d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen for (i = 0; i < 9; i++) 1735d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 1745d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen isf_stage2[i] = vo_sub(isf[i], dico1_isf[i + surv1[k] * 9]); 1755d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 1765d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 1775d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen tmp_ind[0] = Sub_VQ(&isf_stage2[0], dico21_isf_36b, 5, SIZE_BK21_36b, &min_err); 1785d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen temp = min_err; 1795d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen tmp_ind[1] = Sub_VQ(&isf_stage2[5], dico22_isf_36b, 4, SIZE_BK22_36b, &min_err); 1805d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen temp = vo_L_add(temp, min_err); 1815d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 1825d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen if(temp < distance) 1835d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 1845d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen distance = temp; 1855d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen indice[0] = surv1[k]; 1865d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen for (i = 0; i < 2; i++) 1875d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 1885d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen indice[i + 2] = tmp_ind[i]; 1895d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 1905d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 1915d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 1925d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 1935d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen VQ_stage1(&isf[9], dico2_isf, 7, SIZE_BK2, surv1, nb_surv); 1945d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen distance = MAX_32; 1955d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 1965d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen for (k = 0; k < nb_surv; k++) 1975d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 1985d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen for (i = 0; i < 7; i++) 1995d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 2005d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen isf_stage2[i] = vo_sub(isf[9 + i], dico2_isf[i + surv1[k] * 7]); 2015d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 2025d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 2035d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen tmp_ind[0] = Sub_VQ(&isf_stage2[0], dico23_isf_36b, 7, SIZE_BK23_36b, &min_err); 2045d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen temp = min_err; 2055d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 2065d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen if(temp < distance) 2075d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 2085d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen distance = temp; 2095d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen indice[1] = surv1[k]; 2105d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen indice[4] = tmp_ind[0]; 2115d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 2125d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 2135d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 2145d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Dpisf_2s_36b(indice, isf_q, past_isfq, isf_q, isf_q, 0, 0); 2155d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 2165d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 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( 2265d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 * indice, /* input: quantization indices */ 2275d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 * isf_q, /* output: quantized ISF in frequency domain (0..0.5) */ 2285d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 * past_isfq, /* i/0 : past ISF quantizer */ 2295d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 * isfold, /* input : past quantized ISF */ 2305d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 * isf_buf, /* input : isf buffer */ 2315d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 bfi, /* input : Bad frame indicator */ 2325d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 enc_dec 2335d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen ) 234e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 2355d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 ref_isf[M], tmp; 2365d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word32 i, j, L_tmp; 2375d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 2385d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen if (bfi == 0) /* Good frame */ 2395d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 2405d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen for (i = 0; i < 9; i++) 2415d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 2425d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen isf_q[i] = dico1_isf[indice[0] * 9 + i]; 2435d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 2445d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen for (i = 0; i < 7; i++) 2455d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 2465d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen isf_q[i + 9] = dico2_isf[indice[1] * 7 + i]; 2475d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 2485d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 2495d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen for (i = 0; i < 3; i++) 2505d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 2515d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen isf_q[i] = add1(isf_q[i], dico21_isf[indice[2] * 3 + i]); 2525d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen isf_q[i + 3] = add1(isf_q[i + 3], dico22_isf[indice[3] * 3 + i]); 2535d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen isf_q[i + 6] = add1(isf_q[i + 6], dico23_isf[indice[4] * 3 + i]); 2545d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen isf_q[i + 9] = add1(isf_q[i + 9], dico24_isf[indice[5] * 3 + i]); 2555d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 2565d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 2575d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen for (i = 0; i < 4; i++) 2585d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 2595d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen isf_q[i + 12] = add1(isf_q[i + 12], dico25_isf[indice[6] * 4 + i]); 2605d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 2615d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 2625d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen for (i = 0; i < ORDER; i++) 2635d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 2645d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen tmp = isf_q[i]; 2655d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen isf_q[i] = add1(tmp, mean_isf[i]); 2665d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen isf_q[i] = add1(isf_q[i], vo_mult(MU, past_isfq[i])); 2675d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen past_isfq[i] = tmp; 2685d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 2695d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 2705d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen if (enc_dec) 2715d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 2725d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen for (i = 0; i < M; i++) 2735d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 2745d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen for (j = (L_MEANBUF - 1); j > 0; j--) 2755d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 2765d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen isf_buf[j * M + i] = isf_buf[(j - 1) * M + i]; 2775d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 2785d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen isf_buf[i] = isf_q[i]; 2795d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 2805d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 2815d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } else 2825d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { /* bad frame */ 2835d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen for (i = 0; i < M; i++) 2845d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 2855d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_tmp = mean_isf[i] << 14; 2865d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen for (j = 0; j < L_MEANBUF; j++) 2875d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 2885d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_tmp += (isf_buf[j * M + i] << 14); 2895d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 2905d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen ref_isf[i] = vo_round(L_tmp); 2915d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 2925d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 2935d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen /* use the past ISFs slightly shifted towards their mean */ 2945d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen for (i = 0; i < ORDER; i++) 2955d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 2965d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen isf_q[i] = add1(vo_mult(ALPHA, isfold[i]), vo_mult(ONE_ALPHA, ref_isf[i])); 2975d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 2985d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 2995d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen /* estimate past quantized residual to be used in next frame */ 3005d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen for (i = 0; i < ORDER; i++) 3015d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 3025d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen tmp = add1(ref_isf[i], vo_mult(past_isfq[i], MU)); /* predicted ISF */ 3035d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen past_isfq[i] = vo_sub(isf_q[i], tmp); 3045d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen past_isfq[i] = (past_isfq[i] >> 1); /* past_isfq[i] *= 0.5 */ 3055d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 3065d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 3075d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 3085d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Reorder_isf(isf_q, ISF_GAP, ORDER); 3095d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 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( 3195d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 * indice, /* input: quantization indices */ 3205d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 * isf_q, /* output: quantized ISF in frequency domain (0..0.5) */ 3215d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 * past_isfq, /* i/0 : past ISF quantizer */ 3225d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 * isfold, /* input : past quantized ISF */ 3235d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 * isf_buf, /* input : isf buffer */ 3245d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 bfi, /* input : Bad frame indicator */ 3255d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 enc_dec 3265d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen ) 327e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 3285d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 ref_isf[M], tmp; 3295d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word32 i, j, L_tmp; 3305d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 3315d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen if (bfi == 0) /* Good frame */ 3325d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 3335d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen for (i = 0; i < 9; i++) 3345d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 3355d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen isf_q[i] = dico1_isf[indice[0] * 9 + i]; 3365d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 3375d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen for (i = 0; i < 7; i++) 3385d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 3395d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen isf_q[i + 9] = dico2_isf[indice[1] * 7 + i]; 3405d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 3415d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 3425d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen for (i = 0; i < 5; i++) 3435d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 3445d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen isf_q[i] = add1(isf_q[i], dico21_isf_36b[indice[2] * 5 + i]); 3455d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 3465d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen for (i = 0; i < 4; i++) 3475d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 3485d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen isf_q[i + 5] = add1(isf_q[i + 5], dico22_isf_36b[indice[3] * 4 + i]); 3495d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 3505d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen for (i = 0; i < 7; i++) 3515d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 3525d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen isf_q[i + 9] = add1(isf_q[i + 9], dico23_isf_36b[indice[4] * 7 + i]); 3535d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 3545d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 3555d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen for (i = 0; i < ORDER; i++) 3565d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 3575d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen tmp = isf_q[i]; 3585d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen isf_q[i] = add1(tmp, mean_isf[i]); 3595d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen isf_q[i] = add1(isf_q[i], vo_mult(MU, past_isfq[i])); 3605d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen past_isfq[i] = tmp; 3615d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 3625d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 3635d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 3645d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen if (enc_dec) 3655d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 3665d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen for (i = 0; i < M; i++) 3675d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 3685d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen for (j = (L_MEANBUF - 1); j > 0; j--) 3695d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 3705d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen isf_buf[j * M + i] = isf_buf[(j - 1) * M + i]; 3715d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 3725d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen isf_buf[i] = isf_q[i]; 3735d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 3745d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 3755d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } else 3765d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { /* bad frame */ 3775d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen for (i = 0; i < M; i++) 3785d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 3795d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_tmp = (mean_isf[i] << 14); 3805d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen for (j = 0; j < L_MEANBUF; j++) 3815d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 3825d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_tmp += (isf_buf[j * M + i] << 14); 3835d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 3845d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen ref_isf[i] = vo_round(L_tmp); 3855d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 3865d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 3875d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen /* use the past ISFs slightly shifted towards their mean */ 3885d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen for (i = 0; i < ORDER; i++) 3895d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 3905d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen isf_q[i] = add1(vo_mult(ALPHA, isfold[i]), vo_mult(ONE_ALPHA, ref_isf[i])); 3915d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 3925d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 3935d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen /* estimate past quantized residual to be used in next frame */ 3945d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen for (i = 0; i < ORDER; i++) 3955d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 3965d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen tmp = add1(ref_isf[i], vo_mult(past_isfq[i], MU)); /* predicted ISF */ 3975d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen past_isfq[i] = vo_sub(isf_q[i], tmp); 3985d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen past_isfq[i] = past_isfq[i] >> 1; /* past_isfq[i] *= 0.5 */ 3995d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 4005d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 4015d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 4025d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Reorder_isf(isf_q, ISF_GAP, ORDER); 4035d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 4045d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 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( 4225d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 * isf, /* (i/o) Q15: ISF in the frequency domain (0..0.5) */ 4235d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 min_dist, /* (i) Q15 : minimum distance to keep */ 4245d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 n /* (i) : number of ISF */ 4255d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen ) 426e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 4275d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word32 i; 4285d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 isf_min; 4295d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 4305d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen isf_min = min_dist; 4315d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen for (i = 0; i < n - 1; i++) 4325d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 4335d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen if(isf[i] < isf_min) 4345d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 4355d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen isf[i] = isf_min; 4365d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 4375d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen isf_min = (isf[i] + min_dist); 4385d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 4395d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen return; 440e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 441e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 442e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 443e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardWord16 Sub_VQ( /* output: return quantization index */ 4445d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 * x, /* input : ISF residual vector */ 4455d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 * dico, /* input : quantization codebook */ 4465d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 dim, /* input : dimention of vector */ 4475d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 dico_size, /* input : size of quantization codebook */ 4485d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word32 * distance /* output: error of quantization */ 4495d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen ) 450e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 4515d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 temp, *p_dico; 4525d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word32 i, j, index; 4535d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word32 dist_min, dist; 4545d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 4555d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen dist_min = MAX_32; 4565d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen p_dico = dico; 4575d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 4585d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen index = 0; 4595d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen for (i = 0; i < dico_size; i++) 4605d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 4615d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen dist = 0; 4625d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 4635d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen for (j = 0; j < dim; j++) 4645d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 4655d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen temp = x[j] - (*p_dico++); 4665d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen dist += (temp * temp)<<1; 4675d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 4685d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 4695d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen if(dist < dist_min) 4705d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 4715d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen dist_min = dist; 4725d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen index = i; 4735d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 4745d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 4755d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 4765d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen *distance = dist_min; 4775d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 4785d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen /* Reading the selected vector */ 4795d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen p_dico = &dico[index * dim]; 4805d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen for (j = 0; j < dim; j++) 4815d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 4825d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen x[j] = *p_dico++; 4835d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 4845d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 4855d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen return index; 486e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 487e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 488e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 489e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic void VQ_stage1( 4905d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 * x, /* input : ISF residual vector */ 4915d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 * dico, /* input : quantization codebook */ 4925d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 dim, /* input : dimention of vector */ 4935d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 dico_size, /* input : size of quantization codebook */ 4945d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 * index, /* output: indices of survivors */ 4955d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 surv /* input : number of survivor */ 4965d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen ) 497e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 4985d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 temp, *p_dico; 4995d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word32 i, j, k, l; 5005d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word32 dist_min[N_SURV_MAX], dist; 5015d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 5025d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen dist_min[0] = MAX_32; 5035d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen dist_min[1] = MAX_32; 5045d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen dist_min[2] = MAX_32; 5055d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen dist_min[3] = MAX_32; 5065d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen index[0] = 0; 5075d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen index[1] = 1; 5085d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen index[2] = 2; 5095d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen index[3] = 3; 5105d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 5115d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen p_dico = dico; 5125d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 5135d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen for (i = 0; i < dico_size; i++) 5145d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 5155d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen dist = 0; 5165d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen for (j = 0; j < dim; j++) 5175d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 5185d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen temp = x[j] - (*p_dico++); 5195d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen dist += (temp * temp)<<1; 5205d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 5215d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 5225d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen for (k = 0; k < surv; k++) 5235d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 5245d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen if(dist < dist_min[k]) 5255d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 5265d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen for (l = surv - 1; l > k; l--) 5275d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 5285d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen dist_min[l] = dist_min[l - 1]; 5295d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen index[l] = index[l - 1]; 5305d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 5315d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen dist_min[k] = dist; 5325d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen index[k] = i; 5335d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen break; 5345d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 5355d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 5365d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 5375d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen return; 538e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 539e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 540e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 541e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 542e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 543