Adjustable LPC analysis (lag windowing, noise floor), changed wideband
authorjmvalin <jmvalin@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Fri, 15 Mar 2002 23:16:35 +0000 (23:16 +0000)
committerjmvalin <jmvalin@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Fri, 15 Mar 2002 23:16:35 +0000 (23:16 +0000)
frame size

git-svn-id: http://svn.xiph.org/trunk/speex@3153 0101bb08-14d6-0310-b084-bc0e0c8e3800

libspeex/lsp.c
libspeex/modes.c
libspeex/modes.h
libspeex/speex.c
libspeex/speex.h
libspeex/testenc_wb.c

index 7376cb1..d06766e 100644 (file)
@@ -44,10 +44,6 @@ float cheb_poly_eva(float *coef,float x,int m,float *stack)
 
     /* Allocate memory for chebyshev series formulation */
 
-    /*if((T = (float *)malloc((m/2+1)*sizeof(float))) == NULL){
-       printf("not enough memory to allocate buffer\n");
-       exit(1);
-        }*/
     T=PUSH(stack, m/2+1);
 
     /* Initialise pointers */
@@ -118,16 +114,6 @@ int lpc_to_lsp (float *a,int lpcrdr,float *freq,int nb,float delta, float *stack
 
 
     /* Allocate memory space for polynomials */
-
-    /*if((Q = (float *) malloc((m+1)*sizeof(float))) == NULL){
-       printf("not enough memory to allocate buffer\n");
-       exit(1);
-    }
-
-    if((P = (float *) malloc((m+1)*sizeof(float))) == NULL){
-       printf("not enough memory to allocate buffer\n");
-       exit(1);
-        }*/
     Q = PUSH(stack, (m+1));
     P = PUSH(stack, (m+1));
 
@@ -247,10 +233,6 @@ void lsp_to_lpc(float *freq,float *ak,int lpcrdr, float *stack)
     float *pw,*n1,*n2,*n3,*n4=NULL;
     int m = lpcrdr/2;
 
-    /*if((Wp = (float *) malloc((4*m+2)*sizeof(float))) == NULL){
-       printf("not enough memory to allocate buffer\n");
-       exit(1);
-        }*/
     Wp = PUSH(stack, 4*m+2);
     pw = Wp;
 
index 240b4b3..d6e833b 100644 (file)
@@ -71,6 +71,8 @@ SpeexMode nb_mode = {
    144,    /*pitchEnd*/
    0.9,    /*gamma1*/
    0.6,    /*gamma2*/
+   .01,
+   1.0001,
    /*LSP quantization*/
    lsp_quant_nb,
    lsp_unquant_nb,
@@ -85,16 +87,19 @@ SpeexMode nb_mode = {
 };
 
 
+
 SpeexMode wb_mode = {
-   256,    /*frameSize*/
+   320,    /*frameSize*/
    64,     /*subframeSize*/
-   512,    /*windowSize*/
+   640,    /*windowSize*/
    16,     /*lpcSize*/
-   1024,   /*bufSize*/
+   1280,   /*bufSize*/
    35,     /*pitchStart*/
    290,    /*pitchEnd*/
    0.9,    /*gamma1*/
    0.4,    /*gamma2*/
+   .001,
+   1.00001,
    /*LSP quantization*/
    lsp_quant_wb,
    lsp_unquant_wb,
index 1c3fae4..1e9e079 100644 (file)
@@ -56,7 +56,8 @@ typedef struct SpeexMode {
    int     pitchEnd;
    float   gamma1;
    float   gamma2;
-   
+   float   lag_factor;
+   float   lpc_floor;
    /*LSP functions*/
    lsp_quant_func    lsp_quant;
    lsp_unquant_func  lsp_unquant;
index 4993b4c..f56535e 100644 (file)
@@ -53,6 +53,8 @@ void encoder_init(EncState *st, SpeexMode *mode)
    st->gamma2=mode->gamma2;
    st->min_pitch=mode->pitchStart;
    st->max_pitch=mode->pitchEnd;
+   st->lag_factor=mode->lag_factor;
+   st->lpc_floor = mode->lpc_floor;
 
    st->lsp_quant = mode->lsp_quant;
    st->ltp_quant = mode->ltp_quant;
@@ -100,7 +102,7 @@ void encoder_init(EncState *st, SpeexMode *mode)
    /* Create the window for autocorrelation (lag-windowing) */
    st->lagWindow = malloc((st->lpcSize+1)*sizeof(float));
    for (i=0;i<st->lpcSize+1;i++)
-      st->lagWindow[i]=exp(-.5*sqr(2*M_PI*.01*i));
+      st->lagWindow[i]=exp(-.5*sqr(2*M_PI*st->lag_factor*i));
 
    st->autocorr = malloc((st->lpcSize+1)*sizeof(float));
 
@@ -178,7 +180,7 @@ void encode(EncState *st, float *in, FrameBits *bits)
    autocorr(st->buf2, st->autocorr, st->lpcSize+1, st->windowSize);
 
    st->autocorr[0] += 1;        /* prevents NANs */
-   st->autocorr[0] *= 1.0001;   /* 40 dB noise floor */
+   st->autocorr[0] *= st->lpc_floor; /* Noise floor in auto-correlation domain */
    /* Lag windowing: equivalent to filtering in the power-spectrum domain */
    for (i=0;i<st->lpcSize+1;i++)
       st->autocorr[i] *= st->lagWindow[i];
@@ -201,6 +203,8 @@ void encode(EncState *st, float *in, FrameBits *bits)
    
    /* LSP Quantization */
    st->lsp_quant(st->lsp, st->qlsp, st->lpcSize, bits);
+   /*for (i=0;i<st->lpcSize;i++)
+     st->qlsp[i]=st->lsp[i];*/
    /*printf ("LSP ");
    for (i=0;i<st->lpcSize;i++)
       printf ("%f ", st->lsp[i]);
index 77f804e..445dde1 100644 (file)
@@ -38,6 +38,8 @@ typedef struct EncState {
    int    ol_voiced;      /* Open-loop voiced/non-voiced decision */
    float  gamma1;         /* Perceptual filter: A(z/gamma1) */
    float  gamma2;         /* Perceptual filter: A(z/gamma2) */
+   float  lag_factor;     /* Lag windowing gaussian width */
+   float  lpc_floor;      /* Noise floor multiplier for A[0] in LPC analysis*/
    float *stack;          /* Pseudo-stack allocation */
    int    os_fact;        /* Over-sampling factor for fractional pitch */
    int    os_filt_ord2;   /* Over-sampling filter size for fractional pitch */
index 2a88d74..53f1f42 100644 (file)
@@ -2,7 +2,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 
-#define FRAME_SIZE 256
+#define FRAME_SIZE 320
 #include <math.h>
 int main(int argc, char **argv)
 {