annotate filter/imb.c @ 0:5242703e91d3 tip

Initial checkin for AIM92 aimR8.2 (last updated May 1997).
author tomwalters
date Fri, 20 May 2011 15:19:45 +0100
parents
children
rev   line source
tomwalters@0 1 /*
tomwalters@0 2 imb.c
tomwalters@0 3 =====
tomwalters@0 4
tomwalters@0 5 integer version of logarithms using units of milliBells.
tomwalters@0 6
tomwalters@0 7 */
tomwalters@0 8
tomwalters@0 9 #include <math.h>
tomwalters@0 10
tomwalters@0 11 #include "stitch.h"
tomwalters@0 12
tomwalters@0 13 #define LOG_ZERO (-10)
tomwalters@0 14
tomwalters@0 15 int imB( number )
tomwalters@0 16 long number ;
tomwalters@0 17 {
tomwalters@0 18 register int i, out ;
tomwalters@0 19 register long in ;
tomwalters@0 20 static int precision = 12 ;
tomwalters@0 21 static int *table = { ( int * ) 0 } ;
tomwalters@0 22 static unsigned table_size ;
tomwalters@0 23 static int inc ;
tomwalters@0 24 double k ;
tomwalters@0 25
tomwalters@0 26 if( table == ( int * ) 0 ) {
tomwalters@0 27
tomwalters@0 28 table_size = 1 << precision ;
tomwalters@0 29
tomwalters@0 30 k = 2000. / log( 10. ) ;
tomwalters@0 31 inc = k * log( 2. ) + 0.5 ;
tomwalters@0 32
tomwalters@0 33 table = (int *) stitch_malloc( table_size * sizeof( *table ), "imb.c for log table" ) ;
tomwalters@0 34
tomwalters@0 35 for( i=0 ; i < table_size ; i++ )
tomwalters@0 36 table[ i ] = log( (double) ( table_size + i ) / table_size ) * k + 0.5 ;
tomwalters@0 37 }
tomwalters@0 38
tomwalters@0 39 if( number > 0 ) {
tomwalters@0 40
tomwalters@0 41 in = number ;
tomwalters@0 42
tomwalters@0 43 out = precision * inc ;
tomwalters@0 44
tomwalters@0 45 if( number < table_size )
tomwalters@0 46 do {
tomwalters@0 47 in <<= 1 ;
tomwalters@0 48 out -= inc ;
tomwalters@0 49 }
tomwalters@0 50 while( in < table_size ) ;
tomwalters@0 51 else
tomwalters@0 52 while( in - table_size >= table_size ) {
tomwalters@0 53 in >>= 1 ;
tomwalters@0 54 out += inc ;
tomwalters@0 55 }
tomwalters@0 56
tomwalters@0 57 return( out + table[ in - table_size ] ) ;
tomwalters@0 58 }
tomwalters@0 59 else
tomwalters@0 60 return ( LOG_ZERO ) ;
tomwalters@0 61 }
tomwalters@0 62