<HTML><HEAD>
<META http-equiv=Content-Type content="text/html; charset=iso-8859-1">
<META content="MSHTML 6.00.6000.16481" name=GENERATOR></HEAD>
<BODY style="MARGIN: 4px 4px 1px; FONT: 10pt Tahoma">
<DIV>This is going to take some explaining and I apologize in advance if any of this is found in the manual or sample code but I couldn't find it.&nbsp; I just graduated last may and this is my first experience with vocoders and dissecting a professional's code.</DIV>
<DIV>&nbsp;</DIV>
<DIV>I work for a company that is currently using a G729A vocoder from a 3rd party software company and is looking into speex so they no longer have to pay royalties.&nbsp; The product we are trying to force speex into is based on&nbsp;a TI C5416 DSP that did narrowband 8-bit, 8kbs.&nbsp; The product was fairly full as it is so some modifications had to be made in order to fit speex into the project just to allow it to link.&nbsp; The modifications are based off assumptions that I made when looking over the code so I may have been absolutely wrong.</DIV>
<DIV>&nbsp;</DIV>
<DIV>The main assumption was about the exc tables.&nbsp; In looking through modes.c it appeared that only one table was required for 8kbs so I commented out the portions of the code that referenced the other tables and modified "static const SpeexNBMode nb_mode" structure so that the pointers to the other structures that referenced the tables were NULL.&nbsp; We did not have enough data memory to store all the tables.&nbsp; I thought this would work with my initialization but when I stepped through the code in nb_celp for encode it would put it in mode 6 (instead of mode 3), which I believe is 18.2kbs (table 8.2). My set up code is:</DIV>
<DIV>&nbsp;</DIV>
<DIV>&nbsp; st = speex_encoder_init(&amp;speex_nb_mode);<BR>&nbsp;&nbsp;speex_bits_set_bit_buffer(&amp;bits, &amp;G729_tx, COMPRESS_LENGTH);</DIV>
<DIV>&nbsp;&nbsp;tmp=TESTENC_QUALITY;&nbsp; //=4<BR>&nbsp;&nbsp;speex_encoder_ctl(st, SPEEX_SET_QUALITY, &amp;tmp);<BR>&nbsp;&nbsp;speex_encode_int(st, (spx_int16_t *)samples_in, &amp;bits);</DIV>
<DIV>&nbsp;</DIV>
<DIV>which I thought would put it in 8kbs narrowband.&nbsp; I tried to use SPEEX_SET_MODE in there too but it just got overwritten by the set mode in the encode function.&nbsp; So I thought I'd try to force it into mode 3 and see what happens, and I got A result, but when I try to decode it my decode stage gets stuck in an infinite loop:</DIV>
<DIV>&nbsp;</DIV>
<DIV>while (st-&gt;voc_offset&lt;st-&gt;subframeSize)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (st-&gt;voc_offset&gt;=0)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exc[st-&gt;voc_offset]=sqrt(1.0*ol_pitch);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; st-&gt;voc_offset+=ol_pitch;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</DIV>
<DIV>&nbsp;</DIV>
<DIV>because both voc_offset and ol_pitch is = 0 because this code is never entered:</DIV>
<DIV>&nbsp;</DIV>
<DIV>if (SUBMODE(lbr_pitch)!=-1)<BR>&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ol_pitch = st-&gt;min_pitch+speex_bits_unpack_unsigned(bits, 7);<BR>&nbsp;&nbsp; } </DIV>
<DIV>&nbsp;</DIV>
<DIV>This is how I set up the decoder:</DIV>
<DIV>&nbsp;</DIV>
<DIV>&nbsp; dec = speex_decoder_init(&amp;speex_nb_mode);<BR>&nbsp;&nbsp;&nbsp;speex_bits_set_bit_buffer(&amp;bits, &amp;Speex_enc_buffer[0 +&nbsp;COMPRESS_LENGTH*Speex_player_frame], COMPRESS_LENGTH);<BR>&nbsp;&nbsp;&nbsp;tmp=0;<BR>&nbsp;&nbsp;&nbsp;speex_decoder_ctl(dec, SPEEX_SET_ENH, &amp;tmp);</DIV>
<DIV>&nbsp;&nbsp;&nbsp;speex_decode_int(dec, &amp;bits, (spx_int16_t *)samples_out);&nbsp;</DIV>
<DIV>&nbsp;</DIV>
<DIV>There are some things I am sure will be asked.&nbsp; Yes I set flags for the TI_54X part, disable wideband, manual allocation,&nbsp;and fixed point in a config file and defined the #define value needed to include that config file.&nbsp; I do have a heap for the setup of the state structure for encode and decode and yes I made sure it was big enough to allocate enough to both.&nbsp; Yes I destroy the structures after I am done en/decoding them.&nbsp; If there is anything you need to help you help me then I am defiantly willing to share.&nbsp; I am thoroughly confused and could use some help.</DIV>
<DIV>&nbsp;</DIV>
<DIV>Thanks.</DIV>
<DIV>&nbsp;</DIV>
<DIV>-Mike Jacobson</DIV>
<DIV><A href="mailto:michael.jacobson@ultratec.com">michael.jacobson@ultratec.com</A></DIV></BODY></HTML>