diff options
author | jmvalin <jmvalin@0101bb08-14d6-0310-b084-bc0e0c8e3800> | 2002-03-15 22:28:09 +0300 |
---|---|---|
committer | jmvalin <jmvalin@0101bb08-14d6-0310-b084-bc0e0c8e3800> | 2002-03-15 22:28:09 +0300 |
commit | af49c74a89060fdd55460ad910778851f93a8022 (patch) | |
tree | 8dc55738a830edf3e909dff4cc67099c5c240f9f /libspeex | |
parent | f6f7b375ca014cb20e05ab6e752376c52f7834e8 (diff) |
wideband coexists with narrowband now
git-svn-id: http://svn.xiph.org/trunk/speex@3152 0101bb08-14d6-0310-b084-bc0e0c8e3800
Diffstat (limited to 'libspeex')
-rw-r--r-- | libspeex/cb_search.c | 79 | ||||
-rw-r--r-- | libspeex/modes.c | 5 | ||||
-rw-r--r-- | libspeex/quant_lsp.c | 51 | ||||
-rw-r--r-- | libspeex/quant_lsp.h | 3 |
4 files changed, 95 insertions, 43 deletions
diff --git a/libspeex/cb_search.c b/libspeex/cb_search.c index e8a0fbb..2b4db2c 100644 --- a/libspeex/cb_search.c +++ b/libspeex/cb_search.c @@ -220,56 +220,53 @@ float *stack } { -#if 1 int best_vq_index=0, max_index; float max_gain=0, log_max, min_dist=0, *sign; - sign = PUSH(stack, nb_subvect); - for (i=0;i<nb_subvect;i++) + if (gain_cb) /*If no gain codebok, do not quantize (for testing/debugging) */ { - if (gains[i]<0) + sign = PUSH(stack, nb_subvect); + for (i=0;i<nb_subvect;i++) { - gains[i]=-gains[i]; - sign[i]=-1; - } else { - sign[i]=1; + if (gains[i]<0) + { + gains[i]=-gains[i]; + sign[i]=-1; + } else { + sign[i]=1; + } } - } - for (i=0;i<nb_subvect;i++) - if (gains[i]>max_gain) - max_gain=gains[i]; - log_max=log(max_gain+1); - max_index = (int)(floor(.5+log_max-3)); - if (max_index>7) - max_index=7; - if (max_index<0) - max_index=0; - max_gain=1/exp(max_index+3.0); - for (i=0;i<nb_subvect;i++) - gains[i]*=max_gain; - frame_bits_pack(bits,max_index,3); - - /*Vector quantize gains[i]*/ - best_vq_index = vq_index(gains, gain_cb, nb_subvect, gain_cb_size); - frame_bits_pack(bits,best_vq_index,params->gain_bits); - - printf ("best_gains_vq_index %d %f %d\n", best_vq_index, min_dist, max_index); - -#if 1 /* If 0, the gains are not quantized */ - for (i=0;i<nb_subvect;i++) - gains[i]= sign[i]*gain_cb[best_vq_index*nb_subvect+i]/max_gain/(Ee[ind[i]]+.001); -#else - for (i=0;i<nb_subvect;i++) - gains[i]= sign[i]*gains[i]/max_gain/(Ee[ind[i]]+.001); -#endif + for (i=0;i<nb_subvect;i++) + if (gains[i]>max_gain) + max_gain=gains[i]; + log_max=log(max_gain+1); + max_index = (int)(floor(.5+log_max-3)); + if (max_index>7) + max_index=7; + if (max_index<0) + max_index=0; + max_gain=1/exp(max_index+3.0); + for (i=0;i<nb_subvect;i++) + gains[i]*=max_gain; + frame_bits_pack(bits,max_index,3); + + /*Vector quantize gains[i]*/ + best_vq_index = vq_index(gains, gain_cb, nb_subvect, gain_cb_size); + frame_bits_pack(bits,best_vq_index,params->gain_bits); + + printf ("best_gains_vq_index %d %f %d\n", best_vq_index, min_dist, max_index); + + for (i=0;i<nb_subvect;i++) + gains[i]= sign[i]*gain_cb[best_vq_index*nb_subvect+i]/max_gain/(Ee[ind[i]]+.001); - POP(stack); -#else - for (i=0;i<nb_subvect;i++) - gains[i]= gains[i]/(Ee[ind[i]]+.001); + POP(stack); + } else { + + for (i=0;i<nb_subvect;i++) + gains[i]= gains[i]/(Ee[ind[i]]+.001); + } -#endif 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/modes.c b/libspeex/modes.c index 66c4161..240b4b3 100644 --- a/libspeex/modes.c +++ b/libspeex/modes.c @@ -19,6 +19,7 @@ */ +#include <stdlib.h> #include "modes.h" #include "ltp.h" #include "quant_lsp.h" @@ -55,7 +56,7 @@ split_cb_params split_cb_wb = { 8, /*nb_subvect*/ exc_wb_table, /*shape_cb*/ 7, /*shape_bits*/ - exc_gains_table, /*gain_cb*/ + NULL, /*gain_cb*/ 8 /*gain_bits*/ }; @@ -96,7 +97,7 @@ SpeexMode wb_mode = { 0.4, /*gamma2*/ /*LSP quantization*/ lsp_quant_wb, - lsp_unquant_nb, + lsp_unquant_wb, /*Pitch quantization*/ pitch_search_3tap, pitch_unquant_3tap, diff --git a/libspeex/quant_lsp.c b/libspeex/quant_lsp.c index aa7799e..cc3053b 100644 --- a/libspeex/quant_lsp.c +++ b/libspeex/quant_lsp.c @@ -212,3 +212,54 @@ void lsp_quant_wb(float *lsp, float *qlsp, int order, FrameBits *bits) for (i=0;i<order;i++) qlsp[i]=lsp[i]-qlsp[i]; } + + +void lsp_unquant_wb(float *lsp, int order, FrameBits *bits) +{ + + int i, id; + for (i=0;i<order;i++) + lsp[i]=0; + + + id=frame_bits_unpack_unsigned(bits, 6); + for (i=0;i<16;i++) + lsp[i] += lsp_cdbk_wb[id*16+i]; + + + id=frame_bits_unpack_unsigned(bits, 6); + for (i=0;i<4;i++) + lsp[i] += lsp_cdbk_wb11[id*4+i]; + + id=frame_bits_unpack_unsigned(bits, 6); + for (i=0;i<4;i++) + lsp[i] += lsp_cdbk_wb12[id*4+i]; + + + id=frame_bits_unpack_unsigned(bits, 6); + for (i=0;i<4;i++) + lsp[i+4] += lsp_cdbk_wb21[id*4+i]; + + id=frame_bits_unpack_unsigned(bits, 6); + for (i=0;i<4;i++) + lsp[i+4] += lsp_cdbk_wb22[id*4+i]; + + + id=frame_bits_unpack_unsigned(bits, 6); + for (i=0;i<4;i++) + lsp[i+8] += lsp_cdbk_wb31[id*4+i]; + + id=frame_bits_unpack_unsigned(bits, 4); + for (i=0;i<4;i++) + lsp[i+8] += lsp_cdbk_wb32[id*4+i]; + + + id=frame_bits_unpack_unsigned(bits, 6); + for (i=0;i<4;i++) + lsp[i+12] += lsp_cdbk_wb41[id*4+i]; + + id=frame_bits_unpack_unsigned(bits, 4); + for (i=0;i<4;i++) + lsp[i+12] += lsp_cdbk_wb42[id*4+i]; + +} diff --git a/libspeex/quant_lsp.h b/libspeex/quant_lsp.h index 34ad2e0..f113176 100644 --- a/libspeex/quant_lsp.h +++ b/libspeex/quant_lsp.h @@ -46,4 +46,7 @@ void lsp_unquant_nb(float *lsp, int order, FrameBits *bits); /* Quantizes wideband LSPs with 50 bits */ void lsp_quant_wb(float *lsp, float *qlsp, int order, FrameBits *bits); +/* Decodes quantized wideband LSPs */ +void lsp_unquant_wb(float *lsp, int order, FrameBits *bits); + #endif |