Nachdem mit meinen TT-budget S2-3200 Karten bei DVB-S2-Kanälen immer deine deutlich niedrigere Signalqualität angezeigt wird als bei DVB-S, habe ich mir mal die Funktion stb0899_read_snr() im Treiber (linux/drivers/media/dvb-frontends/stb0899_drv.c) näher angeschaut.
static int stb0899_read_snr(struct dvb_frontend *fe, u16 *snr)
{
...
unsigned int val, quant, quantn = -1, est, estn = -1;
...
switch (state->delsys) {
...
case SYS_DVBS2:
if (internal->lock) {
reg = STB0899_READ_S2REG(STB0899_S2DEMOD, UWP_CNTRL1);
quant = STB0899_GETFIELD(UWP_ESN0_QUANT, reg);
reg = STB0899_READ_S2REG(STB0899_S2DEMOD, UWP_STAT2);
est = STB0899_GETFIELD(ESN0_EST, reg);
if (est == 1)
val = 301; /* C/N = 30.1 dB */
else if (est == 2)
val = 270; /* C/N = 27.0 dB */
else {
/* quantn = 100 * log(quant^2) */
quantn = stb0899_table_lookup(stb0899_quant_tab, ARRAY_SIZE(stb0899_quant_tab) - 1, quant * 100);
/* estn = 100 * log(est) */
estn = stb0899_table_lookup(stb0899_est_tab, ARRAY_SIZE(stb0899_est_tab) - 1, est);
/* snr(dBm/10) = -10*(log(est)-log(quant^2)) => snr(dBm/10) = (100*log(quant^2)-100*log(est))/10 */
val = (quantn - estn) / 10;
}
*snr = val;
...
}
break;
...
}
return 0;
}
Alles anzeigen
Ohne jetzt im Einzelnen zu wissen, was "quant" und "est" genau ist, mache ich mal folgende Überlegungen:
- quantn über die Tabelle stb0899_quant_tab[] ermittelt und kann Werte zwischen 0 und 4810 annehmen.
- estn wird über stb0899_est_tab[] ermittelt und liegt zwischen 0 und 5721.
- val wird aus quantn und estn berechnet und kann in den 4 möglichen Extremfällen folgende Werte annehmen:
(0 - 0) / 10 = 0
(0 - 5721) / 10 = -572.1
(4810 - 0) / 10 = 481.0
(4810 - 5721) / 10 = -91.1
Wie man sieht kann das Ergebnis gerne mal negativ sein. Dennoch wird es einer "unsigned"-Variablen und dann auch einem "unsigned"-Rückgabeparameter zugewiesen.
Ist hier irgendwas fundamental im Argen, oder sehe ich da was nicht?
Klaus