diff options
author | jmvalin <jmvalin@0101bb08-14d6-0310-b084-bc0e0c8e3800> | 2002-03-25 22:38:00 +0300 |
---|---|---|
committer | jmvalin <jmvalin@0101bb08-14d6-0310-b084-bc0e0c8e3800> | 2002-03-25 22:38:00 +0300 |
commit | a5ba03f1bb790e68d739b58f603de585e62af3fc (patch) | |
tree | 7112c31ffbaae345efd646e0fbe39f726b383146 /libspeex | |
parent | ccc6adaa61591358b6cad20e55427adb7c64a44c (diff) |
Multi-pulse narrowband seem to work (encode+decode). Didn't test the
wideband yet.
git-svn-id: http://svn.xiph.org/trunk/speex@3184 0101bb08-14d6-0310-b084-bc0e0c8e3800
Diffstat (limited to 'libspeex')
-rw-r--r-- | libspeex/modes.c | 4 | ||||
-rw-r--r-- | libspeex/mpulse.c | 67 | ||||
-rw-r--r-- | libspeex/mpulse.h | 7 |
3 files changed, 75 insertions, 3 deletions
diff --git a/libspeex/modes.c b/libspeex/modes.c index 75e5e0d..1c05904 100644 --- a/libspeex/modes.c +++ b/libspeex/modes.c @@ -125,7 +125,7 @@ SpeexMode mp_nb_mode = { <p_params_nb, /*Innovation quantization*/ mpulse_search, - NULL, + mpulse_unquant, &mpulse_nb }; @@ -179,6 +179,6 @@ SpeexMode mp_wb_mode = { <p_params_wb, /*Innovation quantization*/ mpulse_search, - NULL, + mpulse_unquant, &mpulse_wb }; diff --git a/libspeex/mpulse.c b/libspeex/mpulse.c index 0b1192d..06603b9 100644 --- a/libspeex/mpulse.c +++ b/libspeex/mpulse.c @@ -68,7 +68,7 @@ int porder(int *p, int *s, int *o, int len) st=uniq; en=&uniq[nb_uniq-1]; - for (i=0;i<5;i++) + for (i=0;i<len;i++) printf ("%d ", p[i]); printf ("\n"); for (i=0;i<nb_uniq;i++) @@ -156,6 +156,14 @@ void rorder(int *p, int *s, int *o, int bit, int len) ss[0]=bit; n=1; + for (i=0;i<len;i++) + printf ("%d ", p[i]); + printf ("\n"); + for (i=0;i<nb_uniq;i++) + printf ("%d ", uniq[i]); + printf ("\n"); + + for (i=1;i<len;i++) { if (i>1&&p[i-1]==p[i-2]) @@ -183,6 +191,10 @@ void rorder(int *p, int *s, int *o, int bit, int len) n++; } + for (i=0;i<len;i++) + printf ("%d ", s[i]); + printf ("\n"); + } @@ -372,3 +384,56 @@ float *stack POP(stack); POP(stack); } + + +void mpulse_unquant( +float *exc, +void *par, /* non-overlapping codebook */ +int nsf, /* number of samples in subframe */ +FrameBits *bits, +float *stack +) +{ + int i,j, bit1, nb_pulse, quant_gain; + float g; + int nb_tracks, track_ind_bits; + int *track, *signs, *tr; + mpulse_params *params; + int pulses_per_track; + params = (mpulse_params *) par; + + nb_pulse=params->nb_pulse; + nb_tracks=params->nb_tracks; + pulses_per_track=nb_pulse/nb_tracks; + track_ind_bits=params->track_ind_bits; + + track = (int*)PUSH(stack,pulses_per_track); + signs = (int*)PUSH(stack,pulses_per_track); + tr = (int*)PUSH(stack,pulses_per_track); + + quant_gain=frame_bits_unpack_unsigned(bits, 7); + g=exp((quant_gain/8.0)+1); + + for (i=0;i<nb_tracks;i++) + { + int ind; + int max_val=nsf/nb_tracks; + bit1=frame_bits_unpack_unsigned(bits, 1); + ind = frame_bits_unpack_unsigned(bits,track_ind_bits); + printf ("unquant ind = %d\n", ind); + for (j=0;j<pulses_per_track;j++) + { + track[pulses_per_track-1-j]=ind%max_val; + ind /= max_val; + } + rorder(track, signs, tr, bit1, pulses_per_track); + for (j=0;j<pulses_per_track;j++) + { + exc[tr[i]*nb_tracks+i] += signs[j] ? -g : g; + } + } + + POP(stack); + POP(stack); + POP(stack); +} diff --git a/libspeex/mpulse.h b/libspeex/mpulse.h index 27d990f..881e705 100644 --- a/libspeex/mpulse.h +++ b/libspeex/mpulse.h @@ -45,5 +45,12 @@ FrameBits *bits, float *stack ); +void mpulse_unquant( +float *exc, +void *par, /* non-overlapping codebook */ +int nsf, /* number of samples in subframe */ +FrameBits *bits, +float *stack +); #endif |