From bb5d3f96e8e51e43c101f76356942d1b2a63eec7 Mon Sep 17 00:00:00 2001 From: Zilog80 Date: Sun, 3 Mar 2019 15:54:52 +0100 Subject: [PATCH] dft_correlation: K-window --- demod/demod_dft.c | 128 ++++++++++++++++++++++---------------------- demod/demod_dft.h | 10 ++-- demod/dfm09dm_dft.c | 28 +++++++--- demod/lms6dm_dft.c | 29 +++++++--- demod/lmsXdm_dft.c | 27 +++++++--- demod/m10dm_dft.c | 29 ++++++---- demod/rs41dm_dft.c | 24 ++++++--- demod/rs92dm_dft.c | 27 +++++++--- 8 files changed, 186 insertions(+), 116 deletions(-) diff --git a/demod/demod_dft.c b/demod/demod_dft.c index e3452df..435ac84 100644 --- a/demod/demod_dft.c +++ b/demod/demod_dft.c @@ -13,6 +13,7 @@ #include #include #include +#include typedef unsigned char ui8_t; @@ -27,7 +28,7 @@ typedef int i32_t; static unsigned int sample_in, sample_out, delay; static int buffered = 0; -static int N, M; +static int L, M; static float *match = NULL, *bufs = NULL; @@ -45,7 +46,6 @@ static float dc = 0.0; /* ------------------------------------------------------------------------------------ */ -#include static int LOG2N, N_DFT; @@ -106,53 +106,54 @@ static void Nidft(float complex *Z, float complex *z) { /* ------------------------------------------------------------------------------------ */ -int getCorrDFT(int abs, int K, unsigned int pos, float *maxv, unsigned int *maxvpos) { +int getCorrDFT(int K, unsigned int pos, float *maxv, unsigned int *maxvpos) { int i; int mp = -1; float mx = 0.0; + float mx2 = 0.0; + float re_cx = 0.0; float xnorm = 1; unsigned int mpos = 0; dc = 0.0; - if (N + K > N_DFT/2 - 2) return -1; - if (sample_in < delay+N+K) return -2; + if (K + L > N_DFT) return -1; + if (sample_out < L) return -2; if (pos == 0) pos = sample_out; - for (i = 0; i < N+K; i++) xn[i] = bufs[(pos+M -(N+K-1) + i) % M]; + for (i = 0; i < K+L; i++) xn[i] = bufs[(pos+M -(K+L-1) + i) % M]; while (i < N_DFT) xn[i++] = 0.0; dft(xn, X); - dc = get_bufmu(pos-sample_out); //oder: dc = creal(X[0])/N_DFT; + dc = get_bufmu(pos-sample_out); //oder: dc = creal(X[0])/(K+L); for (i = 0; i < N_DFT; i++) Z[i] = X[i]*Fm[i]; Nidft(Z, cx); - if (abs) { - for (i = N; i < N+K; i++) { - if (fabs(creal(cx[i])) > fabs(mx)) { // imag(cx)=0 - mx = creal(cx[i]); - mp = i; - } + // relativ Peak - Normierung erst zum Schluss; + // dann jedoch nicht zwingend corr-Max wenn FM-Amplitude bzw. norm(x) nicht konstant + // (z.B. rs41 Signal-Pausen). Moeglicherweise wird dann wahres corr-Max in dem + // K-Fenster nicht erkannt, deshalb K nicht zu gross waehlen. + // + mx2 = 0.0; // t = L-1 + for (i = L-1; i < K+L; i++) { // i=t .. i=t+K < t+1+K + re_cx = creal(cx[i]); // imag(cx)=0 + if (re_cx*re_cx > mx2) { + mx = re_cx; + mx2 = mx*mx; + mp = i; } } - else { - for (i = N; i < N+K; i++) { - if (creal(cx[i]) > mx) { // imag(cx)=0 - mx = creal(cx[i]); - mp = i; - } - } - } - if (mp == N || mp == N+K-1) return -4; // Randwert + if (mp == L-1 || mp == K+L-1) return -4; // Randwert + // mp == t mp == K+t - mpos = pos - ( N+K-1 - mp ); - xnorm = sqrt(qs[(mpos + 2*M) % M]); + mpos = pos - (K + L-1) + mp; + xnorm = sqrt(qs[(mpos + 2*M) % M]); // Nvar = L mx /= xnorm*N_DFT; *maxv = mx; @@ -270,7 +271,7 @@ float get_bufmu(int ofs) { return mu; } -int f32buf_sample(FILE *fp, int inv, int cm) { +int f32buf_sample(FILE *fp, int inv) { float s = 0.0; float xneu, xalt; @@ -288,11 +289,6 @@ int f32buf_sample(FILE *fp, int inv, int cm) { qs[sample_in % M] = qsum; - if (0 && cm) { - // direct correlation - } - - sample_out = sample_in - delay; sample_in += 1; @@ -369,7 +365,7 @@ int headcmp(int symlen, char *hdr, int len, unsigned int mvp, int inv, int optio /* -------------------------------------------------------------------------- */ -int read_sbit(FILE *fp, int symlen, int *bit, int inv, int ofs, int reset, int cm) { +int read_sbit(FILE *fp, int symlen, int *bit, int inv, int ofs, int reset) { // symlen==2: manchester2 10->0,01->1: 2.bit static double bitgrenze; @@ -388,7 +384,7 @@ int read_sbit(FILE *fp, int symlen, int *bit, int inv, int ofs, int reset, int c bitgrenze += samples_per_bit; do { if (buffered > 0) buffered -= 1; - else if (f32buf_sample(fp, inv, cm) == EOF) return EOF; + else if (f32buf_sample(fp, inv) == EOF) return EOF; sample = bufs[(sample_out-buffered + ofs + M) % M]; sum -= sample; @@ -400,7 +396,7 @@ int read_sbit(FILE *fp, int symlen, int *bit, int inv, int ofs, int reset, int c bitgrenze += samples_per_bit; do { if (buffered > 0) buffered -= 1; - else if (f32buf_sample(fp, inv, cm) == EOF) return EOF; + else if (f32buf_sample(fp, inv) == EOF) return EOF; sample = bufs[(sample_out-buffered + ofs + M) % M]; sum += sample; @@ -414,7 +410,7 @@ int read_sbit(FILE *fp, int symlen, int *bit, int inv, int ofs, int reset, int c return 0; } -int read_spkbit(FILE *fp, int symlen, int *bit, int inv, int ofs, int reset, int cm, int spike) { +int read_spkbit(FILE *fp, int symlen, int *bit, int inv, int ofs, int reset, int spike) { // symlen==2: manchester2 10->0,01->1: 2.bit static double bitgrenze; @@ -435,7 +431,7 @@ int read_spkbit(FILE *fp, int symlen, int *bit, int inv, int ofs, int reset, int bitgrenze += samples_per_bit; do { if (buffered > 0) buffered -= 1; - else if (f32buf_sample(fp, inv, cm) == EOF) return EOF; + else if (f32buf_sample(fp, inv) == EOF) return EOF; sample = bufs[(sample_out-buffered + ofs + M) % M]; avg = 0.5*(bufs[(sample_out-buffered-1 + ofs + M) % M] @@ -451,7 +447,7 @@ int read_spkbit(FILE *fp, int symlen, int *bit, int inv, int ofs, int reset, int bitgrenze += samples_per_bit; do { if (buffered > 0) buffered -= 1; - else if (f32buf_sample(fp, inv, cm) == EOF) return EOF; + else if (f32buf_sample(fp, inv) == EOF) return EOF; sample = bufs[(sample_out-buffered + ofs + M) % M]; avg = 0.5*(bufs[(sample_out-buffered-1 + ofs + M) % M] @@ -471,7 +467,7 @@ int read_spkbit(FILE *fp, int symlen, int *bit, int inv, int ofs, int reset, int /* -------------------------------------------------------------------------- */ -int read_softbit(FILE *fp, int symlen, int *bit, float *sb, float level, int inv, int ofs, int reset, int cm) { +int read_softbit(FILE *fp, int symlen, int *bit, float *sb, float level, int inv, int ofs, int reset) { // symlen==2: manchester2 10->0,01->1: 2.bit static double bitgrenze; @@ -491,7 +487,7 @@ int read_softbit(FILE *fp, int symlen, int *bit, float *sb, float level, int inv bitgrenze += samples_per_bit; do { if (buffered > 0) buffered -= 1; - else if (f32buf_sample(fp, inv, cm) == EOF) return EOF; + else if (f32buf_sample(fp, inv) == EOF) return EOF; sample = bufs[(sample_out-buffered + ofs + M) % M]; if (scount > bitgrenze-samples_per_bit && scount < bitgrenze-2) @@ -506,7 +502,7 @@ int read_softbit(FILE *fp, int symlen, int *bit, float *sb, float level, int inv bitgrenze += samples_per_bit; do { if (buffered > 0) buffered -= 1; - else if (f32buf_sample(fp, inv, cm) == EOF) return EOF; + else if (f32buf_sample(fp, inv) == EOF) return EOF; sample = bufs[(sample_out-buffered + ofs + M) % M]; if (scount > bitgrenze-samples_per_bit && scount < bitgrenze-2) @@ -541,9 +537,9 @@ float header_level(char hdr[], int hLen, unsigned int pos, int inv) { n = 0; bitn = 0; - while ( bitn < hLen && (n < N) ) { + while ( bitn < hLen && (n < L) ) { sgn = (hdr[bitn]&1)*2-1; // {'0','1'} -> {-1,1} - s = bufs[(pos-N + n + M) % M]; + s = bufs[(pos-L + n + M) % M]; if (inv) s = -s; sum += s * sgn; n++; @@ -560,7 +556,7 @@ float header_level(char hdr[], int hLen, unsigned int pos, int inv) { static double norm2_match() { int i; double x, y = 0.0; - for (i = 0; i < N; i++) { + for (i = 0; i < L; i++) { x = match[i]; y += x*x; } @@ -576,24 +572,40 @@ int init_buffers(char hdr[], int hLen, int shape) { float alpha, sqalp, a = 1.0; + int p2 = 1; int K; int n, k; float *m = NULL; - N = hLen * samples_per_bit + 0.5; - M = 3*N; - if (samples_per_bit < 6) M = 6*N; - Nvar = N; //N/2; // = N/k + L = hLen * samples_per_bit + 0.5; + M = 3*L; + // if (samples_per_bit < 6) M = 6*L; + + sample_in = 0; + + p2 = 1; + while (p2 < M) p2 <<= 1; + while (p2 < 0x2000) p2 <<= 1; // or 0x4000, if sample not too short + M = p2; + N_DFT = p2; + LOG2N = log(N_DFT)/log(2)+0.1; // 32bit cpu ... intermediate floating-point precision + //while ((1 << LOG2N) < N_DFT) LOG2N++; // better N_DFT = (1 << LOG2N) ... + + delay = L/16; + K = M-L - delay; // L+K < M + + Nvar = L; //L/2; // = L/k + bufs = (float *)calloc( M+1, sizeof(float)); if (bufs == NULL) return -100; - match = (float *)calloc( N+1, sizeof(float)); if (match == NULL) return -100; + match = (float *)calloc( L+1, sizeof(float)); if (match == NULL) return -100; xs = (float *)calloc( M+1, sizeof(float)); if (xs == NULL) return -100; qs = (float *)calloc( M+1, sizeof(float)); if (qs == NULL) return -100; - rawbits = (char *)calloc( N+1, sizeof(char)); if (rawbits == NULL) return -100; + rawbits = (char *)calloc( 2*hLen+1, sizeof(char)); if (rawbits == NULL) return -100; for (i = 0; i < M; i++) bufs[i] = 0.0; @@ -601,7 +613,7 @@ int init_buffers(char hdr[], int hLen, int shape) { sqalp = sqrt(alpha/M_PI); //a = sqalp; - for (i = 0; i < N; i++) { + for (i = 0; i < L; i++) { pos = i/samples_per_bit; x = (i - pos*samples_per_bit)*2.0/samples_per_bit - 1; a = sqalp; @@ -629,25 +641,11 @@ int init_buffers(char hdr[], int hLen, int shape) { } normMatch = sqrt(norm2_match()); - for (i = 0; i < N; i++) { + for (i = 0; i < L; i++) { match[i] /= normMatch; } - delay = N/16; - sample_in = 0; - - K = M-N - delay; //N/2 - delay; // N+K < M - - LOG2N = 2 + (int)(log(N+K)/log(2)); - N_DFT = 1 << LOG2N; - - while (N + K > N_DFT/2 - 2) { - LOG2N += 1; - N_DFT <<= 1; - } - - xn = calloc(N_DFT+1, sizeof(float)); if (xn == NULL) return -1; ew = calloc(LOG2N+1, sizeof(complex float)); if (ew == NULL) return -1; @@ -662,7 +660,7 @@ int init_buffers(char hdr[], int hLen, int shape) { } m = calloc(N_DFT+1, sizeof(float)); if (m == NULL) return -1; - for (i = 0; i < N; i++) m[N-1 - i] = match[i]; + for (i = 0; i < L; i++) m[L-1 - i] = match[i]; // t = L-1 while (i < N_DFT) m[i++] = 0.0; dft(m, Fm); diff --git a/demod/demod_dft.h b/demod/demod_dft.h index 32a89db..923e4ef 100644 --- a/demod/demod_dft.h +++ b/demod/demod_dft.h @@ -1,12 +1,12 @@ float read_wav_header(FILE*, float, int); -int f32buf_sample(FILE*, int, int); -int read_sbit(FILE*, int, int*, int, int, int, int); -int read_spkbit(FILE*, int, int*, int, int, int, int, int); -int read_softbit(FILE *fp, int symlen, int *bit, float *sb, float level, int inv, int ofs, int reset, int cm); +int f32buf_sample(FILE*, int); +int read_sbit(FILE*, int, int*, int, int, int); +int read_spkbit(FILE*, int, int*, int, int, int, int); +int read_softbit(FILE *fp, int symlen, int *bit, float *sb, float level, int inv, int ofs, int reset); float header_level(char hdr[], int hLen, unsigned int pos, int inv); -int getCorrDFT(int, int, unsigned int, float *, unsigned int *); +int getCorrDFT(int, unsigned int, float *, unsigned int *); int headcmp(int, char*, int, unsigned int, int, int); float get_bufvar(int); float get_bufmu(int); diff --git a/demod/dfm09dm_dft.c b/demod/dfm09dm_dft.c index 8b0267e..abd4210 100644 --- a/demod/dfm09dm_dft.c +++ b/demod/dfm09dm_dft.c @@ -686,7 +686,7 @@ void print_gpx() { } } else { - if (option_auto && option_verbose >= 2) printf("[%c] ", option_inv?'-':'+'); + if (option_auto && option_verbose >= 2) printf("<%c> ", option_inv?'-':'+'); printf("[%3d] ", gpx.frnr); printf("%4d-%02d-%02d ", gpx.jahr, gpx.monat, gpx.tag); printf("%02d:%02d:%04.1f ", gpx.std, gpx.min, gpx.sek); @@ -851,8 +851,9 @@ int main(int argc, char **argv) { float thres = 0.65; - int bitofs = 0; int symlen = 2; + int bitofs = 2; // +1 .. +2 + int shift = 0; #ifdef CYGWIN @@ -904,6 +905,15 @@ int main(int argc, char **argv) { } else return -1; } + else if ( (strcmp(*argv, "-d") == 0) ) { + ++argv; + if (*argv) { + shift = atoi(*argv); + if (shift > 4) shift = 4; + if (shift < -4) shift = -4; + } + else return -1; + } else { fp = fopen(*argv, "rb"); if (fp == NULL) { @@ -932,8 +942,9 @@ int main(int argc, char **argv) { symlen = 2; + bitofs += shift; + headerlen = strlen(rawheader); - bitofs = 2; // +1 .. +2 K = init_buffers(rawheader, headerlen, 0); // shape=0 (alt. shape=1) if ( K < 0 ) { fprintf(stderr, "error: init buffers\n"); @@ -941,14 +952,16 @@ int main(int argc, char **argv) { }; k = 0; - mv = 0; mv_pos = 0; + mv = 0; + mv_pos = 0; - while ( f32buf_sample(fp, option_inv, 1) != EOF ) { + while ( f32buf_sample(fp, option_inv) != EOF ) { k += 1; if (k >= K-4) { mv0_pos = mv_pos; - mp = getCorrDFT(option_auto, K, 0, &mv, &mv_pos); + mp = getCorrDFT(K, 0, &mv, &mv_pos); + if (option_auto == 0 && mv < 0) mv = 0; k = 0; } else { @@ -993,8 +1006,7 @@ int main(int argc, char **argv) { while ( frm < nfrms ) { // nfrms=1,2,4,8 frm_cnt = mv_pos/(spb*2.0*BITFRAME_LEN) + frm; while ( pos < BITFRAME_LEN ) { - header_found = !(frm==nfrms-1 && pos>=BITFRAME_LEN-10); - bitQ = read_sbit(fp, symlen, &bit, option_inv, bitofs, bitpos==0, !header_found); // symlen=2, return: zeroX/bit + bitQ = read_sbit(fp, symlen, &bit, option_inv, bitofs, bitpos==0); // symlen=2 if (bitQ == EOF) { frm = nfrms; break; } frame_bits[pos] = 0x30 + bit; pos++; diff --git a/demod/lms6dm_dft.c b/demod/lms6dm_dft.c index bc280bd..6d92335 100644 --- a/demod/lms6dm_dft.c +++ b/demod/lms6dm_dft.c @@ -873,8 +873,10 @@ int main(int argc, char **argv) { float thres = 0.76; - int bitofs = 0; int symlen = 1; + int bitofs = 1; // +1 .. +2 + int shift = 0; + unsigned int bc = 0; float sb = 0.0; @@ -931,6 +933,15 @@ int main(int argc, char **argv) { } else return -1; } + else if ( (strcmp(*argv, "-d") == 0) ) { + ++argv; + if (*argv) { + shift = atoi(*argv); + if (shift > 4) shift = 4; + if (shift < -4) shift = -4; + } + else return -1; + } else if ( (strcmp(*argv, "--level") == 0) ) { ++argv; if (*argv) { @@ -973,8 +984,9 @@ int main(int argc, char **argv) { symlen = 1; + bitofs += shift; + headerlen = strlen(rawheader); - bitofs = 1; // +1 .. +2 K = init_buffers(rawheader, headerlen, 2); // shape=2 (alt. shape=1) if ( K < 0 ) { fprintf(stderr, "error: init buffers\n"); @@ -983,14 +995,15 @@ int main(int argc, char **argv) { level = ll; k = 0; - mv = -1; mv_pos = 0; + mv = 0; + mv_pos = 0; - while ( f32buf_sample(fp, option_inv, 1) != EOF ) { + while ( f32buf_sample(fp, option_inv) != EOF ) { k += 1; if (k >= K-4) { mv0_pos = mv_pos; - mp = getCorrDFT(-1, K, 0, &mv, &mv_pos); + mp = getCorrDFT(K, 0, &mv, &mv_pos); k = 0; } else { @@ -1024,9 +1037,9 @@ int main(int argc, char **argv) { if (mv > 0) bc = 0; else bc = 1; while ( pos < RAWBITBLOCK_LEN ) { - header_found = !(pos>=RAWBITBLOCK_LEN-10); - //bitQ = read_sbit(fp, symlen, &rbit, option_inv, bitofs, bitpos==0, !header_found); // symlen=1, return: zeroX/bit - bitQ = read_softbit(fp, symlen, &rbit, &sb, level, option_inv, bitofs, bitpos==0, !header_found); // symlen=1, return: zeroX/bit + + //bitQ = read_sbit(fp, symlen, &rbit, option_inv, bitofs, bitpos==0); // symlen=1 + bitQ = read_softbit(fp, symlen, &rbit, &sb, level, option_inv, bitofs, bitpos==0); // symlen=1 if (bitQ == EOF) { break; } bit = rbit ^ (bc%2); // (c0,inv(c1)) diff --git a/demod/lmsXdm_dft.c b/demod/lmsXdm_dft.c index 9d4be23..671d9c8 100644 --- a/demod/lmsXdm_dft.c +++ b/demod/lmsXdm_dft.c @@ -892,8 +892,10 @@ int main(int argc, char **argv) { float thres = 0.76; - int bitofs = 0; int symlen = 1; + int bitofs = 1; // +1 .. +2 + int shift = 0; + unsigned int bc = 0; float sb = 0.0; @@ -950,6 +952,15 @@ int main(int argc, char **argv) { } else return -1; } + else if ( (strcmp(*argv, "-d") == 0) ) { + ++argv; + if (*argv) { + shift = atoi(*argv); + if (shift > 4) shift = 4; + if (shift < -4) shift = -4; + } + else return -1; + } else if ( (strcmp(*argv, "--level") == 0) ) { ++argv; if (*argv) { @@ -992,8 +1003,9 @@ int main(int argc, char **argv) { symlen = 1; + bitofs += shift; + headerlen = strlen(rawheader); - bitofs = 1; // +1 .. +2 K = init_buffers(rawheader, headerlen, 2); // shape=2 (alt. shape=1) if ( K < 0 ) { fprintf(stderr, "error: init buffers\n"); @@ -1002,14 +1014,15 @@ int main(int argc, char **argv) { level = ll; k = 0; - mv = -1; mv_pos = 0; + mv = 0; + mv_pos = 0; - while ( f32buf_sample(fp, option_inv, 1) != EOF ) { + while ( f32buf_sample(fp, option_inv) != EOF ) { k += 1; if (k >= K-4) { mv0_pos = mv_pos; - mp = getCorrDFT(-1, K, 0, &mv, &mv_pos); + mp = getCorrDFT(K, 0, &mv, &mv_pos); k = 0; } else { @@ -1044,8 +1057,8 @@ int main(int argc, char **argv) { while ( pos < RAWBITBLOCK_LEN ) { header_found = !(pos>=RAWBITBLOCK_LEN-10); - //bitQ = read_sbit(fp, symlen, &rbit, option_inv, bitofs, bitpos==0, !header_found); // symlen=1, return: zeroX/bit - bitQ = read_softbit(fp, symlen, &rbit, &sb, level, option_inv, bitofs, bitpos==0, !header_found); // symlen=1, return: zeroX/bit + //bitQ = read_sbit(fp, symlen, &rbit, option_inv, bitofs, bitpos==0); // symlen=1 + bitQ = read_softbit(fp, symlen, &rbit, &sb, level, option_inv, bitofs, bitpos==0); // symlen=1 if (bitQ == EOF) { break; } bit = rbit ^ (bc%2); // (c0,inv(c1)) diff --git a/demod/m10dm_dft.c b/demod/m10dm_dft.c index 151290a..5f96dd4 100644 --- a/demod/m10dm_dft.c +++ b/demod/m10dm_dft.c @@ -802,8 +802,9 @@ int main(int argc, char **argv) { float thres = 0.76; - int bitofs = 0; int symlen = 2; + int bitofs = 0; // 0 .. +2 + int shift = 0; #ifdef CYGWIN @@ -854,6 +855,15 @@ int main(int argc, char **argv) { } else return -1; } + else if ( (strcmp(*argv, "-d") == 0) ) { + ++argv; + if (*argv) { + shift = atoi(*argv); + if (shift > 4) shift = 4; + if (shift < -4) shift = -4; + } + else return -1; + } else { fp = fopen(*argv, "rb"); if (fp == NULL) { @@ -879,8 +889,9 @@ int main(int argc, char **argv) { symlen = 2; + bitofs += shift; + headerlen = strlen(rawheader); - bitofs = 0; // 0 .. +2 K = init_buffers(rawheader, headerlen, 1); // shape=0 (alt. shape=1) if ( K < 0 ) { fprintf(stderr, "error: init buffers\n"); @@ -889,14 +900,15 @@ int main(int argc, char **argv) { k = 0; - mv = -1; mv_pos = 0; + mv = 0; + mv_pos = 0; - while ( f32buf_sample(fp, option_inv, 1) != EOF ) { + while ( f32buf_sample(fp, option_inv) != EOF ) { k += 1; if (k >= K-4) { mv0_pos = mv_pos; - mp = getCorrDFT(-1, K, 0, &mv, &mv_pos); + mp = getCorrDFT(K, 0, &mv, &mv_pos); k = 0; } else { @@ -925,11 +937,10 @@ int main(int argc, char **argv) { bitpos = 0; pos = 0; pos /= 2; - bit0 = '0'; + bit0 = '0'; // oder: mv[j] > 0 while ( pos < BITFRAME_LEN+BITAUX_LEN ) { - header_found = !(pos>=BITFRAME_LEN-10); - bitQ = read_spkbit(fp, symlen, &bit, option_inv, bitofs, bitpos==0, !header_found, spike); // symlen=2, return: zeroX/bit + bitQ = read_spkbit(fp, symlen, &bit, option_inv, bitofs, bitpos==0, spike); // symlen=2 if (bitQ == EOF) { break; } frame_bits[pos] = 0x31 ^ (bit0 ^ bit); pos++; @@ -945,7 +956,7 @@ int main(int argc, char **argv) { // bis Ende der Sekunde vorspulen; allerdings Doppel-Frame alle 10 sek if (option_verbose < 3) { // && (regulare frame) // print_frame-return? while ( bitpos < 5*BITFRAME_LEN ) { - bitQ = read_spkbit(fp, symlen, &bit, option_inv, bitofs, bitpos==0, 0, spike); // symlen=2, return: zeroX/bit + bitQ = read_spkbit(fp, symlen, &bit, option_inv, bitofs, bitpos==0, spike); // symlen=2 if ( bitQ == EOF) break; bitpos++; } diff --git a/demod/rs41dm_dft.c b/demod/rs41dm_dft.c index bd029fa..46f976f 100644 --- a/demod/rs41dm_dft.c +++ b/demod/rs41dm_dft.c @@ -1209,6 +1209,7 @@ int main(int argc, char *argv[]) { int symlen = 1; int bitofs = 2; + int shift = 0; #ifdef CYGWIN @@ -1261,6 +1262,15 @@ int main(int argc, char *argv[]) { } else return -1; } + else if ( (strcmp(*argv, "-d") == 0) ) { + ++argv; + if (*argv) { + shift = atoi(*argv); + if (shift > 4) shift = 4; + if (shift < -4) shift = -4; + } + else return -1; + } else { fp = fopen(*argv, "rb"); if (fp == NULL) { @@ -1291,8 +1301,9 @@ int main(int argc, char *argv[]) { symlen = 1; + bitofs += shift; + headerlen = strlen(header); - bitofs = 2; // +1 .. +2 K = init_buffers(header, headerlen, 2); // shape=2 if ( K < 0 ) { fprintf(stderr, "error: init buffers\n"); @@ -1301,14 +1312,15 @@ int main(int argc, char *argv[]) { k = 0; - mv = -1; mv_pos = 0; + mv = 0; + mv_pos = 0; - while ( f32buf_sample(fp, option_inv, 1) != EOF ) { + while ( f32buf_sample(fp, option_inv) != EOF ) { k += 1; if (k >= K-4) { mv0_pos = mv_pos; - mp = getCorrDFT(0, K, 0, &mv, &mv_pos); + mp = getCorrDFT(K, 0, &mv, &mv_pos); k = 0; } else { @@ -1341,7 +1353,7 @@ int main(int argc, char *argv[]) { ft_len = frmlen; while ( byte_count < frmlen ) { - bitQ = read_sbit(fp, symlen, &bit, option_inv, bitofs, bit_count==0, 0); // symlen=1, return: zeroX/bit + bitQ = read_sbit(fp, symlen, &bit, option_inv, bitofs, bit_count==0); // symlen=1 if ( bitQ == EOF) break; bit_count += 1; bitbuf[bitpos] = bit; @@ -1371,7 +1383,7 @@ int main(int argc, char *argv[]) { header_found = 0; while ( bit_count < BITS*(FRAME_LEN-8+24) ) { - bitQ = read_sbit(fp, symlen, &bit, option_inv, bitofs, bit_count==0, 0); // symlen=1, return: zeroX/bit + bitQ = read_sbit(fp, symlen, &bit, option_inv, bitofs, bit_count==0); // symlen=1 if ( bitQ == EOF) break; bit_count++; } diff --git a/demod/rs92dm_dft.c b/demod/rs92dm_dft.c index 9af507e..dbde296 100644 --- a/demod/rs92dm_dft.c +++ b/demod/rs92dm_dft.c @@ -1240,8 +1240,9 @@ int main(int argc, char *argv[]) { float thres = 0.7; - int bitofs = 0; int symlen = 2; + int bitofs = 2; // +0 .. +3 + int shift = 0; #ifdef CYGWIN @@ -1342,7 +1343,7 @@ int main(int argc, char *argv[]) { else if (strcmp(*argv, "-g2") == 0) { option_vergps = 2; } // verbose2 GPS (bancroft) else if (strcmp(*argv, "-gg") == 0) { option_vergps = 8; } // vverbose GPS else if (strcmp(*argv, "--ecc") == 0) { option_ecc = 1; } - else if (strcmp(*argv, "--json") == 0) { option_json = 1; } // JSON output (for auto_rx) + else if (strcmp(*argv, "--json") == 0) {option_json = 1; option_ecc = 1; option_crc = 1; } else if (strcmp(*argv, "--ch2") == 0) { wav_channel = 1; } // right channel (default: 0=left) else if (strcmp(*argv, "--ths") == 0) { ++argv; @@ -1351,6 +1352,15 @@ int main(int argc, char *argv[]) { } else return -1; } + else if ( (strcmp(*argv, "-d") == 0) ) { + ++argv; + if (*argv) { + shift = atoi(*argv); + if (shift > 4) shift = 4; + if (shift < -4) shift = -4; + } + else return -1; + } else { if (!rawin) fp = fopen(*argv, "rb"); else fp = fopen(*argv, "r"); @@ -1405,8 +1415,9 @@ int main(int argc, char *argv[]) { symlen = 2; + bitofs += shift; + headerlen = strlen(rawheader); - bitofs = 2; // +1 .. +2 K = init_buffers(rawheader, headerlen, 2); // shape=2 if ( K < 0 ) { fprintf(stderr, "error: init buffers\n"); @@ -1414,14 +1425,15 @@ int main(int argc, char *argv[]) { }; k = 0; - mv = -1; mv_pos = 0; + mv = 0; + mv_pos = 0; - while ( f32buf_sample(fp, option_inv, 1) != EOF ) { + while ( f32buf_sample(fp, option_inv) != EOF ) { k += 1; if (k >= K-4) { mv0_pos = mv_pos; - mp = getCorrDFT(0, K, 0, &mv, &mv_pos); + mp = getCorrDFT(K, 0, &mv, &mv_pos); k = 0; } else { @@ -1451,8 +1463,7 @@ int main(int argc, char *argv[]) { bitpos = 0; while ( byte_count < FRAME_LEN ) { - header_found = !(byte_count>=FRAME_LEN-2); - bitQ = read_sbit(fp, symlen, &bit, option_inv, bitofs, bit_count==0, !header_found); // symlen=2, return: zeroX/bit + bitQ = read_sbit(fp, symlen, &bit, option_inv, bitofs, bit_count==0); // symlen=2 if ( bitQ == EOF) break; bit_count += 1; bitbuf[bitpos] = bit;