diff --git a/demod/demod.c b/demod/demod.c index 60fe7a0..4632148 100644 --- a/demod/demod.c +++ b/demod/demod.c @@ -141,7 +141,8 @@ int getmaxCorr(float *maxv, unsigned int *maxvpos, int len) { // Maximum im Intervall [sample_out-slen, sample_out-1] // Randwerte zaehlen nicht als Extremwerte; // nur neu berechnen, wenn neue Werte groesser als altes Max - int slen, pos, mpos; + int slen, pos; + unsigned int mpos=0; float m, s0, s, s1; int posIn = 0; // -1..0..1; // rs41:0 @@ -171,7 +172,7 @@ int getmaxCorr(float *maxv, unsigned int *maxvpos, int len) { *maxvpos = mpos; } - return 0; + return mpos-sample_out; } int f32buf_sample(FILE *fp, int inv, int cm) { @@ -192,7 +193,7 @@ int f32buf_sample(FILE *fp, int inv, int cm) { if (cm) { if (sample_in > sample_in0+1 || sample_in <= sample_in0) { - for (i = 0; i < M; i++) corrbuf[i] = 0.0; + for (i = 0; i < M; i++) corrbuf[i] = 0.0; // -1.0 } norm = 0.0; // for (i = 0; i < N; i++) { @@ -218,7 +219,7 @@ int f32buf_sample(FILE *fp, int inv, int cm) { return 0; } -static int read_bufbit(int symlen, char *bits, int ofs, int reset) { +static int read_bufbit(int symlen, char *bits, unsigned int mvp, int reset) { // symlen==2: manchester2 0->10,1->01->1: 2.bit static unsigned int rcount; @@ -227,21 +228,21 @@ static int read_bufbit(int symlen, char *bits, int ofs, int reset) { double sum = 0.0; if (reset) { - rcount = 0; // eigentlich scount = 1 - rbitgrenze = 0; // oder bitgrenze = -1 + rcount = 0; + rbitgrenze = 0; } rbitgrenze += samples_per_bit; do { - sum += bufs[(sample_out+rcount + 2*M +ofs) % M]; + sum += bufs[(rcount + mvp + M) % M]; rcount++; } while (rcount < rbitgrenze); // n < samples_per_bit if (symlen == 2) { rbitgrenze += samples_per_bit; do { - sum -= bufs[(sample_out+rcount + 2*M +ofs) % M]; + sum -= bufs[(rcount + mvp + M) % M]; rcount++; } while (rcount < rbitgrenze); // n < samples_per_bit } @@ -259,14 +260,14 @@ static int read_bufbit(int symlen, char *bits, int ofs, int reset) { return 0; } -int headcmp(int symlen, char *hdr, int len, int ofs) { +int headcmp(int symlen, char *hdr, int len, unsigned int mvp) { int errs = 0; int pos; int step = 1; if (symlen != 1) step = 2; for (pos = 0; pos < len; pos += step) { - read_bufbit(symlen, rawbits+pos, len*samples_per_bit+ofs, pos==0); + read_bufbit(symlen, rawbits+pos, mvp+1-(int)(len*samples_per_bit), pos==0); } rawbits[pos] = '\0'; @@ -344,7 +345,7 @@ static double norm2_match() { return y; } -int init_buffers(char hdr[], int hLen, int bitofs, int shape) { +int init_buffers(char hdr[], int hLen, int shape) { //hLen = strlen(header) = HEADLEN; int i, pos; @@ -380,7 +381,7 @@ int init_buffers(char hdr[], int hLen, int bitofs, int shape) { || ( pos > 0 && hdr[pos-1]!=hdr[pos] && x < 0.0 ) ) // x=0: a=sqalp { switch (shape) { - case 1: if ( fabs(x) > 0.5 ) a *= (1 - fabs(x))/0.5; + case 1: if ( fabs(x) > 0.6 ) a *= (1 - fabs(x))/0.6; break; case 2: a = sqalp * exp(-alpha*x*x); break; @@ -388,7 +389,7 @@ int init_buffers(char hdr[], int hLen, int bitofs, int shape) { break; default: a = sqalp; if (i-pos*samples_per_bit < 2 || - i-pos*samples_per_bit > samples_per_bit-2) a = 0.9*sqalp; + i-pos*samples_per_bit > samples_per_bit-2) a = 0.8*sqalp; } } diff --git a/demod/demod.h b/demod/demod.h index d5e77cd..645a5ac 100644 --- a/demod/demod.h +++ b/demod/demod.h @@ -4,10 +4,10 @@ int f32buf_sample(FILE*, int, int); int read_sbit(FILE*, int, int*, int, int, int, int); int getmaxCorr(float*, unsigned int*, int); -int headcmp(int, char*, int, int); +int headcmp(int, char*, int, unsigned int); float get_var(void); -int init_buffers(char*, int, int, int); +int init_buffers(char*, int, int); int free_buffers(void); unsigned int get_sample(void); diff --git a/demod/dfm09dm.c b/demod/dfm09dm.c index 996f02c..3701cce 100644 --- a/demod/dfm09dm.c +++ b/demod/dfm09dm.c @@ -593,16 +593,16 @@ int main(int argc, char **argv) { int bitpos = 0; int bitQ; int pos; - int herrs; + int herrs, herr1; int headerlen = 0; - int frm = 0, nfrms = 4; // nfrms=1,2,4,8 + int frm = 0, nfrms = 8; // nfrms=1,2,4,8 float mv; unsigned int mv_pos, mv0_pos; float thres = 0.6; - int bitofs = 0; + int bitofs = 0, dif = 0; #ifdef CYGWIN @@ -666,8 +666,8 @@ int main(int argc, char **argv) { headerlen = strlen(rawheader); - bitofs = 0; // -1 .. +1 - if (init_buffers(rawheader, headerlen, bitofs, 1) < 0) { // shape=1 + bitofs = 2; // +1 .. +2 + if (init_buffers(rawheader, headerlen, 0) < 0) { // shape=0 (alt. shape=1) fprintf(stderr, "error: init buffers\n"); return -1; }; @@ -678,13 +678,21 @@ int main(int argc, char **argv) { while ( f32buf_sample(fp, option_inv, 1) != EOF ) { mv0_pos = mv_pos; - getmaxCorr(&mv, &mv_pos, headerlen+headerlen/2); + dif = getmaxCorr(&mv, &mv_pos, headerlen+headerlen/2); if (mv > thres) { if (mv_pos > mv0_pos) { header_found = 0; - herrs = headcmp(2, rawheader, headerlen, bitofs); // symlen=2 + herrs = headcmp(2, rawheader, headerlen, mv_pos); // symlen=2 + herr1 = 0; + if (herrs <= 3 && herrs > 0) { + herr1 = headcmp(2, rawheader, headerlen, mv_pos+1); + if (herr1 < herrs) { + herrs = herr1; + herr1 = 1; + } + } if (herrs <= 1) header_found = 1; // herrs <= 1 bitfehler in header if (header_found) { @@ -694,11 +702,11 @@ int main(int argc, char **argv) { pos /= 2; frm = 0; - while ( frm < nfrms ) { // nfrms=1,4,8 + while ( frm < nfrms ) { // nfrms=1,2,4,8 while ( pos < BITFRAME_LEN ) { header_found = !(frm==nfrms-1 && pos>=BITFRAME_LEN-10); - bitQ = read_sbit(fp, 2, &bit, option_inv, bitofs, bitpos==0, !header_found); // symlen=2, return: zeroX/bit - //bitQ = read_sbit(fp, 2, &bit, option_inv, bitofs, bitpos==0, 0); // symlen=2, return: zeroX/bit + bitQ = read_sbit(fp, 2, &bit, option_inv, dif+bitofs, bitpos==0, !header_found); // symlen=2, return: zeroX/bit + //bitQ = read_sbit(fp, 2, &bit, option_inv, dif+bitofs, bitpos==0, 0); // symlen=2, return: zeroX/bit if (bitQ == EOF) { frm = nfrms; break; } frame_bits[pos] = 0x30 + bit; pos++; diff --git a/demod/rs41dm.c b/demod/rs41dm.c index 6171840..b3ff0e1 100644 --- a/demod/rs41dm.c +++ b/demod/rs41dm.c @@ -1064,7 +1064,7 @@ int main(int argc, char *argv[]) { int bit, byte; int frmlen = FRAME_LEN; int headerlen; - int herrs; + int herrs, herr1; int bitQ, Qerror_count; float mv; @@ -1072,7 +1072,7 @@ int main(int argc, char *argv[]) { float thres = 0.7; - int bitofs = 0; + int bitofs = 0, dif = 0; #ifdef CYGWIN @@ -1146,8 +1146,8 @@ int main(int argc, char *argv[]) { } headerlen = strlen(header); - bitofs = +1; // -1 .. +1 - if (init_buffers(header, headerlen, bitofs, 2) < 0) { // shape=2 + bitofs = 2; // +1 .. +2 + if (init_buffers(header, headerlen, 2) < 0) { // shape=2 fprintf(stderr, "error: init buffers\n"); return -1; }; @@ -1158,13 +1158,21 @@ int main(int argc, char *argv[]) { while ( f32buf_sample(fp, option_inv, 1) != EOF ) { mv0_pos = mv_pos; - getmaxCorr(&mv, &mv_pos, headerlen+headerlen/2); + dif = getmaxCorr(&mv, &mv_pos, headerlen+headerlen/2); if (mv > thres) { if (mv_pos > mv0_pos) { header_found = 0; - herrs = headcmp(1, header, headerlen, bitofs); // symlen=1 + herrs = headcmp(1, header, headerlen, mv_pos); // symlen=1 + herr1 = 0; + if (herrs <= 3 && herrs > 0) { + herr1 = headcmp(2, header, headerlen, mv_pos+1); + if (herr1 < herrs) { + herrs = herr1; + herr1 = 1; + } + } if (herrs <= 2) header_found = 1; // herrs <= 2 bitfehler in header if (header_found) { @@ -1176,7 +1184,7 @@ int main(int argc, char *argv[]) { Qerror_count = 0; while ( byte_count < frmlen ) { - bitQ = read_sbit(fp, 1, &bit, option_inv, bitofs, bit_count==0, 0); // symlen=1, return: zeroX/bit + bitQ = read_sbit(fp, 1, &bit, option_inv, dif+bitofs, bit_count==0, 0); // symlen=1, return: zeroX/bit if ( bitQ == EOF) break; bit_count += 1; bitbuf[bitpos] = bit; @@ -1207,7 +1215,7 @@ int main(int argc, char *argv[]) { print_frame(byte_count); while ( bit_count < BITS*FRAME_LEN ) { - bitQ = read_sbit(fp, 1, &bit, option_inv, bitofs, bit_count==0, 0); // symlen=1, return: zeroX/bit + bitQ = read_sbit(fp, 1, &bit, option_inv, dif+bitofs, bit_count==0, 0); // symlen=1, return: zeroX/bit if ( bitQ == EOF) break; bit_count++; } diff --git a/demod/rs92dm.c b/demod/rs92dm.c index f1d6abb..accfa8c 100644 --- a/demod/rs92dm.c +++ b/demod/rs92dm.c @@ -1214,7 +1214,7 @@ int main(int argc, char *argv[]) { header_found = 0; int bit, byte; int bitQ; - int herrs; + int herrs, herr1; int headerlen = 0; float mv; @@ -1222,7 +1222,7 @@ int main(int argc, char *argv[]) { float thres = 0.7; - int bitofs = 0; + int bitofs = 0, dif = 0; #ifdef CYGWIN @@ -1379,8 +1379,8 @@ int main(int argc, char *argv[]) { headerlen = strlen(rawheader); - bitofs = 0; // -1 .. +1 - if (init_buffers(rawheader, headerlen, bitofs, 2) < 0) { // shape=2 + bitofs = 2; // +1 .. +2 + if (init_buffers(rawheader, headerlen, 2) < 0) { // shape=2 fprintf(stderr, "error: init buffers\n"); return -1; }; @@ -1390,13 +1390,21 @@ int main(int argc, char *argv[]) { while ( f32buf_sample(fp, option_inv, 1) != EOF ) { mv0_pos = mv_pos; - getmaxCorr(&mv, &mv_pos, headerlen+headerlen/2); + dif = getmaxCorr(&mv, &mv_pos, headerlen+headerlen/2); if (mv > thres) { if (mv_pos > mv0_pos) { header_found = 0; - herrs = headcmp(2, rawheader, headerlen, bitofs); // symlen=2 + herrs = headcmp(2, rawheader, headerlen, mv_pos); // symlen=2 + herr1 = 0; + if (herrs <= 3 && herrs > 0) { + herr1 = headcmp(2, rawheader, headerlen, mv_pos+1); + if (herr1 < herrs) { + herrs = herr1; + herr1 = 1; + } + } if (herrs <= 2) header_found = 1; // herrs <= 2 bitfehler in header if (header_found) { @@ -1407,7 +1415,7 @@ int main(int argc, char *argv[]) { while ( byte_count < FRAME_LEN ) { header_found = !(byte_count>=FRAME_LEN-2); - bitQ = read_sbit(fp, 2, &bit, option_inv, bitofs, bit_count==0, !header_found); // symlen=2, return: zeroX/bit + bitQ = read_sbit(fp, 2, &bit, option_inv, dif+bitofs, bit_count==0, !header_found); // symlen=2, return: zeroX/bit if ( bitQ == EOF) break; bit_count += 1; bitbuf[bitpos] = bit;