diff --git a/frontends/cxd2843.c b/frontends/cxd2843.c index 7ec11ee..91886a1 100644 --- a/frontends/cxd2843.c +++ b/frontends/cxd2843.c @@ -34,9 +34,12 @@ #include #include +#include "dvb_math.h" #include "dvb_frontend.h" #include "cxd2843.h" +#define INTLOG10X100(x) ((u32) (((u64) intlog10(x) * 100) >> 24)) + #define USE_ALGO 1 enum demod_type { CXD2843, CXD2837, CXD2838 }; @@ -1504,52 +1507,6 @@ static int read_signal_strength(struct dvb_frontend *fe, u16 *strength) return 0; } -static s32 Log10x100(u32 x) -{ - static u32 LookupTable[100] = { - 101157945, 103514217, 105925373, 108392691, 110917482, - 113501082, 116144861, 118850223, 121618600, 124451461, - 127350308, 130316678, 133352143, 136458314, 139636836, - 142889396, 146217717, 149623566, 153108746, 156675107, - 160324539, 164058977, 167880402, 171790839, 175792361, - 179887092, 184077200, 188364909, 192752491, 197242274, - 201836636, 206538016, 211348904, 216271852, 221309471, - 226464431, 231739465, 237137371, 242661010, 248313311, - 254097271, 260015956, 266072506, 272270131, 278612117, - 285101827, 291742701, 298538262, 305492111, 312607937, - 319889511, 327340695, 334965439, 342767787, 350751874, - 358921935, 367282300, 375837404, 384591782, 393550075, - 402717034, 412097519, 421696503, 431519077, 441570447, - 451855944, 462381021, 473151259, 484172368, 495450191, - 506990708, 518800039, 530884444, 543250331, 555904257, - 568852931, 582103218, 595662144, 609536897, 623734835, - 638263486, 653130553, 668343918, 683911647, 699841996, - 716143410, 732824533, 749894209, 767361489, 785235635, - 803526122, 822242650, 841395142, 860993752, 881048873, - 901571138, 922571427, 944060876, 966050879, 988553095, - }; - s32 y; - int i; - - if (x == 0) - return 0; - y = 800; - if (x >= 1000000000) { - x /= 10; - y += 100; - } - - while (x < 100000000) { - x *= 10; - y -= 100; - } - i = 0; - while (i < 100 && x > LookupTable[i]) - i += 1; - y += i; - return y; -} - #if 0 static void GetPLPIds(struct cxd_state *state, u32 nValues, u8 *Values, u32 *Returned) @@ -1598,10 +1555,10 @@ static void GetSignalToNoiseIT(struct cxd_state *state, u32 *SignalToNoise) if (state->bw == 8) { if (reg > 1143) reg = 1143; - *SignalToNoise = (Log10x100(reg) - - Log10x100(1200 - reg)) + 220; + *SignalToNoise = (INTLOG10X100(reg) - + INTLOG10X100(1200 - reg)) + 220; } else - *SignalToNoise = Log10x100(reg) - 90; + *SignalToNoise = INTLOG10X100(reg) - 90; } static void GetSignalToNoiseC2(struct cxd_state *state, u32 *SignalToNoise) @@ -1617,7 +1574,7 @@ static void GetSignalToNoiseC2(struct cxd_state *state, u32 *SignalToNoise) if (reg > 51441) reg = 51441; - *SignalToNoise = (Log10x100(reg) - Log10x100(55000 - reg)) + 384; + *SignalToNoise = (INTLOG10X100(reg) - INTLOG10X100(55000 - reg)) + 384; } @@ -1634,7 +1591,7 @@ static void GetSignalToNoiseT2(struct cxd_state *state, u32 *SignalToNoise) if (reg > 10876) reg = 10876; - *SignalToNoise = (Log10x100(reg) - Log10x100(12600 - reg)) + 320; + *SignalToNoise = (INTLOG10X100(reg) - INTLOG10X100(12600 - reg)) + 320; } static void GetSignalToNoiseT(struct cxd_state *state, u32 *SignalToNoise) @@ -1650,7 +1607,7 @@ static void GetSignalToNoiseT(struct cxd_state *state, u32 *SignalToNoise) if (reg > 4996) reg = 4996; - *SignalToNoise = (Log10x100(reg) - Log10x100(5350 - reg)) + 285; + *SignalToNoise = (INTLOG10X100(reg) - INTLOG10X100(5350 - reg)) + 285; } static void GetSignalToNoiseC(struct cxd_state *state, u32 *SignalToNoise) @@ -1676,13 +1633,13 @@ static void GetSignalToNoiseC(struct cxd_state *state, u32 *SignalToNoise) case 4: /* QAM 256 */ if (reg < 126) reg = 126; - *SignalToNoise = ((439 - Log10x100(reg)) * 2134 + 500) / 1000; + *SignalToNoise = ((439 - INTLOG10X100(reg)) * 2134 + 500) / 1000; break; case 1: /* QAM 32 */ case 3: /* QAM 128 */ if (reg < 69) reg = 69; - *SignalToNoise = ((432 - Log10x100(reg)) * 2015 + 500) / 1000; + *SignalToNoise = ((432 - INTLOG10X100(reg)) * 2015 + 500) / 1000; break; } } diff --git a/frontends/stv0367dd.c b/frontends/stv0367dd.c index ab74cf3..cafb796 100644 --- a/frontends/stv0367dd.c +++ b/frontends/stv0367dd.c @@ -31,10 +31,13 @@ #include #include +#include "dvb_math.h" #include "dvb_frontend.h" #include "stv0367dd.h" #include "stv0367dd_regs.h" +#define INTLOG10X100(x) ((u32) (((u64) intlog10(x) * 100) >> 24)) + enum omode { OM_NONE, OM_DVBT, OM_DVBC, OM_QAM_ITU_C }; enum { QAM_MOD_QAM4 = 0, QAM_MOD_QAM16, @@ -1249,52 +1252,6 @@ static int Stop(struct stv_state *state) } #endif -static s32 Log10x100(u32 x) -{ - static u32 LookupTable[100] = { - 101157945, 103514217, 105925373, 108392691, 110917482, - 113501082, 116144861, 118850223, 121618600, 124451461, // 800.5 - 809.5 - 127350308, 130316678, 133352143, 136458314, 139636836, - 142889396, 146217717, 149623566, 153108746, 156675107, // 810.5 - 819.5 - 160324539, 164058977, 167880402, 171790839, 175792361, - 179887092, 184077200, 188364909, 192752491, 197242274, // 820.5 - 829.5 - 201836636, 206538016, 211348904, 216271852, 221309471, - 226464431, 231739465, 237137371, 242661010, 248313311, // 830.5 - 839.5 - 254097271, 260015956, 266072506, 272270131, 278612117, - 285101827, 291742701, 298538262, 305492111, 312607937, // 840.5 - 849.5 - 319889511, 327340695, 334965439, 342767787, 350751874, - 358921935, 367282300, 375837404, 384591782, 393550075, // 850.5 - 859.5 - 402717034, 412097519, 421696503, 431519077, 441570447, - 451855944, 462381021, 473151259, 484172368, 495450191, // 860.5 - 869.5 - 506990708, 518800039, 530884444, 543250331, 555904257, - 568852931, 582103218, 595662144, 609536897, 623734835, // 870.5 - 879.5 - 638263486, 653130553, 668343918, 683911647, 699841996, - 716143410, 732824533, 749894209, 767361489, 785235635, // 880.5 - 889.5 - 803526122, 822242650, 841395142, 860993752, 881048873, - 901571138, 922571427, 944060876, 966050879, 988553095, // 890.5 - 899.5 - }; - s32 y; - int i; - - if (x == 0) - return 0; - y = 800; - if (x >= 1000000000) { - x /= 10; - y += 100; - } - - while (x < 100000000) { - x *= 10; - y -= 100; - } - i = 0; - while (i < 100 && x > LookupTable[i]) - i += 1; - y += i; - return y; -} - static int QAM_GetSignalToNoise(struct stv_state *state, s32 *pSignalToNoise) { u32 RegValAvg = 0; @@ -1327,7 +1284,7 @@ static int QAM_GetSignalToNoise(struct stv_state *state, s32 *pSignalToNoise) default: break; } - *pSignalToNoise = Log10x100((Power * 320) / RegValAvg); + *pSignalToNoise = INTLOG10X100((Power * 320) / RegValAvg); } else { *pSignalToNoise = 380; } diff --git a/frontends/stv0910.c b/frontends/stv0910.c index a7052dc..7a2b08e 100644 --- a/frontends/stv0910.c +++ b/frontends/stv0910.c @@ -33,10 +33,12 @@ #include #include +#include "dvb_math.h" #include "dvb_frontend.h" #include "stv0910.h" #include "stv0910_regs.h" +#define INTLOG10X100(x) ((u32) (((u64) intlog10(x) * 100) >> 24)) #define TUNING_DELAY 200 #define BER_SRC_S 0x20 @@ -1389,52 +1391,6 @@ static int read_ber(struct dvb_frontend *fe, u32 *ber) return 0; } -static s32 Log10x100(u32 x) -{ - static u32 LookupTable[100] = { - 101157945, 103514217, 105925373, 108392691, 110917482, - 113501082, 116144861, 118850223, 121618600, 124451461, - 127350308, 130316678, 133352143, 136458314, 139636836, - 142889396, 146217717, 149623566, 153108746, 156675107, - 160324539, 164058977, 167880402, 171790839, 175792361, - 179887092, 184077200, 188364909, 192752491, 197242274, - 201836636, 206538016, 211348904, 216271852, 221309471, - 226464431, 231739465, 237137371, 242661010, 248313311, - 254097271, 260015956, 266072506, 272270131, 278612117, - 285101827, 291742701, 298538262, 305492111, 312607937, - 319889511, 327340695, 334965439, 342767787, 350751874, - 358921935, 367282300, 375837404, 384591782, 393550075, - 402717034, 412097519, 421696503, 431519077, 441570447, - 451855944, 462381021, 473151259, 484172368, 495450191, - 506990708, 518800039, 530884444, 543250331, 555904257, - 568852931, 582103218, 595662144, 609536897, 623734835, - 638263486, 653130553, 668343918, 683911647, 699841996, - 716143410, 732824533, 749894209, 767361489, 785235635, - 803526122, 822242650, 841395142, 860993752, 881048873, - 901571138, 922571427, 944060876, 966050879, 988553095, - }; - s32 y; - int i; - - if (x == 0) - return 0; - y = 800; - if (x >= 1000000000) { - x /= 10; - y += 100; - } - - while (x < 100000000) { - x *= 10; - y -= 100; - } - i = 0; - while (i < 100 && x > LookupTable[i]) - i += 1; - y += i; - return y; -} - static int read_signal_strength(struct dvb_frontend *fe, u16 *strength) { struct stv *state = fe->demodulator_priv; @@ -1457,7 +1413,7 @@ static int read_signal_strength(struct dvb_frontend *fe, u16 *strength) } Power /= 5; - bbgain = (465 - Log10x100(Power)) * 10; + bbgain = (465 - INTLOG10X100(Power)) * 10; if (fe->ops.tuner_ops.get_rf_strength) fe->ops.tuner_ops.get_rf_strength(fe, strength);