134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)/* Copyright (C) 2002 Jean-Marc Valin 234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) File: quant_lsp.c 334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) LSP vector quantization 434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) Redistribution and use in source and binary forms, with or without 634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) modification, are permitted provided that the following conditions 734680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) are met: 834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) - Redistributions of source code must retain the above copyright 1034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) notice, this list of conditions and the following disclaimer. 1134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 1234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) - Redistributions in binary form must reproduce the above copyright 1334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) notice, this list of conditions and the following disclaimer in the 1434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) documentation and/or other materials provided with the distribution. 1534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 1634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) - Neither the name of the Xiph.org Foundation nor the names of its 1734680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) contributors may be used to endorse or promote products derived from 1834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) this software without specific prior written permission. 1934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 2034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 2134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR 2434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 2534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 2634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 2734680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 2834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 2934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 3034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)*/ 3234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 3334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)#ifdef HAVE_CONFIG_H 3434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)#include "config.h" 3534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)#endif 3634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 3734680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)#include "quant_lsp.h" 3834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)#include "os_support.h" 3934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)#include <math.h> 4034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)#ifndef M_PI 4134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)#define M_PI 3.14159265358979323846 4234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)#endif 4334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 4434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)#include "arch.h" 4534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 4634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)#ifdef BFIN_ASM 4734680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)#include "quant_lsp_bfin.h" 4834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)#endif 4934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 5034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)#ifdef FIXED_POINT 5134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 5234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)#define LSP_LINEAR(i) (SHL16(i+1,11)) 5334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)#define LSP_LINEAR_HIGH(i) (ADD16(MULT16_16_16(i,2560),6144)) 5434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)#define LSP_DIV_256(x) (SHL16((spx_word16_t)x, 5)) 5534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)#define LSP_DIV_512(x) (SHL16((spx_word16_t)x, 4)) 5634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)#define LSP_DIV_1024(x) (SHL16((spx_word16_t)x, 3)) 5734680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)#define LSP_PI 25736 5834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 5934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)#else 6034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 6134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)#define LSP_LINEAR(i) (.25*(i)+.25) 6234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)#define LSP_LINEAR_HIGH(i) (.3125*(i)+.75) 6334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)#define LSP_SCALE 256. 6434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)#define LSP_DIV_256(x) (0.0039062*(x)) 6534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)#define LSP_DIV_512(x) (0.0019531*(x)) 6634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)#define LSP_DIV_1024(x) (0.00097656*(x)) 6734680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)#define LSP_PI M_PI 6834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 6934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)#endif 7034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 7134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)static void compute_quant_weights(spx_lsp_t *qlsp, spx_word16_t *quant_weight, int order) 7234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles){ 7334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) int i; 7434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) spx_word16_t tmp1, tmp2; 7534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) for (i=0;i<order;i++) 7634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) { 7734680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) if (i==0) 7834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) tmp1 = qlsp[i]; 7934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) else 8034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) tmp1 = qlsp[i]-qlsp[i-1]; 8134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) if (i==order-1) 8234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) tmp2 = LSP_PI-qlsp[i]; 8334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) else 8434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) tmp2 = qlsp[i+1]-qlsp[i]; 8534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) if (tmp2<tmp1) 8634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) tmp1 = tmp2; 8734680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)#ifdef FIXED_POINT 8834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) quant_weight[i] = DIV32_16(81920,ADD16(300,tmp1)); 8934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)#else 9034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) quant_weight[i] = 10/(.04+tmp1); 9134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)#endif 9234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) } 9334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 9434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)} 9534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 9634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)/* Note: x is modified*/ 9734680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)#ifndef OVERRIDE_LSP_QUANT 9834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)static int lsp_quant(spx_word16_t *x, const signed char *cdbk, int nbVec, int nbDim) 9934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles){ 10034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) int i,j; 10134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) spx_word32_t dist; 10234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) spx_word16_t tmp; 10334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) spx_word32_t best_dist=VERY_LARGE32; 10434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) int best_id=0; 10534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) const signed char *ptr=cdbk; 10634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) for (i=0;i<nbVec;i++) 10734680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) { 10834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) dist=0; 10934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) for (j=0;j<nbDim;j++) 11034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) { 11134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) tmp=SUB16(x[j],SHL16((spx_word16_t)*ptr++,5)); 11234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) dist=MAC16_16(dist,tmp,tmp); 11334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) } 11434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) if (dist<best_dist) 11534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) { 11634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) best_dist=dist; 11734680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) best_id=i; 11834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) } 11934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) } 12034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 12134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) for (j=0;j<nbDim;j++) 12234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) x[j] = SUB16(x[j],SHL16((spx_word16_t)cdbk[best_id*nbDim+j],5)); 12334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 12434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) return best_id; 12534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)} 12634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)#endif 12734680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 12834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)/* Note: x is modified*/ 12934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)#ifndef OVERRIDE_LSP_WEIGHT_QUANT 13034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)static int lsp_weight_quant(spx_word16_t *x, spx_word16_t *weight, const signed char *cdbk, int nbVec, int nbDim) 13134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles){ 13234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) int i,j; 13334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) spx_word32_t dist; 13434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) spx_word16_t tmp; 13534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) spx_word32_t best_dist=VERY_LARGE32; 13634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) int best_id=0; 13734680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) const signed char *ptr=cdbk; 13834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) for (i=0;i<nbVec;i++) 13934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) { 14034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) dist=0; 14134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) for (j=0;j<nbDim;j++) 14234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) { 14334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) tmp=SUB16(x[j],SHL16((spx_word16_t)*ptr++,5)); 14434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) dist=MAC16_32_Q15(dist,weight[j],MULT16_16(tmp,tmp)); 14534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) } 14634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) if (dist<best_dist) 14734680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) { 14834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) best_dist=dist; 14934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) best_id=i; 15034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) } 15134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) } 15234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 15334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) for (j=0;j<nbDim;j++) 15434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) x[j] = SUB16(x[j],SHL16((spx_word16_t)cdbk[best_id*nbDim+j],5)); 15534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) return best_id; 15634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)} 15734680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)#endif 15834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 15934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)void lsp_quant_nb(spx_lsp_t *lsp, spx_lsp_t *qlsp, int order, SpeexBits *bits) 16034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles){ 16134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) int i; 16234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) int id; 16334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) spx_word16_t quant_weight[10]; 16434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 16534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) for (i=0;i<order;i++) 16634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) qlsp[i]=lsp[i]; 16734680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 16834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) compute_quant_weights(qlsp, quant_weight, order); 16934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 17034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) for (i=0;i<order;i++) 17134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) qlsp[i]=SUB16(qlsp[i],LSP_LINEAR(i)); 17234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 17334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)#ifndef FIXED_POINT 17434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) for (i=0;i<order;i++) 17534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) qlsp[i] = LSP_SCALE*qlsp[i]; 17634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)#endif 17734680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) id = lsp_quant(qlsp, cdbk_nb, NB_CDBK_SIZE, order); 17834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) speex_bits_pack(bits, id, 6); 17934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 18034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) for (i=0;i<order;i++) 18134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) qlsp[i]*=2; 18234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 18334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) id = lsp_weight_quant(qlsp, quant_weight, cdbk_nb_low1, NB_CDBK_SIZE_LOW1, 5); 18434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) speex_bits_pack(bits, id, 6); 18534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 18634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) for (i=0;i<5;i++) 18734680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) qlsp[i]*=2; 18834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 18934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) id = lsp_weight_quant(qlsp, quant_weight, cdbk_nb_low2, NB_CDBK_SIZE_LOW2, 5); 19034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) speex_bits_pack(bits, id, 6); 19134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 19234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) id = lsp_weight_quant(qlsp+5, quant_weight+5, cdbk_nb_high1, NB_CDBK_SIZE_HIGH1, 5); 19334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) speex_bits_pack(bits, id, 6); 19434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 19534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) for (i=5;i<10;i++) 19634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) qlsp[i]*=2; 19734680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 19834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) id = lsp_weight_quant(qlsp+5, quant_weight+5, cdbk_nb_high2, NB_CDBK_SIZE_HIGH2, 5); 19934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) speex_bits_pack(bits, id, 6); 20034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 20134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)#ifdef FIXED_POINT 20234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) for (i=0;i<order;i++) 20334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) qlsp[i]=PSHR16(qlsp[i],2); 20434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)#else 20534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) for (i=0;i<order;i++) 20634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) qlsp[i]=qlsp[i] * .00097656; 20734680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)#endif 20834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 20934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) for (i=0;i<order;i++) 21034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) qlsp[i]=lsp[i]-qlsp[i]; 21134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)} 21234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 21334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)void lsp_unquant_nb(spx_lsp_t *lsp, int order, SpeexBits *bits) 21434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles){ 21534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) int i, id; 21634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) for (i=0;i<order;i++) 21734680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) lsp[i]=LSP_LINEAR(i); 21834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 21934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 22034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) id=speex_bits_unpack_unsigned(bits, 6); 22134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) for (i=0;i<10;i++) 22234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) lsp[i] = ADD32(lsp[i], LSP_DIV_256(cdbk_nb[id*10+i])); 22334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 22434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) id=speex_bits_unpack_unsigned(bits, 6); 22534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) for (i=0;i<5;i++) 22634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) lsp[i] = ADD16(lsp[i], LSP_DIV_512(cdbk_nb_low1[id*5+i])); 22734680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 22834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) id=speex_bits_unpack_unsigned(bits, 6); 22934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) for (i=0;i<5;i++) 23034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) lsp[i] = ADD32(lsp[i], LSP_DIV_1024(cdbk_nb_low2[id*5+i])); 23134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 23234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) id=speex_bits_unpack_unsigned(bits, 6); 23334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) for (i=0;i<5;i++) 23434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) lsp[i+5] = ADD32(lsp[i+5], LSP_DIV_512(cdbk_nb_high1[id*5+i])); 23534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 23634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) id=speex_bits_unpack_unsigned(bits, 6); 23734680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) for (i=0;i<5;i++) 23834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) lsp[i+5] = ADD32(lsp[i+5], LSP_DIV_1024(cdbk_nb_high2[id*5+i])); 23934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)} 24034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 24134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 24234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)void lsp_quant_lbr(spx_lsp_t *lsp, spx_lsp_t *qlsp, int order, SpeexBits *bits) 24334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles){ 24434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) int i; 24534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) int id; 24634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) spx_word16_t quant_weight[10]; 24734680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 24834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) for (i=0;i<order;i++) 24934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) qlsp[i]=lsp[i]; 25034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 25134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) compute_quant_weights(qlsp, quant_weight, order); 25234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 25334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) for (i=0;i<order;i++) 25434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) qlsp[i]=SUB16(qlsp[i],LSP_LINEAR(i)); 25534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)#ifndef FIXED_POINT 25634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) for (i=0;i<order;i++) 25734680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) qlsp[i]=qlsp[i]*LSP_SCALE; 25834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)#endif 25934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) id = lsp_quant(qlsp, cdbk_nb, NB_CDBK_SIZE, order); 26034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) speex_bits_pack(bits, id, 6); 26134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 26234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) for (i=0;i<order;i++) 26334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) qlsp[i]*=2; 26434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 26534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) id = lsp_weight_quant(qlsp, quant_weight, cdbk_nb_low1, NB_CDBK_SIZE_LOW1, 5); 26634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) speex_bits_pack(bits, id, 6); 26734680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 26834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) id = lsp_weight_quant(qlsp+5, quant_weight+5, cdbk_nb_high1, NB_CDBK_SIZE_HIGH1, 5); 26934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) speex_bits_pack(bits, id, 6); 27034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 27134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)#ifdef FIXED_POINT 27234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) for (i=0;i<order;i++) 27334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) qlsp[i] = PSHR16(qlsp[i],1); 27434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)#else 27534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) for (i=0;i<order;i++) 27634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) qlsp[i] = qlsp[i]*0.0019531; 27734680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)#endif 27834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 27934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) for (i=0;i<order;i++) 28034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) qlsp[i]=lsp[i]-qlsp[i]; 28134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)} 28234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 28334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)void lsp_unquant_lbr(spx_lsp_t *lsp, int order, SpeexBits *bits) 28434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles){ 28534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) int i, id; 28634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) for (i=0;i<order;i++) 28734680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) lsp[i]=LSP_LINEAR(i); 28834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 28934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 29034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) id=speex_bits_unpack_unsigned(bits, 6); 29134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) for (i=0;i<10;i++) 29234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) lsp[i] += LSP_DIV_256(cdbk_nb[id*10+i]); 29334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 29434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) id=speex_bits_unpack_unsigned(bits, 6); 29534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) for (i=0;i<5;i++) 29634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) lsp[i] += LSP_DIV_512(cdbk_nb_low1[id*5+i]); 29734680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 29834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) id=speex_bits_unpack_unsigned(bits, 6); 29934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) for (i=0;i<5;i++) 30034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) lsp[i+5] += LSP_DIV_512(cdbk_nb_high1[id*5+i]); 30134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 30234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)} 30334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 30434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 30534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)#ifdef DISABLE_WIDEBAND 30634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)void lsp_quant_high(spx_lsp_t *lsp, spx_lsp_t *qlsp, int order, SpeexBits *bits) 30734680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles){ 30834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) speex_fatal("Wideband and Ultra-wideband are disabled"); 30934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)} 31034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)void lsp_unquant_high(spx_lsp_t *lsp, int order, SpeexBits *bits) 31134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles){ 31234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) speex_fatal("Wideband and Ultra-wideband are disabled"); 31334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)} 31434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)#else 31534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)extern const signed char high_lsp_cdbk[]; 31634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)extern const signed char high_lsp_cdbk2[]; 31734680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 31834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 31934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)void lsp_quant_high(spx_lsp_t *lsp, spx_lsp_t *qlsp, int order, SpeexBits *bits) 32034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles){ 32134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) int i; 32234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) int id; 32334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) spx_word16_t quant_weight[10]; 32434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 32534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) for (i=0;i<order;i++) 32634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) qlsp[i]=lsp[i]; 32734680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 32834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) compute_quant_weights(qlsp, quant_weight, order); 32934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 33034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) /* quant_weight[0] = 10/(qlsp[1]-qlsp[0]); 33134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) quant_weight[order-1] = 10/(qlsp[order-1]-qlsp[order-2]); 33234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) for (i=1;i<order-1;i++) 33334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) { 33434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) tmp1 = 10/(qlsp[i]-qlsp[i-1]); 33534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) tmp2 = 10/(qlsp[i+1]-qlsp[i]); 33634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) quant_weight[i] = tmp1 > tmp2 ? tmp1 : tmp2; 33734680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) }*/ 33834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 33934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) for (i=0;i<order;i++) 34034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) qlsp[i]=SUB16(qlsp[i],LSP_LINEAR_HIGH(i)); 34134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)#ifndef FIXED_POINT 34234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) for (i=0;i<order;i++) 34334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) qlsp[i] = qlsp[i]*LSP_SCALE; 34434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)#endif 34534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) id = lsp_quant(qlsp, high_lsp_cdbk, 64, order); 34634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) speex_bits_pack(bits, id, 6); 34734680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 34834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) for (i=0;i<order;i++) 34934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) qlsp[i]*=2; 35034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 35134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) id = lsp_weight_quant(qlsp, quant_weight, high_lsp_cdbk2, 64, order); 35234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) speex_bits_pack(bits, id, 6); 35334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 35434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)#ifdef FIXED_POINT 35534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) for (i=0;i<order;i++) 35634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) qlsp[i] = PSHR16(qlsp[i],1); 35734680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)#else 35834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) for (i=0;i<order;i++) 35934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) qlsp[i] = qlsp[i]*0.0019531; 36034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)#endif 36134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 36234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) for (i=0;i<order;i++) 36334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) qlsp[i]=lsp[i]-qlsp[i]; 36434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)} 36534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 36634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)void lsp_unquant_high(spx_lsp_t *lsp, int order, SpeexBits *bits) 36734680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles){ 36834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 36934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) int i, id; 37034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) for (i=0;i<order;i++) 37134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) lsp[i]=LSP_LINEAR_HIGH(i); 37234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 37334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 37434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) id=speex_bits_unpack_unsigned(bits, 6); 37534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) for (i=0;i<order;i++) 37634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) lsp[i] += LSP_DIV_256(high_lsp_cdbk[id*order+i]); 37734680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 37834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 37934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) id=speex_bits_unpack_unsigned(bits, 6); 38034680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) for (i=0;i<order;i++) 38134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) lsp[i] += LSP_DIV_512(high_lsp_cdbk2[id*order+i]); 38234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)} 38334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 38434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)#endif 38534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) 386