<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=Content-Type content="text/html; charset=iso-8859-1">
<META content="MSHTML 6.00.6000.16525" name=GENERATOR>
<STYLE></STYLE>
</HEAD>
<BODY style="MARGIN: 4px 4px 1px; FONT: 10pt Tahoma" bgColor=#ffffff>
<DIV><FONT face=Arial>
<DIV><FONT face=Arial>Michael,</FONT></DIV>
<DIV><FONT face=Arial></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial>Before you suffer any further, do you need the highpass 
function?&nbsp; This is a DC block for the input audio.&nbsp; In my application 
there is a DC block in front of Speex for other reasons, so I disabled this 
function.</FONT></DIV>
<DIV><FONT face=Arial></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial>This worked before your code squeeze, right?&nbsp; There 
are many possibilities:</FONT></DIV>
<DIV><FONT face=Arial></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial>1.&nbsp; You are overrunning the C stack, so the local 
variable declarations are clobbering something.</FONT></DIV>
<DIV><FONT face=Arial>2.&nbsp; There is a parameter size type mismatch (16-32 
bit) between the calling code and the function code, so the mem pointer is read 
from the wrong place on the stack.</FONT></DIV>
<DIV><FONT face=Arial>
<DIV><FONT face=Arial>2a.&nbsp; The len value is bad.</FONT></DIV>
<DIV><FONT face=Arial>2b.&nbsp; The FiltID value is bad.&nbsp; There is code to 
limit the value to 4, but a negative value might blow up.</FONT></DIV>3.&nbsp; 
Some data structure is not aligned on the required boundary.&nbsp; I have been 
bitten by this&nbsp;on the C64x with mixed assembly and C files, but I do not 
recall if the C54 requires any structures to start on 32-bit 
boundaries.</FONT></DIV>
<DIV><FONT face=Arial>4.&nbsp; You have a memory segment that is crossing a 64K 
boundary, and an address wrap is occurring.</FONT></DIV>
<DIV><FONT face=Arial>5.&nbsp; The problem is somewhere else entirely, and the 
highpass function has been corrupted by a bad memory write.</FONT></DIV>
<DIV><FONT face=Arial>6.&nbsp; There is some kind of link problem, and the 
highpass function is not where the call is going.</FONT></DIV>
<DIV><FONT face=Arial></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial>I would assembly step through the code, looking at how the 
parameters are stored in registers and onto the stack, and then follow what 
happens after the branch.&nbsp; You should learn more by seeing where things run 
off at the the assembly level, rather than C.&nbsp; The more I think about it, 
the more it sounds like the highpass() code has been corrupted or is 
misaligned.&nbsp; You can&nbsp;save the disassembled highpass() code from the 
emulator, and load the same file into the simulator, and see if the disassembly 
looks the same.</FONT></DIV>
<DIV><FONT face=Arial></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial>Good luck.</FONT></DIV>
<DIV><FONT face=Arial></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial>- Jim</FONT></DIV></FONT></DIV>
<BLOCKQUOTE 
style="PADDING-RIGHT: 0px; PADDING-LEFT: 5px; MARGIN-LEFT: 5px; BORDER-LEFT: #000000 2px solid; MARGIN-RIGHT: 0px">
  <DIV style="FONT: 10pt arial">----- Original Message ----- </DIV>
  <DIV 
  style="BACKGROUND: #e4e4e4; FONT: 10pt arial; font-color: black"><B>From:</B> 
  <A title=Michael.Jacobson@ultratec.com 
  href="mailto:Michael.Jacobson@ultratec.com">Michael Jacobson</A> </DIV>
  <DIV style="FONT: 10pt arial"><B>To:</B> <A title=speex-dev@xiph.org 
  href="mailto:speex-dev@xiph.org">speex-dev@xiph.org</A> </DIV>
  <DIV style="FONT: 10pt arial"><B>Sent:</B> Wednesday, August 29, 2007 11:05 
  AM</DIV>
  <DIV style="FONT: 10pt arial"><B>Subject:</B> [Speex-dev] high-pass filter 
  issues</DIV>
  <DIV><FONT face=Arial></FONT><BR></DIV>
  <DIV>Hi, I am using 1.2beta2 on a C5416 doing narrowband</DIV>
  <DIV><FONT face=Arial></FONT>&nbsp;</DIV>
  <DIV><FONT face=Arial></FONT>&nbsp;</DIV>
  <DIV>in the decode function I am having a problem with the execution of my 
  program vectoring off to random interrupts that are not used.&nbsp; I have 
  tracked down the error to the highpass function called in nb_decode -very 
  close to the end of the function-context:</DIV>
  <DIV><FONT face=Arial></FONT>&nbsp;</DIV>
  <DIV>it is called here: ln 1719 for me</DIV>
  <DIV>&nbsp;&nbsp; if 
  (st-&gt;highpass_enabled)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; highpass(out, out, 
  st-&gt;frameSize, 
  (st-&gt;isWideband?HIGHPASS_WIDEBAND:HIGHPASS_NARROWBAND)|HIGHPASS_OUTPUT, 
  st-&gt;mem_hp);<BR>&nbsp;&nbsp; /*for 
  (i=0;i&lt;st-&gt;frameSize;i++)<BR>&nbsp;&nbsp;&nbsp;&nbsp; printf ("%d\n", 
  (int)st-&gt;frame[i]);*/</DIV>
  <DIV><FONT face=Arial></FONT>&nbsp;</DIV>
  <DIV>here's the function:</DIV>
  <DIV><FONT face=Arial></FONT>&nbsp;</DIV>
  <DIV>void highpass(const spx_word16_t *x, spx_word16_t *y, int len, int 
  filtID, spx_mem_t *mem)<BR>{<BR>&nbsp;&nbsp; int i;<BR>#ifdef 
  FIXED_POINT<BR>&nbsp;&nbsp; const spx_word16_t Pcoef[5][3] = {{16384, -31313, 
  14991}, {16384, -31569, 15249}, {16384, -31677, 15328}, {16384, -32313, 
  15947}, {16384, -22446, 6537}};<BR>&nbsp;&nbsp; const spx_word16_t Zcoef[5][3] 
  = {{15672, -31344, 15672}, {15802, -31601, 15802}, {15847, -31694, 15847}, 
  {16162, -32322, 16162}, {14418, -28836, 14418}};<BR>#else<BR>&nbsp;&nbsp; 
  const spx_word16_t Pcoef[5][3] = {{1.00000f, -1.91120f, 0.91498f}, {1.00000f, 
  -1.92683f, 0.93071f}, {1.00000f, -1.93338f, 0.93553f}, {1.00000f, -1.97226f, 
  0.97332f}, {1.00000f, -1.37000f, 0.39900f}};<BR>&nbsp;&nbsp; const 
  spx_word16_t Zcoef[5][3] = {{0.95654f, -1.91309f, 0.95654f}, {0.96446f, 
  -1.92879f, 0.96446f}, {0.96723f, -1.93445f, 0.96723f}, {0.98645f, -1.97277f, 
  0.98645f}, {0.88000f, -1.76000f, 0.88000f}};<BR>#endif<BR>&nbsp;&nbsp; const 
  spx_word16_t *den, *num;<BR>&nbsp;&nbsp; if 
  (filtID&gt;4)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; filtID=4;<BR>&nbsp;&nbsp; 
  <BR>&nbsp;&nbsp; den = Pcoef[filtID]; num = Zcoef[filtID];<BR>&nbsp;&nbsp; 
  /*return;*/<BR>&nbsp;&nbsp; for (i=0;i&lt;len;i++)<BR>&nbsp;&nbsp; 
  {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; spx_word16_t 
  yi;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; spx_word32_t vout = 
  ADD32(MULT16_16(num[0], x[i]),mem[0]);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; yi = 
  EXTRACT16(SATURATE(PSHR32(vout,14),32767));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  mem[0] = ADD32(MAC16_16(mem[1], num[1],x[i]), 
  SHL32(MULT16_32_Q15(-den[1],vout),1));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  mem[1] = ADD32(MULT16_16(num[2],x[i]), 
  SHL32(MULT16_32_Q15(-den[2],vout),1));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; y[i] 
  = yi;<BR>&nbsp;&nbsp; }<BR>}</DIV>
  <DIV><FONT face=Arial></FONT>&nbsp;</DIV>
  <DIV><FONT face=Arial></FONT>&nbsp;</DIV>
  <DIV>I can step into the function just fine, but when I run it, even just from 
  the initial variable declarations to the top of that "for" loop I vector 
  off.&nbsp; I am thinking this might have something to do with me making the 
  state parameters static instead of running off a heap.&nbsp; these are the 
  sizes and parameters I used:</DIV>
  <DIV><FONT face=Arial></FONT>&nbsp;</DIV>
  <DIV>#ifdef STATIC_INIT<BR>&nbsp;#define ENC_WINBUF_SIZE 40<BR>&nbsp;#define 
  ENC_EXCBUF_SIZE 306<BR>&nbsp;#define ENC_SWBUF_SIZE 306<BR>&nbsp;#define 
  ENC_LAGWINDOW_SIZE 11<BR>&nbsp;#define ENC_OLD_LSP_SIZE 10<BR>&nbsp;#define 
  ENC_OLD_QLSP_SIZE 10<BR>&nbsp;#define ENC_MEM_SP_SIZE 20<BR>&nbsp;#define 
  ENC_MEM_SW_SIZE 20<BR>&nbsp;#define ENC_SW_WHOLE_SIZE 20<BR>&nbsp;#define 
  ENC_MEM_EXC_SIZE 20<BR>&nbsp;#define ENC_MEM_EXC2_SIZE 20<BR>&nbsp;#define 
  ENC_PI_GAIN_SIZE 8<BR>&nbsp;#define ENC_PITCH_SIZE 4</DIV>
  <DIV><FONT face=Arial></FONT>&nbsp;</DIV>
  <DIV>&nbsp;#define DEC_EXCBUF_SIZE 500<BR>&nbsp;#define DEC_INTERP_QLPC_SIZE 
  10<BR>&nbsp;#define DEC_OLD_QLSP_SIZE 10<BR>&nbsp;#define DEC_MEM_SP_SIZE 
  20<BR>&nbsp;#define DEC_PI_GAIN_SIZE 8</DIV>
  <DIV><FONT face=Arial></FONT>&nbsp;</DIV>
  <DIV>&nbsp;EncState &nbsp;&nbsp;enc_state;<BR>&nbsp;char 
  &nbsp;&nbsp;&nbsp;enc_stack[NB_ENC_STACK];<BR>&nbsp;spx_word16_t 
  &nbsp;enc_winbuf[ENC_WINBUF_SIZE];<BR>&nbsp;spx_word16_t 
  &nbsp;enc_excbuf[ENC_EXCBUF_SIZE];<BR>&nbsp;spx_word16_t 
  &nbsp;enc_swbuf[ENC_SWBUF_SIZE];<BR>&nbsp;spx_word16_t 
  &nbsp;enc_lagwindow[ENC_LAGWINDOW_SIZE];<BR>&nbsp;spx_lsp_t 
  &nbsp;&nbsp;enc_old_lsp[ENC_OLD_LSP_SIZE];<BR>&nbsp;spx_lsp_t&nbsp;&nbsp;enc_old_qlsp[ENC_OLD_QLSP_SIZE];<BR>&nbsp;spx_mem_t&nbsp;&nbsp;enc_mem_sp[ENC_MEM_SP_SIZE];<BR>&nbsp;spx_mem_t&nbsp;&nbsp;enc_mem_sw[ENC_MEM_SW_SIZE];<BR>&nbsp;spx_mem_t&nbsp;&nbsp;enc_mem_sw_whole[ENC_SW_WHOLE_SIZE];<BR>&nbsp;spx_mem_t&nbsp;&nbsp;enc_mem_exc[ENC_MEM_EXC_SIZE];<BR>&nbsp;spx_mem_t&nbsp;&nbsp;enc_memexc2[ENC_MEM_EXC2_SIZE];<BR>&nbsp;spx_word32_t&nbsp;enc_pi_gain[ENC_PI_GAIN_SIZE];<BR>&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;enc_pitch[ENC_PITCH_SIZE];</DIV>
  <DIV><FONT face=Arial></FONT>&nbsp;</DIV>
  <DIV>&nbsp;DecState&nbsp;&nbsp;dec_state;<BR>&nbsp;char&nbsp;&nbsp;&nbsp;dec_stack[NB_DEC_STACK];<BR>&nbsp;spx_word16_t&nbsp;dec_excbuf[DEC_EXCBUF_SIZE];<BR>&nbsp;spx_coef_t&nbsp;&nbsp;dec_interp_qlpc[DEC_INTERP_QLPC_SIZE];<BR>&nbsp;spx_lsp_t&nbsp;&nbsp;dec_old_qlsp[DEC_OLD_QLSP_SIZE];<BR>&nbsp;spx_mem_t&nbsp;&nbsp;dec_mem_sp[DEC_MEM_SP_SIZE];<BR>&nbsp;spx_word32_t&nbsp;dec_pi_gain[DEC_PI_GAIN_SIZE];</DIV>
  <DIV><FONT face=Arial></FONT>&nbsp;</DIV>
  <DIV>#endif </DIV>
  <DIV><FONT face=Arial></FONT>&nbsp;</DIV>
  <DIV>I noticed that when inside the high pass function that len must be 
  greater that 160 because I single stepped through it and I got to be greater 
  than A0 and that I cannot read any of the variables passed as a parameter, 
  they always show up as FP + some value.&nbsp; any thoughts on what might be 
  going on? (FIXED_POINT is defined)</DIV>
  <DIV><FONT face=Arial></FONT>&nbsp;</DIV>
  <DIV>-Mike</DIV>
  <DIV><FONT face=Arial></FONT>&nbsp;</DIV>
  <P>
  <HR>

  <P></P>_______________________________________________<BR>Speex-dev mailing 
  list<BR>Speex-dev@xiph.org<BR>http://lists.xiph.org/mailman/listinfo/speex-dev<BR></BLOCKQUOTE></BODY></HTML>