match header bits

pull/4/head
Zilog80 2017-12-07 01:07:39 +01:00
rodzic f4d592a58f
commit 6c23e1a878
5 zmienionych plików z 65 dodań i 40 usunięć

Wyświetl plik

@ -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;
}
}

Wyświetl plik

@ -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);

Wyświetl plik

@ -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++;

Wyświetl plik

@ -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++;
}

Wyświetl plik

@ -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;