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