fixed-point: converted the pitch gain quantisation, except for the codebook

itself
This commit is contained in:
Jean-Marc Valin 2008-03-05 11:31:57 +11:00
parent a78dc946cd
commit 92376697c6
3 changed files with 29 additions and 12 deletions

View file

@ -58,6 +58,7 @@ typedef celt_word16_t celt_pgain_t;
typedef float celt_mask_t; typedef float celt_mask_t;
#define Q15ONE 32767 #define Q15ONE 32767
#define Q30ONE 1073741823
#define SIG_SCALING 16384.f #define SIG_SCALING 16384.f
#define SIG_SCALING_1 (1.f/16384.f) #define SIG_SCALING_1 (1.f/16384.f)
@ -114,6 +115,7 @@ typedef float celt_pgain_t;
typedef float celt_mask_t; typedef float celt_mask_t;
#define Q15ONE 1.0f #define Q15ONE 1.0f
#define Q30ONE 1.0f
#define SIG_SCALING 1.f #define SIG_SCALING 1.f
#define SIG_SCALING_1 1.f #define SIG_SCALING_1 1.f

View file

@ -37,21 +37,28 @@
#include <math.h> #include <math.h>
#include "pgain_table.h" #include "pgain_table.h"
#include "arch.h" #include "arch.h"
#include "mathops.h"
#define PGAIN(codebook, i) ((celt_pgain_t)(Q15ONE*(codebook)[i]))
#define Q1515ONE MULT16_16(Q15ONE,Q15ONE)
/* Taken from Speex. /* Taken from Speex.
Finds the index of the entry in a codebook that best matches the input*/ Finds the index of the entry in a codebook that best matches the input*/
int vq_index(float *in, const float *codebook, int len, int entries) int vq_index(celt_pgain_t *in, const float *codebook, int len, int entries)
{ {
int i,j; int i,j;
float min_dist=0; int index = 0;
celt_word32_t min_dist=0;
int best_index=0; int best_index=0;
for (i=0;i<entries;i++) for (i=0;i<entries;i++)
{ {
float dist=0; celt_word32_t dist=0;
for (j=0;j<len;j++) for (j=0;j<len;j++)
{ {
float tmp = in[j]-*codebook++; celt_pgain_t tmp = SHR16(SUB16(in[j],PGAIN(codebook, index)),1);
dist += tmp*tmp; index++;
dist = MAC16_16(dist, tmp, tmp);
} }
if (i==0 || dist<min_dist) if (i==0 || dist<min_dist)
{ {
@ -62,20 +69,26 @@ int vq_index(float *in, const float *codebook, int len, int entries)
return best_index; return best_index;
} }
static void id2gains(int id, celt_pgain_t *gains, int len)
{
int i;
for (i=0;i<len;i++)
gains[i] = celt_sqrt(Q1515ONE-MULT16_16(Q15ONE-PGAIN(pgain_table,id*len+i),Q15ONE-PGAIN(pgain_table,id*len+i)));
}
int quant_pitch(celt_pgain_t *gains, int len, ec_enc *enc) int quant_pitch(celt_pgain_t *gains, int len, ec_enc *enc)
{ {
int i, id; int i, id;
VARDECL(float *g2); VARDECL(celt_pgain_t *g2);
SAVE_STACK; SAVE_STACK;
ALLOC(g2, len, float); ALLOC(g2, len, celt_pgain_t);
/*for (i=0;i<len;i++) printf ("%f ", gains[i]);printf ("\n");*/ /*for (i=0;i<len;i++) printf ("%f ", gains[i]);printf ("\n");*/
for (i=0;i<len;i++) for (i=0;i<len;i++)
g2[i] = 1-sqrt(1-PGAIN_SCALING_1*PGAIN_SCALING_1*gains[i]*gains[i]); g2[i] = Q15ONE-celt_sqrt(Q1515ONE-MULT16_16(gains[i],gains[i]));
id = vq_index(g2, pgain_table, len, 128); id = vq_index(g2, pgain_table, len, 128);
ec_enc_uint(enc, id, 128); ec_enc_uint(enc, id, 128);
/*for (i=0;i<len;i++) printf ("%f ", pgain_table[id*len+i]);printf ("\n");*/ /*for (i=0;i<len;i++) printf ("%f ", pgain_table[id*len+i]);printf ("\n");*/
for (i=0;i<len;i++) id2gains(id, gains, len);
gains[i] = PGAIN_SCALING*(sqrt(1-(1-pgain_table[id*len+i])*(1-pgain_table[id*len+i])));
RESTORE_STACK; RESTORE_STACK;
return id!=0; return id!=0;
} }
@ -84,7 +97,6 @@ int unquant_pitch(celt_pgain_t *gains, int len, ec_dec *dec)
{ {
int i, id; int i, id;
id = ec_dec_uint(dec, 128); id = ec_dec_uint(dec, 128);
for (i=0;i<len;i++) id2gains(id, gains, len);
gains[i] = PGAIN_SCALING*(sqrt(1-(1-pgain_table[id*len+i])*(1-pgain_table[id*len+i])));
return id!=0; return id!=0;
} }

View file

@ -130,7 +130,10 @@ int main(int argc, char *argv[])
out[i] = in[i]; out[i] = in[i];
#endif #endif
for (i=0;i<frame_size*channels;i++) for (i=0;i<frame_size*channels;i++)
{
rmsd += (in[i]-out[i])*1.0*(in[i]-out[i]); rmsd += (in[i]-out[i])*1.0*(in[i]-out[i]);
out[i] -= in[i];
}
count++; count++;
fwrite(out, sizeof(short), (frame_size-skip)*channels, fout); fwrite(out, sizeof(short), (frame_size-skip)*channels, fout);
skip = 0; skip = 0;