m10mod/mXXmod, rs92mod: rawhex input

pull/37/head
Zilog80 2020-12-31 16:30:21 +01:00
rodzic f9bb77ac75
commit c13e34239c
3 zmienionych plików z 544 dodań i 444 usunięć

Wyświetl plik

@ -1018,13 +1018,15 @@ static int print_pos(gpx_t *gpx, int csOK) {
return err; return err;
} }
static int print_frame(gpx_t *gpx, int pos) { static int print_frame(gpx_t *gpx, int pos, int b2B) {
int i; int i;
ui8_t byte; ui8_t byte;
int cs1, cs2; int cs1, cs2;
int flen = stdFLEN; // stdFLEN=0x64, auxFLEN=0x76 int flen = stdFLEN; // stdFLEN=0x64, auxFLEN=0x76
bits2bytes(gpx->frame_bits, gpx->frame_bytes); if (b2B) {
bits2bytes(gpx->frame_bits, gpx->frame_bytes);
}
flen = gpx->frame_bytes[0]; flen = gpx->frame_bytes[0];
if (flen == stdFLEN) gpx->auxlen = 0; if (flen == stdFLEN) gpx->auxlen = 0;
else { else {
@ -1128,6 +1130,7 @@ int main(int argc, char **argv) {
int wavloaded = 0; int wavloaded = 0;
int sel_wavch = 0; // audio channel: left int sel_wavch = 0; // audio channel: left
int spike = 0; int spike = 0;
int rawhex = 0;
int cfreq = -1; int cfreq = -1;
FILE *fp = NULL; FILE *fp = NULL;
@ -1244,6 +1247,7 @@ int main(int argc, char **argv) {
if (frq < 300000000) frq = -1; if (frq < 300000000) frq = -1;
cfreq = frq; cfreq = frq;
} }
else if (strcmp(*argv, "--rawhex") == 0) { rawhex = 2; } // raw hex input
else if (strcmp(*argv, "-") == 0) { else if (strcmp(*argv, "-") == 0) {
int sample_rate = 0, bits_sample = 0, channels = 0; int sample_rate = 0, bits_sample = 0, channels = 0;
++argv; ++argv;
@ -1290,182 +1294,212 @@ int main(int argc, char **argv) {
} }
#endif #endif
if (!option_softin) { if (!rawhex) {
if (!option_softin) {
if (option_iq == 0 && option_pcmraw) { if (option_iq == 0 && option_pcmraw) {
fclose(fp);
fprintf(stderr, "error: raw data not IQ\n");
return -1;
}
if (option_iq) sel_wavch = 0;
pcm.sel_ch = sel_wavch;
if (option_pcmraw == 0) {
k = read_wav_header(&pcm, fp);
if ( k < 0 ) {
fclose(fp); fclose(fp);
fprintf(stderr, "error: wav header\n"); fprintf(stderr, "error: raw data not IQ\n");
return -1;
}
if (option_iq) sel_wavch = 0;
pcm.sel_ch = sel_wavch;
if (option_pcmraw == 0) {
k = read_wav_header(&pcm, fp);
if ( k < 0 ) {
fclose(fp);
fprintf(stderr, "error: wav header\n");
return -1;
}
}
if (cfreq > 0) {
int fq_kHz = (cfreq - dsp.xlt_fq*pcm.sr + 500)/1e3;
gpx.jsn_freq = fq_kHz;
}
// m10: BT>1?, h=1.2 ?
symlen = 2;
// init dsp
//
dsp.fp = fp;
dsp.sr = pcm.sr;
dsp.bps = pcm.bps;
dsp.nch = pcm.nch;
dsp.ch = pcm.sel_ch;
dsp.br = (float)BAUD_RATE;
dsp.sps = (float)dsp.sr/dsp.br;
dsp.symlen = symlen;
dsp.symhd = 1; // M10!header
dsp._spb = dsp.sps*symlen;
dsp.hdr = rawheader;
dsp.hdrlen = strlen(rawheader);
dsp.BT = 1.8; // bw/time (ISI) // 1.0..2.0
dsp.h = 0.9; // 1.2 modulation index
dsp.opt_iq = option_iq;
dsp.opt_iqdc = option_iqdc;
dsp.opt_lp = option_lp;
dsp.lpIQ_bw = 24e3; // IF lowpass bandwidth
dsp.lpFM_bw = 10e3; // FM audio lowpass
dsp.opt_dc = option_dc;
dsp.opt_IFmin = option_min;
if ( dsp.sps < 8 ) {
fprintf(stderr, "note: sample rate low (%.1f sps)\n", dsp.sps);
}
//headerlen = dsp.hdrlen;
k = init_buffers(&dsp);
if ( k < 0 ) {
fprintf(stderr, "error: init buffers\n");
return -1;
}
bitofs += shift;
}
else {
// init circular header bit buffer
hdb.hdr = rawheader;
hdb.len = strlen(rawheader);
//hdb.thb = 1.0 - 3.1/(float)hdb.len; // 1.0-max_bit_errors/hdrlen
hdb.bufpos = -1;
hdb.buf = NULL;
/*
calloc(hdb.len, sizeof(char));
if (hdb.buf == NULL) {
fprintf(stderr, "error: malloc\n");
return -1;
}
*/
hdb.ths = 0.8; // caution 0.7: false positive / offset
hdb.sbuf = calloc(hdb.len, sizeof(float));
if (hdb.sbuf == NULL) {
fprintf(stderr, "error: malloc\n");
return -1; return -1;
} }
} }
if (cfreq > 0) {
int fq_kHz = (cfreq - dsp.xlt_fq*pcm.sr + 500)/1e3;
gpx.jsn_freq = fq_kHz;
}
// m10: BT>1?, h=1.2 ? while ( 1 )
symlen = 2; {
if (option_softin) {
header_found = find_softbinhead(fp, &hdb, &_mv);
}
else { // FM-audio:
header_found = find_header(&dsp, thres, 2, bitofs, dsp.opt_dc); // optional 2nd pass: dc=0
_mv = dsp.mv;
}
// init dsp if (header_found == EOF) break;
//
dsp.fp = fp;
dsp.sr = pcm.sr;
dsp.bps = pcm.bps;
dsp.nch = pcm.nch;
dsp.ch = pcm.sel_ch;
dsp.br = (float)BAUD_RATE;
dsp.sps = (float)dsp.sr/dsp.br;
dsp.symlen = symlen;
dsp.symhd = 1; // M10!header
dsp._spb = dsp.sps*symlen;
dsp.hdr = rawheader;
dsp.hdrlen = strlen(rawheader);
dsp.BT = 1.8; // bw/time (ISI) // 1.0..2.0
dsp.h = 0.9; // 1.2 modulation index
dsp.opt_iq = option_iq;
dsp.opt_iqdc = option_iqdc;
dsp.opt_lp = option_lp;
dsp.lpIQ_bw = 24e3; // IF lowpass bandwidth
dsp.lpFM_bw = 10e3; // FM audio lowpass
dsp.opt_dc = option_dc;
dsp.opt_IFmin = option_min;
if ( dsp.sps < 8 ) { // mv == correlation score
fprintf(stderr, "note: sample rate low (%.1f sps)\n", dsp.sps); if (_mv*(0.5-gpx.option.inv) < 0) {
} gpx.option.inv ^= 0x1; // M10: irrelevant
}
//headerlen = dsp.hdrlen; if (header_found) {
bitpos = 0;
pos = 0;
pos /= 2;
bit0 = '0'; // oder: _mv[j] > 0
k = init_buffers(&dsp); while ( pos < BITFRAME_LEN+BITAUX_LEN ) {
if ( k < 0 ) {
fprintf(stderr, "error: init buffers\n");
return -1;
}
bitofs += shift; if (option_softin) {
} float s1 = 0.0;
else { float s2 = 0.0;
// init circular header bit buffer float s = 0.0;
hdb.hdr = rawheader; bitQ = f32soft_read(fp, &s1);
hdb.len = strlen(rawheader);
//hdb.thb = 1.0 - 3.1/(float)hdb.len; // 1.0-max_bit_errors/hdrlen
hdb.bufpos = -1;
hdb.buf = NULL;
/*
calloc(hdb.len, sizeof(char));
if (hdb.buf == NULL) {
fprintf(stderr, "error: malloc\n");
return -1;
}
*/
hdb.ths = 0.8; // caution 0.7: false positive / offset
hdb.sbuf = calloc(hdb.len, sizeof(float));
if (hdb.sbuf == NULL) {
fprintf(stderr, "error: malloc\n");
return -1;
}
}
while ( 1 )
{
if (option_softin) {
header_found = find_softbinhead(fp, &hdb, &_mv);
}
else { // FM-audio:
header_found = find_header(&dsp, thres, 2, bitofs, dsp.opt_dc); // optional 2nd pass: dc=0
_mv = dsp.mv;
}
if (header_found == EOF) break;
// mv == correlation score
if (_mv*(0.5-gpx.option.inv) < 0) {
gpx.option.inv ^= 0x1; // M10: irrelevant
}
if (header_found) {
bitpos = 0;
pos = 0;
pos /= 2;
bit0 = '0'; // oder: _mv[j] > 0
while ( pos < BITFRAME_LEN+BITAUX_LEN ) {
if (option_softin) {
float s1 = 0.0;
float s2 = 0.0;
float s = 0.0;
bitQ = f32soft_read(fp, &s1);
if (bitQ != EOF) {
bitQ = f32soft_read(fp, &s2);
if (bitQ != EOF) { if (bitQ != EOF) {
s = s2-s1; // integrate both symbols // only 2nd Manchester symbol: s2 bitQ = f32soft_read(fp, &s2);
bit = (s>=0.0); // no soft decoding if (bitQ != EOF) {
s = s2-s1; // integrate both symbols // only 2nd Manchester symbol: s2
bit = (s>=0.0); // no soft decoding
}
} }
} }
}
else {
float bl = -1;
if (option_iq >= 2) spike = 0;
if (option_iq > 2) bl = 4.0;
//bitQ = read_slbit(&dsp, &bit, 0, bitofs, bitpos, bl, spike); // symlen=2
bitQ = read_softbit2p(&dsp, &hsbit, 0, bitofs, bitpos, bl, spike, &hsbit1); // symlen=2
bit = hsbit.hb;
if (option_chk == 3 && option_iq) {
//if (hsbit.sb*hsbit1.sb < 0)
bit = (hsbit.sb+0.25*hsbit1.sb)>=0;
}
}
if ( bitQ == EOF ) { break; }
gpx.frame_bits[pos] = 0x31 ^ (bit0 ^ bit);
pos++;
bit0 = bit;
bitpos += 1;
}
gpx.frame_bits[pos] = '\0';
print_frame(&gpx, pos);
if (pos < BITFRAME_LEN) break;
header_found = 0;
// bis Ende der Sekunde vorspulen; allerdings Doppel-Frame alle 10 sek
if (gpx.option.vbs < 3) { // && (regulare frame) // print_frame-return?
while ( bitpos < 5*BITFRAME_LEN ) {
if (option_softin) {
float s = 0.0;
bitQ = f32soft_read(fp, &s);
}
else { else {
bitQ = read_slbit(&dsp, &bit, 0, bitofs, bitpos, -1, 0); // symlen=2 float bl = -1;
if (option_iq >= 2) spike = 0;
if (option_iq > 2) bl = 4.0;
//bitQ = read_slbit(&dsp, &bit, 0, bitofs, bitpos, bl, spike); // symlen=2
bitQ = read_softbit2p(&dsp, &hsbit, 0, bitofs, bitpos, bl, spike, &hsbit1); // symlen=2
bit = hsbit.hb;
if (option_chk == 3 && option_iq) {
//if (hsbit.sb*hsbit1.sb < 0)
bit = (hsbit.sb+0.25*hsbit1.sb)>=0;
}
} }
if ( bitQ == EOF) break; if ( bitQ == EOF ) { break; }
bitpos++;
}
}
pos = 0; gpx.frame_bits[pos] = 0x31 ^ (bit0 ^ bit);
pos++;
bit0 = bit;
bitpos += 1;
}
gpx.frame_bits[pos] = '\0';
print_frame(&gpx, pos, 1);
if (pos < BITFRAME_LEN) break;
header_found = 0;
// bis Ende der Sekunde vorspulen; allerdings Doppel-Frame alle 10 sek
if (gpx.option.vbs < 3) { // && (regulare frame) // print_frame-return?
while ( bitpos < 5*BITFRAME_LEN ) {
if (option_softin) {
float s = 0.0;
bitQ = f32soft_read(fp, &s);
}
else {
bitQ = read_slbit(&dsp, &bit, 0, bitofs, bitpos, -1, 0); // symlen=2
}
if ( bitQ == EOF) break;
bitpos++;
}
}
pos = 0;
}
}
if (!option_softin) free_buffers(&dsp);
else {
if (hdb.buf) { free(hdb.buf); hdb.buf = NULL; }
} }
} }
else //if (rawhex)
{
char buffer_rawhex[2*(FRAME_LEN+AUX_LEN)+12];
char *pbuf = NULL, *buf_sp = NULL;
ui8_t frmbyte;
int frameofs = 0, len, i;
while (1 > 0) {
if (!option_softin) free_buffers(&dsp); memset(buffer_rawhex, 2*(FRAME_LEN+AUX_LEN)+12, 0);
else { pbuf = fgets(buffer_rawhex, 2*(FRAME_LEN+AUX_LEN)+12, fp);
if (hdb.buf) { free(hdb.buf); hdb.buf = NULL; } if (pbuf == NULL) break;
buffer_rawhex[2*(FRAME_LEN+AUX_LEN)] = '\0';
buf_sp = strchr(buffer_rawhex, ' ');
if (buf_sp != NULL && buf_sp-buffer_rawhex < 2*(FRAME_LEN+AUX_LEN)) {
buffer_rawhex[buf_sp-buffer_rawhex] = '\0';
for (i = buf_sp-buffer_rawhex+1; i < 2*(FRAME_LEN+AUX_LEN); i++) buffer_rawhex[i] = '\0';
}
len = strlen(buffer_rawhex) / 2;
if (len > pos_GPSweek+2) {
for (i = 0; i < len; i++) { //%2x SCNx8=%hhx(inttypes.h)
sscanf(buffer_rawhex+2*i, "%2hhx", &frmbyte);
// wenn ohne %hhx: sscanf(buffer_rawhex+rawhex*i, "%2x", &byte); frame[frameofs+i] = (ui8_t)byte;
gpx.frame_bytes[frameofs+i] = frmbyte;
}
print_frame(&gpx, len*8, 0);
}
}
} }
fclose(fp); fclose(fp);

Wyświetl plik

@ -656,14 +656,16 @@ static int print_pos(gpx_t *gpx, int bcOK, int csOK) {
return err; return err;
} }
static int print_frame(gpx_t *gpx, int pos) { static int print_frame(gpx_t *gpx, int pos, int b2B) {
int i; int i;
ui8_t byte; ui8_t byte;
int cs1, cs2; int cs1, cs2;
int bc1, bc2; int bc1, bc2;
int flen = stdFLEN; // stdFLEN=0x64, auxFLEN=0x76; M20:0x45 ? int flen = stdFLEN; // stdFLEN=0x64, auxFLEN=0x76; M20:0x45 ?
bits2bytes(gpx->frame_bits, gpx->frame_bytes); if (b2B) {
bits2bytes(gpx->frame_bits, gpx->frame_bytes);
}
flen = gpx->frame_bytes[0]; flen = gpx->frame_bytes[0];
if (flen == stdFLEN) gpx->auxlen = 0; if (flen == stdFLEN) gpx->auxlen = 0;
else { else {
@ -767,6 +769,7 @@ int main(int argc, char **argv) {
int wavloaded = 0; int wavloaded = 0;
int sel_wavch = 0; // audio channel: left int sel_wavch = 0; // audio channel: left
int spike = 0; int spike = 0;
int rawhex = 0;
int cfreq = -1; int cfreq = -1;
float baudrate = -1; float baudrate = -1;
@ -892,6 +895,7 @@ int main(int argc, char **argv) {
if (frq < 300000000) frq = -1; if (frq < 300000000) frq = -1;
cfreq = frq; cfreq = frq;
} }
else if (strcmp(*argv, "--rawhex") == 0) { rawhex = 2; } // raw hex input
else if (strcmp(*argv, "-") == 0) { else if (strcmp(*argv, "-") == 0) {
int sample_rate = 0, bits_sample = 0, channels = 0; int sample_rate = 0, bits_sample = 0, channels = 0;
++argv; ++argv;
@ -938,178 +942,208 @@ int main(int argc, char **argv) {
} }
#endif #endif
if (!option_softin) { if (!rawhex) {
if (!option_softin) {
if (option_iq == 0 && option_pcmraw) { if (option_iq == 0 && option_pcmraw) {
fclose(fp);
fprintf(stderr, "error: raw data not IQ\n");
return -1;
}
if (option_iq) sel_wavch = 0;
pcm.sel_ch = sel_wavch;
if (option_pcmraw == 0) {
k = read_wav_header(&pcm, fp);
if ( k < 0 ) {
fclose(fp); fclose(fp);
fprintf(stderr, "error: wav header\n"); fprintf(stderr, "error: raw data not IQ\n");
return -1;
}
if (option_iq) sel_wavch = 0;
pcm.sel_ch = sel_wavch;
if (option_pcmraw == 0) {
k = read_wav_header(&pcm, fp);
if ( k < 0 ) {
fclose(fp);
fprintf(stderr, "error: wav header\n");
return -1;
}
}
if (cfreq > 0) {
int fq_kHz = (cfreq - dsp.xlt_fq*pcm.sr + 500)/1e3;
gpx.jsn_freq = fq_kHz;
}
// m10: BT>1?, h=1.2 ?
symlen = 2;
// init dsp
//
dsp.fp = fp;
dsp.sr = pcm.sr;
dsp.bps = pcm.bps;
dsp.nch = pcm.nch;
dsp.ch = pcm.sel_ch;
dsp.br = (float)BAUD_RATE;
dsp.sps = (float)dsp.sr/dsp.br;
dsp.symlen = symlen;
dsp.symhd = 1; // M10!header
dsp._spb = dsp.sps*symlen;
dsp.hdr = rawheader;
dsp.hdrlen = strlen(rawheader);
dsp.BT = 1.8; // bw/time (ISI) // 1.0..2.0 // M20 ?
dsp.h = 0.9; // 1.2 modulation index // M20 ?
dsp.opt_iq = option_iq;
dsp.opt_iqdc = option_iqdc;
dsp.opt_lp = option_lp;
dsp.lpIQ_bw = 24e3; // IF lowpass bandwidth
dsp.lpFM_bw = 10e3; // FM audio lowpass
dsp.opt_dc = option_dc;
dsp.opt_IFmin = option_min;
if ( dsp.sps < 8 ) {
fprintf(stderr, "note: sample rate low (%.1f sps)\n", dsp.sps);
}
if (baudrate > 0) {
dsp.br = (float)baudrate;
dsp.sps = (float)dsp.sr/dsp.br;
fprintf(stderr, "sps corr: %.4f\n", dsp.sps);
}
//headerlen = dsp.hdrlen;
k = init_buffers(&dsp);
if ( k < 0 ) {
fprintf(stderr, "error: init buffers\n");
return -1;
}
bitofs += shift;
}
else {
// init circular header bit buffer
hdb.hdr = rawheader;
hdb.len = strlen(rawheader);
//hdb.thb = 1.0 - 3.1/(float)hdb.len; // 1.0-max_bit_errors/hdrlen
hdb.bufpos = -1;
hdb.buf = NULL;
/*
calloc(hdb.len, sizeof(char));
if (hdb.buf == NULL) {
fprintf(stderr, "error: malloc\n");
return -1;
}
*/
hdb.ths = 0.8; // caution 0.7: false positive / offset
hdb.sbuf = calloc(hdb.len, sizeof(float));
if (hdb.sbuf == NULL) {
fprintf(stderr, "error: malloc\n");
return -1; return -1;
} }
} }
if (cfreq > 0) {
int fq_kHz = (cfreq - dsp.xlt_fq*pcm.sr + 500)/1e3;
gpx.jsn_freq = fq_kHz;
}
// m10: BT>1?, h=1.2 ? while ( 1 )
symlen = 2; {
if (option_softin) {
header_found = find_softbinhead(fp, &hdb, &_mv);
}
else { // FM-audio:
header_found = find_header(&dsp, thres, 2, bitofs, dsp.opt_dc); // optional 2nd pass: dc=0
_mv = dsp.mv;
}
// init dsp if (header_found == EOF) break;
//
dsp.fp = fp;
dsp.sr = pcm.sr;
dsp.bps = pcm.bps;
dsp.nch = pcm.nch;
dsp.ch = pcm.sel_ch;
dsp.br = (float)BAUD_RATE;
dsp.sps = (float)dsp.sr/dsp.br;
dsp.symlen = symlen;
dsp.symhd = 1; // M10!header
dsp._spb = dsp.sps*symlen;
dsp.hdr = rawheader;
dsp.hdrlen = strlen(rawheader);
dsp.BT = 1.8; // bw/time (ISI) // 1.0..2.0 // M20 ?
dsp.h = 0.9; // 1.2 modulation index // M20 ?
dsp.opt_iq = option_iq;
dsp.opt_iqdc = option_iqdc;
dsp.opt_lp = option_lp;
dsp.lpIQ_bw = 24e3; // IF lowpass bandwidth
dsp.lpFM_bw = 10e3; // FM audio lowpass
dsp.opt_dc = option_dc;
dsp.opt_IFmin = option_min;
if ( dsp.sps < 8 ) { // mv == correlation score
fprintf(stderr, "note: sample rate low (%.1f sps)\n", dsp.sps); if (_mv*(0.5-gpx.option.inv) < 0) {
} gpx.option.inv ^= 0x1; // M10: irrelevant
}
if (baudrate > 0) { if (header_found) {
dsp.br = (float)baudrate;
dsp.sps = (float)dsp.sr/dsp.br;
fprintf(stderr, "sps corr: %.4f\n", dsp.sps);
}
//headerlen = dsp.hdrlen; bitpos = 0;
pos = 0;
pos /= 2;
bit0 = '0'; // oder: _mv[j] > 0
while ( pos < BITFRAME_LEN+BITAUX_LEN ) {
k = init_buffers(&dsp); if (option_softin) {
if ( k < 0 ) { float s1 = 0.0;
fprintf(stderr, "error: init buffers\n"); float s2 = 0.0;
return -1; float s = 0.0;
} bitQ = f32soft_read(fp, &s1);
bitofs += shift;
}
else {
// init circular header bit buffer
hdb.hdr = rawheader;
hdb.len = strlen(rawheader);
//hdb.thb = 1.0 - 3.1/(float)hdb.len; // 1.0-max_bit_errors/hdrlen
hdb.bufpos = -1;
hdb.buf = NULL;
/*
calloc(hdb.len, sizeof(char));
if (hdb.buf == NULL) {
fprintf(stderr, "error: malloc\n");
return -1;
}
*/
hdb.ths = 0.8; // caution 0.7: false positive / offset
hdb.sbuf = calloc(hdb.len, sizeof(float));
if (hdb.sbuf == NULL) {
fprintf(stderr, "error: malloc\n");
return -1;
}
}
while ( 1 )
{
if (option_softin) {
header_found = find_softbinhead(fp, &hdb, &_mv);
}
else { // FM-audio:
header_found = find_header(&dsp, thres, 2, bitofs, dsp.opt_dc); // optional 2nd pass: dc=0
_mv = dsp.mv;
}
if (header_found == EOF) break;
// mv == correlation score
if (_mv*(0.5-gpx.option.inv) < 0) {
gpx.option.inv ^= 0x1; // M10: irrelevant
}
if (header_found) {
bitpos = 0;
pos = 0;
pos /= 2;
bit0 = '0'; // oder: _mv[j] > 0
while ( pos < BITFRAME_LEN+BITAUX_LEN ) {
if (option_softin) {
float s1 = 0.0;
float s2 = 0.0;
float s = 0.0;
bitQ = f32soft_read(fp, &s1);
if (bitQ != EOF) {
bitQ = f32soft_read(fp, &s2);
if (bitQ != EOF) { if (bitQ != EOF) {
s = s2-s1; // integrate both symbols // only 2nd Manchester symbol: s2 bitQ = f32soft_read(fp, &s2);
bit = (s>=0.0); // no soft decoding if (bitQ != EOF) {
s = s2-s1; // integrate both symbols // only 2nd Manchester symbol: s2
bit = (s>=0.0); // no soft decoding
}
} }
} }
} else {
else { float bl = -1;
float bl = -1; if (option_iq >= 2) spike = 0;
if (option_iq >= 2) spike = 0; if (option_iq > 2) bl = 4.0;
if (option_iq > 2) bl = 4.0; //bitQ = read_slbit(&dsp, &bit, 0, bitofs, bitpos, bl, spike); // symlen=2
//bitQ = read_slbit(&dsp, &bit, 0, bitofs, bitpos, bl, spike); // symlen=2 bitQ = read_softbit2p(&dsp, &hsbit, 0, bitofs, bitpos, bl, spike, &hsbit1); // symlen=2
bitQ = read_softbit2p(&dsp, &hsbit, 0, bitofs, bitpos, bl, spike, &hsbit1); // symlen=2 bit = hsbit.hb;
bit = hsbit.hb; }
} if ( bitQ == EOF ) { break; }
if ( bitQ == EOF ) { break; }
gpx.frame_bits[pos] = 0x31 ^ (bit0 ^ bit); gpx.frame_bits[pos] = 0x31 ^ (bit0 ^ bit);
pos++; pos++;
bit0 = bit; bit0 = bit;
bitpos += 1; bitpos += 1;
}
gpx.frame_bits[pos] = '\0';
print_frame(&gpx, pos, 1);
if (pos < BITFRAME_LEN) break;
header_found = 0;
// bis Ende der Sekunde vorspulen; allerdings Doppel-Frame alle 10 sek
if (gpx.option.vbs < 3) { // && (regulare frame) // print_frame-return?
while ( bitpos < 5*BITFRAME_LEN ) {
bitQ = read_slbit(&dsp, &bit, 0, bitofs, bitpos, -1, 0); // symlen=2
if ( bitQ == EOF) break;
bitpos++;
}
}
pos = 0;
} }
gpx.frame_bits[pos] = '\0'; }
print_frame(&gpx, pos);
if (pos < BITFRAME_LEN) break;
header_found = 0; if (!option_softin) free_buffers(&dsp);
else {
// bis Ende der Sekunde vorspulen; allerdings Doppel-Frame alle 10 sek if (hdb.buf) { free(hdb.buf); hdb.buf = NULL; }
if (gpx.option.vbs < 3) { // && (regulare frame) // print_frame-return?
while ( bitpos < 5*BITFRAME_LEN ) {
bitQ = read_slbit(&dsp, &bit, 0, bitofs, bitpos, -1, 0); // symlen=2
if ( bitQ == EOF) break;
bitpos++;
}
}
pos = 0;
} }
} }
else //if (rawhex)
{
char buffer_rawhex[2*(FRAME_LEN+AUX_LEN)+12];
char *pbuf = NULL, *buf_sp = NULL;
ui8_t frmbyte;
int frameofs = 0, len, i;
while (1 > 0) {
if (!option_softin) free_buffers(&dsp); memset(buffer_rawhex, 2*(FRAME_LEN+AUX_LEN)+12, 0);
else { pbuf = fgets(buffer_rawhex, 2*(FRAME_LEN+AUX_LEN)+12, fp);
if (hdb.buf) { free(hdb.buf); hdb.buf = NULL; } if (pbuf == NULL) break;
buffer_rawhex[2*(FRAME_LEN+AUX_LEN)] = '\0';
buf_sp = strchr(buffer_rawhex, ' ');
if (buf_sp != NULL && buf_sp-buffer_rawhex < 2*(FRAME_LEN+AUX_LEN)) {
buffer_rawhex[buf_sp-buffer_rawhex] = '\0';
for (i = buf_sp-buffer_rawhex+1; i < 2*(FRAME_LEN+AUX_LEN); i++) buffer_rawhex[i] = '\0';
}
len = strlen(buffer_rawhex) / 2;
if (len > pos_GPSweek+2) {
for (i = 0; i < len; i++) { //%2x SCNx8=%hhx(inttypes.h)
sscanf(buffer_rawhex+2*i, "%2hhx", &frmbyte);
// wenn ohne %hhx: sscanf(buffer_rawhex+rawhex*i, "%2x", &byte); frame[frameofs+i] = (ui8_t)byte;
gpx.frame_bytes[frameofs+i] = frmbyte;
}
print_frame(&gpx, len*8, 0);
}
}
} }
fclose(fp); fclose(fp);

Wyświetl plik

@ -1251,6 +1251,7 @@ int main(int argc, char *argv[]) {
int sel_wavch = 0; // audio channel: left int sel_wavch = 0; // audio channel: left
int spike = 0; int spike = 0;
int fileloaded = 0; int fileloaded = 0;
int rawhex = 0;
int cfreq = -1; int cfreq = -1;
char bitbuf[BITS]; char bitbuf[BITS];
@ -1443,6 +1444,7 @@ int main(int argc, char *argv[]) {
option_min = 1; option_min = 1;
} }
else if (strcmp(*argv, "--ngp") == 0) { gpx.option.ngp = 1; } // RS92-NGP, RS92-D: 1680 MHz else if (strcmp(*argv, "--ngp") == 0) { gpx.option.ngp = 1; } // RS92-NGP, RS92-D: 1680 MHz
else if (strcmp(*argv, "--rawhex") == 0) { rawhex = 2; } // raw hex input
else if (strcmp(*argv, "-") == 0) { else if (strcmp(*argv, "-") == 0) {
int sample_rate = 0, bits_sample = 0, channels = 0; int sample_rate = 0, bits_sample = 0, channels = 0;
++argv; ++argv;
@ -1512,171 +1514,201 @@ int main(int argc, char *argv[]) {
} }
#endif #endif
if (!option_softin) { if (!rawhex) {
if (option_iq == 0 && option_pcmraw) { if (!option_softin) {
fclose(fp);
fprintf(stderr, "error: raw data not IQ\n");
return -1;
}
if (option_iq) sel_wavch = 0;
pcm.sel_ch = sel_wavch; if (option_iq == 0 && option_pcmraw) {
if (option_pcmraw == 0) {
k = read_wav_header(&pcm, fp);
if ( k < 0 ) {
fclose(fp); fclose(fp);
fprintf(stderr, "error: wav header\n"); fprintf(stderr, "error: raw data not IQ\n");
return -1;
}
if (option_iq) sel_wavch = 0;
pcm.sel_ch = sel_wavch;
if (option_pcmraw == 0) {
k = read_wav_header(&pcm, fp);
if ( k < 0 ) {
fclose(fp);
fprintf(stderr, "error: wav header\n");
return -1;
}
}
if (cfreq > 0) {
int fq_kHz = (cfreq - dsp.xlt_fq*pcm.sr + 500)/1e3;
gpx.jsn_freq = fq_kHz;
}
// rs92-sgp: BT=0.5, h=1.0 ?
symlen = 2;
// init dsp
//
dsp.fp = fp;
dsp.sr = pcm.sr;
dsp.bps = pcm.bps;
dsp.nch = pcm.nch;
dsp.ch = pcm.sel_ch;
dsp.br = (float)BAUD_RATE;
dsp.sps = (float)dsp.sr/dsp.br;
dsp.symlen = symlen;
dsp.symhd = symlen;
dsp._spb = dsp.sps*symlen;
dsp.hdr = rs92_rawheader;
dsp.hdrlen = strlen(rs92_rawheader);
dsp.BT = 0.5; // bw/time (ISI) // 0.3..0.5
dsp.h = 0.8; // 1.0 modulation index abzgl. BT
dsp.opt_iq = option_iq;
dsp.opt_iqdc = option_iqdc;
dsp.opt_lp = option_lp;
dsp.lpIQ_bw = 8e3; // IF lowpass bandwidth
dsp.lpFM_bw = 6e3; // FM audio lowpass
dsp.opt_dc = option_dc;
dsp.opt_IFmin = option_min;
if (gpx.option.ngp) { // L-band rs92-ngp
dsp.h = 3.8; // RS92-NGP: 1680/400=4.2, 4.2*0.9=3.8=4.75*0.8
dsp.lpIQ_bw = 32e3; // IF lowpass bandwidth // 32e3=4.2*7.6e3
}
if ( dsp.sps < 8 ) {
fprintf(stderr, "note: sample rate low (%.1f sps)\n", dsp.sps);
}
k = init_buffers(&dsp); // BT=0.5 (IQ-Int: BT > 0.5 ?)
if ( k < 0 ) {
fprintf(stderr, "error: init buffers\n");
return -1;
};
bitofs += shift;
}
else {
// init circular header bit buffer
hdb.hdr = rs92_rawheader;
hdb.len = strlen(rs92_rawheader);
//hdb.thb = 1.0 - 3.1/(float)hdb.len; // 1.0-max_bit_errors/hdrlen
hdb.bufpos = -1;
hdb.buf = NULL;
/*
calloc(hdb.len, sizeof(char));
if (hdb.buf == NULL) {
fprintf(stderr, "error: malloc\n");
return -1;
}
*/
// caution ths=0.7: -3 byte offset, false positive
// 2A 2A 2A 2A 2A 10|65 10 ..
// header sync could be extended into the frame
hdb.ths = 0.8;
hdb.sbuf = calloc(hdb.len, sizeof(float));
if (hdb.sbuf == NULL) {
fprintf(stderr, "error: malloc\n");
return -1; return -1;
} }
} }
if (cfreq > 0) {
int fq_kHz = (cfreq - dsp.xlt_fq*pcm.sr + 500)/1e3;
gpx.jsn_freq = fq_kHz;
}
// rs92-sgp: BT=0.5, h=1.0 ? while ( 1 )
symlen = 2; {
if (option_softin) {
for (k = 0; k < hdb.len; k++) hdb.sbuf[k] = 0.0;
header_found = find_softbinhead(fp, &hdb, &_mv);
}
else {
header_found = find_header(&dsp, thres, 3, bitofs, dsp.opt_dc);
_mv = dsp.mv;
}
// init dsp if (header_found == EOF) break;
//
dsp.fp = fp;
dsp.sr = pcm.sr;
dsp.bps = pcm.bps;
dsp.nch = pcm.nch;
dsp.ch = pcm.sel_ch;
dsp.br = (float)BAUD_RATE;
dsp.sps = (float)dsp.sr/dsp.br;
dsp.symlen = symlen;
dsp.symhd = symlen;
dsp._spb = dsp.sps*symlen;
dsp.hdr = rs92_rawheader;
dsp.hdrlen = strlen(rs92_rawheader);
dsp.BT = 0.5; // bw/time (ISI) // 0.3..0.5
dsp.h = 0.8; // 1.0 modulation index abzgl. BT
dsp.opt_iq = option_iq;
dsp.opt_iqdc = option_iqdc;
dsp.opt_lp = option_lp;
dsp.lpIQ_bw = 8e3; // IF lowpass bandwidth
dsp.lpFM_bw = 6e3; // FM audio lowpass
dsp.opt_dc = option_dc;
dsp.opt_IFmin = option_min;
if (gpx.option.ngp) { // L-band rs92-ngp
dsp.h = 3.8; // RS92-NGP: 1680/400=4.2, 4.2*0.9=3.8=4.75*0.8
dsp.lpIQ_bw = 32e3; // IF lowpass bandwidth // 32e3=4.2*7.6e3
}
if ( dsp.sps < 8 ) { // mv == correlation score
fprintf(stderr, "note: sample rate low (%.1f sps)\n", dsp.sps); if (_mv *(0.5-gpx.option.inv) < 0) {
} if (gpx.option.aut == 0) header_found = 0;
else gpx.option.inv ^= 0x1;
}
if (header_found) {
k = init_buffers(&dsp); // BT=0.5 (IQ-Int: BT > 0.5 ?) byte_count = FRAMESTART;
if ( k < 0 ) { bitpos = 0;
fprintf(stderr, "error: init buffers\n"); b8pos = 0;
return -1;
};
bitofs += shift; while ( byte_count < FRAME_LEN ) {
}
else {
// init circular header bit buffer
hdb.hdr = rs92_rawheader;
hdb.len = strlen(rs92_rawheader);
//hdb.thb = 1.0 - 3.1/(float)hdb.len; // 1.0-max_bit_errors/hdrlen
hdb.bufpos = -1;
hdb.buf = NULL;
/*
calloc(hdb.len, sizeof(char));
if (hdb.buf == NULL) {
fprintf(stderr, "error: malloc\n");
return -1;
}
*/
// caution ths=0.7: -3 byte offset, false positive
// 2A 2A 2A 2A 2A 10|65 10 ..
// header sync could be extended into the frame
hdb.ths = 0.8;
hdb.sbuf = calloc(hdb.len, sizeof(float));
if (hdb.sbuf == NULL) {
fprintf(stderr, "error: malloc\n");
return -1;
}
}
if (option_softin) {
while ( 1 ) float s1 = 0.0;
{ float s2 = 0.0;
if (option_softin) { float s = 0.0;
for (k = 0; k < hdb.len; k++) hdb.sbuf[k] = 0.0; bitQ = f32soft_read(fp, &s1);
header_found = find_softbinhead(fp, &hdb, &_mv);
}
else {
header_found = find_header(&dsp, thres, 3, bitofs, dsp.opt_dc);
_mv = dsp.mv;
}
if (header_found == EOF) break;
// mv == correlation score
if (_mv *(0.5-gpx.option.inv) < 0) {
if (gpx.option.aut == 0) header_found = 0;
else gpx.option.inv ^= 0x1;
}
if (header_found) {
byte_count = FRAMESTART;
bitpos = 0;
b8pos = 0;
while ( byte_count < FRAME_LEN ) {
if (option_softin) {
float s1 = 0.0;
float s2 = 0.0;
float s = 0.0;
bitQ = f32soft_read(fp, &s1);
if (bitQ != EOF) {
bitQ = f32soft_read(fp, &s2);
if (bitQ != EOF) { if (bitQ != EOF) {
s = s2-s1; // integrate both symbols // only 2nd Manchester symbol: s2 bitQ = f32soft_read(fp, &s2);
bit = (s>=0.0); // no soft decoding if (bitQ != EOF) {
s = s2-s1; // integrate both symbols // only 2nd Manchester symbol: s2
bit = (s>=0.0); // no soft decoding
}
} }
} }
} else {
else { float bl = -1;
float bl = -1; if (option_iq > 2) bl = 4.0;
if (option_iq > 2) bl = 4.0; bitQ = read_slbit(&dsp, &bit, 0, bitofs, bitpos, bl, spike); // symlen=2
bitQ = read_slbit(&dsp, &bit, 0, bitofs, bitpos, bl, spike); // symlen=2 }
} if ( bitQ == EOF) break;
if ( bitQ == EOF) break;
if (gpx.option.inv) bit ^= 1; if (gpx.option.inv) bit ^= 1;
bitpos += 1; bitpos += 1;
bitbuf[b8pos] = bit; bitbuf[b8pos] = bit;
b8pos++; b8pos++;
if (b8pos >= BITS) { if (b8pos >= BITS) {
b8pos = 0; b8pos = 0;
byte = bits2byte(bitbuf); byte = bits2byte(bitbuf);
gpx.frame[byte_count] = byte; gpx.frame[byte_count] = byte;
byte_count++; byte_count++;
}
} }
header_found = 0;
print_frame(&gpx, byte_count);
byte_count = FRAMESTART;
} }
header_found = 0;
print_frame(&gpx, byte_count);
byte_count = FRAMESTART;
} }
if (!option_softin) free_buffers(&dsp);
else {
if (hdb.buf) { free(hdb.buf); hdb.buf = NULL; }
}
} }
else //if (rawhex)
{
char buffer_rawhex[2*FRAME_LEN+12];
char *pbuf = NULL, *buf_sp = NULL;
ui8_t frmbyte;
int frameofs = 0, len, i;
while (1 > 0) {
if (!option_softin) free_buffers(&dsp); pbuf = fgets(buffer_rawhex, 2*FRAME_LEN+12, fp);
else { if (pbuf == NULL) break;
if (hdb.buf) { free(hdb.buf); hdb.buf = NULL; } buffer_rawhex[2*FRAME_LEN] = '\0';
buf_sp = strchr(buffer_rawhex, ' ');
if (buf_sp != NULL && buf_sp-buffer_rawhex < 2*FRAME_LEN) {
buffer_rawhex[buf_sp-buffer_rawhex] = '\0';
}
len = strlen(buffer_rawhex) / 2;
if (len > posGPS_TOW+4) {
for (i = 0; i < len; i++) { //%2x SCNx8=%hhx(inttypes.h)
sscanf(buffer_rawhex+2*i, "%2hhx", &frmbyte);
// wenn ohne %hhx: sscanf(buffer_rawhex+rawhex*i, "%2x", &byte); frame[frameofs+i] = (ui8_t)byte;
gpx.frame[frameofs+i] = frmbyte;
}
print_frame(&gpx, frameofs+len);
}
}
} }
if (gpx.gps.ephs) free(gpx.gps.ephs); if (gpx.gps.ephs) free(gpx.gps.ephs);