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-14 22:31:35 +0300
committerjmvalin <jmvalin@0101bb08-14d6-0310-b084-bc0e0c8e3800>2002-03-14 22:31:35 +0300
commit57479753681165c1e6b16ec44b57f0dcbbf449c7 (patch)
tree028e4750f4b44348ffe215aaae019fc587362ccf /libspeex
parent6e9bdba1083c436aa28dcf81c5c32e0fa8fe4146 (diff)
Think the modularity stuff is mostly done...
git-svn-id: http://svn.xiph.org/trunk/speex@3144 0101bb08-14d6-0310-b084-bc0e0c8e3800
Diffstat (limited to 'libspeex')
-rw-r--r--libspeex/cb_search.c66
-rw-r--r--libspeex/cb_search.h26
-rw-r--r--libspeex/ltp.c43
-rw-r--r--libspeex/ltp.h11
-rw-r--r--libspeex/modes.c48
-rw-r--r--libspeex/modes.h8
-rw-r--r--libspeex/speex.c16
-rw-r--r--libspeex/speex.h4
8 files changed, 157 insertions, 65 deletions
diff --git a/libspeex/cb_search.c b/libspeex/cb_search.c
index 323ecfd..bc0d925 100644
--- a/libspeex/cb_search.c
+++ b/libspeex/cb_search.c
@@ -39,8 +39,6 @@
#define EXC_CB_SIZE 128
#define min(a,b) ((a) < (b) ? (a) : (b))
-extern float exc_gains_table[];
-extern float exc_table[];
/*---------------------------------------------------------------------------*\
@@ -131,14 +129,6 @@ int nsf /* number of samples in subframe */
}
-split_cb_params split_cb_nb = {
- 8, /*subvect_size*/
- 5, /*nb_subvect*/
- exc_table, /*shape_cb*/
- 7, /*shape_bits*/
- exc_gains_table, /*gain_cb*/
- 8 /*gain_bits*/
-};
void split_cb_search(
@@ -298,43 +288,65 @@ float *stack
void split_cb_unquant(
float *exc,
-float codebook[][8], /* non-overlapping codebook */
+void *par, /* non-overlapping codebook */
int nsf, /* number of samples in subframe */
-FrameBits *bits
+FrameBits *bits,
+float *stack
)
{
int i,j;
- int ind[5];
- float gains[5];
- float sign[5];
+ int *ind;
+ float *gains;
+ float *sign;
int max_gain_ind, vq_gain_ind;
- float max_gain, Ee[5];
- for (i=0;i<5;i++)
+ float max_gain, *Ee;
+ float *shape_cb, *gain_cb;
+ int shape_cb_size, gain_cb_size, subvect_size, nb_subvect;
+ split_cb_params *params;
+
+ params = (split_cb_params *) par;
+ subvect_size = params->subvect_size;
+ nb_subvect = params->nb_subvect;
+ shape_cb_size = 1<<params->shape_bits;
+ shape_cb = params->shape_cb;
+ gain_cb_size = 1<<params->gain_bits;
+ gain_cb = params->gain_cb;
+
+ ind = (int*)PUSH(stack, nb_subvect);
+ gains = PUSH(stack, nb_subvect);
+ sign = PUSH(stack, nb_subvect);
+ Ee=PUSH(stack, nb_subvect);
+
+ for (i=0;i<nb_subvect;i++)
{
- ind[i] = frame_bits_unpack_unsigned(bits, 7);
+ ind[i] = frame_bits_unpack_unsigned(bits, params->shape_bits);
if (frame_bits_unpack_unsigned(bits, 1))
sign[i]=-1;
else
sign[i]=1;
Ee[i]=.001;
- for (j=0;j<8;j++)
- Ee[i]+=codebook[ind[i]][j]*codebook[ind[i]][j];
+ for (j=0;j<subvect_size;j++)
+ Ee[i]+=shape_cb[ind[i]*subvect_size+j]*shape_cb[ind[i]*subvect_size+j];
}
max_gain_ind = frame_bits_unpack_unsigned(bits, 3);
- vq_gain_ind = frame_bits_unpack_unsigned(bits, 8);
+ vq_gain_ind = frame_bits_unpack_unsigned(bits, params->gain_bits);
printf ("unquant gains ind: %d %d\n", max_gain_ind, vq_gain_ind);
max_gain=exp(max_gain_ind+3.0);
- for (i=0;i<5;i++)
- gains[i] = sign[i]*exc_gains_table[vq_gain_ind*5+i]*max_gain/Ee[i];
+ for (i=0;i<nb_subvect;i++)
+ gains[i] = sign[i]*gain_cb[vq_gain_ind*nb_subvect+i]*max_gain/Ee[i];
printf ("unquant gains: ");
- for (i=0;i<5;i++)
+ for (i=0;i<nb_subvect;i++)
printf ("%f ", gains[i]);
printf ("\n");
- for (i=0;i<5;i++)
- for (j=0;j<8;j++)
- exc[8*i+j]+=gains[i]*codebook[ind[i]][j];
+ 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];
+ POP(stack);
+ POP(stack);
+ POP(stack);
+ POP(stack);
}
diff --git a/libspeex/cb_search.h b/libspeex/cb_search.h
index de0de11..bc48187 100644
--- a/libspeex/cb_search.h
+++ b/libspeex/cb_search.h
@@ -22,6 +22,15 @@
#include "bits.h"
+typedef struct split_cb_params {
+ int subvect_size;
+ int nb_subvect;
+ float *shape_cb;
+ int shape_bits;
+ float *gain_cb;
+ int gain_bits;
+} split_cb_params;
+
float overlap_cb_search(
float target[], /* target vector */
float ak[], /* LPCs for this subframe */
@@ -35,18 +44,6 @@ int p, /* number of LPC coeffs */
int nsf /* number of samples in subframe */
);
-
-typedef struct split_cb_params {
- int subvect_size;
- int nb_subvect;
- float *shape_cb;
- int shape_bits;
- float *gain_cb;
- int gain_bits;
-} split_cb_params;
-
-extern split_cb_params split_cb_nb;
-
void split_cb_search(
float target[], /* target vector */
float ak[], /* LPCs for this subframe */
@@ -62,9 +59,10 @@ float *stack
void split_cb_unquant(
float *exc,
-float codebook[][8], /* non-overlapping codebook */
+void *par, /* Innovation parameters */
int nsf, /* number of samples in subframe */
-FrameBits *bits
+FrameBits *bits,
+float *stack
);
#endif
diff --git a/libspeex/ltp.c b/libspeex/ltp.c
index d668c66..04c5e3c 100644
--- a/libspeex/ltp.c
+++ b/libspeex/ltp.c
@@ -319,7 +319,8 @@ float target[], /* Target vector */
float ak[], /* LPCs for this subframe */
float awk1[], /* Weighted LPCs #1 for this subframe */
float awk2[], /* Weighted LPCs #2 for this subframe */
-float exc[], /* Overlapping codebook */
+float exc[], /* Excitation */
+void *par,
int start, /* Smallest pitch value allowed */
int end, /* Largest pitch value allowed */
int p, /* Number of LPC coeffs */
@@ -334,8 +335,12 @@ float *stack
float corr[3];
float A[3][3];
float gain[3];
- int pitch;
-
+ int pitch, gain_cdbk_size;
+ float *gain_cdbk;
+ ltp_params *params;
+ params = (ltp_params*) par;
+ gain_cdbk=params->gain_cdbk;
+ gain_cdbk_size=1<<params->gain_bits;
tmp = PUSH(stack, 3*nsf);
x[0]=tmp;
@@ -367,7 +372,7 @@ float *stack
{
int j;
float C[9];
- float *ptr=gain_cdbk_nb;
+ float *ptr=gain_cdbk;
int best_cdbk=0;
float best_sum=0;
C[0]=corr[2];
@@ -380,10 +385,10 @@ float *stack
C[7]=A[1][1];
C[8]=A[0][0];
- for (i=0;i<127;i++)
+ for (i=0;i<gain_cdbk_size;i++)
{
float sum=0;
- ptr = gain_cdbk_nb+12*i;
+ ptr = gain_cdbk+12*i;
for (j=0;j<9;j++)
sum+=C[j]*ptr[j+3];
if (sum>best_sum || i==0)
@@ -392,11 +397,11 @@ float *stack
best_cdbk=i;
}
}
- gain[0] = gain_cdbk_nb[best_cdbk*12];
- gain[1] = gain_cdbk_nb[best_cdbk*12+1];
- gain[2] = gain_cdbk_nb[best_cdbk*12+2];
- frame_bits_pack(bits,pitch-start,7);
- frame_bits_pack(bits,best_cdbk,7);
+ gain[0] = gain_cdbk[best_cdbk*12];
+ gain[1] = gain_cdbk[best_cdbk*12+1];
+ gain[2] = gain_cdbk[best_cdbk*12+2];
+ frame_bits_pack(bits,pitch-start,params->pitch_bits);
+ frame_bits_pack(bits,best_cdbk,params->gain_bits);
}
@@ -422,6 +427,7 @@ void pitch_unquant_3tap(
float exc[], /* Excitation */
int start, /* Smallest pitch value allowed */
int end, /* Largest pitch value allowed */
+void *par,
int nsf, /* Number of samples in subframe */
FrameBits *bits,
float *stack
@@ -431,12 +437,17 @@ float *stack
int pitch;
int gain_index;
float gain[3];
- pitch = frame_bits_unpack_unsigned(bits, 7);
+ float *gain_cdbk;
+ ltp_params *params;
+ params = (ltp_params*) par;
+ gain_cdbk=params->gain_cdbk;
+
+ pitch = frame_bits_unpack_unsigned(bits, params->pitch_bits);
pitch += start;
- gain_index = frame_bits_unpack_unsigned(bits, 7);
- gain[0] = gain_cdbk_nb[gain_index*12];
- gain[1] = gain_cdbk_nb[gain_index*12+1];
- gain[2] = gain_cdbk_nb[gain_index*12+2];
+ gain_index = frame_bits_unpack_unsigned(bits, params->gain_bits);
+ gain[0] = gain_cdbk[gain_index*12];
+ gain[1] = gain_cdbk[gain_index*12+1];
+ gain[2] = gain_cdbk[gain_index*12+2];
printf ("unquantized pitch: %d %f %f %f\n", pitch, gain[0], gain[1], gain[2]);
/*FIXME: backward or forward? (ie recursive or not?)*/
diff --git a/libspeex/ltp.h b/libspeex/ltp.h
index 6c46cff..bdcc21b 100644
--- a/libspeex/ltp.h
+++ b/libspeex/ltp.h
@@ -19,7 +19,13 @@
#include "bits.h"
-extern float gain_cdbk_nb[];
+
+typedef struct ltp_params {
+ float *gain_cdbk;
+ int gain_bits;
+ int pitch_bits;
+} ltp_params;
+
/* Finds open-loop pitch */
void open_loop_pitch(float *sw, int start, int end, int len, int *pitch, int *vuv);
@@ -42,6 +48,7 @@ int nsf, /* Number of samples in subframe */
float *stack
);
+
/** Finds the best quantized 3-tap pitch predictor by analysis by synthesis */
void pitch_search_3tap(
float target[], /* Target vector */
@@ -49,6 +56,7 @@ float ak[], /* LPCs for this subframe */
float awk1[], /* Weighted LPCs #1 for this subframe */
float awk2[], /* Weighted LPCs #2 for this subframe */
float exc[], /* Overlapping codebook */
+void *par,
int start, /* Smallest pitch value allowed */
int end, /* Largest pitch value allowed */
int p, /* Number of LPC coeffs */
@@ -78,6 +86,7 @@ void pitch_unquant_3tap(
float exc[], /* Excitation */
int start, /* Smallest pitch value allowed */
int end, /* Largest pitch value allowed */
+void *par,
int nsf, /* Number of samples in subframe */
FrameBits *bits,
float *stack
diff --git a/libspeex/modes.c b/libspeex/modes.c
index b21c406..fa612b0 100644
--- a/libspeex/modes.c
+++ b/libspeex/modes.c
@@ -24,6 +24,25 @@
#include "quant_lsp.h"
#include "cb_search.h"
+extern float gain_cdbk_nb[];
+extern float exc_gains_table[];
+extern float exc_table[];
+
+ltp_params ltp_params_nb = {
+ gain_cdbk_nb,
+ 7,
+ 7
+};
+
+split_cb_params split_cb_nb = {
+ 8, /*subvect_size*/
+ 5, /*nb_subvect*/
+ exc_table, /*shape_cb*/
+ 7, /*shape_bits*/
+ exc_gains_table, /*gain_cb*/
+ 8 /*gain_bits*/
+};
+
SpeexMode nb_mode = {
160, /*frameSize*/
40, /*subframeSize*/
@@ -34,10 +53,39 @@ SpeexMode nb_mode = {
140, /*pitchEnd*/
0.9, /*gamma1*/
0.6, /*gamma2*/
+ /*LSP quantization*/
+ lsp_quant_nb,
+ lsp_unquant_nb,
+ /*Pitch quantization*/
+ pitch_search_3tap,
+ pitch_unquant_3tap,
+ &ltp_params_nb,
+ /*Innovation quantization*/
+ split_cb_search,
+ split_cb_unquant,
+ &split_cb_nb
+};
+
+
+SpeexMode wb_mode = {
+ 256, /*frameSize*/
+ 64, /*subframeSize*/
+ 512, /*windowSize*/
+ 16, /*lpcSize*/
+ 1024, /*bufSize*/
+ 35, /*pitchStart*/
+ 290, /*pitchEnd*/
+ 0.9, /*gamma1*/
+ 0.2, /*gamma2*/
+ /*LSP quantization*/
lsp_quant_nb,
lsp_unquant_nb,
+ /*Pitch quantization*/
pitch_search_3tap,
pitch_unquant_3tap,
+ &ltp_params_nb,
+ /*Innovation quantization*/
split_cb_search,
+ split_cb_unquant,
&split_cb_nb
};
diff --git a/libspeex/modes.h b/libspeex/modes.h
index ef17d5e..46ec981 100644
--- a/libspeex/modes.h
+++ b/libspeex/modes.h
@@ -33,16 +33,17 @@ typedef void (*lsp_unquant_func)(float *, int, FrameBits *);
/*Long-term predictor quantization*/
typedef void (*ltp_quant_func)(float *, float *, float *,
- float *, float *, int, int,
+ float *, float *, void *, int, int,
int, int, FrameBits*, float *);
/*Long-term un-quantize*/
-typedef void (*ltp_unquant_func)(float *, int, int, int, FrameBits*, float*);
+typedef void (*ltp_unquant_func)(float *, int, int, void *, int, FrameBits*, float*);
typedef void (*innovation_quant_func)(float *, float *, float *, float *, void *, int, int,
float *, FrameBits *, float *);
+typedef void (*innovation_unquant_func)(float *, void *, int, FrameBits*, float *);
/*Struct defining the encoding/decoding mode*/
typedef struct SpeexMode {
@@ -63,9 +64,10 @@ typedef struct SpeexMode {
/*Lont-term predictor functions*/
ltp_quant_func ltp_quant;
ltp_unquant_func ltp_unquant;
-
+ void *ltp_params;
/*Quantization of innovation */
innovation_quant_func innovation_quant;
+ innovation_unquant_func innovation_unquant;
void *innovation_params;
} SpeexMode;
diff --git a/libspeex/speex.c b/libspeex/speex.c
index 6cc013b..217ed8c 100644
--- a/libspeex/speex.c
+++ b/libspeex/speex.c
@@ -56,6 +56,7 @@ void encoder_init(EncState *st, SpeexMode *mode)
st->lsp_quant = mode->lsp_quant;
st->ltp_quant = mode->ltp_quant;
+ st->ltp_params = mode->ltp_params;
st->innovation_quant = mode->innovation_quant;
st->innovation_params = mode->innovation_params;
@@ -287,7 +288,7 @@ void encode(EncState *st, float *in, FrameBits *bits)
/* Long-term prediction */
st->ltp_quant(target, st->interp_qlpc, st->bw_lpc1, st->bw_lpc2,
- exc, 20, 147, st->lpcSize, st->subframeSize,
+ exc, st->ltp_params, 20, 147, st->lpcSize, st->subframeSize,
bits, st->stack);
/* Update target for adaptive codebook contribution */
@@ -361,6 +362,13 @@ void decoder_init(DecState *st, SpeexMode *mode)
st->min_pitch=mode->pitchStart;
st->max_pitch=mode->pitchEnd;
+ st->lsp_unquant = mode->lsp_unquant;
+ st->ltp_unquant = mode->ltp_unquant;
+ st->ltp_params = mode->ltp_params;
+
+ st->innovation_unquant = mode->innovation_unquant;
+ st->innovation_params = mode->innovation_params;
+
st->stack = calloc(10000, sizeof(float));
st->inBuf = malloc(st->bufSize*sizeof(float));
@@ -400,7 +408,7 @@ void decode(DecState *st, FrameBits *bits, float *out)
memmove(st->excBuf, st->excBuf+st->frameSize, (st->bufSize-st->frameSize)*sizeof(float));
- lsp_unquant_nb(st->qlsp, st->lpcSize, bits);
+ st->lsp_unquant(st->qlsp, st->lpcSize, bits);
if (st->first)
{
for (i=0;i<st->lpcSize;i++)
@@ -440,10 +448,10 @@ void decode(DecState *st, FrameBits *bits, float *out)
exc[i]=0;
/*Adaptive codebook contribution*/
- pitch_unquant_3tap(exc, st->min_pitch, st->max_pitch, st->subframeSize, bits, st->stack);
+ st->ltp_unquant(exc, st->min_pitch, st->max_pitch, st->ltp_params, st->subframeSize, bits, st->stack);
/*Fixed codebook contribution*/
- split_cb_unquant(exc, exc_table, st->subframeSize, bits);
+ st->innovation_unquant(exc, st->innovation_params, st->subframeSize, bits, st->stack);
/*Compute decoded signal*/
syn_filt_mem(exc, st->interp_qlpc, sp, st->subframeSize, st->lpcSize, st->mem_sp);
diff --git a/libspeex/speex.h b/libspeex/speex.h
index af718a3..77f804e 100644
--- a/libspeex/speex.h
+++ b/libspeex/speex.h
@@ -70,6 +70,7 @@ typedef struct EncState {
lsp_quant_func lsp_quant;
ltp_quant_func ltp_quant;
+ void *ltp_params;
innovation_quant_func innovation_quant;
void *innovation_params;
} EncState;
@@ -99,6 +100,9 @@ typedef struct DecState {
lsp_unquant_func lsp_unquant;
ltp_unquant_func ltp_unquant;
+ void *ltp_params;
+ innovation_unquant_func innovation_unquant;
+ void *innovation_params;
} DecState;
/**Initializes encoder state*/