Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mumble-voip/speex.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjmvalin <jmvalin@0101bb08-14d6-0310-b084-bc0e0c8e3800>2002-04-09 11:48:01 +0400
committerjmvalin <jmvalin@0101bb08-14d6-0310-b084-bc0e0c8e3800>2002-04-09 11:48:01 +0400
commit138711df2f37619a09b30521b2860feb0bb47109 (patch)
treea1643ae378757a8e8c1f3004f605db599b7c5c92 /libspeex
parent8779e5efb32b9dd232e4f3911153b041aa8ded36 (diff)
SB-CELP work... more to go
git-svn-id: http://svn.xiph.org/trunk/speex@3232 0101bb08-14d6-0310-b084-bc0e0c8e3800
Diffstat (limited to 'libspeex')
-rw-r--r--libspeex/cb_search.c20
-rw-r--r--libspeex/sb_celp.c32
-rw-r--r--libspeex/testenc_sb.c5
3 files changed, 52 insertions, 5 deletions
diff --git a/libspeex/cb_search.c b/libspeex/cb_search.c
index 2a3e766..e2fc139 100644
--- a/libspeex/cb_search.c
+++ b/libspeex/cb_search.c
@@ -318,7 +318,7 @@ float *stack
int *ind;
float *gains;
float *sign;
- float *shape_cb;
+ float *shape_cb, exc_energy;
int shape_cb_size, subvect_size, nb_subvect;
split_cb_params *params;
@@ -332,19 +332,29 @@ float *stack
gains = PUSH(stack, nb_subvect);
sign = PUSH(stack, nb_subvect);
+ /* Decode global (average) gain */
+ {
+ int id;
+ id = frame_bits_unpack_unsigned(bits, 4);
+ exc_energy=exp(.5*id+2);
+ }
+
for (i=0;i<nb_subvect;i++)
{
+ int gain_id;
ind[i] = frame_bits_unpack_unsigned(bits, params->shape_bits);
if (frame_bits_unpack_unsigned(bits, 1))
sign[i]=-1;
else
sign[i]=1;
+
+ gain_id = frame_bits_unpack_unsigned(bits, 3);
+ gains[i]=scal_gains4[gain_id];
+ if (sign[i])
+ gains[i]=-gains[i];
+ gains[i] *= exc_energy;
}
- /*FIXME: Gain quantization changed, need to re-write that part */
- for (i=0;i<nb_subvect;i++)
- gains[i]=0;
-
for (i=0;i<nb_subvect;i++)
for (j=0;j<subvect_size;j++)
exc[subvect_size*i+j]+=gains[i]*shape_cb[ind[i]*subvect_size+j];
diff --git a/libspeex/sb_celp.c b/libspeex/sb_celp.c
index dfcf456..fda594e 100644
--- a/libspeex/sb_celp.c
+++ b/libspeex/sb_celp.c
@@ -664,3 +664,35 @@ void sb_decoder_destroy(SBDecState *st)
free(st->stack);
}
+
+
+void sb_decode(SBDecState *st, FrameBits *bits, float *out)
+{
+ int i;
+
+ /* Decode the low-band */
+ decode(&st->st_low, bits, st->x0d);
+
+ for (i=0;i<st->frame_size;i++)
+ st->exc[i]=0;
+
+ /* Up-sample coded low-band and high-band*/
+ for (i=0;i<st->frame_size;i++)
+ {
+ st->x0[(i<<1)]=st->x0d[i];
+ st->x1[(i<<1)]=st->high[i];
+ st->x0[(i<<1)+1]=0;
+ st->x1[(i<<1)+1]=0;
+ }
+ /* Reconstruct the original */
+ fir_mem(st->x0, h0, st->y0, st->full_frame_size, QMF_ORDER, st->g0_mem);
+ fir_mem(st->x1, h1, st->y1, st->full_frame_size, QMF_ORDER, st->g1_mem);
+ for (i=0;i<st->full_frame_size;i++)
+ out[i]=2*(st->y0[i]-st->y1[i]);
+
+ for (i=0;i<st->lpcSize;i++)
+ st->old_qlsp[i] = st->qlsp[i];
+
+ st->first=0;
+
+}
diff --git a/libspeex/testenc_sb.c b/libspeex/testenc_sb.c
index 7b3437f..c70b3af 100644
--- a/libspeex/testenc_sb.c
+++ b/libspeex/testenc_sb.c
@@ -14,11 +14,13 @@ int main(int argc, char **argv)
int nbBits;
int i;
SBEncState st;
+ SBDecState dec;
FrameBits bits;
for (i=0;i<FRAME_SIZE;i++)
bak2[i]=0;
sb_encoder_init(&st, &mp_sb_mode);
+ sb_decoder_init(&dec, &mp_sb_mode);
if (argc != 4 && argc != 3)
{
fprintf (stderr, "Usage: encode [in file] [out file] [bits file]\nargc = %d", argc);
@@ -57,6 +59,8 @@ int main(int argc, char **argv)
}
frame_bits_rewind(&bits);
+ sb_decode(&dec, &bits, input);
+
frame_bits_reset(&bits);
for (i=0;i<FRAME_SIZE;i++)
{
@@ -73,5 +77,6 @@ int main(int argc, char **argv)
}
sb_encoder_destroy(&st);
+ sb_decoder_destroy(&dec);
return 1;
}