diff options
author | jmvalin <jmvalin@0101bb08-14d6-0310-b084-bc0e0c8e3800> | 2002-03-14 22:31:35 +0300 |
---|---|---|
committer | jmvalin <jmvalin@0101bb08-14d6-0310-b084-bc0e0c8e3800> | 2002-03-14 22:31:35 +0300 |
commit | 57479753681165c1e6b16ec44b57f0dcbbf449c7 (patch) | |
tree | 028e4750f4b44348ffe215aaae019fc587362ccf /libspeex | |
parent | 6e9bdba1083c436aa28dcf81c5c32e0fa8fe4146 (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.c | 66 | ||||
-rw-r--r-- | libspeex/cb_search.h | 26 | ||||
-rw-r--r-- | libspeex/ltp.c | 43 | ||||
-rw-r--r-- | libspeex/ltp.h | 11 | ||||
-rw-r--r-- | libspeex/modes.c | 48 | ||||
-rw-r--r-- | libspeex/modes.h | 8 | ||||
-rw-r--r-- | libspeex/speex.c | 16 | ||||
-rw-r--r-- | libspeex/speex.h | 4 |
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, + <p_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, + <p_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*/ |