mirror of
https://github.com/saitohirga/WSJT-X.git
synced 2024-11-01 08:07:10 -04:00
178 lines
3.9 KiB
C
178 lines
3.9 KiB
C
|
/* CHECK.C - Compute parity checks and other stats on decodings. */
|
||
|
|
||
|
/* Copyright (c) 1995-2012 by Radford M. Neal.
|
||
|
*
|
||
|
* Permission is granted for anyone to copy, use, modify, and distribute
|
||
|
* these programs and accompanying documents for any purpose, provided
|
||
|
* this copyright notice is retained and prominently displayed, and note
|
||
|
* is made of any changes made to these programs. These programs and
|
||
|
* documents are distributed without any warranty, express or implied.
|
||
|
* As the programs were written for research purposes only, they have not
|
||
|
* been tested to the degree that would be advisable in any important
|
||
|
* application. All use of these programs is entirely at the user's own
|
||
|
* risk.
|
||
|
*/
|
||
|
|
||
|
#include <stdlib.h>
|
||
|
#include <stdio.h>
|
||
|
#include <math.h>
|
||
|
|
||
|
#include "mod2sparse.h"
|
||
|
#include "check.h"
|
||
|
|
||
|
|
||
|
|
||
|
/* COMPUTE PARITY CHECKS. Returns the number of parity checks violated by
|
||
|
dblk. The results of all the parity checks are stored in pchk. */
|
||
|
|
||
|
int check
|
||
|
( mod2sparse *H, /* Parity check matrix */
|
||
|
char *dblk, /* Guess for codeword */
|
||
|
char *pchk /* Place to store parity checks */
|
||
|
)
|
||
|
{
|
||
|
int M, i, c;
|
||
|
|
||
|
M = mod2sparse_rows(H);
|
||
|
|
||
|
mod2sparse_mulvec (H, dblk, pchk);
|
||
|
|
||
|
c = 0;
|
||
|
for (i = 0; i<M; i++)
|
||
|
{ c += pchk[i];
|
||
|
}
|
||
|
|
||
|
return c;
|
||
|
}
|
||
|
|
||
|
|
||
|
/* COUNT HOW MANY BITS HAVED CHANGED FROM BIT INDICATED BY LIKELIHOOD. The
|
||
|
simple decoding based on likelihood ratio is compared to the given decoding.
|
||
|
A bit for which the likelihood ratio is exactly one counts as half a
|
||
|
change, which explains why the result is a double rather than an int.
|
||
|
*/
|
||
|
|
||
|
double changed
|
||
|
( double *lratio, /* Likelihood ratios for bits */
|
||
|
char *dblk, /* Candidate decoding */
|
||
|
int N /* Number of bits */
|
||
|
)
|
||
|
{
|
||
|
double changed;
|
||
|
int j;
|
||
|
|
||
|
changed = 0;
|
||
|
for (j = 0; j<N; j++)
|
||
|
{ changed += lratio[j]==1 ? 0.5 : dblk[j] != (lratio[j]>1);
|
||
|
}
|
||
|
|
||
|
return changed;
|
||
|
}
|
||
|
|
||
|
|
||
|
/* COMPUTE THE EXPECTED NUMBER OF PARITY CHECK ERRORS. Computes the
|
||
|
expected number of parity check errors with respect to the distribution
|
||
|
given by the bit probabilities passed, with bits assumed to be independent.
|
||
|
*/
|
||
|
|
||
|
double expected_parity_errors
|
||
|
( mod2sparse *H, /* Parity check matrix */
|
||
|
double *bpr /* Bit probabilities */
|
||
|
)
|
||
|
{
|
||
|
mod2entry *f;
|
||
|
double ee, p;
|
||
|
int M, i, j;
|
||
|
|
||
|
M = mod2sparse_rows(H);
|
||
|
|
||
|
ee = 0;
|
||
|
|
||
|
for (i = 0; i<M; i++)
|
||
|
{ p = 0;
|
||
|
for (f = mod2sparse_first_in_row(H,i);
|
||
|
!mod2sparse_at_end(f);
|
||
|
f = mod2sparse_next_in_row(f))
|
||
|
{ j = mod2sparse_col(f);
|
||
|
p = p * (1-bpr[j]) + (1-p) * bpr[j];
|
||
|
}
|
||
|
ee += p;
|
||
|
}
|
||
|
|
||
|
return ee;
|
||
|
}
|
||
|
|
||
|
|
||
|
/* COMPUTE LOG LIKELIHOOD OF A DECODING. */
|
||
|
|
||
|
double loglikelihood
|
||
|
( double *lratio, /* Likelihood ratios for bits */
|
||
|
char *bits, /* Bits in decoding */
|
||
|
int N /* Length of codeword */
|
||
|
)
|
||
|
{
|
||
|
double ll;
|
||
|
int j;
|
||
|
|
||
|
ll = 0;
|
||
|
|
||
|
for (j = 0; j<N; j++)
|
||
|
{ ll -= bits[j] ? log(1+1/lratio[j]) : log(1+lratio[j]);
|
||
|
}
|
||
|
|
||
|
return ll;
|
||
|
}
|
||
|
|
||
|
|
||
|
/* COMPUTE THE EXPECTED LOG LIKELIHOOD BASED ON BIT PROBABILITIES. Computes
|
||
|
the expected value of the log likelihood with respect to the distribution
|
||
|
given by the bit probabilities passed, with bits assumed to be independent.
|
||
|
*/
|
||
|
|
||
|
double expected_loglikelihood
|
||
|
( double *lratio, /* Likelihood ratios for bits */
|
||
|
double *bpr, /* Bit probabilities */
|
||
|
int N /* Length of codeword */
|
||
|
)
|
||
|
{
|
||
|
double ll;
|
||
|
int j;
|
||
|
|
||
|
ll = 0;
|
||
|
|
||
|
for (j = 0; j<N; j++)
|
||
|
{ if (bpr[j]>0)
|
||
|
{ ll -= bpr[j]*log(1+1/lratio[j]);
|
||
|
}
|
||
|
if (bpr[j]<1)
|
||
|
{ ll -= (1-bpr[j])*log(1+lratio[j]);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return ll;
|
||
|
}
|
||
|
|
||
|
|
||
|
/* COMPUTE ENTROPY FROM BIT PROBABILITIES. Computes the entropy of the
|
||
|
distribution given by the bit probabilities, on the assumption that
|
||
|
bits are independent.
|
||
|
*/
|
||
|
|
||
|
double entropy
|
||
|
( double *bpr, /* Bit probabilities */
|
||
|
int N /* Length of codeword */
|
||
|
)
|
||
|
{
|
||
|
double e;
|
||
|
int j;
|
||
|
|
||
|
e = 0;
|
||
|
for (j = 0; j<N; j++)
|
||
|
{ if (bpr[j]>0 && bpr[j]<1)
|
||
|
{ e -= bpr[j]*log(bpr[j]) + (1-bpr[j])*log(1-bpr[j]);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return e/log(2.0);
|
||
|
}
|