diff options
-rw-r--r-- | libspeex/cb_search.c | 489 | ||||
-rw-r--r-- | libspeex/cb_search.h | 48 | ||||
-rw-r--r-- | libspeex/lpc.c | 17 | ||||
-rw-r--r-- | libspeex/lsp.c | 19 | ||||
-rw-r--r-- | libspeex/lsp.h | 17 | ||||
-rw-r--r-- | libspeex/ltp.c | 1 | ||||
-rw-r--r-- | libspeex/modes.c | 4 | ||||
-rw-r--r-- | libspeex/vq.c | 3 | ||||
-rw-r--r-- | libspeex/vq.h | 2 |
9 files changed, 57 insertions, 543 deletions
diff --git a/libspeex/cb_search.c b/libspeex/cb_search.c index f8dcdf0..a56ad5a 100644 --- a/libspeex/cb_search.c +++ b/libspeex/cb_search.c @@ -42,171 +42,6 @@ static float scal_gains4[16] = { }; -void split_cb_search( -float target[], /* target vector */ -float ak[], /* LPCs for this subframe */ -float awk1[], /* Weighted LPCs for this subframe */ -float awk2[], /* Weighted LPCs for this subframe */ -void *par, /* Codebook/search parameters*/ -int p, /* number of LPC coeffs */ -int nsf, /* number of samples in subframe */ -float *exc, -SpeexBits *bits, -float *stack -) -{ - int i,j, id; - float *resp, *E, q; - float *t, *r, *e; - float *gains; - int *ind; - float *shape_cb; - int shape_cb_size, subvect_size, nb_subvect; - float exc_energy=0; - 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; - resp = PUSH(stack, shape_cb_size*subvect_size); - E = PUSH(stack, shape_cb_size); - t = PUSH(stack, nsf); - r = PUSH(stack, nsf); - e = PUSH(stack, nsf); - gains = PUSH(stack, nb_subvect); - ind = (int*)PUSH(stack, nb_subvect); - - /* Compute energy of the "real excitation" */ - syn_filt_zero(target, awk1, e, nsf, p); - residue_zero(e, ak, e, nsf, p); - residue_zero(e, awk2, e, nsf, p); - for (i=0;i<nsf;i++) - exc_energy += e[i]*e[i]; - exc_energy=sqrt(exc_energy/nb_subvect); - - /* Quantize global ("average") gain */ - q=log(exc_energy+.1); - q=floor(.5+2*(q-2)); - if (q<0) - q=0; - if (q>15) - q=15; - id = (int)q; - speex_bits_pack(bits, id, 4); - exc_energy=exp(.5*q+2); - - - for (i=0;i<nsf;i++) - t[i]=target[i]; - - e[0]=1; - for (i=1;i<nsf;i++) - e[i]=0; - residue_zero(e, awk1, r, nsf, p); - syn_filt_zero(r, ak, r, nsf, p); - syn_filt_zero(r, awk2, r, nsf,p); - - /* Pre-compute codewords response and energy */ - for (i=0;i<shape_cb_size;i++) - { - float *res = resp+i*subvect_size; - - /* Compute codeword response */ - int k; - for(j=0;j<subvect_size;j++) - res[j]=0; - for(j=0;j<subvect_size;j++) - { - for (k=j;k<subvect_size;k++) - res[k]+=shape_cb[i*subvect_size+j]*r[k-j]; - } - /* Compute energy of codeword response */ - E[i]=0; - for(j=0;j<subvect_size;j++) - E[i]+=res[j]*res[j]; - E[i]=1/(.001+E[i]); - } - - for (i=0;i<nb_subvect;i++) - { - int best_index=0, k, m; - float g, corr, best_gain=0, score, best_score=-1; - /* Find best codeword for current sub-vector */ - for (j=0;j<shape_cb_size;j++) - { - corr=xcorr(resp+j*subvect_size,t+subvect_size*i,subvect_size); - score=corr*corr*E[j]; - g = corr*E[j]; - if (score>best_score) - { - best_index=j; - best_score=score; - best_gain=g; - } - } - speex_bits_pack(bits,best_index,params->shape_bits); - - /* Quantize gain */ - { - int s=0, best_id; - best_gain /= .01+exc_energy; - if (best_gain<0) - { - best_gain=-best_gain; - s=1; - } - - /* Find gain index (it's a scalar but we use the VQ code anyway)*/ - best_id = vq_index(&best_gain, scal_gains4, 1, 8); - - best_gain=scal_gains4[best_id]; - /*printf ("gain_quant: %f %d %f\n", best_gain, best_id, scal_gains4[best_id]);*/ - if (s) - best_gain=-best_gain; - best_gain *= exc_energy; - speex_bits_pack(bits,s,1); - speex_bits_pack(bits,best_id,3); - } - ind[i]=best_index; - gains[i]=best_gain; - /* Update target for next subvector */ - for (j=0;j<subvect_size;j++) - { - g=best_gain*shape_cb[best_index*subvect_size+j]; - for (k=subvect_size*i+j,m=0;k<nsf;k++,m++) - t[k] -= g*r[m]; - } - } - - /* Put everything back together */ - for (i=0;i<nb_subvect;i++) - for (j=0;j<subvect_size;j++) - e[subvect_size*i+j]=gains[i]*shape_cb[ind[i]*subvect_size+j]; - - /* Update excitation */ - for (j=0;j<nsf;j++) - exc[j]+=e[j]; - - /* Update target */ - residue_zero(e, awk1, r, nsf, p); - syn_filt_zero(r, ak, r, nsf, p); - syn_filt_zero(r, awk2, r, nsf,p); - for (j=0;j<nsf;j++) - target[j]-=r[j]; - - - - - POP(stack); - POP(stack); - POP(stack); - POP(stack); - POP(stack); - POP(stack); - POP(stack); -} void split_cb_search_nogain( float target[], /* target vector */ @@ -727,330 +562,6 @@ float *stack } -void split_cb_search2( -float target[], /* target vector */ -float ak[], /* LPCs for this subframe */ -float awk1[], /* Weighted LPCs for this subframe */ -float awk2[], /* Weighted LPCs for this subframe */ -void *par, /* Codebook/search parameters*/ -int p, /* number of LPC coeffs */ -int nsf, /* number of samples in subframe */ -float *exc, -SpeexBits *bits, -float *stack -) -{ - int i,j, id; - float *resp, *E, q; - float *t, *r, *e; - float *gains; - int *ind, *gain_ind; - float *shape_cb; - int shape_cb_size, subvect_size, nb_subvect; - float exc_energy=0; - 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; - resp = PUSH(stack, shape_cb_size*subvect_size); - E = PUSH(stack, shape_cb_size); - t = PUSH(stack, nsf); - r = PUSH(stack, nsf); - e = PUSH(stack, nsf); - gains = PUSH(stack, nb_subvect); - ind = (int*)PUSH(stack, nb_subvect); - gain_ind = (int*)PUSH(stack, nb_subvect); - - /* Compute energy of the "real excitation" */ - syn_filt_zero(target, awk1, e, nsf, p); - residue_zero(e, ak, e, nsf, p); - residue_zero(e, awk2, e, nsf, p); - for (i=0;i<nsf;i++) - exc_energy += e[i]*e[i]; - exc_energy=sqrt(exc_energy/nb_subvect); - - /* Quantize global ("average") gain */ - q=log(exc_energy+.1); - q=floor(.5+2*(q-2)); - if (q<0) - q=0; - if (q>15) - q=15; - id = (int)q; - speex_bits_pack(bits, id, 4); - exc_energy=exp(.5*q+2); - - - for (i=0;i<nsf;i++) - t[i]=target[i]; - - e[0]=1; - for (i=1;i<nsf;i++) - e[i]=0; - residue_zero(e, awk1, r, nsf, p); - syn_filt_zero(r, ak, r, nsf, p); - syn_filt_zero(r, awk2, r, nsf,p); - - /* Pre-compute codewords response and energy */ - for (i=0;i<shape_cb_size;i++) - { - float *res = resp+i*subvect_size; - - /* Compute codeword response */ - int k; - for(j=0;j<subvect_size;j++) - res[j]=0; - for(j=0;j<subvect_size;j++) - { - for (k=j;k<subvect_size;k++) - res[k]+=shape_cb[i*subvect_size+j]*r[k-j]; - } - /* Compute energy of codeword response */ - E[i]=0; - for(j=0;j<subvect_size;j++) - E[i]+=res[j]*res[j]; - E[i]=1/(.001+E[i]); - } - - for (i=0;i<nb_subvect;i++) - { - int best_index[2]={0,0}, k, m, best_gain_ind[2]={0,0}; - float g, corr, best_gain[2]={0,0}, score, best_score[2]={-1,-1}; - /* Find best codeword for current sub-vector */ - for (j=0;j<shape_cb_size;j++) - { - corr=xcorr(resp+j*subvect_size,t+subvect_size*i,subvect_size); - score=corr*corr*E[j]; - g = corr*E[j]; - if (score>best_score[0]) - { - best_index[1]=best_index[0]; - best_score[1]=best_score[0]; - best_gain[1]=best_gain[0]; - - best_index[0]=j; - best_score[0]=score; - best_gain[0]=g; - } else if (score>best_score[1]) { - best_index[1]=j; - best_score[1]=score; - best_gain[1]=g; - } - } - - /* Quantize gain */ - for (k=0;k<2;k++) { - int s=0, best_id; - best_gain[k] /= .01+exc_energy; - if (best_gain[k]<0) - { - best_gain[k]=-best_gain[k]; - s=1; - } - - /* Find gain index (it's a scalar but we use the VQ code anyway)*/ - best_id = vq_index(&best_gain[k], scal_gains4, 1, 8); - - best_gain_ind[k]=best_id; - best_gain[k]=scal_gains4[best_id]; - /*printf ("gain_quant: %f %d %f\n", best_gain, best_id, scal_gains4[best_id]);*/ - if (s) - best_gain[k]=-best_gain[k]; - best_gain[k] *= exc_energy; - } - - - - if (i<nb_subvect-1) { - int best_index2=0; - float best_score2=-1, best_gain2=0; - int nbest; - float err[2]={0,0}; - float *tt=PUSH(stack,nsf); - for (nbest=0;nbest<2;nbest++) - { - for (j=0;j<nsf;j++) - tt[j]=t[j]; - for (j=0;j<subvect_size;j++) - { - g=best_gain[nbest]*shape_cb[best_index[nbest]*subvect_size+j]; - for (k=subvect_size*i+j,m=0;k<nsf;k++,m++) - tt[k] -= g*r[m]; - } - - - for (j=0;j<shape_cb_size;j++) - { - corr=xcorr(resp+j*subvect_size,tt+subvect_size*(i+1),subvect_size); - score=corr*corr*E[j]; - g = corr*E[j]; - if (score>best_score2) - { - best_index2=j; - best_score2=score; - best_gain2=g; - } - } - - { - int s=0, best_id; - best_gain2 /= .01+exc_energy; - if (best_gain2<0) - { - best_gain2=-best_gain2; - s=1; - } - best_id = vq_index(&best_gain2, scal_gains4, 1, 8); - best_gain2=scal_gains4[best_id]; - if (s) - best_gain2=-best_gain2; - best_gain2 *= exc_energy; - } - - for (j=0;j<subvect_size;j++) - { - g=best_gain2*shape_cb[best_index2*subvect_size+j]; - for (k=subvect_size*(i+1)+j,m=0;k<nsf;k++,m++) - tt[k] -= g*r[m]; - } - for (j=subvect_size*i;j<subvect_size*(i+2);j++) - err[nbest]-=tt[j]*tt[j]; - - best_score[nbest]=err[nbest]; - } - - if (best_score[1]>best_score[0]) - { - best_index[0]=best_index[1]; - best_score[0]=best_score[1]; - best_gain[0]=best_gain[1]; - best_gain_ind[0]=best_gain_ind[1]; - } - POP(stack); - } - - - - - ind[i]=best_index[0]; - gain_ind[i]=best_gain_ind[0]; - gains[i]=best_gain[0]; - /* Update target for next subvector */ - for (j=0;j<subvect_size;j++) - { - g=best_gain[0]*shape_cb[best_index[0]*subvect_size+j]; - for (k=subvect_size*i+j,m=0;k<nsf;k++,m++) - t[k] -= g*r[m]; - } - } - for (i=0;i<nb_subvect;i++) - { - speex_bits_pack(bits, ind[i], params->shape_bits); - if (gains[i]<0) - speex_bits_pack(bits, 1, 1); - else - speex_bits_pack(bits, 0, 1); - speex_bits_pack(bits, gain_ind[i], 3); - /*printf ("encode split: %d %d %f\n", i, ind[i], gains[i]);*/ - - } - /* Put everything back together */ - for (i=0;i<nb_subvect;i++) - for (j=0;j<subvect_size;j++) - e[subvect_size*i+j]=gains[i]*shape_cb[ind[i]*subvect_size+j]; - - /* Update excitation */ - for (j=0;j<nsf;j++) - exc[j]+=e[j]; - - /* Update target */ - residue_zero(e, awk1, r, nsf, p); - syn_filt_zero(r, ak, r, nsf, p); - syn_filt_zero(r, awk2, r, nsf,p); - for (j=0;j<nsf;j++) - target[j]-=r[j]; - - - - POP(stack); - POP(stack); - POP(stack); - POP(stack); - POP(stack); - POP(stack); - POP(stack); - POP(stack); -} - - - - -void split_cb_unquant( -float *exc, -void *par, /* non-overlapping codebook */ -int nsf, /* number of samples in subframe */ -SpeexBits *bits, -float *stack -) -{ - int i,j; - int *ind; - float *gains; - float *sign; - float *shape_cb, exc_energy; - int shape_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; - - ind = (int*)PUSH(stack, nb_subvect); - gains = PUSH(stack, nb_subvect); - sign = PUSH(stack, nb_subvect); - - /* Decode global (average) gain */ - { - int id; - id = speex_bits_unpack_unsigned(bits, 4); - exc_energy=exp(.5*id+2); - } - - /* Decode codewords and gains */ - for (i=0;i<nb_subvect;i++) - { - int gain_id; - ind[i] = speex_bits_unpack_unsigned(bits, params->shape_bits); - if (speex_bits_unpack_unsigned(bits, 1)) - sign[i]=-1; - else - sign[i]=1; - - gain_id = speex_bits_unpack_unsigned(bits, 3); - gains[i]=scal_gains4[gain_id]; - gains[i] *= sign[i]; - gains[i] *= exc_energy; - - /*printf ("decode split: %d %d %f\n", i, ind[i], gains[i]);*/ - } - - /* Compute decoded excitation */ - 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); -} - - - void split_cb_nogain_unquant( float *exc, void *par, /* non-overlapping codebook */ diff --git a/libspeex/cb_search.h b/libspeex/cb_search.h index 8d45eaa..c9d38c0 100644 --- a/libspeex/cb_search.h +++ b/libspeex/cb_search.h @@ -29,32 +29,6 @@ typedef struct split_cb_params { int shape_bits; } split_cb_params; -float overlap_cb_search( -float target[], /* target vector */ -float ak[], /* LPCs for this subframe */ -float awk1[], /* Weighted LPCs for this subframe */ -float awk2[], /* Weighted LPCs for this subframe */ -float codebook[], /* overlapping codebook */ -int entries, /* number of overlapping entries to search */ -float *gain, /* gain of optimum entry */ -int *index, /* index of optimum entry */ -int p, /* number of LPC coeffs */ -int nsf, /* number of samples in subframe */ -float *stack -); - -void split_cb_search( -float target[], /* target vector */ -float ak[], /* LPCs for this subframe */ -float awk1[], /* Weighted LPCs for this subframe */ -float awk2[], /* Weighted LPCs for this subframe */ -void *par, /* Codebook/search parameters*/ -int p, /* number of LPC coeffs */ -int nsf, /* number of samples in subframe */ -float *exc, -SpeexBits *bits, -float *stack -); void split_cb_search_nogain( float target[], /* target vector */ @@ -103,28 +77,6 @@ SpeexBits *bits, float *stack ); -void split_cb_search2( -float target[], /* target vector */ -float ak[], /* LPCs for this subframe */ -float awk1[], /* Weighted LPCs for this subframe */ -float awk2[], /* Weighted LPCs for this subframe */ -void *par, /* Codebook/search parameters*/ -int p, /* number of LPC coeffs */ -int nsf, /* number of samples in subframe */ -float *exc, -SpeexBits *bits, -float *stack -); - - -void split_cb_unquant( -float *exc, -void *par, /* Innovation parameters */ -int nsf, /* number of samples in subframe */ -SpeexBits *bits, -float *stack -); - void split_cb_nogain_unquant( float *exc, void *par, /* non-overlapping codebook */ diff --git a/libspeex/lpc.c b/libspeex/lpc.c index bff5f4b..932878b 100644 --- a/libspeex/lpc.c +++ b/libspeex/lpc.c @@ -16,6 +16,23 @@ Jutta Degener Carsten Bormann */ +/* Speex License: + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + /* LPC- and Reflection Coefficients diff --git a/libspeex/lsp.c b/libspeex/lsp.c index a5cedc7..1a7b7c8 100644 --- a/libspeex/lsp.c +++ b/libspeex/lsp.c @@ -12,6 +12,22 @@ radians format but in the x domain of the unit circle. \*---------------------------------------------------------------------------*/ +/* Speex License: + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ #include <math.h> #include <stdio.h> @@ -282,7 +298,8 @@ void lsp_to_lpc(float *freq,float *ak,int lpcrdr, float *stack) POP(stack); } - +/*Added by JMV + Makes sure the LSPs are stable*/ void lsp_enforce_margin(float *lsp, int len, float margin) { int i; diff --git a/libspeex/lsp.h b/libspeex/lsp.h index 5bf3c37..2758602 100644 --- a/libspeex/lsp.h +++ b/libspeex/lsp.h @@ -7,6 +7,22 @@ DATE CREATED: 21/11/95
\*---------------------------------------------------------------------------*/
+/* Speex License:
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
#ifndef __AK2LSPD__
#define __AK2LSPD__
@@ -14,6 +30,7 @@ int lpc_to_lsp (float *a, int lpcrdr, float *freq, int nb, float delta, float *stack);
void lsp_to_lpc(float *freq, float *ak, int lpcrdr, float *stack);
+/*Added by JMV*/
void lsp_enforce_margin(float *lsp, int len, float margin);
diff --git a/libspeex/ltp.c b/libspeex/ltp.c index 84038b6..c0c0aa3 100644 --- a/libspeex/ltp.c +++ b/libspeex/ltp.c @@ -20,7 +20,6 @@ #include <math.h> #include <stdio.h> #include "ltp.h" -#include "cb_search.h" #include "stack_alloc.h" #include "filters.h" #include "speex_bits.h" diff --git a/libspeex/modes.c b/libspeex/modes.c index 3c89c07..b74c2fa 100644 --- a/libspeex/modes.c +++ b/libspeex/modes.c @@ -257,7 +257,7 @@ SpeexMode speex_nb_mode = { &nb_mode, "narrowband", 0, - 1, + 2, &nb_encoder_init, &nb_encoder_destroy, &nb_encode, @@ -350,7 +350,7 @@ SpeexMode speex_wb_mode = { &sb_wb_mode, "full-rate wideband (sub-band CELP)", 1, - 1, + 2, &sb_encoder_init, &sb_encoder_destroy, &sb_encode, diff --git a/libspeex/vq.c b/libspeex/vq.c index d26b20a..92b9188 100644 --- a/libspeex/vq.c +++ b/libspeex/vq.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2002 Jean-Marc Valin & David Rowe +/* Copyright (C) 2002 Jean-Marc Valin File: vq.c Vector quantization @@ -19,6 +19,7 @@ #include "vq.h" +/*Finds the index of the entry in a codebook that best matches the input*/ int vq_index(float *in, float *codebook, int len, int entries) { int i,j; diff --git a/libspeex/vq.h b/libspeex/vq.h index 2460bad..a8addef 100644 --- a/libspeex/vq.h +++ b/libspeex/vq.h @@ -1,4 +1,4 @@ -/* Copyright (C) 2002 Jean-Marc Valin & David Rowe +/* Copyright (C) 2002 Jean-Marc Valin File: vq.h Vector quantization |