[Speex-dev] Speex echo canceller on TI C55 DSP

Jean-Marc Valin Jean-Marc.Valin at USherbrooke.ca
Mon May 8 15:55:34 PDT 2006


Hi Jim,

I'll have a closer look at those values (below). Could you send me the
test files you're using, just so I make sure I reproduce the same thing.
Also, have you compared the TI values to values computed on a PC to see
if it's the same with your modifications?

	Jean-Marc

Le lundi 08 mai 2006 à 18:17 -0400, Jim Crichton a écrit :
> Jean-Marc,
> 
> I have traced the second infinite loop further.  When st->adapted becomes 
> true (mdf.c line 623), the first Yf[i] value is 4, the leak_estimate is 
> 0xd4e, the resulting r is 3.  The first value in st->Rf is 0, so e is 1, and 
> r is set to e>>1, or 0.  A little later there is a divide by r, and there is 
> the hang.
> 
> It seems that the 0 in Rf[0] is the problem, but I am not sure what else to 
> look at there.  The first few 32-bit values in Rf are:
> 
> 0 0 1 1 0 2 D D 5 0 8 11 19 3D 51 74 3A 8 11 8 4
> 
> Do you have any suggestions?
> 
> - Jim
> 
> ----- Original Message ----- 
> From: "Jim Crichton" <jim.crichton at comcast.net>
> To: <speex-dev at xiph.org>
> Sent: Monday, May 08, 2006 12:11 PM
> Subject: [Speex-dev] Speex echo canceller on TI C55 DSP
> 
> 
> > Jean-Marc,
> >
> > I recently started looking at running the echo canceller on a TI C55 DSP 
> > along with the 8kbps narrowband Speex encoder/decoder.  This is one of 
> > those "braindead compilers" that you refer to from time to time, and 
> > cannot handle the float struct assignments in the return statements in 
> > pseudofloat.h.
> >
> > Most of these were eliminated in build 11311 (patch by Brian Retford), but 
> > there were four left that I had to break apart.  I started with build 
> > 11343.
> >
> > I got several compiler warnings for "shift out of range" in mdf.c, which I 
> > fixed by adding EXTEND32 to all of the SHL32s with 16 bit operands 
> > (st->frame_size in 6 places, st->wtmp2 in 1 place).  I have not sent 
> > patches for these two changes, because I still have other problems.
> >
> > If fftwrap.c, I ifdefed out the spx_fft_float and spx_ifft_float routines, 
> > because there were not used and required smallft.c (which is not so small 
> > at all) to be added to the build.
> >
> > With these changes, the link was successful, using testecho.c with some 
> > modifications for the C55 environment.  The code and data memory 
> > requirements were a lot more than I had hoped (>20kbytes of dynamic data 
> > memory for block size=128, tail length = 1024), and I will probably not be 
> > able to fit it in the production build without some trimming.
> >
> > When I run the build, it goes into an infinite loop in FLOAT_DIV32 (mdf.c 
> > line 660), which occurs because adapt_rate is < 0, which happens when 
> > FLOAT_EXTRACT16 gets the input {0x7ff0, 0xfffb}.  The rounding is causing 
> > the result to go negative.  I worked around this by changing
> >
> >      return (a.m+(1<<(-a.e-1)))>>-a.e;
> > to
> >      return (((spx_uint16_t) a.m)+(1<<(-a.e-1)))>>-a.e;
> >
> > in FLOAT_EXTRACT16.  This changes the returned value from 0xfc00 to 0x400. 
> > Now it runs on for a while, then hits another infinite loop at mdf.c line 
> > 641:
> >
> >         st->power_1[i] = 
> > FLOAT_SHL(FLOAT_DIV32_FLOAT(MULT16_32_Q15(M_1,r),FLOAT_MUL32U(e,st->power[i]+10)),WEIGHT_SHIFT+16);
> >
> > I have not had time to trace this, but it looks like a similar problem, 
> > where the result of MULT16_32_Q15(M_1,r) is negative, and 
> > FLOAT_DIV32_FLOAT bombs.  Maybe the best thing to do next is to instrument 
> > the routines in pseudofloat.h which have loops, but I will not get to that 
> > for a day or two.
> >
> > I need to make a decision soon whether to seriously pursue making this 
> > work. With that in mind, here are some questions:
> >
> > 1.  speex_echo_state_init takes about 20M instructions, which is a little 
> > frightening, and the calls to speex_echo_cancel take about 630K 
> > instructions for 128 samples.  Given your recent experience with the fixed 
> > point canceller, does this sound rational?  The MIPs for the canceller are 
> > similar to the MIPs for the encoder running 8kbps, complexity 1.
> >
> > 2.  The testecho example uses a frame length and tail size that are powers 
> > of two (128, 1024).  Are there any implications to using sizes which are 
> > not powers of two?  It would be most convenient to use the encoder frame 
> > size (160), and some multiple of that for the tail size.  How does the 
> > frame size affect performance (I understand that the tail length 
> > determines what echo signals are cancelable)?
> >
> > 3.  Do you have any suggestions for code/data memory reduction for the 
> > canceller, other than to make the tail length no longer than necessary 
> > (this is a line echo canceller for a local phone, so I should be able to 
> > keep it to 40ms).  I was surprised by the size of the FFT code, but I 
> > guess that it is doing much more than the radix2 version in the TI 
> > library.
> >
> > Regards,
> >
> > Jim Crichton
> >
> > _______________________________________________
> > Speex-dev mailing list
> > Speex-dev at xiph.org
> > http://lists.xiph.org/mailman/listinfo/speex-dev
> > 
> 
> 
> _______________________________________________
> Speex-dev mailing list
> Speex-dev at xiph.org
> http://lists.xiph.org/mailman/listinfo/speex-dev
> 


More information about the Speex-dev mailing list