Basic adaptive gain control working
authorjm <jm@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Wed, 14 May 2003 04:37:00 +0000 (04:37 +0000)
committerjm <jm@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Wed, 14 May 2003 04:37:00 +0000 (04:37 +0000)
git-svn-id: http://svn.xiph.org/trunk/speex@4702 0101bb08-14d6-0310-b084-bc0e0c8e3800

libspeex/denoise.c
libspeex/speex_denoise.h

index b5278ee..2a1b5f3 100644 (file)
@@ -47,6 +47,7 @@
 #endif
 
 #define SQRT_M_PI_2 0.88623
+#define LOUDNESS_EXP 3.5
 
 static void conj_window(float *w, int len)
 {
@@ -147,6 +148,10 @@ DenoiseState *denoise_state_init(int frame_size)
       st->loudness_weight[i] *= st->loudness_weight[i];
    }
 
+   st->loudness = pow(6000,LOUDNESS_EXP);
+   st->loudness2 = 6000;
+   st->nb_loudness_adapt = 0;
+
    drft_init(&st->fft_lookup,2*N);
 
 
@@ -365,6 +370,7 @@ int denoise(DenoiseState *st, float *x)
    if (mean_prior<.23 && mean_post < .5 && st->nb_adapt>=20)
    {
       st->consec_noise++;
+      /*fprintf (stderr, "noise\n");*/
    } else {
       st->consec_noise=0;
    }
@@ -412,15 +418,31 @@ int denoise(DenoiseState *st, float *x)
    }
    st->gain2[N-1]=0;
 
+   if ((mean_prior>3&&mean_prior>3))
    {
+      st->nb_loudness_adapt++;
+      float rate=2.0/(1+st->nb_loudness_adapt);
+      if (rate < .01)
+         rate = .01;
+
       float loudness=0;
       for (i=2;i<N;i++)
       {
          loudness += scale*st->ps[i] * st->gain2[i] * st->gain2[i] * st->loudness_weight[i];
       }
       loudness=sqrt(loudness);
-      fprintf (stderr, "%f\n", loudness);
+      /*if (loudness < 2*pow(st->loudness, 1.0/LOUDNESS_EXP) &&
+        loudness*2 > pow(st->loudness, 1.0/LOUDNESS_EXP))*/
+      st->loudness = (1-rate)*st->loudness + (rate)*pow(loudness, LOUDNESS_EXP);
+      
+      st->loudness2 = (1-rate)*st->loudness2 + rate*pow(st->loudness, 1.0/LOUDNESS_EXP);
+
+      loudness = pow(st->loudness, 1.0/LOUDNESS_EXP);
+
+      /*fprintf (stderr, "%f %f %f\n", loudness, st->loudness2, rate);*/
    }
+   for (i=0;i<N;i++)
+      st->gain2[i] *= 6000.0/st->loudness2;
 
    /* Apply computed gain */
    for (i=1;i<N;i++)
index a37b15b..140ce77 100644 (file)
@@ -55,17 +55,20 @@ typedef struct DenoiseState {
    float *last_energy;       /**< Energy of the previous frames */
    float *last_ps;           /**< Power spectrum of the past frames */
    float *loudness_weight;   /**< */
-   int   last_id;            /**< */
+   int    last_id;           /**< */
 
    float *inbuf;             /**< Input buffer (overlapped analysis) */
    float *outbuf;            /**< Output buffer (for overlap and add) */
 
-   int nb_adapt;             /**< Number of frames used for adaptation so far */
-   int consec_noise;         /**< */
-   int nb_denoise;           /**< Number of frames processed so far */
-   int nb_min_estimate;      /**< */
-   int last_update;          /**< */
-   float min_ener;           /**< */
+   float  loudness;          /**< loudness estimate */
+   float  loudness2;          /**< loudness estimate */
+   int    nb_adapt;          /**< Number of frames used for adaptation so far */
+   int    nb_loudness_adapt; /**< Number of frames used for loudness adaptation so far */
+   int    consec_noise;      /**< Number of consecutive noise frames */
+   int    nb_denoise;        /**< Number of frames processed so far */
+   int    nb_min_estimate;   /**< */
+   int    last_update;       /**< */
+   float  min_ener;          /**< */
    drft_lookup fft_lookup;   /**< */
 
 } DenoiseState;