Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mumble-voip/speexdsp.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libspeex/cb_search.c489
-rw-r--r--libspeex/cb_search.h48
-rw-r--r--libspeex/lpc.c17
-rw-r--r--libspeex/lsp.c19
-rw-r--r--libspeex/lsp.h17
-rw-r--r--libspeex/ltp.c1
-rw-r--r--libspeex/modes.c4
-rw-r--r--libspeex/vq.c3
-rw-r--r--libspeex/vq.h2
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