Use a lookup table for SNR calculation.

This commit is contained in:
Oliver Jowett 2014-09-22 14:53:06 +01:00
parent 2e45a59986
commit 76c958b03e
4 changed files with 30 additions and 12 deletions

View file

@ -144,7 +144,7 @@ int detectModeA(uint16_t *m, struct modesMessage *mm)
int F1_sig, F1_noise;
int F2_sig, F2_noise;
int fSig, fNoise, fLevel, fLoLo;
float snr;
int snr;
// m[0] contains the energy from 0 -> 499 nS
// m[1] contains the energy from 500 -> 999 nS
@ -307,8 +307,14 @@ int detectModeA(uint16_t *m, struct modesMessage *mm)
if ((ModeABits < 3) || (ModeABits & 0xFFFF8808) || (ModeAErrs) )
{return (ModeABits = 0);}
snr = 5 * 20.0 * log10f((float)(fSig + fNoise + 365) / (fNoise + 365)); // 365 to adjust for magnitude value offset
mm->signalLevel = ((snr < 255) ? (uint8_t)round(snr) : 255);
// snr = 5 * 20log10(fSig / (fSig+fNoise)) (in units of 0.2dB)
// = 100log10(fSig) - 100log10(fSig+fNoise)
while (fSig > 65535 || (fSig + fNoise) > 65535) {
fSig >>= 1;
fNoise >>= 1;
}
snr = Modes.log10lut[fSig] - Modes.log10lut[fSig + fNoise];
mm->signalLevel = ((snr < 255) ? (uint8_t)snr : 255);
return ModeABits;
}