diff options
author | jmvalin <jmvalin@0101bb08-14d6-0310-b084-bc0e0c8e3800> | 2002-04-09 11:48:01 +0400 |
---|---|---|
committer | jmvalin <jmvalin@0101bb08-14d6-0310-b084-bc0e0c8e3800> | 2002-04-09 11:48:01 +0400 |
commit | 138711df2f37619a09b30521b2860feb0bb47109 (patch) | |
tree | a1643ae378757a8e8c1f3004f605db599b7c5c92 /libspeex | |
parent | 8779e5efb32b9dd232e4f3911153b041aa8ded36 (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.c | 20 | ||||
-rw-r--r-- | libspeex/sb_celp.c | 32 | ||||
-rw-r--r-- | libspeex/testenc_sb.c | 5 |
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; } |