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-03-15 22:28:09 +0300
committerjmvalin <jmvalin@0101bb08-14d6-0310-b084-bc0e0c8e3800>2002-03-15 22:28:09 +0300
commitaf49c74a89060fdd55460ad910778851f93a8022 (patch)
tree8dc55738a830edf3e909dff4cc67099c5c240f9f /libspeex
parentf6f7b375ca014cb20e05ab6e752376c52f7834e8 (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.c79
-rw-r--r--libspeex/modes.c5
-rw-r--r--libspeex/quant_lsp.c51
-rw-r--r--libspeex/quant_lsp.h3
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