mirror of
https://github.com/saitohirga/WSJT-X.git
synced 2024-11-29 23:58:39 -05:00
147 lines
3.9 KiB
C
147 lines
3.9 KiB
C
// q65_subs.c
|
|
|
|
/* Fortran interface for Q65 codec
|
|
|
|
To encode a Q65 message:
|
|
|
|
integer x(13) !Message payload, 78 bits as 13 six-bit integers
|
|
integer y(63) !Codeword, 63 six-bit integers
|
|
call q65_enc(imsg,icodeword)
|
|
|
|
To decode a Q65 message:
|
|
|
|
parameter (LL=64,NN=63)
|
|
real s3(LL,NN) !Received energies
|
|
real s3prob(LL,NN) !Symbol-value probabilities
|
|
integer APmask(13)
|
|
integer APsymbols(13)
|
|
real snr2500
|
|
integer xdec(13) !Decoded 78-bit message as 13 six-bit integers
|
|
integer irc !Return code from q65_decode()
|
|
|
|
call q65_dec(s3,APmask,APsymbols,s3prob,snr2500,xdec,irc)
|
|
*/
|
|
|
|
#include "qra15_65_64_irr_e23.h" // QRA code used by Q65
|
|
#include "q65.h"
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
|
|
static q65_codec_ds codec;
|
|
|
|
void q65_enc_(int x[], int y[])
|
|
{
|
|
|
|
static int first=1;
|
|
if (first) {
|
|
// Set the QRA code, allocate memory, and initialize
|
|
int rc = q65_init(&codec,&qra15_65_64_irr_e23);
|
|
if (rc<0) {
|
|
printf("error in q65_init()\n");
|
|
exit(0);
|
|
}
|
|
first=0;
|
|
}
|
|
// Encode message x[13], producing codeword y[63]
|
|
q65_encode(&codec,y,x);
|
|
}
|
|
|
|
void q65_intrinsics_ff_(float s3[], int* submode, float* B90Ts,
|
|
int* fadingModel, float s3prob[])
|
|
{
|
|
|
|
/* Input: s3[LL,NN] Received energies
|
|
* submode 0=A, 4=E
|
|
* B90 Spread bandwidth, 90% fractional energy
|
|
* fadingModel 0=Gaussian, 1=Lorentzian
|
|
* Output: s3prob[LL,NN] Symbol-value intrinsic probabilities
|
|
*/
|
|
|
|
int rc;
|
|
static int first=1;
|
|
|
|
if (first) {
|
|
// Set the QRA code, allocate memory, and initialize
|
|
int rc = q65_init(&codec,&qra15_65_64_irr_e23);
|
|
if (rc<0) {
|
|
printf("error in q65_init()\n");
|
|
exit(0);
|
|
}
|
|
first=0;
|
|
}
|
|
rc = q65_intrinsics_fastfading(&codec,s3prob,s3,*submode,*B90Ts,*fadingModel);
|
|
if(rc<0) {
|
|
printf("error in q65_intrinsics()\n");
|
|
exit(0);
|
|
}
|
|
}
|
|
|
|
void q65_dec_(float s3[], float s3prob[], int APmask[], int APsymbols[],
|
|
float* esnodb0, int xdec[], int* rc0)
|
|
{
|
|
|
|
/* Input: s3[LL,NN] Symbol spectra
|
|
* s3prob[LL,NN] Symbol-value intrinsic probabilities
|
|
* APmask[13] AP information to be used in decoding
|
|
* APsymbols[13] Available AP informtion
|
|
* Output:
|
|
* esnodb0 Estimated Es/No (dB)
|
|
* xdec[13] Decoded 78-bit message as 13 six-bit integers
|
|
* rc0 Return code from q65_decode()
|
|
*/
|
|
|
|
int rc;
|
|
int ydec[63];
|
|
float esnodb;
|
|
|
|
rc = q65_decode(&codec,ydec,xdec,s3prob,APmask,APsymbols);
|
|
*rc0=rc;
|
|
// rc = -1: Invalid params
|
|
// rc = -2: Decode failed
|
|
// rc = -3: CRC mismatch
|
|
*esnodb0 = 0.0; //Default Es/No for a failed decode
|
|
if(rc<0) return;
|
|
|
|
rc = q65_esnodb_fastfading(&codec,&esnodb,ydec,s3);
|
|
if(rc<0) {
|
|
printf("error in q65_esnodb_fastfading()\n");
|
|
exit(0);
|
|
}
|
|
*esnodb0 = esnodb;
|
|
}
|
|
|
|
void q65_dec_fullaplist_(float s3[], float s3prob[], int codewords[],
|
|
int* ncw, float* esnodb0, int xdec[], float* plog, int* rc0)
|
|
{
|
|
/* Input: s3[LL,NN] Symbol spectra
|
|
* s3prob[LL,NN] Symbol-value intrinsic probabilities
|
|
* codewords[63,ncw] Full codewords to search for
|
|
* ncw Number of codewords
|
|
* Output:
|
|
* esnodb0 Estimated Es/No (dB)
|
|
* xdec[13] Decoded 78-bit message as 13 six-bit integers
|
|
* rc0 Return code from q65_decode()
|
|
*/
|
|
|
|
int rc;
|
|
int ydec[63];
|
|
float esnodb;
|
|
|
|
rc = q65_decode_fullaplist(&codec,ydec,xdec,s3prob,codewords,*ncw);
|
|
*plog=q65_llh;
|
|
*rc0=rc;
|
|
|
|
// rc = -1: Invalid params
|
|
// rc = -2: Decode failed
|
|
// rc = -3: CRC mismatch
|
|
*esnodb0 = 0.0; //Default Es/No for a failed decode
|
|
if(rc<0) return;
|
|
|
|
rc = q65_esnodb_fastfading(&codec,&esnodb,ydec,s3);
|
|
if(rc<0) {
|
|
printf("error in q65_esnodb_fastfading()\n");
|
|
exit(0);
|
|
}
|
|
*esnodb0 = esnodb;
|
|
}
|