Added a post-filter for narrowband (and thus 0-4 kHz in wideband)
[speexdsp.git] / libspeex / nb_celp.c
index b6f6a5c..871f15f 100644 (file)
@@ -30,6 +30,7 @@
 #include "stack_alloc.h"
 #include "vq.h"
 #include "speex_bits.h"
+#include "post_filter.h"
 
 #ifndef M_PI
 #define M_PI           3.14159265358979323846  /* pi */
@@ -184,7 +185,7 @@ void nb_encoder_destroy(void *state)
    free(st);
 }
 
-void nb_encode(void *state, float *in, FrameBits *bits)
+void nb_encode(void *state, float *in, SpeexBits *bits)
 {
    EncState *st;
    int i, sub, roots;
@@ -429,7 +430,7 @@ void nb_encode(void *state, float *in, FrameBits *bits)
          ener=sign/sqrt(.01+ener/st->subframeSize);
          for (i=0;i<st->subframeSize;i++)
          {
-            if (i%8==0)
+            if (i%10==0)
                printf ("\nexc ");
             printf ("%f ", ener*st->buf2[i]);
          }
@@ -441,7 +442,7 @@ void nb_encode(void *state, float *in, FrameBits *bits)
 #else
       if (0)
       {
-      /* Perform a split-codebook search */
+      /* Perform innovation search */
       st->innovation_quant(target, st->interp_qlpc, st->bw_lpc1, st->bw_lpc2,
                            st->innovation_params, st->lpcSize,
                            st->subframeSize, exc, bits, st->stack);
@@ -468,7 +469,6 @@ void nb_encode(void *state, float *in, FrameBits *bits)
                qe=63;
             ener = exp(qe/7.0);
             speex_bits_pack(bits, qe, 6);
-            printf ("quant_energy: %d %f\n", qe, ener);
          }
          ener_1 = 1/ener;
          
@@ -486,6 +486,8 @@ void nb_encode(void *state, float *in, FrameBits *bits)
             exc[i] += st->buf2[i];
 #endif
          POP(st->stack);
+         for (i=0;i<st->subframeSize;i++)
+            target[i]*=ener;
 
       }
 #endif
@@ -494,9 +496,9 @@ void nb_encode(void *state, float *in, FrameBits *bits)
       for (i=0;i<st->subframeSize;i++)
          enoise += target[i]*target[i];
       snr = 10*log10((esig+1)/(enoise+1));
-#ifdef DEBUG
+
       printf ("seg SNR = %f\n", snr);
-#endif
+
       /*Keep the previous memory*/
       for (i=0;i<st->lpcSize;i++)
          mem[i]=st->mem_sp[i];
@@ -586,10 +588,14 @@ void *nb_decoder_init(SpeexMode *m)
    st->frame = st->inBuf + st->bufSize - st->windowSize;
    st->excBuf = malloc(st->bufSize*sizeof(float));
    st->exc = st->excBuf + st->bufSize - st->windowSize;
+   st->exc2Buf = malloc(st->bufSize*sizeof(float));
+   st->exc2 = st->exc2Buf + st->bufSize - st->windowSize;
    for (i=0;i<st->bufSize;i++)
       st->inBuf[i]=0;
    for (i=0;i<st->bufSize;i++)
       st->excBuf[i]=0;
+   for (i=0;i<st->bufSize;i++)
+      st->exc2Buf[i]=0;
 
    st->interp_qlpc = malloc((st->lpcSize+1)*sizeof(float));
    st->qlsp = malloc(st->lpcSize*sizeof(float));
@@ -608,6 +614,7 @@ void nb_decoder_destroy(void *state)
    st=state;
    free(st->inBuf);
    free(st->excBuf);
+   free(st->exc2Buf);
    free(st->interp_qlpc);
    free(st->qlsp);
    free(st->old_qlsp);
@@ -619,15 +626,18 @@ void nb_decoder_destroy(void *state)
    free(state);
 }
 
-void nb_decode(void *state, FrameBits *bits, float *out)
+void nb_decode(void *state, SpeexBits *bits, float *out, int lost)
 {
    DecState *st;
    int i, sub;
+   int pitch;
+   float pitch_gain;
 
    st=state;
 
    memmove(st->inBuf, st->inBuf+st->frameSize, (st->bufSize-st->frameSize)*sizeof(float));
    memmove(st->excBuf, st->excBuf+st->frameSize, (st->bufSize-st->frameSize)*sizeof(float));
+   memmove(st->exc2Buf, st->exc2Buf+st->frameSize, (st->bufSize-st->frameSize)*sizeof(float));
 
 
    st->lsp_unquant(st->qlsp, st->lpcSize, bits);
@@ -641,7 +651,7 @@ void nb_decode(void *state, FrameBits *bits, float *out)
    for (sub=0;sub<st->nbSubframes;sub++)
    {
       int offset;
-      float *sp, *exc, tmp;
+      float *sp, *exc, *exc2, tmp;
       
       /* Offset relative to start of frame */
       offset = st->subframeSize*sub;
@@ -649,6 +659,8 @@ void nb_decode(void *state, FrameBits *bits, float *out)
       sp=st->frame+offset;
       /* Excitation */
       exc=st->exc+offset;
+      /* Excitation after post-filter*/
+      exc2=st->exc2+offset;
 
       /* LSP interpolation (quantized and unquantized) */
       tmp = (.5 + sub)/st->nbSubframes;
@@ -673,7 +685,7 @@ void nb_decode(void *state, FrameBits *bits, float *out)
          exc[i]=0;
 
       /*Adaptive codebook contribution*/
-      st->ltp_unquant(exc, st->min_pitch, st->max_pitch, st->ltp_params, st->subframeSize, bits, st->stack);
+      st->ltp_unquant(exc, st->min_pitch, st->max_pitch, st->ltp_params, st->subframeSize, &pitch, &pitch_gain, bits, st->stack, lost);
       
 
       {
@@ -687,7 +699,7 @@ void nb_decode(void *state, FrameBits *bits, float *out)
 
          q_energy = speex_bits_unpack_unsigned(bits, 6);
          ener = exp(q_energy/7.0);
-         printf ("unquant_energy: %d %f\n", q_energy, ener);
+         /*printf ("unquant_energy: %d %f\n", q_energy, ener);*/
          
          /*Fixed codebook contribution*/
          st->innovation_unquant(innov, st->innovation_params, st->subframeSize, bits, st->stack);
@@ -698,8 +710,13 @@ void nb_decode(void *state, FrameBits *bits, float *out)
          POP(st->stack);
       }
 
+      for (i=0;i<st->subframeSize;i++)
+         exc2[i]=exc[i];
+      /*nb_post_filter(exc, exc2, st->interp_qlpc, st->lpcSize, st->subframeSize,
+        pitch, pitch_gain, st->stack);*/
+
       /*Compute decoded signal*/
-      syn_filt_mem(exc, st->interp_qlpc, sp, st->subframeSize, st->lpcSize, st->mem_sp);
+      syn_filt_mem(exc2, st->interp_qlpc, sp, st->subframeSize, st->lpcSize, st->mem_sp);
 
    }