index 294e2dc..7c7164b 100644 (file)
@@ -42,7 +42,7 @@
#define toBARK(n)   (13.1f*atan(.00074f*(n))+2.24f*atan((n)*(n)*1.85e-8f)+1e-4f*(n))
#define fromBARK(z) (102.f*(z)-2.f*pow(z,2.f)+.4f*pow(z,3.f)+pow(1.46f,z)-1.f)

#define toBARK(n)   (13.1f*atan(.00074f*(n))+2.24f*atan((n)*(n)*1.85e-8f)+1e-4f*(n))
#define fromBARK(z) (102.f*(z)-2.f*pow(z,2.f)+.4f*pow(z,3.f)+pow(1.46f,z)-1.f)

-
+#ifndef STATIC_MODES
/* Psychoacoustic spreading function. The idea here is compute a first order
recursive filter. The filter coefficient is frequency dependent and
chosen such that we have a -10dB/Bark slope on the right side and a -25dB/Bark
/* Psychoacoustic spreading function. The idea here is compute a first order
recursive filter. The filter coefficient is frequency dependent and
chosen such that we have a -10dB/Bark slope on the right side and a -25dB/Bark
@@ -50,8 +50,8 @@
void psydecay_init(struct PsyDecay *decay, int len, celt_int32_t Fs)
{
int i;
void psydecay_init(struct PsyDecay *decay, int len, celt_int32_t Fs)
{
int i;
-   decay->decayR = celt_alloc(sizeof(float)*len);
-   decay->decayL = celt_alloc(sizeof(float)*len);
+   celt_word16_t *decayR = (celt_word16_t*)celt_alloc(sizeof(celt_word16_t)*len);
+   /*decay->decayL = celt_alloc(sizeof(celt_word16_t)*len);*/
for (i=0;i<len;i++)
{
float f;
for (i=0;i<len;i++)
{
float f;
@@ -63,20 +63,22 @@ void psydecay_init(struct PsyDecay *decay, int len, celt_int32_t Fs)
/* Back to FFT bin units */
deriv *= Fs*(1/(2.f*len));
/* decay corresponding to -10dB/Bark */
/* Back to FFT bin units */
deriv *= Fs*(1/(2.f*len));
/* decay corresponding to -10dB/Bark */
-      decay->decayR[i] = Q15ONE*pow(.1f, deriv);
+      decayR[i] = Q15ONE*pow(.1f, deriv);
/* decay corresponding to -25dB/Bark */
/* decay corresponding to -25dB/Bark */
-      decay->decayL[i] = Q15ONE*pow(0.0031623f, deriv);
+      /*decay->decayL[i] = Q15ONE*pow(0.0031623f, deriv);*/
/*printf ("%f %f\n", decayL[i], decayR[i]);*/
}
/*printf ("%f %f\n", decayL[i], decayR[i]);*/
}
+   decay->decayR = decayR;
}

void psydecay_clear(struct PsyDecay *decay)
{
}

void psydecay_clear(struct PsyDecay *decay)
{
-   celt_free(decay->decayR);
-   celt_free(decay->decayL);
+   celt_free((celt_word16_t *)decay->decayR);
+   /*celt_free(decay->decayL);*/
}
}
+#endif

+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;
@@ -85,19 +87,20 @@ static void spreading_func(struct PsyDecay *d, celt_word32_t *psd, celt_mask_t *
mem=psd;
for (i=0;i<len;i++)
{
mem=psd;
for (i=0;i<len;i++)
{
-      mask[i] = MULT16_32_Q15(Q15ONE-d->decayR[i],psd[i]) + MULT16_32_Q15(d->decayR[i],mem);
+      /* 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=psd[len-1];
for (i=len-1;i>=0;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]);
+      /* 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 */
@@ -105,7 +108,7 @@ static void spreading_func(struct PsyDecay *d, celt_word32_t *psd, celt_mask_t *
{
int start,end;
int j;
{
int start,end;
int j;
start = (int)floor(fromBARK((float)i)*(2*len)/Fs);
if (start<0)
start = 0;
start = (int)floor(fromBARK((float)i)*(2*len)/Fs);
if (start<0)
start = 0;
@@ -126,26 +129,21 @@ static void spreading_func(struct PsyDecay *d, celt_word32_t *psd, celt_mask_t *
}

/* Compute a marking threshold from the spectrum X. */
}

/* Compute a marking threshold from the spectrum X. */
{
int i;
{
int i;
-   VARDECL(celt_word32_t *psd);
int N;
int N;
-   SAVE_STACK;
-   N=len/2;
-   ALLOC(psd, N, celt_word32_t);
-   psd = MULT16_16(ROUND(X,SIG_SHIFT), ROUND(X,SIG_SHIFT));
+   N=len>>1;
for (i=1;i<N;i++)
for (i=1;i<N;i++)
-                     MULT16_16(ROUND(X[i*2+1],SIG_SHIFT), ROUND(X[i*2+1],SIG_SHIFT)));
/* TODO: Do tone masking */
/* TODO: Do tone masking */
-   RESTORE_STACK;
}

#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 */