mirror of
https://github.com/saitohirga/WSJT-X.git
synced 2025-03-22 03:58:50 -04:00
Apply Nico's QRA changes as of 2016/06/23
git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/wsjtx@6801 ab8295b8-cf94-4d9e-aec4-7959e3be5d79
This commit is contained in:
parent
6a481dd006
commit
84891dde37
@ -74,6 +74,7 @@ unsigned GetTickCount(void) {
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "qra65.h"
|
||||
#include "../qracodes/normrnd.h" // gaussian numbers generator
|
||||
@ -209,7 +210,7 @@ int test_proc_1(int channel_type, float EbNodB, int mode)
|
||||
|
||||
int x[QRA65_K], xdec[QRA65_K];
|
||||
int y[QRA65_N];
|
||||
float *r;
|
||||
float *rx;
|
||||
int rc;
|
||||
|
||||
// each simulated station must use its own codec
|
||||
@ -222,40 +223,40 @@ int test_proc_1(int channel_type, float EbNodB, int mode)
|
||||
printf("IV3NWV tx: CQ IV3NWV\n");
|
||||
encodemsg_jt65(x,CALL_CQ,CALL_IV3NWV,GRID_BLANK);
|
||||
qra65_encode(codec_iv3nwv, y, x);
|
||||
r = mfskchannel(y,channel_type,EbNodB);
|
||||
rx = mfskchannel(y,channel_type,EbNodB);
|
||||
|
||||
// K1JT attempts to decode
|
||||
rc = qra65_decode(codec_k1jt, xdec,r);
|
||||
rc = qra65_decode(codec_k1jt, xdec,rx);
|
||||
if (rc>=0) { // decoded
|
||||
printf("K1JT rx: received with apcode=%d %s\n",rc, decode_type[rc]);
|
||||
// K1JT replies to IV3NWV (with no grid)
|
||||
printf("K1JT tx: IV3NWV K1JT\n");
|
||||
encodemsg_jt65(x,CALL_IV3NWV,CALL_K1JT, GRID_BLANK);
|
||||
qra65_encode(codec_k1jt, y, x);
|
||||
r = mfskchannel(y,channel_type,EbNodB);
|
||||
rx = mfskchannel(y,channel_type,EbNodB);
|
||||
|
||||
// IV3NWV attempts to decode
|
||||
rc = qra65_decode(codec_iv3nwv, xdec,r);
|
||||
rc = qra65_decode(codec_iv3nwv, xdec,rx);
|
||||
if (rc>=0) { // decoded
|
||||
printf("IV3NWV rx: received with apcode=%d %s\n",rc, decode_type[rc]);
|
||||
// IV3NWV replies to K1JT with a 73
|
||||
printf("IV3NWV tx: K1JT IV3NWV 73\n");
|
||||
encodemsg_jt65(x,CALL_K1JT,CALL_IV3NWV, GRID_73);
|
||||
qra65_encode(codec_iv3nwv, y, x);
|
||||
r = mfskchannel(y,channel_type,EbNodB);
|
||||
rx = mfskchannel(y,channel_type,EbNodB);
|
||||
|
||||
// K1JT attempts to decode
|
||||
rc = qra65_decode(codec_k1jt, xdec,r);
|
||||
rc = qra65_decode(codec_k1jt, xdec,rx);
|
||||
if (rc>=0) { // decoded
|
||||
printf("K1JT rx: received with apcode=%d %s\n",rc, decode_type[rc]);
|
||||
// K1JT replies to IV3NWV with a 73
|
||||
printf("K1JT tx: IV3NWV K1JT 73\n");
|
||||
encodemsg_jt65(x,CALL_IV3NWV,CALL_K1JT, GRID_73);
|
||||
qra65_encode(codec_k1jt, y, x);
|
||||
r = mfskchannel(y,channel_type,EbNodB);
|
||||
rx = mfskchannel(y,channel_type,EbNodB);
|
||||
|
||||
// IV3NWV attempts to decode
|
||||
rc = qra65_decode(codec_iv3nwv, xdec,r);
|
||||
rc = qra65_decode(codec_iv3nwv, xdec,rx);
|
||||
if (rc>=0) { // decoded
|
||||
printf("IV3NWV rx: received with apcode=%d %s\n",rc, decode_type[rc]);
|
||||
return 0;
|
||||
@ -292,7 +293,7 @@ int test_proc_2(int channel_type, float EbNodB, int mode)
|
||||
|
||||
int x[QRA65_K], xdec[QRA65_K];
|
||||
int y[QRA65_N];
|
||||
float *r;
|
||||
float *rx;
|
||||
int rc,k;
|
||||
|
||||
int ndecok[6] = { 0, 0, 0, 0, 0, 0};
|
||||
@ -315,8 +316,8 @@ int test_proc_2(int channel_type, float EbNodB, int mode)
|
||||
|
||||
for (k=0;k<ntx;k++) {
|
||||
printf(".");
|
||||
r = mfskchannel(y,channel_type,EbNodB);
|
||||
rc = qra65_decode(codec_k1jt, xdec,r);
|
||||
rx = mfskchannel(y,channel_type,EbNodB);
|
||||
rc = qra65_decode(codec_k1jt, xdec,rx);
|
||||
if (rc>=0)
|
||||
ndecok[rc]++;
|
||||
}
|
||||
@ -369,7 +370,7 @@ int main(int argc, char* argv[])
|
||||
}
|
||||
else
|
||||
if (strncmp(*argv,"-a",2)==0) {
|
||||
mode = (unsigned int)atoi((*argv)+2);
|
||||
mode = ( int)atoi((*argv)+2);
|
||||
if (mode>1) {
|
||||
printf("Invalid decoding mode\n");
|
||||
syntax();
|
||||
@ -387,7 +388,7 @@ int main(int argc, char* argv[])
|
||||
}
|
||||
else
|
||||
if (strncmp(*argv,"-t",2)==0) {
|
||||
testtype = (unsigned int)atoi((*argv)+2);
|
||||
testtype = ( int)atoi((*argv)+2);
|
||||
if (testtype>1) {
|
||||
printf("Invalid test type\n");
|
||||
syntax();
|
||||
@ -396,7 +397,7 @@ int main(int argc, char* argv[])
|
||||
}
|
||||
else
|
||||
if (strncmp(*argv,"-c",2)==0) {
|
||||
channel = (unsigned int)atoi((*argv)+2);
|
||||
channel = ( int)atoi((*argv)+2);
|
||||
if (channel>CHANNEL_RAYLEIGH) {
|
||||
printf("Invalid channel type\n");
|
||||
syntax();
|
||||
@ -412,6 +413,10 @@ int main(int argc, char* argv[])
|
||||
|
||||
EbNodB = SNRdB+29.1f;
|
||||
|
||||
#if defined(__linux__) || defined(__unix__)
|
||||
srand48(GetTickCount());
|
||||
#endif
|
||||
|
||||
if (testtype==0) {
|
||||
for (k=0;k<nqso;k++) {
|
||||
printf("\n\n------------------------\n");
|
||||
|
@ -152,7 +152,7 @@ void qra65_encode(qra65codec *pcodec, int *y, const int *x)
|
||||
|
||||
int qra65_decode(qra65codec *pcodec, int *x, const float *rxen)
|
||||
{
|
||||
uint k;
|
||||
int k;
|
||||
float *srctmp, *dsttmp;
|
||||
float ix[QRA65_NC*QRA65_M]; // (depunctured) intrisic information to the decoder
|
||||
int rc;
|
||||
@ -276,7 +276,7 @@ static void ix_mask(float *dst, const float *src, const int *mask, const int *x)
|
||||
{
|
||||
// mask intrinsic information (channel observations) with a priori knowledge
|
||||
|
||||
uint k,kk, smask;
|
||||
int k,kk, smask;
|
||||
float *row;
|
||||
|
||||
memcpy(dst,src,(QRA65_NC*QRA65_M)*sizeof(float));
|
||||
|
@ -60,9 +60,9 @@
|
||||
#include <unistd.h>
|
||||
#include <time.h>
|
||||
|
||||
unsigned GetTickCount(void) {
|
||||
GetTickCount(void) {
|
||||
struct timespec ts;
|
||||
unsigned theTick = 0U;
|
||||
theTick = 0U;
|
||||
clock_gettime( CLOCK_REALTIME, &ts );
|
||||
theTick = ts.tv_nsec / 1000000;
|
||||
theTick += ts.tv_sec * 1000;
|
||||
@ -116,7 +116,7 @@ const char fnameout_sfx[4][64] = {
|
||||
"-ap56.txt"
|
||||
};
|
||||
|
||||
const uint ap_masks_jt65[4][13] = {
|
||||
const int ap_masks_jt65[4][13] = {
|
||||
// Each row must be 13 entries long (to handle puntc. codes 13,64)
|
||||
// The mask of 13th symbol (crc) is alway initializated to 0
|
||||
// AP0 - no a-priori knowledge
|
||||
@ -150,8 +150,8 @@ typedef struct {
|
||||
volatile int done;
|
||||
int ap_index; // index to the a priori knowledge mask
|
||||
const qracode *pcode; // pointer to the code descriptor
|
||||
uint *x; //[qra_K]; input message buffer
|
||||
uint *y, *ydec; //[qra_N]; encoded/decoded codewords buffers
|
||||
int *x; //[qra_K]; input message buffer
|
||||
int *y, *ydec; //[qra_N]; encoded/decoded codewords buffers
|
||||
float *qra_v2cmsg; //[qra_NMSG*qra_M]; MP decoder v->c msg buffer
|
||||
float *qra_c2vmsg; //[qra_NMSG*qra_M]; MP decoder c->v msg buffer
|
||||
float *rp; // [qra_N*qra_M]; received samples (real component) buffer
|
||||
@ -194,11 +194,11 @@ int calc_crc6(int *x, int sz)
|
||||
void wer_test_thread(wer_test_ds *pdata)
|
||||
{
|
||||
const qracode *pcode=pdata->pcode;
|
||||
const uint qra_K = pcode->K;
|
||||
const uint qra_N = pcode->N;
|
||||
const uint qra_M = pcode->M;
|
||||
const uint qra_m = pcode->m;
|
||||
const uint NSAMPLES = pcode->N*pcode->M;
|
||||
const int qra_K = pcode->K;
|
||||
const int qra_N = pcode->N;
|
||||
const int qra_M = pcode->M;
|
||||
const int qra_m = pcode->m;
|
||||
const int NSAMPLES = pcode->N*pcode->M;
|
||||
|
||||
const float No = 1.0f; // noise spectral density
|
||||
const float sigma = (float)sqrt(No/2.0f); // std dev of noise I/Q components
|
||||
@ -208,7 +208,7 @@ void wer_test_thread(wer_test_ds *pdata)
|
||||
const float EbNodBMetric = 2.8f;
|
||||
const float EbNoMetric = (float)pow(10,EbNodBMetric/10);
|
||||
|
||||
uint k,t,j,diff;
|
||||
int k,t,j,diff;
|
||||
float R;
|
||||
float EsNoMetric;
|
||||
float EbNo, EsNo, Es, A;
|
||||
@ -220,8 +220,8 @@ void wer_test_thread(wer_test_ds *pdata)
|
||||
|
||||
|
||||
// inizialize pointer to required buffers
|
||||
uint *x=pdata->x; // message buffer
|
||||
uint *y=pdata->y, *ydec=pdata->ydec; // encoded/decoded codeword buffers
|
||||
int *x=pdata->x; // message buffer
|
||||
int *y=pdata->y, *ydec=pdata->ydec; // encoded/decoded codeword buffers
|
||||
float *qra_v2cmsg=pdata->qra_v2cmsg; // table of the v->c messages
|
||||
float *qra_c2vmsg=pdata->qra_c2vmsg; // table of the c->v messages
|
||||
float *rp=pdata->rp; // received samples (real component)
|
||||
@ -374,10 +374,10 @@ void ix_mask(const qracode *pcode, float *r, const int *mask, const int *x)
|
||||
{
|
||||
// mask intrinsic information (channel observations) with a priori knowledge
|
||||
|
||||
uint k,kk, smask;
|
||||
const uint qra_K=pcode->K;
|
||||
const uint qra_M=pcode->M;
|
||||
const uint qra_m=pcode->m;
|
||||
int k,kk, smask;
|
||||
const int qra_K=pcode->K;
|
||||
const int qra_M=pcode->M;
|
||||
const int qra_m=pcode->m;
|
||||
|
||||
for (k=0;k<qra_K;k++) {
|
||||
smask = mask[k];
|
||||
@ -392,10 +392,10 @@ void ix_mask(const qracode *pcode, float *r, const int *mask, const int *x)
|
||||
}
|
||||
|
||||
|
||||
int wer_test_proc(const qracode *pcode, uint nthreads, int chtype, uint ap_index, float *EbNodB, uint *nerrstgt, uint nitems)
|
||||
int wer_test_proc(const qracode *pcode, int nthreads, int chtype, int ap_index, float *EbNodB, int *nerrstgt, int nitems)
|
||||
{
|
||||
uint k,nn,j,nt,nerrs,nerrsu,nd;
|
||||
uint cini,cend;
|
||||
int k,nn,j,nt,nerrs,nerrsu,nd;
|
||||
int cini,cend;
|
||||
char fnameout[128];
|
||||
FILE *fout;
|
||||
wer_test_ds wt[NTHREADS_MAX];
|
||||
@ -427,9 +427,9 @@ int wer_test_proc(const qracode *pcode, uint nthreads, int chtype, uint ap_index
|
||||
wt[j].channel_type=chtype;
|
||||
wt[j].ap_index = ap_index;
|
||||
wt[j].pcode = pcode;
|
||||
wt[j].x = (uint*)malloc(pcode->K*sizeof(uint));
|
||||
wt[j].y = (uint*)malloc(pcode->N*sizeof(uint));
|
||||
wt[j].ydec = (uint*)malloc(pcode->N*sizeof(uint));
|
||||
wt[j].x = (int*)malloc(pcode->K*sizeof(int));
|
||||
wt[j].y = (int*)malloc(pcode->N*sizeof(int));
|
||||
wt[j].ydec = (int*)malloc(pcode->N*sizeof(int));
|
||||
wt[j].qra_v2cmsg = (float*)malloc(pcode->NMSG*pcode->M*sizeof(float));
|
||||
wt[j].qra_c2vmsg = (float*)malloc(pcode->NMSG*pcode->M*sizeof(float));
|
||||
wt[j].rp = (float*)malloc(pcode->N*pcode->M*sizeof(float));
|
||||
@ -570,17 +570,17 @@ int main(int argc, char* argv[])
|
||||
{
|
||||
|
||||
float EbNodB[SIM_POINTS_MAX];
|
||||
uint nerrstgt[SIM_POINTS_MAX];
|
||||
int nerrstgt[SIM_POINTS_MAX];
|
||||
FILE *fin;
|
||||
|
||||
char fnamein[128]= "ebnovalues.txt";
|
||||
char buf[128];
|
||||
|
||||
uint nitems = 0;
|
||||
uint code_idx = 1;
|
||||
uint nthreads = 8;
|
||||
uint ch_type = CHANNEL_AWGN;
|
||||
uint ap_index = AP_NONE;
|
||||
int nitems = 0;
|
||||
int code_idx = 1;
|
||||
int nthreads = 8;
|
||||
int ch_type = CHANNEL_AWGN;
|
||||
int ap_index = AP_NONE;
|
||||
|
||||
// parse command line
|
||||
while(--argc) {
|
||||
@ -591,7 +591,7 @@ int main(int argc, char* argv[])
|
||||
}
|
||||
else
|
||||
if (strncmp(*argv,"-q",2)==0) {
|
||||
code_idx = (uint)atoi((*argv)+2);
|
||||
code_idx = (int)atoi((*argv)+2);
|
||||
if (code_idx>1) {
|
||||
printf("Invalid code index\n");
|
||||
syntax();
|
||||
@ -600,7 +600,7 @@ int main(int argc, char* argv[])
|
||||
}
|
||||
else
|
||||
if (strncmp(*argv,"-t",2)==0) {
|
||||
nthreads = (uint)atoi((*argv)+2);
|
||||
nthreads = (int)atoi((*argv)+2);
|
||||
if (nthreads>NTHREADS_MAX) {
|
||||
printf("Invalid number of threads\n");
|
||||
syntax();
|
||||
@ -609,7 +609,7 @@ int main(int argc, char* argv[])
|
||||
}
|
||||
else
|
||||
if (strncmp(*argv,"-c",2)==0) {
|
||||
ch_type = (uint)atoi((*argv)+2);
|
||||
ch_type = (int)atoi((*argv)+2);
|
||||
if (ch_type>CHANNEL_RAYLEIGH) {
|
||||
printf("Invalid channel type\n");
|
||||
syntax();
|
||||
@ -618,7 +618,7 @@ int main(int argc, char* argv[])
|
||||
}
|
||||
else
|
||||
if (strncmp(*argv,"-a",2)==0) {
|
||||
ap_index = (uint)atoi((*argv)+2);
|
||||
ap_index = (int)atoi((*argv)+2);
|
||||
if (ap_index>AP_56) {
|
||||
printf("Invalid a-priori information index\n");
|
||||
syntax();
|
||||
|
@ -29,19 +29,22 @@
|
||||
#if _WIN32 // note the underscore: without it, it's not msdn official!
|
||||
// Windows (x64 and x86)
|
||||
#include <windows.h> // required only for GetTickCount(...)
|
||||
#define K_RAND_MAX UINT_MAX
|
||||
#elif __unix__ // all unices, not all compilers
|
||||
#define rand_s rand_r
|
||||
#include <stdlib.h>
|
||||
#include <limits.h> // for UINT_MAX
|
||||
#define rand_s(x) (*x)=(unsigned int)lrand48() // returns unsigned integers in the range 0..0x7FFFFFFF
|
||||
#define K_RAND_MAX 0x7FFFFFFF // that's the max number generated by lrand48
|
||||
// Unix
|
||||
#elif __linux__
|
||||
#include <stdlib.h>
|
||||
#define rand_s(x) (*x)=(unsigned int)lrand48() // returns unsigned integers in the range 0..0x7FFFFFFF
|
||||
#define K_RAND_MAX 0x7FFFFFFF // that's the max number generated by lrand48
|
||||
// linux
|
||||
#elif __APPLE__
|
||||
// Mac OS, not sure if this is covered by __posix__ and/or __unix__ though...
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
// use MS rand_s(...) function
|
||||
void normrnd_s(float *dst, int nitems, float mean, float stdev)
|
||||
{
|
||||
@ -55,13 +58,14 @@ void normrnd_s(float *dst, int nitems, float mean, float stdev)
|
||||
set = 0;
|
||||
}
|
||||
else {
|
||||
rand_s(&r); phi = (M_2PI/(1.0f+UINT_MAX))*r;
|
||||
rand_s(&r); u = (float)sqrt(-2.0f* log( (1.0f/(1.0f+UINT_MAX))*(1.0f+r) ) );
|
||||
rand_s((unsigned int*)&r); phi = (M_2PI/(1.0f+K_RAND_MAX))*r;
|
||||
rand_s((unsigned int*)&r); u = (float)sqrt(-2.0f* log( (1.0f/(1.0f+K_RAND_MAX))*(1.0f+r) ) );
|
||||
*dst++ = (float)cos(phi)*u*stdev+mean;
|
||||
set=1;
|
||||
}
|
||||
}
|
||||
|
||||
/* NOT USED
|
||||
// use MS rand() function
|
||||
void normrnd(float *dst, int nitems, float mean, float stdev)
|
||||
{
|
||||
@ -80,4 +84,4 @@ void normrnd(float *dst, int nitems, float mean, float stdev)
|
||||
set=1;
|
||||
}
|
||||
}
|
||||
|
||||
*/
|
||||
|
@ -37,9 +37,11 @@ void normrnd_s(float *dst, int nitems, float mean, float stdev);
|
||||
// generate a random array of numbers with a gaussian distribution of given mean and stdev
|
||||
// use MS rand_s(...) function
|
||||
|
||||
/* not used
|
||||
void normrnd(float *dst, int nitems, float mean, float stdev);
|
||||
// generate a random array of numbers with a gaussian distribution of given mean and stdev
|
||||
// use MS rand() function
|
||||
*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
@ -331,14 +331,14 @@ void pd_memset(float *dst, const float *src, int ndim, int nitems)
|
||||
}
|
||||
}
|
||||
|
||||
void pd_fwdperm(float *dst, float *src, const unsigned int *perm, int ndim)
|
||||
void pd_fwdperm(float *dst, float *src, const int *perm, int ndim)
|
||||
{
|
||||
// TODO: non-loop implementation
|
||||
while (ndim--)
|
||||
dst[ndim] = src[perm[ndim]];
|
||||
}
|
||||
|
||||
void pd_bwdperm(float *dst, float *src, const unsigned int *perm, int ndim)
|
||||
void pd_bwdperm(float *dst, float *src, const int *perm, int ndim)
|
||||
{
|
||||
// TODO: non-loop implementation
|
||||
while (ndim--)
|
||||
|
@ -57,12 +57,12 @@ float pd_norm(float *pd, int nlogdim);
|
||||
// are replaced with a uniform distribution
|
||||
// Returns the norm of the distribution prior to the normalization
|
||||
|
||||
void pd_fwdperm(float *dst, float *src, const unsigned int *perm, int ndim);
|
||||
void pd_fwdperm(float *dst, float *src, const int *perm, int ndim);
|
||||
// Forward permutation of a distribution
|
||||
// Computes dst[k] = src[perm[k]] for every element in the distribution
|
||||
// perm must be a pointer to an array of integers of length ndim
|
||||
|
||||
void pd_bwdperm(float *dst, float *src, const unsigned int *perm, int ndim);
|
||||
void pd_bwdperm(float *dst, float *src, const int *perm, int ndim);
|
||||
// Backward permutation of a distribution
|
||||
// Computes dst[perm[k]] = src[k] for every element in the distribution
|
||||
// perm must be a pointer to an array of integers of length ndim
|
||||
|
@ -52,7 +52,7 @@ static const int qra_acc_input_idx[qra_NC+1] = {
|
||||
};
|
||||
|
||||
// table of the systematic symbols weight logarithms over GF(M)
|
||||
static const unsigned int qra_acc_input_wlog[qra_NC+1] = {
|
||||
static const int qra_acc_input_wlog[qra_NC+1] = {
|
||||
39, 0, 34, 16, 25, 0, 34, 48, 19, 13,
|
||||
29, 56, 0, 5, 39, 42, 31, 0, 10, 0,
|
||||
57, 62, 33, 43, 0, 14, 22, 48, 28, 20,
|
||||
@ -73,7 +73,7 @@ static const int qra_log[qra_M] = {
|
||||
};
|
||||
|
||||
// table of GF(M) elements given their logarithm
|
||||
static const unsigned int qra_exp[qra_M-1] = {
|
||||
static const int qra_exp[qra_M-1] = {
|
||||
1, 2, 4, 8, 16, 32, 3, 6, 12, 24,
|
||||
48, 35, 5, 10, 20, 40, 19, 38, 15, 30,
|
||||
60, 59, 53, 41, 17, 34, 7, 14, 28, 56,
|
||||
@ -84,7 +84,7 @@ static const unsigned int qra_exp[qra_M-1] = {
|
||||
};
|
||||
|
||||
// table of the messages weight logarithms over GF(M)
|
||||
static const unsigned int qra_msgw[qra_NMSG] = {
|
||||
static const int qra_msgw[qra_NMSG] = {
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
@ -110,7 +110,7 @@ static const unsigned int qra_msgw[qra_NMSG] = {
|
||||
};
|
||||
|
||||
// table of the degrees of the variable nodes
|
||||
static const unsigned int qra_vdeg[qra_V] = {
|
||||
static const int qra_vdeg[qra_V] = {
|
||||
4, 4, 4, 4, 5, 5, 5, 6, 6, 6,
|
||||
7, 8, 3, 3, 3, 3, 3, 3, 3, 3,
|
||||
3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
|
||||
@ -121,7 +121,7 @@ static const unsigned int qra_vdeg[qra_V] = {
|
||||
};
|
||||
|
||||
// table of the degrees of the factor nodes
|
||||
static const unsigned int qra_cdeg[qra_C] = {
|
||||
static const int qra_cdeg[qra_C] = {
|
||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
||||
@ -237,7 +237,7 @@ static const int qra_c2vmidx[qra_C*qra_MAXCDEG] = {
|
||||
};
|
||||
|
||||
// permutation matrix to compute Prob(x*alfa^logw)
|
||||
static const unsigned int qra_pmat[qra_M*qra_M] = {
|
||||
static const int qra_pmat[qra_M*qra_M] = {
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
|
||||
16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
|
||||
32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
|
||||
|
@ -51,7 +51,7 @@ static const int qra_acc_input_idx[qra_NC+1] = {
|
||||
};
|
||||
|
||||
// table of the systematic symbols weight logarithms over GF(M)
|
||||
static const unsigned int qra_acc_input_wlog[qra_NC+1] = {
|
||||
static const int qra_acc_input_wlog[qra_NC+1] = {
|
||||
0, 27, 0, 0, 0, 31, 28, 61, 31, 0,
|
||||
0, 52, 22, 7, 19, 47, 44, 62, 32, 50,
|
||||
52, 42, 48, 56, 40, 50, 51, 37, 37, 0,
|
||||
@ -72,7 +72,7 @@ static const int qra_log[qra_M] = {
|
||||
};
|
||||
|
||||
// table of GF(M) elements given their logarithm
|
||||
static const unsigned int qra_exp[qra_M-1] = {
|
||||
static const int qra_exp[qra_M-1] = {
|
||||
1, 2, 4, 8, 16, 32, 3, 6, 12, 24,
|
||||
48, 35, 5, 10, 20, 40, 19, 38, 15, 30,
|
||||
60, 59, 53, 41, 17, 34, 7, 14, 28, 56,
|
||||
@ -83,7 +83,7 @@ static const unsigned int qra_exp[qra_M-1] = {
|
||||
};
|
||||
|
||||
// table of the messages weight logarithms over GF(M)
|
||||
static const unsigned int qra_msgw[qra_NMSG] = {
|
||||
static const int qra_msgw[qra_NMSG] = {
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||
@ -109,7 +109,7 @@ static const unsigned int qra_msgw[qra_NMSG] = {
|
||||
};
|
||||
|
||||
// table of the degrees of the variable nodes
|
||||
static const unsigned int qra_vdeg[qra_V] = {
|
||||
static const int qra_vdeg[qra_V] = {
|
||||
4, 4, 4, 4, 5, 5, 5, 5, 7, 4,
|
||||
4, 6, 8, 3, 3, 3, 3, 3, 3, 3,
|
||||
3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
|
||||
@ -120,7 +120,7 @@ static const unsigned int qra_vdeg[qra_V] = {
|
||||
};
|
||||
|
||||
// table of the degrees of the factor nodes
|
||||
static const unsigned int qra_cdeg[qra_C] = {
|
||||
static const int qra_cdeg[qra_C] = {
|
||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
||||
@ -237,7 +237,7 @@ static const int qra_c2vmidx[qra_C*qra_MAXCDEG] = {
|
||||
};
|
||||
|
||||
// permutation matrix to compute Prob(x*alfa^logw)
|
||||
static const unsigned int qra_pmat[qra_M*qra_M] = {
|
||||
static const int qra_pmat[qra_M*qra_M] = {
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
|
||||
16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
|
||||
32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
|
||||
|
@ -29,22 +29,22 @@
|
||||
|
||||
#define QRA_DEBUG
|
||||
|
||||
int qra_encode(const qracode *pcode, uint *y, const uint *x)
|
||||
int qra_encode(const qracode *pcode, int *y, const int *x)
|
||||
{
|
||||
uint k,j,kk,jj;
|
||||
uint t, chk = 0;
|
||||
int k,j,kk,jj;
|
||||
int t, chk = 0;
|
||||
|
||||
const uint K = pcode->K;
|
||||
const uint M = pcode->M;
|
||||
const uint NC= pcode->NC;
|
||||
const uint a = pcode->a;
|
||||
const int K = pcode->K;
|
||||
const int M = pcode->M;
|
||||
const int NC= pcode->NC;
|
||||
const int a = pcode->a;
|
||||
const int *acc_input_idx = pcode->acc_input_idx;
|
||||
const uint *acc_input_wlog = pcode->acc_input_wlog;
|
||||
const int *acc_input_wlog = pcode->acc_input_wlog;
|
||||
const int *gflog = pcode->gflog;
|
||||
const uint *gfexp = pcode->gfexp;
|
||||
const int *gfexp = pcode->gfexp;
|
||||
|
||||
// copy the systematic symbols to destination
|
||||
memcpy(y,x,K*sizeof(uint));
|
||||
memcpy(y,x,K*sizeof(int));
|
||||
|
||||
y = y+K; // point to check symbols
|
||||
|
||||
@ -144,7 +144,7 @@ static void qra_ioapprox(float *src, float C, int nitems)
|
||||
}
|
||||
|
||||
|
||||
void qra_mfskbesselmetric(float *pix, const float *rsq, const uint m, const uint N, float EsNoMetric)
|
||||
void qra_mfskbesselmetric(float *pix, const float *rsq, const int m, const int N, float EsNoMetric)
|
||||
{
|
||||
// Computes the codeword symbols intrinsic probabilities
|
||||
// given the square of the received input amplitudes.
|
||||
@ -167,12 +167,12 @@ void qra_mfskbesselmetric(float *pix, const float *rsq, const uint m, const uint
|
||||
// nevertheless it is usually better than a generic parameter-free metric which
|
||||
// makes no assumptions on the input Es/No.
|
||||
|
||||
uint k;
|
||||
int k;
|
||||
float rsum = 0.f;
|
||||
float sigmaest, cmetric;
|
||||
|
||||
const uint M = 1<<m;
|
||||
const uint nsamples = M*N;
|
||||
const int M = 1<<m;
|
||||
const int nsamples = M*N;
|
||||
|
||||
// compute total power and modulus of input signal
|
||||
for (k=0;k<nsamples;k++) {
|
||||
@ -226,29 +226,29 @@ int qra_extrinsic(const qracode *pcode,
|
||||
float *qra_v2cmsg,
|
||||
float *qra_c2vmsg)
|
||||
{
|
||||
const uint qra_M = pcode->M;
|
||||
const uint qra_m = pcode->m;
|
||||
const uint qra_V = pcode->V;
|
||||
const uint qra_MAXVDEG = pcode->MAXVDEG;
|
||||
const int qra_M = pcode->M;
|
||||
const int qra_m = pcode->m;
|
||||
const int qra_V = pcode->V;
|
||||
const int qra_MAXVDEG = pcode->MAXVDEG;
|
||||
const int *qra_vdeg = pcode->vdeg;
|
||||
const uint qra_C = pcode->C;
|
||||
const uint qra_MAXCDEG = pcode->MAXCDEG;
|
||||
const uint *qra_cdeg = pcode->cdeg;
|
||||
const int qra_C = pcode->C;
|
||||
const int qra_MAXCDEG = pcode->MAXCDEG;
|
||||
const int *qra_cdeg = pcode->cdeg;
|
||||
const int *qra_v2cmidx = pcode->v2cmidx;
|
||||
const int *qra_c2vmidx = pcode->c2vmidx;
|
||||
const int *qra_pmat = pcode->gfpmat;
|
||||
const uint *qra_msgw = pcode->msgw;
|
||||
const int *qra_msgw = pcode->msgw;
|
||||
|
||||
// float msgout[qra_M]; // buffer to store temporary results
|
||||
float msgout[QRACODE_MAX_M]; // we use a fixed size in order to avoid mallocs
|
||||
|
||||
float totex; // total extrinsic information
|
||||
int nit; // current iteration
|
||||
uint nv; // current variable
|
||||
uint nc; // current check
|
||||
uint k,kk; // loop indexes
|
||||
int nv; // current variable
|
||||
int nc; // current check
|
||||
int k,kk; // loop indexes
|
||||
|
||||
uint ndeg; // current node degree
|
||||
int ndeg; // current node degree
|
||||
int msgbase; // current offset in the table of msg indexes
|
||||
int imsg; // current message index
|
||||
int wmsg; // current message weight
|
||||
@ -448,7 +448,7 @@ int qra_extrinsic(const qracode *pcode,
|
||||
return rc;
|
||||
}
|
||||
|
||||
void qra_mapdecode(const qracode *pcode, uint *xdec, float *pex, const float *pix)
|
||||
void qra_mapdecode(const qracode *pcode, int *xdec, float *pex, const float *pix)
|
||||
{
|
||||
// Maximum a posteriori probability decoding.
|
||||
// Given the intrinsic information (pix) and extrinsic information (pex) (computed with qra_extrinsic(...))
|
||||
@ -460,11 +460,11 @@ void qra_mapdecode(const qracode *pcode, uint *xdec, float *pex, const float *pi
|
||||
|
||||
// Note: pex is destroyed and overwritten with mapp
|
||||
|
||||
const uint qra_M = pcode->M;
|
||||
const uint qra_m = pcode->m;
|
||||
const uint qra_K = pcode->K;
|
||||
const int qra_M = pcode->M;
|
||||
const int qra_m = pcode->m;
|
||||
const int qra_K = pcode->K;
|
||||
|
||||
uint k;
|
||||
int k;
|
||||
|
||||
for (k=0;k<qra_K;k++) {
|
||||
// compute a posteriori prob
|
||||
|
@ -22,8 +22,6 @@
|
||||
#ifndef _qracodes_h_
|
||||
#define _qracodes_h_
|
||||
|
||||
typedef unsigned int uint;
|
||||
|
||||
// type of codes
|
||||
#define QRATYPE_NORMAL 0x00 // normal code
|
||||
#define QRATYPE_CRC 0x01 // code with crc - last information symbol is a CRC
|
||||
@ -32,29 +30,29 @@ typedef unsigned int uint;
|
||||
|
||||
typedef struct {
|
||||
// code parameters
|
||||
const uint K; // number of information symbols
|
||||
const uint N; // codeword length in symbols
|
||||
const uint m; // bits/symbol
|
||||
const uint M; // Symbol alphabet cardinality (2^m)
|
||||
const uint a; // code grouping factor
|
||||
const uint NC; // number of check symbols (N-K)
|
||||
const uint V; // number of variables in the code graph (N)
|
||||
const uint C; // number of factors in the code graph (N +(N-K)+1)
|
||||
const uint NMSG; // number of msgs in the code graph
|
||||
const uint MAXVDEG; // maximum variable degree
|
||||
const uint MAXCDEG; // maximum factor degree
|
||||
const uint type; // see QRATYPE_xx defines
|
||||
const int K; // number of information symbols
|
||||
const int N; // codeword length in symbols
|
||||
const int m; // bits/symbol
|
||||
const int M; // Symbol alphabet cardinality (2^m)
|
||||
const int a; // code grouping factor
|
||||
const int NC; // number of check symbols (N-K)
|
||||
const int V; // number of variables in the code graph (N)
|
||||
const int C; // number of factors in the code graph (N +(N-K)+1)
|
||||
const int NMSG; // number of msgs in the code graph
|
||||
const int MAXVDEG; // maximum variable degree
|
||||
const int MAXCDEG; // maximum factor degree
|
||||
const int type; // see QRATYPE_xx defines
|
||||
const float R; // code rate (K/N)
|
||||
const char name[64]; // code name
|
||||
// tables used by the encoder
|
||||
const int *acc_input_idx;
|
||||
const uint *acc_input_wlog;
|
||||
const int *acc_input_wlog;
|
||||
const int *gflog;
|
||||
const uint *gfexp;
|
||||
const int *gfexp;
|
||||
// tables used by the decoder -------------------------
|
||||
const uint *msgw;
|
||||
const uint *vdeg;
|
||||
const uint *cdeg;
|
||||
const int *msgw;
|
||||
const int *vdeg;
|
||||
const int *cdeg;
|
||||
const int *v2cmidx;
|
||||
const int *c2vmidx;
|
||||
const int *gfpmat;
|
||||
@ -69,10 +67,10 @@ typedef struct {
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
int qra_encode(const qracode *pcode, uint *y, const uint *x);
|
||||
void qra_mfskbesselmetric(float *pix, const float *rsq, const uint m, const uint N, float EsNoMetric);
|
||||
int qra_encode(const qracode *pcode, int *y, const int *x);
|
||||
void qra_mfskbesselmetric(float *pix, const float *rsq, const int m, const int N, float EsNoMetric);
|
||||
int qra_extrinsic(const qracode *pcode, float *pex, const float *pix, int maxiter,float *qra_v2cmsg,float *qra_c2vmsg);
|
||||
void qra_mapdecode(const qracode *pcode, uint *xdec, float *pex, const float *pix);
|
||||
void qra_mapdecode(const qracode *pcode, int *xdec, float *pex, const float *pix);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user