diff --git a/openair1/PHY/TOOLS/dB_routines.c b/openair1/PHY/TOOLS/dB_routines.c index 6d56e6d124..13172da86b 100644 --- a/openair1/PHY/TOOLS/dB_routines.c +++ b/openair1/PHY/TOOLS/dB_routines.c @@ -21,7 +21,7 @@ #include "tools_defs.h" -// Approximate 10*log10(x) in fixed point : x = 0...(2^32)-1 +// Approximate 10*log10(x) in fixed point : x = 0...(2^32)-1, where the output is truncated to 10*log10(2^30) = 90 dB static const int8_t dB_table[256] = { 0, 3, 5, 6, 7, 8, 8, 9, 10, 10, 10, 11, 11, 11, 12, 12, 12, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, @@ -131,60 +131,60 @@ int16_t dB_fixed_x10(uint32_t x) { int16_t dB_fixed_times10(uint32_t x) { - int16_t dB_power=0; + int16_t dB_power = 0; - if (x==0) { - dB_power = 0; - } else if ( (x&0xff000000) != 0 ) { - dB_power = dB_table_times10[((x>>24)&255)-1]; - dB_power += 3*dB_table_times10[255]; - } else if ( (x&0x00ff0000) != 0 ) { - dB_power = dB_table_times10[((x>>16)&255)-1]; - dB_power += 2*dB_table_times10[255]; - } else if ( (x&0x0000ff00) != 0 ) { - dB_power = dB_table_times10[((x>>8)&255)-1]; + if (x == 0) { + dB_power = -900; // 0 in dB is -INF, but since we're dealing with integer variables, we'll put 10*log10(2^-30) x 10 in the output + } else if ((x & 0xff000000) != 0) { + dB_power = dB_table_times10[((x >> 24) & 255) - 1]; + dB_power += 3 * dB_table_times10[255]; + } else if ((x & 0x00ff0000) != 0) { + dB_power = dB_table_times10[((x >> 16) & 255) - 1]; + dB_power += 2 * dB_table_times10[255]; + } else if ((x & 0x0000ff00) != 0) { + dB_power = dB_table_times10[((x >> 8) & 255) - 1]; dB_power += dB_table_times10[255]; } else { - dB_power = dB_table_times10[(x&255)-1]; + dB_power = dB_table_times10[(x & 255) - 1]; } if (dB_power > 900) - return(900); + return (900); return dB_power; } - int8_t dB_fixed(uint32_t x) { - int8_t dB_power=0; + int8_t dB_power = 0; - if (x==0) { - dB_power = 0; - } else if ( (x&0xff000000) != 0 ) { - dB_power = dB_table[((x>>24)&255)-1]; - dB_power += 3*dB_table[255]; - } else if ( (x&0x00ff0000) != 0 ) { - dB_power = dB_table[((x>>16)&255)-1]; - dB_power += 2*dB_table[255]; - } else if ( (x&0x0000ff00) != 0 ) { - dB_power = dB_table[((x>>8)&255)-1]; + if (x == 0) { + dB_power = -90; // 0 in dB is -INF, but since we're dealing with integer variables, we'll put 10*log10(2^-30) in the output + } else if ((x & 0xff000000) != 0) { + dB_power = dB_table[((x >> 24) & 255) - 1]; + dB_power += 3 * dB_table[255]; + } else if ((x & 0x00ff0000) != 0) { + dB_power = dB_table[((x >> 16) & 255) - 1]; + dB_power += 2 * dB_table[255]; + } else if ((x & 0x0000ff00) != 0) { + dB_power = dB_table[((x >> 8) & 255) - 1]; dB_power += dB_table[255]; } else { - dB_power = dB_table[(x&255)-1]; + dB_power = dB_table[(x & 255) - 1]; } if (dB_power > 90) - return(90); + return (90); return dB_power; } - -uint8_t dB_fixed64(uint64_t x) +int8_t dB_fixed64(uint64_t x) { - if ((x<(((uint64_t)1)<<32))) return(dB_fixed((uint32_t)x)); - else return(4*dB_table[255]+dB_fixed((uint32_t)(x>>32))); + if ((x < (((uint64_t)1) << 32))) + return (dB_fixed((uint32_t)x)); + else + return (4 * dB_table[255] + dB_fixed((uint32_t)(x >> 32))); } diff --git a/openair1/PHY/TOOLS/tools_defs.h b/openair1/PHY/TOOLS/tools_defs.h index 40f6ca46f6..abe2ded220 100644 --- a/openair1/PHY/TOOLS/tools_defs.h +++ b/openair1/PHY/TOOLS/tools_defs.h @@ -961,7 +961,7 @@ uint32_t angle(struct complex16 perrror); unsigned char factor2(unsigned int x); int8_t dB_fixed(uint32_t x); -uint8_t dB_fixed64(uint64_t x); +int8_t dB_fixed64(uint64_t x); int8_t dB_fixed2(uint32_t x,uint32_t y); int16_t dB_fixed_times10(uint32_t x); int16_t dB_fixed_x10(uint32_t x);