A bunch of pointers marked as "restrict" to ease the job of the compiler
[opus.git] / libcelt / psy.c
index 93a8da4..7c7164b 100644 (file)
@@ -78,7 +78,7 @@ void psydecay_clear(struct PsyDecay *decay)
 }
 #endif
 
 }
 #endif
 
-static void spreading_func(const struct PsyDecay *d, celt_word32_t *psd, celt_mask_t *mask, int len)
+static void spreading_func(const struct PsyDecay *d, celt_word32_t * restrict psd, int len)
 {
    int i;
    celt_word32_t mem;
 {
    int i;
    celt_word32_t mem;
@@ -87,22 +87,20 @@ static void spreading_func(const struct PsyDecay *d, celt_word32_t *psd, celt_ma
    mem=psd[0];
    for (i=0;i<len;i++)
    {
    mem=psd[0];
    for (i=0;i<len;i++)
    {
-      mask[i] = MULT16_32_Q15(Q15ONE-d->decayR[i],psd[i]) + MULT16_32_Q15(d->decayR[i],mem);
-      if (mask[i]<1)
-         mask[i]=1;
-      mem = mask[i];
+      /* psd = (1-decay)*psd + decay*mem */
+      psd[i] = EPSILON + psd[i] + MULT16_32_Q15(d->decayR[i],mem-psd[i]);
+      mem = psd[i];
    }
    /* Compute left slope (-25 dB/Bark) */
    }
    /* Compute left slope (-25 dB/Bark) */
-   mem=mask[len-1];
+   mem=psd[len-1];
    for (i=len-1;i>=0;i--)
    {
       /* Left side has around twice the slope as the right side, so we just
          square the coef instead of storing two sets of decay coefs */
       celt_word16_t decayL = MULT16_16_Q15(d->decayR[i], d->decayR[i]);
    for (i=len-1;i>=0;i--)
    {
       /* Left side has around twice the slope as the right side, so we just
          square the coef instead of storing two sets of decay coefs */
       celt_word16_t decayL = MULT16_16_Q15(d->decayR[i], d->decayR[i]);
-      mask[i] = MULT16_32_Q15(Q15ONE-decayL,mask[i]) + MULT16_32_Q15(decayL,mem);
-      if (mask[i]<1)
-         mask[i]=1;
-      mem = mask[i];
+      /* psd = (1-decay)*psd + decay*mem */
+      psd[i] = EPSILON + psd[i] + MULT16_32_Q15(decayL,mem-psd[i]);
+      mem = psd[i];
    }
    /*for (i=0;i<len;i++) printf ("%f ", mask[i]); printf ("\n");*/
 #if 0 /* Prints signal and mask energy per critical band */
    }
    /*for (i=0;i<len;i++) printf ("%f ", mask[i]); printf ("\n");*/
 #if 0 /* Prints signal and mask energy per critical band */
@@ -131,17 +129,17 @@ static void spreading_func(const struct PsyDecay *d, celt_word32_t *psd, celt_ma
 }
 
 /* Compute a marking threshold from the spectrum X. */
 }
 
 /* Compute a marking threshold from the spectrum X. */
-void compute_masking(const struct PsyDecay *decay, celt_word16_t *X, celt_mask_t *mask, int len)
+void compute_masking(const struct PsyDecay *decay, celt_word16_t *X, celt_mask_t * restrict mask, int len)
 {
    int i;
    int N;
 {
    int i;
    int N;
-   N=len/2;
+   N=len>>1;
    mask[0] = MULT16_16(X[0], X[0]);
    for (i=1;i<N;i++)
       mask[i] = ADD32(MULT16_16(X[i*2], X[i*2]), MULT16_16(X[i*2+1], X[i*2+1]));
    /* TODO: Do tone masking */
    /* Noise masking */
    mask[0] = MULT16_16(X[0], X[0]);
    for (i=1;i<N;i++)
       mask[i] = ADD32(MULT16_16(X[i*2], X[i*2]), MULT16_16(X[i*2+1], X[i*2+1]));
    /* TODO: Do tone masking */
    /* Noise masking */
-   spreading_func(decay, mask, mask, N);
+   spreading_func(decay, mask, N);
 }
 
 #if 0 /* Not needed for now, but will be useful in the future */
 }
 
 #if 0 /* Not needed for now, but will be useful in the future */