Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mumble-voip/speexdsp.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'tmv/mdf_tm.h')
-rw-r--r--tmv/mdf_tm.h362
1 files changed, 181 insertions, 181 deletions
diff --git a/tmv/mdf_tm.h b/tmv/mdf_tm.h
index cc82bf8..c505570 100644
--- a/tmv/mdf_tm.h
+++ b/tmv/mdf_tm.h
@@ -8,18 +8,18 @@
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
-
+
- Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
-
+
- Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
-
+
- Neither the name of the Xiph.org Foundation nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
-
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
@@ -36,7 +36,7 @@
#include "profile_tm.h"
// shifted power spectrum to fftwrap.c so that optimisation can be shared between mdf.c and preprocess.c
-#define OVERRIDE_POWER_SPECTRUM
+#define OVERRIDE_POWER_SPECTRUM
#ifdef FIXED_POINT
@@ -44,10 +44,10 @@
#define OVERRIDE_FILTER_DC_NOTCH16
void filter_dc_notch16(
- const spx_int16_t * restrict in,
- float radius,
- float * restrict out,
- int len,
+ const spx_int16_t * restrict in,
+ float radius,
+ float * restrict out,
+ int len,
float * restrict mem
)
{
@@ -74,7 +74,7 @@ void filter_dc_notch16(
mem0 = mem1 + 2 * (-vin + rvout);
mem1 = vin - (den2 * vout);
-
+
out[i] = rvout;
}
#if (TM_UNROLL && TM_UNROLL_FILTERDCNOTCH16)
@@ -90,17 +90,17 @@ void filter_dc_notch16(
#define OVERRIDE_MDF_INNER_PROD
float mdf_inner_prod(
- const float * restrict x,
- const float * restrict y,
+ const float * restrict x,
+ const float * restrict y,
int len
)
{
register float sum = 0;
-
+
MDFINNERPROD_START();
len >>= 1;
-
+
#if (TM_UNROLL && TM_UNROLL_MDFINNERPRODUCT)
#pragma TCS_unroll=4
#pragma TCS_unrollexact=1
@@ -126,9 +126,9 @@ float mdf_inner_prod(
#define OVERRIDE_SPECTRAL_MUL_ACCUM
void spectral_mul_accum(
- const float * restrict X,
- const float * restrict Y,
- float * restrict acc,
+ const float * restrict X,
+ const float * restrict Y,
+ float * restrict acc,
int N, int M
)
{
@@ -151,11 +151,11 @@ void spectral_mul_accum(
acc[i] = (Xi * Yi - Xii * Yii);
acc[i+1]= (Xii * Yi + Xi * Yii);
}
-
+
acc[_N] = X[_N] * Y[_N];
for ( j=1,X+=N,Y+=N ; j<M ; j++ )
- {
+ {
acc[0] += X[0] * Y[0];
for ( i=1 ; i<N-1 ; i+=2 )
@@ -168,7 +168,7 @@ void spectral_mul_accum(
acc[i] += (Xi * Yi - Xii * Yii);
acc[i+1]+= (Xii * Yi + Xi * Yii);
}
-
+
acc[_N] += X[_N] * Y[_N];
X += N;
Y += N;
@@ -179,11 +179,11 @@ void spectral_mul_accum(
#define OVERRIDE_WEIGHTED_SPECTRAL_MUL_CONJ
void weighted_spectral_mul_conj(
- const float * restrict w,
- const float p,
- const float * restrict X,
- const float * restrict Y,
- float * restrict prod,
+ const float * restrict w,
+ const float p,
+ const float * restrict X,
+ const float * restrict Y,
+ float * restrict prod,
int N
)
{
@@ -192,7 +192,7 @@ void weighted_spectral_mul_conj(
WEIGHTEDSPECTRALMULCONJ_START();
- prod[0] = p * w[0] * X[0] * Y[0];
+ prod[0] = p * w[0] * X[0] * Y[0];
_N = N-1;
for (i=1,j=1;i<_N;i+=2,j++)
@@ -210,7 +210,7 @@ void weighted_spectral_mul_conj(
prod[i] = W * (Xi * Yi + Xii * Yii);
prod[i+1]= W * (Xi * Yii - Xii * Yi);
}
-
+
prod[_N] = p * w[j] * X[_N] * Y[_N];
WEIGHTEDSPECTRALMULCONJ_STOP();
@@ -218,9 +218,9 @@ void weighted_spectral_mul_conj(
#define OVERRIDE_MDF_ADJUST_PROP
void mdf_adjust_prop(
- const float * restrict W,
- int N,
- int M,
+ const float * restrict W,
+ int N,
+ int M,
float * restrict prop
)
{
@@ -242,9 +242,9 @@ void mdf_adjust_prop(
#pragma TCS_unrollexact=1
#endif
for ( j=k ; j<l ; ++j )
- {
+ {
register float wi = W[j];
-
+
tmp += wi * wi;
}
#if (TM_UNROLL && TM_UNROLL_MDFADJUSTPROP)
@@ -277,8 +277,8 @@ void mdf_adjust_prop(
#define OVERRIDE_SPEEX_ECHO_GET_RESIDUAL
void speex_echo_get_residual(
- SpeexEchoState * restrict st,
- float * restrict residual_echo,
+ SpeexEchoState * restrict st,
+ float * restrict residual_echo,
int len
)
{
@@ -302,16 +302,16 @@ void speex_echo_get_residual(
#pragma TCS_unrollexact=1
#endif
for (i=0;i<N;i++)
- { y[i] = window[i] * last_y[i];
+ { y[i] = window[i] * last_y[i];
}
#if (TM_UNROLL && TM_UNROLL_SPEEXECHOGETRESIDUAL)
#pragma TCS_unrollexact=0
#pragma TCS_unroll=0
#endif
-
+
spx_fft(st->fft_table, st->y, st->Y);
power_spectrum(st->Y, residual_echo, N);
-
+
leake = st->leak_estimate;
leak2 = fmux(leake > .5, 1, 2 * leake);
N = st->frame_size;
@@ -340,7 +340,7 @@ void speex_echo_get_residual(
void mdf_preemph(
- SpeexEchoState * restrict st,
+ SpeexEchoState * restrict st,
spx_word16_t * restrict x,
const spx_int16_t * restrict far_end,
int framesize
@@ -429,7 +429,7 @@ void mdf_sub(
#if (TM_UNROLL && TM_UNROLL_SPEEXECHOCANCELLATION)
#pragma TCS_unrollexact=0
#pragma TCS_unroll=0
-#endif
+#endif
}
void mdf_sub_int(
@@ -458,8 +458,8 @@ void mdf_sub_int(
#else
for ( i=0,j=0 ; i<framesize ; i+=2,++j )
{ register int src1i, src2i, desti;
-
-
+
+
src1i = ld32d(src1,j);
src2i = ld32d(src2,j);
desti = dspidualsub(src1i,src2i);
@@ -472,7 +472,7 @@ void mdf_sub_int(
#if (TM_UNROLL && TM_UNROLL_SPEEXECHOCANCELLATION)
#pragma TCS_unrollexact=0
#pragma TCS_unroll=0
-#endif
+#endif
}
void mdf_compute_weight_gradient(
@@ -490,11 +490,11 @@ void mdf_compute_weight_gradient(
register spx_word32_t * restrict W = &(st->W[j*N]);
weighted_spectral_mul_conj(
- st->power_1,
- FLOAT_SHL(PSEUDOFLOAT(st->prop[j]),-15),
- &X[(j+1)*N],
- st->E,
- st->PHI,
+ st->power_1,
+ FLOAT_SHL(PSEUDOFLOAT(st->prop[j]),-15),
+ &X[(j+1)*N],
+ st->E,
+ st->PHI,
N);
#if (TM_UNROLL && TM_UNROLL_SPEEXECHOCANCELLATION)
#pragma TCS_unroll=4
@@ -506,7 +506,7 @@ void mdf_compute_weight_gradient(
#if (TM_UNROLL && TM_UNROLL_SPEEXECHOCANCELLATION)
#pragma TCS_unrollexact=0
#pragma TCS_unroll=0
-#endif
+#endif
}
}
@@ -528,7 +528,7 @@ void mdf_update_weight(
for ( j=0 ; j<M ; j++ )
{
register spx_word32_t * restrict W = &(st->W[j*N]);
-
+
if (j==0 || cancel_count%(M-1) == j-1)
{
#ifdef FIXED_POINT
@@ -542,7 +542,7 @@ void mdf_update_weight(
#if (TM_UNROLL && TM_UNROLL_SPEEXECHOCANCELLATION)
#pragma TCS_unrollexact=0
#pragma TCS_unroll=0
-#endif
+#endif
spx_ifft(st->fft_table, wtmp2, wtmp);
memset(wtmp, 0, framesize * sizeof(spx_word16_t));
@@ -556,7 +556,7 @@ void mdf_update_weight(
#if (TM_UNROLL && TM_UNROLL_SPEEXECHOCANCELLATION)
#pragma TCS_unrollexact=0
#pragma TCS_unroll=0
-#endif
+#endif
spx_fft(st->fft_table, wtmp, wtmp2);
@@ -570,13 +570,13 @@ void mdf_update_weight(
#if (TM_UNROLL && TM_UNROLL_SPEEXECHOCANCELLATION)
#pragma TCS_unrollexact=0
#pragma TCS_unroll=0
-#endif
+#endif
#else
spx_ifft(st->fft_table, W, wtmp);
memset(&wtmp[framesize], 0, (N-framesize) * sizeof(spx_word16_t));
spx_fft(st->fft_table, wtmp, W);
-#endif
+#endif
}
}
}
@@ -589,11 +589,11 @@ spx_word32_t mdf_update_foreground(
spx_word32_t Dbf,
spx_word32_t Sff,
spx_word32_t See
-)
-{
- register spx_word32_t Davg1 = st->Davg1;
- register spx_word32_t Davg2 = st->Davg2;
- register spx_word32_t Dvar1 = st->Dvar1;
+)
+{
+ register spx_word32_t Davg1 = st->Davg1;
+ register spx_word32_t Davg2 = st->Davg2;
+ register spx_word32_t Dvar1 = st->Dvar1;
register spx_word32_t Dvar2 = st->Dvar2;
register spx_word16_t * restrict input = st->input;
register int framesize = st->frame_size;
@@ -604,80 +604,80 @@ spx_word32_t mdf_update_foreground(
register int i;
register int N = st->window_size;
register int M = st->M;
-
-#ifdef FIXED_POINT
- register spx_word32_t sc0 = SUB32(Sff,See);
- register spx_float_t sc1 = FLOAT_MUL32U(Sff,Dbf);
-
- Davg1 = ADD32(MULT16_32_Q15(QCONST16(.6f,15),Davg1), MULT16_32_Q15(QCONST16(.4f,15),sc0));
- Davg2 = ADD32(MULT16_32_Q15(QCONST16(.85f,15),Davg2), MULT16_32_Q15(QCONST16(.15f,15),sc0));
- Dvar1 = FLOAT_ADD(
- FLOAT_MULT(VAR1_SMOOTH,Dvar1),
- FLOAT_MUL32U(MULT16_32_Q15(QCONST16(.4f,15),Sff),
- MULT16_32_Q15(QCONST16(.4f,15),Dbf)));
- Dvar2 = FLOAT_ADD(
- FLOAT_MULT(VAR2_SMOOTH,Dvar2),
- FLOAT_MUL32U(MULT16_32_Q15(QCONST16(.15f,15),Sff),
- MULT16_32_Q15(QCONST16(.15f,15),Dbf)));
+
+#ifdef FIXED_POINT
+ register spx_word32_t sc0 = SUB32(Sff,See);
+ register spx_float_t sc1 = FLOAT_MUL32U(Sff,Dbf);
+
+ Davg1 = ADD32(MULT16_32_Q15(QCONST16(.6f,15),Davg1), MULT16_32_Q15(QCONST16(.4f,15),sc0));
+ Davg2 = ADD32(MULT16_32_Q15(QCONST16(.85f,15),Davg2), MULT16_32_Q15(QCONST16(.15f,15),sc0));
+ Dvar1 = FLOAT_ADD(
+ FLOAT_MULT(VAR1_SMOOTH,Dvar1),
+ FLOAT_MUL32U(MULT16_32_Q15(QCONST16(.4f,15),Sff),
+ MULT16_32_Q15(QCONST16(.4f,15),Dbf)));
+ Dvar2 = FLOAT_ADD(
+ FLOAT_MULT(VAR2_SMOOTH,Dvar2),
+ FLOAT_MUL32U(MULT16_32_Q15(QCONST16(.15f,15),Sff),
+ MULT16_32_Q15(QCONST16(.15f,15),Dbf)));
#else
- register spx_word32_t sc0 = Sff - See;
- register spx_word32_t sc1 = Sff * Dbf;
-
- Davg1 = .6*Davg1 + .4*sc0;
- Davg2 = .85*Davg2 + .15*sc0;
- Dvar1 = VAR1_SMOOTH*Dvar1 + .16*sc1;
- Dvar2 = VAR2_SMOOTH*Dvar2 + .0225*sc1;
+ register spx_word32_t sc0 = Sff - See;
+ register spx_word32_t sc1 = Sff * Dbf;
+
+ Davg1 = .6*Davg1 + .4*sc0;
+ Davg2 = .85*Davg2 + .15*sc0;
+ Dvar1 = VAR1_SMOOTH*Dvar1 + .16*sc1;
+ Dvar2 = VAR2_SMOOTH*Dvar2 + .0225*sc1;
+#endif
+
+ update_foreground =
+ mux( FLOAT_GT(FLOAT_MUL32U(sc0, VABS(sc0)), sc1), 1,
+ mux( FLOAT_GT(FLOAT_MUL32U(Davg1, VABS(Davg1)), FLOAT_MULT(VAR1_UPDATE,(Dvar1))), 1,
+ mux( FLOAT_GT(FLOAT_MUL32U(Davg2, VABS(Davg2)), FLOAT_MULT(VAR2_UPDATE,(Dvar2))), 1, 0)));
+
+ if ( update_foreground )
+ {
+ register spx_word16_t * restrict windowf = st->window + framesize;
+ register spx_word16_t * restrict window = st->window;
+
+ st->Davg1 = st->Davg2 = 0;
+ st->Dvar1 = st->Dvar2 = FLOAT_ZERO;
+
+ memcpy(st->foreground, st->W, N*M*sizeof(spx_word32_t));
+
+#if (TM_UNROLL && TM_UNROLL_SPEEXECHOCANCELLATION)
+#pragma TCS_unroll=4
+#pragma TCS_unrollexact=1
#endif
-
- update_foreground =
- mux( FLOAT_GT(FLOAT_MUL32U(sc0, VABS(sc0)), sc1), 1,
- mux( FLOAT_GT(FLOAT_MUL32U(Davg1, VABS(Davg1)), FLOAT_MULT(VAR1_UPDATE,(Dvar1))), 1,
- mux( FLOAT_GT(FLOAT_MUL32U(Davg2, VABS(Davg2)), FLOAT_MULT(VAR2_UPDATE,(Dvar2))), 1, 0)));
-
- if ( update_foreground )
- {
- register spx_word16_t * restrict windowf = st->window + framesize;
- register spx_word16_t * restrict window = st->window;
-
- st->Davg1 = st->Davg2 = 0;
- st->Dvar1 = st->Dvar2 = FLOAT_ZERO;
-
- memcpy(st->foreground, st->W, N*M*sizeof(spx_word32_t));
-
-#if (TM_UNROLL && TM_UNROLL_SPEEXECHOCANCELLATION)
-#pragma TCS_unroll=4
-#pragma TCS_unrollexact=1
-#endif
- for ( i=0 ; i<framesize ; ++i)
- { register spx_word16_t wi = window[i];
- register spx_word16_t wfi = windowf[i];
- register spx_word16_t ei = ee[i];
- register spx_word16_t yi = y[i];
-
- ee[i] = MULT16_16_Q15(wfi,ei) + MULT16_16_Q15(wi,yi);
- }
-#if (TM_UNROLL && TM_UNROLL_SPEEXECHOCANCELLATION)
-#pragma TCS_unrollexact=0
-#pragma TCS_unroll=0
-#endif
-
- } else
- {
- register int reset_background;
-
- reset_background =
- mux( FLOAT_GT(FLOAT_MUL32U(-(sc0),VABS(sc0)), FLOAT_MULT(VAR_BACKTRACK,sc1)), 1,
- mux( FLOAT_GT(FLOAT_MUL32U(-(Davg1), VABS(Davg1)), FLOAT_MULT(VAR_BACKTRACK,Dvar1)), 1,
- mux( FLOAT_GT(FLOAT_MUL32U(-(Davg2), VABS(Davg2)), FLOAT_MULT(VAR_BACKTRACK,Dvar2)), 1, 0)));
-
- if ( reset_background )
- {
- memcpy(st->W, st->foreground, N*M*sizeof(spx_word32_t));
- memcpy(y, ee, framesize * sizeof(spx_word16_t));
- mdf_sub(xx,input,y,framesize);
- See = Sff;
- st->Davg1 = st->Davg2 = 0;
- st->Dvar1 = st->Dvar2 = FLOAT_ZERO;
+ for ( i=0 ; i<framesize ; ++i)
+ { register spx_word16_t wi = window[i];
+ register spx_word16_t wfi = windowf[i];
+ register spx_word16_t ei = ee[i];
+ register spx_word16_t yi = y[i];
+
+ ee[i] = MULT16_16_Q15(wfi,ei) + MULT16_16_Q15(wi,yi);
+ }
+#if (TM_UNROLL && TM_UNROLL_SPEEXECHOCANCELLATION)
+#pragma TCS_unrollexact=0
+#pragma TCS_unroll=0
+#endif
+
+ } else
+ {
+ register int reset_background;
+
+ reset_background =
+ mux( FLOAT_GT(FLOAT_MUL32U(-(sc0),VABS(sc0)), FLOAT_MULT(VAR_BACKTRACK,sc1)), 1,
+ mux( FLOAT_GT(FLOAT_MUL32U(-(Davg1), VABS(Davg1)), FLOAT_MULT(VAR_BACKTRACK,Dvar1)), 1,
+ mux( FLOAT_GT(FLOAT_MUL32U(-(Davg2), VABS(Davg2)), FLOAT_MULT(VAR_BACKTRACK,Dvar2)), 1, 0)));
+
+ if ( reset_background )
+ {
+ memcpy(st->W, st->foreground, N*M*sizeof(spx_word32_t));
+ memcpy(y, ee, framesize * sizeof(spx_word16_t));
+ mdf_sub(xx,input,y,framesize);
+ See = Sff;
+ st->Davg1 = st->Davg2 = 0;
+ st->Dvar1 = st->Dvar2 = FLOAT_ZERO;
} else
{
st->Davg1 = Davg1;
@@ -688,9 +688,9 @@ spx_word32_t mdf_update_foreground(
}
return See;
-}
+}
#endif
-
+
void mdf_compute_error_signal(
SpeexEchoState * restrict st,
const spx_int16_t * restrict in,
@@ -733,7 +733,7 @@ void mdf_compute_error_signal(
#else
tmp_out = SUB32(EXTEND32(input[i]), EXTEND32(y[i]));
#endif
- tmp_out =
+ tmp_out =
fmux( tmp_out > 32767, 32767,
fmux( tmp_out < -32768, -32768, tmp_out));
#endif
@@ -749,7 +749,7 @@ void mdf_compute_error_signal(
#if (TM_UNROLL && TM_UNROLL_SPEEXECHOCANCELLATION)
#pragma TCS_unrollexact=0
#pragma TCS_unroll=0
-#endif
+#endif
st->memE = memE;
st->saturated = saturated;
@@ -760,8 +760,8 @@ void mdf_compute_error_signal(
inline int mdf_check(
SpeexEchoState * restrict st,
spx_int16_t * out,
- spx_word32_t Syy,
- spx_word32_t Sxx,
+ spx_word32_t Syy,
+ spx_word32_t Sxx,
spx_word32_t See,
spx_word32_t Sff,
spx_word32_t Sdd
@@ -777,7 +777,7 @@ inline int mdf_check(
|| !(Sff < N1e9 && Syy < N1e9 && Sxx < N1e9 )
#endif
)
- {
+ {
screwed_up += 50;
memset(out, 0, framesize * sizeof(spx_int16_t));
@@ -811,7 +811,7 @@ void mdf_smooth(
#if (TM_UNROLL && TM_UNROLL_SPEEXECHOCANCELLATION)
#pragma TCS_unroll=4
#pragma TCS_unrollexact=1
-#endif
+#endif
for ( j=0 ; j<framesize ; ++j )
{ register spx_word32_t pi = power[j];
register spx_word32_t xfi = Xf[j];
@@ -821,7 +821,7 @@ void mdf_smooth(
#if (TM_UNROLL && TM_UNROLL_SPEEXECHOCANCELLATION)
#pragma TCS_unrollexact=0
#pragma TCS_unroll=0
-#endif
+#endif
pf = power[framesize];
xff = Xf[framesize];
@@ -830,11 +830,11 @@ void mdf_smooth(
void mdf_compute_filtered_spectra_crosscorrelations(
SpeexEchoState * restrict st,
- spx_word32_t Syy,
+ spx_word32_t Syy,
spx_word32_t See,
int framesize
)
-{
+{
register spx_float_t Pey = FLOAT_ONE;
register spx_float_t Pyy = FLOAT_ONE;
register spx_word16_t spec_average = st->spec_average;
@@ -863,7 +863,7 @@ void mdf_compute_filtered_spectra_crosscorrelations(
#if (TM_UNROLL && TM_UNROLL_SPEEXECHOCANCELLATION)
#pragma TCS_unroll=4
#pragma TCS_unrollexact=1
-#endif
+#endif
for (j=framesize; j>0 ; --j)
{
_Ehj = pEh[j];
@@ -883,7 +883,7 @@ void mdf_compute_filtered_spectra_crosscorrelations(
#if (TM_UNROLL && TM_UNROLL_SPEEXECHOCANCELLATION)
#pragma TCS_unrollexact=0
#pragma TCS_unroll=0
-#endif
+#endif
_Ehj = pEh[0];
_Rfj = pRf[0];
_Yfj = pYf[0];
@@ -906,21 +906,21 @@ void mdf_compute_filtered_spectra_crosscorrelations(
tmp32 = VMUX(tmp32 > tmpx, tmpx, tmp32);
alpha = FLOAT_DIV32(tmp32, See);
alpha_1 = FLOAT_SUB(FLOAT_ONE, alpha);
-
+
sPey = FLOAT_ADD(FLOAT_MULT(alpha_1,sPey) , FLOAT_MULT(alpha,Pey));
- sPyy = FLOAT_ADD(FLOAT_MULT(alpha_1,sPyy) , FLOAT_MULT(alpha,Pyy));
+ sPyy = FLOAT_ADD(FLOAT_MULT(alpha_1,sPyy) , FLOAT_MULT(alpha,Pyy));
tmp = FLOAT_MULT(MIN_LEAK,sPyy);
#ifndef FIXED_POINT
sPyy = VMUX(FLOAT_LT(sPyy, FLOAT_ONE), FLOAT_ONE, sPyy);
sPey = VMUX(FLOAT_LT(sPey, tmp), tmp, sPey);
- sPey = VMUX(FLOAT_LT(sPey, sPyy), sPey, sPyy);
+ sPey = VMUX(FLOAT_LT(sPey, sPyy), sPey, sPyy);
#else
sPyy = FLOAT_LT(sPyy, FLOAT_ONE) ? FLOAT_ONE : sPyy;
sPey = FLOAT_LT(sPey, tmp) ? tmp : sPey;
- sPey = FLOAT_LT(sPey, sPyy) ? sPey : sPyy;
+ sPey = FLOAT_LT(sPey, sPyy) ? sPey : sPyy;
#endif
-
+
leak_estimate = FLOAT_EXTRACT16(FLOAT_SHL(FLOAT_DIVU(sPey, sPyy),14));
leak_estimate = VMUX( leak_estimate > 16383, 32767, SHL16(leak_estimate,1));
@@ -943,10 +943,10 @@ inline spx_word16_t mdf_compute_RER(
register spx_word32_t tmp32;
register spx_word32_t tmp;
spx_float_t bound = PSEUDOFLOAT(Sey);
-
+
tmp32 = MULT16_32_Q15(leake,Syy);
tmp32 = ADD32(SHR32(Sxx,13), ADD32(tmp32, SHL32(tmp32,1)));
-
+
bound = FLOAT_DIVU(FLOAT_MULT(bound, bound), PSEUDOFLOAT(ADD32(1,Syy)));
tmp = FLOAT_EXTRACT32(bound);
tmp32 = imux( FLOAT_GT(bound, PSEUDOFLOAT(See)), See,
@@ -972,7 +972,7 @@ void mdf_adapt(
SpeexEchoState * restrict st,
spx_word16_t RER,
spx_word32_t Syy,
- spx_word32_t See,
+ spx_word32_t See,
spx_word32_t Sxx
)
{
@@ -985,20 +985,20 @@ void mdf_adapt(
register int i;
register int M = st->M;
- adapted = mux( !adapted && sum_adapt > QCONST32(M,15) &&
+ adapted = mux( !adapted && sum_adapt > QCONST32(M,15) &&
MULT16_32_Q15(leake,Syy) > MULT16_32_Q15(QCONST16(.03f,15),Syy), 1, adapted);
if ( adapted )
- { register spx_word32_t * restrict Yf = st->Yf;
+ { register spx_word32_t * restrict Yf = st->Yf;
register spx_word32_t * restrict Rf = st->Rf;
register spx_word32_t r, e, e2;
#if (TM_UNROLL && TM_UNROLL_SPEEXECHOCANCELLATION)
#pragma TCS_unroll=4
#pragma TCS_unrollexact=1
-#endif
+#endif
for ( i=0 ; i<framesize ; ++i )
- {
+ {
r = SHL32(Yf[i],3);
r = MULT16_32_Q15(leake,r);
e = SHL32(Rf[i],3)+1;
@@ -1011,7 +1011,7 @@ void mdf_adapt(
r = fmux( r > e2, e2, r);
#endif
- r = MULT16_32_Q15(QCONST16(.7,15),r) +
+ r = MULT16_32_Q15(QCONST16(.7,15),r) +
MULT16_32_Q15(QCONST16(.3,15),(spx_word32_t)(MULT16_32_Q15(RER,e)));
power_1[i] = FLOAT_SHL(FLOAT_DIV32_FLOAT(r,FLOAT_MUL32U(e,power[i]+10)),WEIGHT_SHIFT+16);
@@ -1019,8 +1019,8 @@ void mdf_adapt(
#if (TM_UNROLL && TM_UNROLL_SPEEXECHOCANCELLATION)
#pragma TCS_unrollexact=0
#pragma TCS_unroll=0
-#endif
-
+#endif
+
r = SHL32(Yf[framesize],3);
r = MULT16_32_Q15(leake,r);
e = SHL32(Rf[framesize],3)+1;
@@ -1033,19 +1033,19 @@ void mdf_adapt(
r = fmux( r > e2, e2, r);
#endif
- r = MULT16_32_Q15(QCONST16(.7,15),r) +
+ r = MULT16_32_Q15(QCONST16(.7,15),r) +
MULT16_32_Q15(QCONST16(.3,15),(spx_word32_t)(MULT16_32_Q15(RER,e)));
power_1[framesize] = FLOAT_SHL(FLOAT_DIV32_FLOAT(r,FLOAT_MUL32U(e,power[framesize]+10)),WEIGHT_SHIFT+16);
- } else
+ } else
{
register spx_word16_t adapt_rate=0;
register int N = st->window_size;
- if ( Sxx > SHR32(MULT16_16(N, 1000),6) )
+ if ( Sxx > SHR32(MULT16_16(N, 1000),6) )
{ register spx_word32_t tmp32, tmp32q;
-
+
tmp32 = MULT16_32_Q15(QCONST16(.25f, 15), Sxx);
#ifdef FIXED_POINT
tmp32q = SHR32(See,2);
@@ -1056,33 +1056,33 @@ void mdf_adapt(
#endif
adapt_rate = FLOAT_EXTRACT16(FLOAT_SHL(FLOAT_DIV32(tmp32, See),15));
}
-
+
#if (TM_UNROLL && TM_UNROLL_SPEEXECHOCANCELLATION)
#pragma TCS_unroll=4
#pragma TCS_unrollexact=1
-#endif
+#endif
for (i=0;i<framesize;i++)
power_1[i] = FLOAT_SHL(FLOAT_DIV32(EXTEND32(adapt_rate),ADD32(power[i],10)),WEIGHT_SHIFT+1);
#if (TM_UNROLL && TM_UNROLL_SPEEXECHOCANCELLATION)
#pragma TCS_unrollexact=0
#pragma TCS_unroll=0
-#endif
+#endif
power_1[framesize] = FLOAT_SHL(FLOAT_DIV32(EXTEND32(adapt_rate),ADD32(power[framesize],10)),WEIGHT_SHIFT+1);
sum_adapt = ADD32(sum_adapt,adapt_rate);
}
-
+
st->sum_adapt = sum_adapt;
st->adapted = adapted;
}
#define OVERRIDE_ECHO_CANCELLATION
void speex_echo_cancellation(
- SpeexEchoState * restrict st,
- const spx_int16_t * restrict in,
- const spx_int16_t * restrict far_end,
+ SpeexEchoState * restrict st,
+ const spx_int16_t * restrict in,
+ const spx_int16_t * restrict far_end,
spx_int16_t * restrict out
)
-{
+{
register int framesize = st->frame_size;
register spx_word16_t * restrict x = st->x;
register spx_word16_t * restrict xx = st->x + framesize;
@@ -1103,7 +1103,7 @@ void speex_echo_cancellation(
filter_dc_notch16(in, st->notch_radius, st->input, framesize, st->notch_mem);
mdf_preemph(st, xx, far_end, framesize);
-
+
{
register spx_word16_t * restrict X = st->X;
@@ -1119,19 +1119,19 @@ void speex_echo_cancellation(
memcpy(st->last_y, st->x, N * sizeof(spx_word16_t));
Sxx = mdf_inner_prod(xx, xx, framesize);
memcpy(x, xx, framesize * sizeof(spx_word16_t));
-
+
#ifdef TWO_PATH
- spectral_mul_accum(st->X, st->foreground, st->Y, N, M);
+ spectral_mul_accum(st->X, st->foreground, st->Y, N, M);
spx_ifft(st->fft_table, st->Y, st->e);
mdf_sub(xx, st->input, ee, framesize);
Sff = mdf_inner_prod(xx, xx, framesize);
#endif
-
+
mdf_adjust_prop (st->W, N, M, st->prop);
-
+
if (st->saturated == 0)
{ mdf_compute_weight_gradient(st, X, N, M);
- } else
+ } else
{ st->saturated--;
}
}
@@ -1141,7 +1141,7 @@ void speex_echo_cancellation(
spx_ifft(st->fft_table, st->Y, st->y);
#ifdef TWO_PATH
- mdf_sub(xx, ee, yy, framesize);
+ mdf_sub(xx, ee, yy, framesize);
Dbf = 10+mdf_inner_prod(xx, xx, framesize);
#endif
@@ -1154,12 +1154,12 @@ void speex_echo_cancellation(
See = mdf_update_foreground(st,Dbf,Sff,See);
#endif
-
+
mdf_compute_error_signal(st, in, out, framesize);
Sey = mdf_inner_prod(ee, yy, framesize);
Syy = mdf_inner_prod(yy, yy, framesize);
Sdd = mdf_inner_prod(st->input, st->input, framesize);
-
+
if ( mdf_check(st,out,Syy,Sxx,See,Sff,Sdd) >= 50 )
{ speex_warning("The echo canceller started acting funny and got slapped (reset). It swears it will behave now.");
speex_echo_state_reset(st);
@@ -1178,10 +1178,10 @@ void speex_echo_cancellation(
mdf_compute_filtered_spectra_crosscorrelations(st,Syy,See,framesize);
RER = mdf_compute_RER(See,Syy,Sey,Sxx,st->leak_estimate);
mdf_adapt(st, RER, Syy, See, Sxx);
-
+
if ( st->adapted )
{ register spx_word16_t * restrict last_yy = st->last_y + framesize;
-
+
memcpy(st->last_y, last_yy, framesize * sizeof(spx_word16_t));
mdf_sub_int(last_yy, in, out, framesize);