return -1 if unsure

This commit is contained in:
Ahmet Inan 2020-06-09 14:36:19 +02:00
commit 809ab3690b
2 changed files with 17 additions and 3 deletions

View file

@ -62,15 +62,20 @@ public:
{ {
// maximum likelihood // maximum likelihood
if (0) { if (0) {
int word = 0, best = 0; int word = 0, best = -1, next = -1;
for (int msg = 0; msg < W; ++msg) { for (int msg = 0; msg < W; ++msg) {
int enc = (msg << P) | par[msg]; int enc = (msg << P) | par[msg];
int met = metric(code, enc); int met = metric(code, enc);
if (met > best) { if (met > best) {
next = best;
best = met; best = met;
word = enc; word = enc;
} else if (met > next) {
next = met;
} }
} }
if (best == next)
return -1;
return word; return word;
} }
int cw = 0; int cw = 0;
@ -82,6 +87,7 @@ public:
return word; return word;
// metric of hard decision // metric of hard decision
int best = metric(code, word); int best = metric(code, word);
int next = -1;
// flip each bit and see .. // flip each bit and see ..
if (0) { if (0) {
for (int j = 0; j < N; ++j) { for (int j = 0; j < N; ++j) {
@ -89,8 +95,11 @@ public:
int dec = (*this)(cw ^ tmp); int dec = (*this)(cw ^ tmp);
int met = metric(code, dec); int met = metric(code, dec);
if (met > best) { if (met > best) {
next = best;
best = met; best = met;
word = dec; word = dec;
} else if (word != dec && met > next) {
next = met;
} }
} }
} }
@ -122,11 +131,16 @@ public:
int dec = (*this)(cw ^ tmp); int dec = (*this)(cw ^ tmp);
int met = metric(code, dec); int met = metric(code, dec);
if (met > best) { if (met > best) {
next = best;
best = met; best = met;
word = dec; word = dec;
} else if (word != dec && met > next) {
next = met;
} }
} }
} }
if (best == next)
return -1;
return word; return word;
} }
}; };

View file

@ -91,8 +91,8 @@ int main()
awgn_errors += noisy[i] * orig[i] < 0; awgn_errors += noisy[i] * orig[i] < 0;
for (int i = 0; i < CODE_LEN; ++i) for (int i = 0; i < CODE_LEN; ++i)
quantization_erasures += !noisy[i]; quantization_erasures += !noisy[i];
uncorrected_errors += popcnt(enc^dec); uncorrected_errors += dec < 0 ? CODE_LEN : popcnt(enc^dec);
for (int i = 0; i < CODE_LEN; ++i) for (int i = 0; dec >= 0 && i < CODE_LEN; ++i)
decoder_errors += ((enc^dec)&(1<<i)) && orig[i] * noisy[i] > 0; decoder_errors += ((enc^dec)&(1<<i)) && orig[i] * noisy[i] > 0;
} }
float bit_error_rate = (float)uncorrected_errors / (float)(CODE_LEN * LOOPS); float bit_error_rate = (float)uncorrected_errors / (float)(CODE_LEN * LOOPS);