[Speex-dev] Speex inner_prod(), normalize, C64 MIPS

Jean-Marc Valin Jean-Marc.Valin at USherbrooke.ca
Sat Feb 4 18:41:36 PST 2006


Le samedi 04 février 2006 à 11:38 -0600, Jerry Trantow a écrit :
> Ok, I hadn't verified inner product was called with values scaled to <=
> +-16384.  That would make it safe to do a 32 bit add of the intermediate
> terms. I have implemented the 40-bit accumulator.

Actually, it you have a 40-bit accumulator, you can just do a loop on
"accumulator += *x++ * *y++" without worrying about anything

> The C64x has a _dotp2() instruction that does two 16x16 multiplies and adds
> the products together.  Since the values are scaled to 16384, I can add the
> results of the two _dotp2()s together before the long add without worrying
> about overflow.  

Why would you do that instead of just accumulating directly?

> I split a norm_shift() out of your normalize16().  This function can also be
> used twice in pitch_gain_search_3tap().  Are there any other places that
> would benefit from this optimized routine?

Not sure I see what it does exactly...

> PS.  Here are the C64x MIPS vs Complexity results for the original code.  I
> have been able to reduce the complexity 1 encoder to 15.7 MIPS.
> 
> Encoder		
> Complexity	Original 32	Original 16
> 1	31.2	29.6
> 2	41.7	39.8
> 3	51.4	49.0
> 4	61.6	
> 5		
> 6		
> 7		93.1
> 8		
> 9		120.8

Could you explain what this means and what the 15.7 MIPS value means?
And what bit-rate?

	Jean-Marc


More information about the Speex-dev mailing list