Так переведено вроде бы уже все Может этот перевод и не совсем верен.
Давайте вместе думать,как перевести правильно.
Недавно появился новый формат DVBAPI5 для вывода данных тюнера/потока,его стали использовать некоторые производители ресиверов. Это Sundtek/Mutant/Edision/Xtrend,но не VU+ .
В общем, в этом формате данные snr/db энигма не пересчитывает,как сделал производитель,то и выводим.А там такое бывает.
В старом формате, DVBAPI3,сделан отличный пересчет.То бишь,кто понимает в этом,может правильно пересчитать данные для нужного тюнера.
Вот пример как выглядит этот пересчет:
Спойлер :
void eDVBFrontend::calculateSignalQuality(int snr, int &signalquality, int &signalqualitydb)
{
int sat_max = 1600; // for stv0288 / bsbe2
int ret = 0x12345678;
int ter_max = 2900;
int atsc_max = 4200;
if (!strcmp(m_description, "AVL2108")) // ET9000
{
ret = (int)(snr / 40.5);
sat_max = 1618;
}
if (!strcmp(m_description, "AVL6211")) // ET10000
{
ret = (int)(snr / 37.5);
sat_max = 1700;
}
else if (strstr("Nova-T StickNovaT 500StickDTB03", m_description)) // dib0700
{
if ( snr > 300 )
ret = 0; //error condition
else
ret = (int)(snr * 10);
}
else if (!strcmp(m_description, "BCM4501 (internal)"))
{
eDVBFrontendParametersSatellite parm;
float SDS_SNRE = snr << 16;
float snr_in_db;
oparm.getDVBS(parm);
if (parm.system == eDVBFrontendParametersSatellite::System_DVB_S) // DVB-S1 / QPSK
{
static float SNR_COEFF[6] = {
100.0 / 4194304.0,
-7136.0 / 4194304.0,
197418.0 / 4194304.0,
-2602183.0 / 4194304.0,
20377212.0 / 4194304.0,
-37791203.0 / 4194304.0,
};
float fval1 = 12.44714 - (2.0 * log10(SDS_SNRE / 256.0)),
fval2 = pow(10.0, fval1)-1;
fval1 = 10.0 * log10(fval2);
if (fval1 < 10.0)
{
fval2 = SNR_COEFF[0];
for (int i=1; i<6; ++i)
{
fval2 *= fval1;
fval2 += SNR_COEFF
; } fval1 = fval2; } snr_in_db = fval1; } else { float fval1 = SDS_SNRE / 268435456.0, fval2, fval3, fval4; if (parm.modulation == eDVBFrontendParametersSatellite::Modulation_QPSK) { fval2 = 6.76; fval3 = 4.35; } else // 8PSK { fval1 *= 0.5; fval2 = 8.06; fval3 = 6.18; } fval4 = -10.0 * log10(fval1); fval1 = fval4; for (int i=0; i < 5; ++i) fval1 = fval4 - fval2 * log10(1.0+pow(10.0, (fval3-fval1)/fval2)); snr_in_db = fval1; } sat_max = 1750; ret = (int)(snr_in_db * 100); } else if (strstr(m_description, "Alps BSBE1 C01A") || strstr(m_description, "Alps -S(STV0288)")) { if (snr == 0) ret = 0; else if (snr == 0xFFFF) // i think this should not happen ret = 100*100; else { enum { REALVAL, REGVAL }; const long CN_lookup[31][2] = { {20,8900}, {25,8680}, {30,8420}, {35,8217}, {40,7897}, {50,7333}, {60,6747}, {70,6162}, {80,5580}, {90,5029}, {100,4529}, {110,4080}, {120,3685}, {130,3316}, {140,2982}, {150,2688}, {160,2418}, {170,2188}, {180,1982}, {190,1802}, {200,1663}, {210,1520}, {220,1400}, {230,1295}, {240,1201}, {250,1123}, {260,1058}, {270,1004}, {280,957}, {290,920}, {300,890} }; int add=strchr(m_description, '.') ? 0xA250 : 0xA100; long regval = 0xFFFF - ((snr / 3) + add), // revert some dvb api calulations to get the real register value Imin=0, Imax=30, i; if(INRANGE(CN_lookup[Imin][REGVAL],regval,CN_lookup[Imax][REGVAL])) { while((Imax-Imin)>1) { i=(Imax+Imin)/2; if(INRANGE(CN_lookup[Imin][REGVAL],regval,CN_lookup[REGVAL])) Imax = i; else Imin = i; } ret = (((regval - CN_lookup[Imin][REGVAL]) * (CN_lookup[Imax][REALVAL] - CN_lookup[Imin][REALVAL]) / (CN_lookup[Imax][REGVAL] - CN_lookup[Imin][REGVAL])) + CN_lookup[Imin][REALVAL]) * 10; } else ret = 100; } } else if (!strcmp(m_description, "Alps BSBE1 702A") || // some frontends with STV0299 !strcmp(m_description, "Alps -S") || !strcmp(m_description, "Philips -S") || !strcmp(m_description, "LG -S") ) { sat_max = 1500; ret = (int)((snr-39075)/17.647); } else if (!strcmp(m_description, "Alps BSBE2")) { ret = (int)((snr >> 7) * 10); } else if (!strcmp(m_description, "Philips CU1216Mk3")) { eDVBFrontendParametersCable parm; int mse = (~snr) & 0xFF; oparm.getDVBC(parm); switch (parm.modulation) { case eDVBFrontendParametersCable::Modulation_QAM16: ret = fe_udiv(1950000, (32 * mse) + 138) + 1000; break; case eDVBFrontendParametersCable::Modulation_QAM32: ret = fe_udiv(2150000, (40 * mse) + 500) + 1350; break; case eDVBFrontendParametersCable::Modulation_QAM64: ret = fe_udiv(2100000, (40 * mse) + 500) + 1250; break; case eDVBFrontendParametersCable::Modulation_QAM128: ret = fe_udiv(1850000, (38 * mse) + 400) + 1380; break; case eDVBFrontendParametersCable::Modulation_QAM256: ret = fe_udiv(1800000, (100 * mse) + 40) + 2030; break; default: break; } } else if (!strcmp(m_description, "Philips TU1216")) { snr = 0xFF - (snr & 0xFF); if (snr != 0) ret = 10 * (int)(-100 * (log10(snr) - log10(255))); } else if (strstr(m_description, "Si2166B")) // DM7080HD/DM7020HD/DM820/DM800se DVB-S2 Dual NIM { ret = (snr * 240) >> 8; } else if (strstr(m_description, "BCM4506") || strstr(m_description, "BCM4505") || strstr(m_description, "BCM45208")) { ret = (snr * 100) >> 8; } else if (!strcmp(m_description, "ATBM781x")) { ret = snr*10; } else if (!strcmp(m_description, "Vuplus DVB-S NIM(AVL2108)")) // VU+Ultimo/VU+Uno DVB-S2 NIM { ret = (int)((((double(snr) / (65535.0 / 100.0)) * 0.1600) + 0.2100) * 100); } else if (!strcmp(m_description, "Vuplus DVB-S NIM(AVL6222)") || !strcmp(m_description, "Vuplus DVB-S NIM(AVL6211)") || !strcmp(m_description, "BCM7335 DVB-S2 NIM (internal)")) // VU+ DVB-S2 Dual NIM and VU+DUO DVB-S2 NIM { ret = (int)((((double(snr) / (65535.0 / 100.0)) * 0.1244) + 2.5079) * 100); if (!strcmp(m_description, "Vuplus DVB-S NIM(AVL6222)")) sat_max = 1490; } else if (!strcmp(m_description, "BCM7346 (internal)")) // MaxDigital XP1000 { ret = (int)((((double(snr) / (65535.0 / 100.0)) * 0.1880) + 0.1959) * 100); } else if (!strcmp(m_description, "BCM7356 DVB-S2 NIM (internal)")) // VU+ Solo2 { ret = (int)((((double(snr) / (65535.0 / 100.0)) * 0.1800) - 1.0000) * 100); } else if (!strcmp(m_description, "Vuplus DVB-S NIM(7376 FBC)")) // VU+ Solo4k { ret = (int)((((double(snr) / (65535.0 / 100.0)) * 0.1480) + 0.9560) * 100); } else if (!strcmp(m_description, "BCM7362 (internal) DVB-S2")) // Xsarius { ret = (int)((((double(snr) / (65535.0 / 100.0)) * 0.28) - 10.0) * 100); } else if (!strcmp(m_description, "DVB-S2 NIM(45208 FBC)")) { ret = (int)((((double(snr) / (65535.0 / 100.0)) * 0.1950) - 1.0000) * 100); } else if (!strcmp(m_description, "Genpix")) { ret = (int)((snr << 1) / 5); } else if (!strcmp(m_description, "CXD1981")) { eDVBFrontendParametersCable parm; int mse = (~snr) & 0xFF; oparm.getDVBC(parm); switch (parm.modulation) { case eDVBFrontendParametersCable::Modulation_QAM16: case eDVBFrontendParametersCable::Modulation_QAM64: case eDVBFrontendParametersCable::Modulation_QAM256: ret = (int)(-950 * log(((double)mse) / 760)); break; case eDVBFrontendParametersCable::Modulation_QAM32: case eDVBFrontendParametersCable::Modulation_QAM128: ret = (int)(-875 * log(((double)mse) / 650)); break; default: break; } } else if (!strcmp(m_description, "Broadcom BCM73XX") || !strcmp(m_description, "FTS-260 (Montage RS6000)") || !strcmp(m_description, "Panasonic MN88472") || !strcmp(m_description, "Panasonic MN88473")) { ret = snr * 100 / 256; if (!strcmp(m_description, "FTS-260 (Montage RS6000)")) sat_max = 1490; } else if (!strcmp(m_description, "Si216x")) { eDVBFrontendParametersTerrestrial parm; oparm.getDVBT(parm); switch (parm.system) { case eDVBFrontendParametersTerrestrial::System_DVB_T: case eDVBFrontendParametersTerrestrial::System_DVB_T2: case eDVBFrontendParametersTerrestrial::System_DVB_T_T2: ret = (int)(snr / 58); ter_max = 1700; break; default: break; } } else if (strstr(m_description, "Sundtek DVB-T (III)")) // Sundtek MediaTV Digital Home III...dvb-t/t2 mode { ret = (int)(snr / 75); ter_max = 1700; } else if (strstr(m_description, "Sundtek DVB-S/S2 (IV)")) { ret = (int)(snr / 40.5); sat_max = 1900; } else if(!strcmp(m_description, "TBS-5925") || !strcmp(m_description, "DVBS2BOX") || !strcmp(m_description, "TechniSat USB device")) { ret = (snr * 2000) / 0xFFFF; sat_max = 2000; } else if (!strcmp(m_description, "Si21662")) { ret = (int)(snr / 46. ; sat_max = 1620; } else if(!strcmp(m_description, "WinTV HVR-850") || !strcmp(m_description, "Hauppauge") || !strcmp(m_description, "LG Electronics LGDT3306A VSB/QAM Frontend")) { eDVBFrontendParametersATSC parm; oparm.getATSC(parm); switch (parm.modulation) { case eDVBFrontendParametersATSC::Modulation_QAM256: atsc_max = 4000; break; case eDVBFrontendParametersATSC::Modulation_QAM64: atsc_max = 2900; break; case eDVBFrontendParametersATSC::Modulation_VSB_8: atsc_max = 2700; break; default: break; } ret = snr * 10; } else if (!strcmp(m_description, "FTM-4862 (Availink AVL6862)")) // Osmega /S2/T2/C { int type = -1; oparm.getSystem(type); switch (type) { case feSatellite: ret = (snr + 2300) / 11.5; sat_max = 1550; break; } } else if (!strncmp(m_description, "Si216", 5)) // New models with SI tuners { ret = snr; } signalqualitydb = ret; if (ret == 0x12345678) // no snr db calculation avail.. return untouched snr value.. { signalquality = snr; } else { Я упросил в опенПли сделать выбор для пользователя,что использовать.