2024-02-01 08:52:46 -05:00
|
|
|
#include <stdio.h>
|
|
|
|
#include "rs_sf.h"
|
|
|
|
|
2024-02-01 10:51:48 -05:00
|
|
|
void *rs_sf;
|
2024-02-01 08:52:46 -05:00
|
|
|
static int first=1;
|
|
|
|
static int nn,kk,nroots,npad;
|
|
|
|
|
2024-02-01 10:51:48 -05:00
|
|
|
void rs_init_sf_(int *mm, int *nq, int *nn0, int *kk0, int *nfz)
|
2024-02-01 08:52:46 -05:00
|
|
|
{
|
|
|
|
nn=*nn0;
|
|
|
|
kk=*kk0;
|
|
|
|
nroots=nn-kk;
|
|
|
|
npad=*nq-1-nn;
|
2024-02-01 10:51:48 -05:00
|
|
|
if(*mm==6) rs_sf=init_rs_sf(*mm,0x43,*nfz,1,nroots,npad); //M=6
|
|
|
|
if(*mm==7) rs_sf=init_rs_sf(*mm,0x89,*nfz,1,nroots,npad); //M=7
|
|
|
|
if(*mm==8) rs_sf=init_rs_sf(*mm,0x11d,*nfz,1,nroots,npad); //M=8
|
2024-02-01 08:52:46 -05:00
|
|
|
first=0;
|
|
|
|
}
|
|
|
|
|
2024-02-01 10:51:48 -05:00
|
|
|
void rs_encode_sf_(int *dgen, int *sent)
|
2024-02-01 08:52:46 -05:00
|
|
|
// Encode JT65 data dgen[...], producing sent[...].
|
|
|
|
{
|
|
|
|
int dat1[256];
|
|
|
|
int b[256];
|
|
|
|
int i;
|
|
|
|
|
|
|
|
// Reverse data order for the Karn codec.
|
|
|
|
for(i=0; i<kk; i++) {
|
2024-02-02 12:07:40 -05:00
|
|
|
// dat1[i]=dgen[kk-1-i];
|
|
|
|
dat1[i]=dgen[i]; //### Temporary, no reversal ###
|
2024-02-01 08:52:46 -05:00
|
|
|
}
|
|
|
|
// Compute the parity symbols
|
2024-02-01 10:51:48 -05:00
|
|
|
encode_rs_sf(rs_sf,dat1,b);
|
2024-02-01 08:52:46 -05:00
|
|
|
|
|
|
|
// Move parity symbols and data into sent[] array, in reverse order.
|
2024-02-02 12:07:40 -05:00
|
|
|
for (i = 0; i < nroots; i++) {
|
|
|
|
// sent[nroots-1-i] = b[i];
|
|
|
|
sent[i] = b[i]; //### Temporary, no reversal ###
|
|
|
|
}
|
|
|
|
for (i = 0; i < kk; i++) {
|
|
|
|
// sent[i+nroots] = dat1[kk-1-i];
|
|
|
|
sent[i+nroots] = dat1[i]; //### Temporary, no reversal ###
|
|
|
|
}
|
2024-02-01 08:52:46 -05:00
|
|
|
}
|
|
|
|
|
2024-02-01 10:51:48 -05:00
|
|
|
void rs_decode_sf_(int *recd0, int *era0, int *numera0, int *decoded, int *nerr)
|
2024-02-01 08:52:46 -05:00
|
|
|
// Decode JT65 received data recd0[63], producing decoded[12].
|
|
|
|
// Erasures are indicated in era0[numera]. The number of corrected
|
|
|
|
// errors is *nerr. If the data are uncorrectable, *nerr=-1 is
|
|
|
|
// returned.
|
|
|
|
{
|
|
|
|
int numera;
|
|
|
|
int i;
|
|
|
|
int era_pos[200];
|
|
|
|
int recd[255];
|
|
|
|
|
|
|
|
numera=*numera0;
|
2024-02-02 12:07:40 -05:00
|
|
|
for(i=0; i<kk; i++) {
|
|
|
|
// recd[i]=recd0[nn-1-i];
|
|
|
|
recd[i]=recd0[i];
|
|
|
|
}
|
|
|
|
for(i=0; i<nroots; i++) {
|
|
|
|
// recd[kk+i]=recd0[nroots-1-i];
|
|
|
|
recd[kk+i]=recd0[kk+i];
|
|
|
|
}
|
|
|
|
if(numera) {
|
|
|
|
for(i=0; i<numera; i++) {
|
|
|
|
era_pos[i]=era0[i];
|
|
|
|
// printf("erased %d %d\n",i,era_pos[i]);
|
|
|
|
}
|
|
|
|
}
|
2024-02-01 10:51:48 -05:00
|
|
|
*nerr=decode_rs_sf(rs_sf,recd,era_pos,numera);
|
2024-02-02 12:07:40 -05:00
|
|
|
for(i=0; i<kk; i++) {
|
|
|
|
// decoded[i]=recd[kk-1-i];
|
|
|
|
decoded[i]=recd[nroots+i];
|
|
|
|
}
|
2024-02-01 08:52:46 -05:00
|
|
|
}
|