dft_correlation: K-window

pull/11/head
Zilog80 2019-03-03 15:54:52 +01:00
rodzic e6cc0068c4
commit bb5d3f96e8
8 zmienionych plików z 186 dodań i 116 usunięć

Wyświetl plik

@ -13,6 +13,7 @@
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <math.h> #include <math.h>
#include <complex.h>
typedef unsigned char ui8_t; typedef unsigned char ui8_t;
@ -27,7 +28,7 @@ typedef int i32_t;
static unsigned int sample_in, sample_out, delay; static unsigned int sample_in, sample_out, delay;
static int buffered = 0; static int buffered = 0;
static int N, M; static int L, M;
static float *match = NULL, static float *match = NULL,
*bufs = NULL; *bufs = NULL;
@ -45,7 +46,6 @@ static float dc = 0.0;
/* ------------------------------------------------------------------------------------ */ /* ------------------------------------------------------------------------------------ */
#include <complex.h>
static int LOG2N, N_DFT; 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 i;
int mp = -1; int mp = -1;
float mx = 0.0; float mx = 0.0;
float mx2 = 0.0;
float re_cx = 0.0;
float xnorm = 1; float xnorm = 1;
unsigned int mpos = 0; unsigned int mpos = 0;
dc = 0.0; dc = 0.0;
if (N + K > N_DFT/2 - 2) return -1; if (K + L > N_DFT) return -1;
if (sample_in < delay+N+K) return -2; if (sample_out < L) return -2;
if (pos == 0) pos = sample_out; 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; while (i < N_DFT) xn[i++] = 0.0;
dft(xn, X); 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]; for (i = 0; i < N_DFT; i++) Z[i] = X[i]*Fm[i];
Nidft(Z, cx); Nidft(Z, cx);
if (abs) { // relativ Peak - Normierung erst zum Schluss;
for (i = N; i < N+K; i++) { // dann jedoch nicht zwingend corr-Max wenn FM-Amplitude bzw. norm(x) nicht konstant
if (fabs(creal(cx[i])) > fabs(mx)) { // imag(cx)=0 // (z.B. rs41 Signal-Pausen). Moeglicherweise wird dann wahres corr-Max in dem
mx = creal(cx[i]); // K-Fenster nicht erkannt, deshalb K nicht zu gross waehlen.
mp = i; //
} 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 { if (mp == L-1 || mp == K+L-1) return -4; // Randwert
for (i = N; i < N+K; i++) { // mp == t mp == K+t
if (creal(cx[i]) > mx) { // imag(cx)=0
mx = creal(cx[i]);
mp = i;
}
}
}
if (mp == N || mp == N+K-1) return -4; // Randwert
mpos = pos - ( N+K-1 - mp ); mpos = pos - (K + L-1) + mp;
xnorm = sqrt(qs[(mpos + 2*M) % M]); xnorm = sqrt(qs[(mpos + 2*M) % M]); // Nvar = L
mx /= xnorm*N_DFT; mx /= xnorm*N_DFT;
*maxv = mx; *maxv = mx;
@ -270,7 +271,7 @@ float get_bufmu(int ofs) {
return mu; return mu;
} }
int f32buf_sample(FILE *fp, int inv, int cm) { int f32buf_sample(FILE *fp, int inv) {
float s = 0.0; float s = 0.0;
float xneu, xalt; float xneu, xalt;
@ -288,11 +289,6 @@ int f32buf_sample(FILE *fp, int inv, int cm) {
qs[sample_in % M] = qsum; qs[sample_in % M] = qsum;
if (0 && cm) {
// direct correlation
}
sample_out = sample_in - delay; sample_out = sample_in - delay;
sample_in += 1; 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 // symlen==2: manchester2 10->0,01->1: 2.bit
static double bitgrenze; 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; bitgrenze += samples_per_bit;
do { do {
if (buffered > 0) buffered -= 1; 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]; sample = bufs[(sample_out-buffered + ofs + M) % M];
sum -= sample; 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; bitgrenze += samples_per_bit;
do { do {
if (buffered > 0) buffered -= 1; 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]; sample = bufs[(sample_out-buffered + ofs + M) % M];
sum += sample; 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; 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 // symlen==2: manchester2 10->0,01->1: 2.bit
static double bitgrenze; 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; bitgrenze += samples_per_bit;
do { do {
if (buffered > 0) buffered -= 1; 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]; sample = bufs[(sample_out-buffered + ofs + M) % M];
avg = 0.5*(bufs[(sample_out-buffered-1 + 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; bitgrenze += samples_per_bit;
do { do {
if (buffered > 0) buffered -= 1; 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]; sample = bufs[(sample_out-buffered + ofs + M) % M];
avg = 0.5*(bufs[(sample_out-buffered-1 + 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 // symlen==2: manchester2 10->0,01->1: 2.bit
static double bitgrenze; 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; bitgrenze += samples_per_bit;
do { do {
if (buffered > 0) buffered -= 1; 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]; sample = bufs[(sample_out-buffered + ofs + M) % M];
if (scount > bitgrenze-samples_per_bit && scount < bitgrenze-2) 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; bitgrenze += samples_per_bit;
do { do {
if (buffered > 0) buffered -= 1; 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]; sample = bufs[(sample_out-buffered + ofs + M) % M];
if (scount > bitgrenze-samples_per_bit && scount < bitgrenze-2) 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; n = 0;
bitn = 0; bitn = 0;
while ( bitn < hLen && (n < N) ) { while ( bitn < hLen && (n < L) ) {
sgn = (hdr[bitn]&1)*2-1; // {'0','1'} -> {-1,1} 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; if (inv) s = -s;
sum += s * sgn; sum += s * sgn;
n++; n++;
@ -560,7 +556,7 @@ float header_level(char hdr[], int hLen, unsigned int pos, int inv) {
static double norm2_match() { static double norm2_match() {
int i; int i;
double x, y = 0.0; double x, y = 0.0;
for (i = 0; i < N; i++) { for (i = 0; i < L; i++) {
x = match[i]; x = match[i];
y += x*x; y += x*x;
} }
@ -576,24 +572,40 @@ int init_buffers(char hdr[], int hLen, int shape) {
float alpha, sqalp, a = 1.0; float alpha, sqalp, a = 1.0;
int p2 = 1;
int K; int K;
int n, k; int n, k;
float *m = NULL; float *m = NULL;
N = hLen * samples_per_bit + 0.5; L = hLen * samples_per_bit + 0.5;
M = 3*N; M = 3*L;
if (samples_per_bit < 6) M = 6*N; // if (samples_per_bit < 6) M = 6*L;
Nvar = N; //N/2; // = N/k
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; 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; xs = (float *)calloc( M+1, sizeof(float)); if (xs == NULL) return -100;
qs = (float *)calloc( M+1, sizeof(float)); if (qs == 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; 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); sqalp = sqrt(alpha/M_PI);
//a = sqalp; //a = sqalp;
for (i = 0; i < N; i++) { for (i = 0; i < L; i++) {
pos = i/samples_per_bit; pos = i/samples_per_bit;
x = (i - pos*samples_per_bit)*2.0/samples_per_bit - 1; x = (i - pos*samples_per_bit)*2.0/samples_per_bit - 1;
a = sqalp; a = sqalp;
@ -629,25 +641,11 @@ int init_buffers(char hdr[], int hLen, int shape) {
} }
normMatch = sqrt(norm2_match()); normMatch = sqrt(norm2_match());
for (i = 0; i < N; i++) { for (i = 0; i < L; i++) {
match[i] /= normMatch; 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; xn = calloc(N_DFT+1, sizeof(float)); if (xn == NULL) return -1;
ew = calloc(LOG2N+1, sizeof(complex float)); if (ew == 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; 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; while (i < N_DFT) m[i++] = 0.0;
dft(m, Fm); dft(m, Fm);

Wyświetl plik

@ -1,12 +1,12 @@
float read_wav_header(FILE*, float, int); float read_wav_header(FILE*, float, int);
int f32buf_sample(FILE*, int, int); int f32buf_sample(FILE*, int);
int read_sbit(FILE*, int, int*, int, int, int, int); int read_sbit(FILE*, int, int*, int, int, int);
int read_spkbit(FILE*, int, int*, 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, int cm); 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); 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); int headcmp(int, char*, int, unsigned int, int, int);
float get_bufvar(int); float get_bufvar(int);
float get_bufmu(int); float get_bufmu(int);

Wyświetl plik

@ -686,7 +686,7 @@ void print_gpx() {
} }
} }
else { 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("[%3d] ", gpx.frnr);
printf("%4d-%02d-%02d ", gpx.jahr, gpx.monat, gpx.tag); printf("%4d-%02d-%02d ", gpx.jahr, gpx.monat, gpx.tag);
printf("%02d:%02d:%04.1f ", gpx.std, gpx.min, gpx.sek); 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; float thres = 0.65;
int bitofs = 0;
int symlen = 2; int symlen = 2;
int bitofs = 2; // +1 .. +2
int shift = 0;
#ifdef CYGWIN #ifdef CYGWIN
@ -904,6 +905,15 @@ int main(int argc, char **argv) {
} }
else return -1; 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 { else {
fp = fopen(*argv, "rb"); fp = fopen(*argv, "rb");
if (fp == NULL) { if (fp == NULL) {
@ -932,8 +942,9 @@ int main(int argc, char **argv) {
symlen = 2; symlen = 2;
bitofs += shift;
headerlen = strlen(rawheader); headerlen = strlen(rawheader);
bitofs = 2; // +1 .. +2
K = init_buffers(rawheader, headerlen, 0); // shape=0 (alt. shape=1) K = init_buffers(rawheader, headerlen, 0); // shape=0 (alt. shape=1)
if ( K < 0 ) { if ( K < 0 ) {
fprintf(stderr, "error: init buffers\n"); fprintf(stderr, "error: init buffers\n");
@ -941,14 +952,16 @@ int main(int argc, char **argv) {
}; };
k = 0; 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; k += 1;
if (k >= K-4) { if (k >= K-4) {
mv0_pos = mv_pos; 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; k = 0;
} }
else { else {
@ -993,8 +1006,7 @@ int main(int argc, char **argv) {
while ( frm < nfrms ) { // nfrms=1,2,4,8 while ( frm < nfrms ) { // nfrms=1,2,4,8
frm_cnt = mv_pos/(spb*2.0*BITFRAME_LEN) + frm; frm_cnt = mv_pos/(spb*2.0*BITFRAME_LEN) + frm;
while ( pos < BITFRAME_LEN ) { while ( pos < BITFRAME_LEN ) {
header_found = !(frm==nfrms-1 && pos>=BITFRAME_LEN-10); bitQ = read_sbit(fp, symlen, &bit, option_inv, bitofs, bitpos==0); // symlen=2
bitQ = read_sbit(fp, symlen, &bit, option_inv, bitofs, bitpos==0, !header_found); // symlen=2, return: zeroX/bit
if (bitQ == EOF) { frm = nfrms; break; } if (bitQ == EOF) { frm = nfrms; break; }
frame_bits[pos] = 0x30 + bit; frame_bits[pos] = 0x30 + bit;
pos++; pos++;

Wyświetl plik

@ -873,8 +873,10 @@ int main(int argc, char **argv) {
float thres = 0.76; float thres = 0.76;
int bitofs = 0;
int symlen = 1; int symlen = 1;
int bitofs = 1; // +1 .. +2
int shift = 0;
unsigned int bc = 0; unsigned int bc = 0;
float sb = 0.0; float sb = 0.0;
@ -931,6 +933,15 @@ int main(int argc, char **argv) {
} }
else return -1; 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) ) { else if ( (strcmp(*argv, "--level") == 0) ) {
++argv; ++argv;
if (*argv) { if (*argv) {
@ -973,8 +984,9 @@ int main(int argc, char **argv) {
symlen = 1; symlen = 1;
bitofs += shift;
headerlen = strlen(rawheader); headerlen = strlen(rawheader);
bitofs = 1; // +1 .. +2
K = init_buffers(rawheader, headerlen, 2); // shape=2 (alt. shape=1) K = init_buffers(rawheader, headerlen, 2); // shape=2 (alt. shape=1)
if ( K < 0 ) { if ( K < 0 ) {
fprintf(stderr, "error: init buffers\n"); fprintf(stderr, "error: init buffers\n");
@ -983,14 +995,15 @@ int main(int argc, char **argv) {
level = ll; level = ll;
k = 0; 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; k += 1;
if (k >= K-4) { if (k >= K-4) {
mv0_pos = mv_pos; mv0_pos = mv_pos;
mp = getCorrDFT(-1, K, 0, &mv, &mv_pos); mp = getCorrDFT(K, 0, &mv, &mv_pos);
k = 0; k = 0;
} }
else { else {
@ -1024,9 +1037,9 @@ int main(int argc, char **argv) {
if (mv > 0) bc = 0; else bc = 1; if (mv > 0) bc = 0; else bc = 1;
while ( pos < RAWBITBLOCK_LEN ) { 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_sbit(fp, symlen, &rbit, option_inv, bitofs, bitpos==0); // symlen=1
bitQ = read_softbit(fp, symlen, &rbit, &sb, level, 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); // symlen=1
if (bitQ == EOF) { break; } if (bitQ == EOF) { break; }
bit = rbit ^ (bc%2); // (c0,inv(c1)) bit = rbit ^ (bc%2); // (c0,inv(c1))

Wyświetl plik

@ -892,8 +892,10 @@ int main(int argc, char **argv) {
float thres = 0.76; float thres = 0.76;
int bitofs = 0;
int symlen = 1; int symlen = 1;
int bitofs = 1; // +1 .. +2
int shift = 0;
unsigned int bc = 0; unsigned int bc = 0;
float sb = 0.0; float sb = 0.0;
@ -950,6 +952,15 @@ int main(int argc, char **argv) {
} }
else return -1; 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) ) { else if ( (strcmp(*argv, "--level") == 0) ) {
++argv; ++argv;
if (*argv) { if (*argv) {
@ -992,8 +1003,9 @@ int main(int argc, char **argv) {
symlen = 1; symlen = 1;
bitofs += shift;
headerlen = strlen(rawheader); headerlen = strlen(rawheader);
bitofs = 1; // +1 .. +2
K = init_buffers(rawheader, headerlen, 2); // shape=2 (alt. shape=1) K = init_buffers(rawheader, headerlen, 2); // shape=2 (alt. shape=1)
if ( K < 0 ) { if ( K < 0 ) {
fprintf(stderr, "error: init buffers\n"); fprintf(stderr, "error: init buffers\n");
@ -1002,14 +1014,15 @@ int main(int argc, char **argv) {
level = ll; level = ll;
k = 0; 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; k += 1;
if (k >= K-4) { if (k >= K-4) {
mv0_pos = mv_pos; mv0_pos = mv_pos;
mp = getCorrDFT(-1, K, 0, &mv, &mv_pos); mp = getCorrDFT(K, 0, &mv, &mv_pos);
k = 0; k = 0;
} }
else { else {
@ -1044,8 +1057,8 @@ int main(int argc, char **argv) {
while ( pos < RAWBITBLOCK_LEN ) { while ( pos < RAWBITBLOCK_LEN ) {
header_found = !(pos>=RAWBITBLOCK_LEN-10); 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_sbit(fp, symlen, &rbit, option_inv, bitofs, bitpos==0); // symlen=1
bitQ = read_softbit(fp, symlen, &rbit, &sb, level, 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); // symlen=1
if (bitQ == EOF) { break; } if (bitQ == EOF) { break; }
bit = rbit ^ (bc%2); // (c0,inv(c1)) bit = rbit ^ (bc%2); // (c0,inv(c1))

Wyświetl plik

@ -802,8 +802,9 @@ int main(int argc, char **argv) {
float thres = 0.76; float thres = 0.76;
int bitofs = 0;
int symlen = 2; int symlen = 2;
int bitofs = 0; // 0 .. +2
int shift = 0;
#ifdef CYGWIN #ifdef CYGWIN
@ -854,6 +855,15 @@ int main(int argc, char **argv) {
} }
else return -1; 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 { else {
fp = fopen(*argv, "rb"); fp = fopen(*argv, "rb");
if (fp == NULL) { if (fp == NULL) {
@ -879,8 +889,9 @@ int main(int argc, char **argv) {
symlen = 2; symlen = 2;
bitofs += shift;
headerlen = strlen(rawheader); headerlen = strlen(rawheader);
bitofs = 0; // 0 .. +2
K = init_buffers(rawheader, headerlen, 1); // shape=0 (alt. shape=1) K = init_buffers(rawheader, headerlen, 1); // shape=0 (alt. shape=1)
if ( K < 0 ) { if ( K < 0 ) {
fprintf(stderr, "error: init buffers\n"); fprintf(stderr, "error: init buffers\n");
@ -889,14 +900,15 @@ int main(int argc, char **argv) {
k = 0; 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; k += 1;
if (k >= K-4) { if (k >= K-4) {
mv0_pos = mv_pos; mv0_pos = mv_pos;
mp = getCorrDFT(-1, K, 0, &mv, &mv_pos); mp = getCorrDFT(K, 0, &mv, &mv_pos);
k = 0; k = 0;
} }
else { else {
@ -925,11 +937,10 @@ int main(int argc, char **argv) {
bitpos = 0; bitpos = 0;
pos = 0; pos = 0;
pos /= 2; pos /= 2;
bit0 = '0'; bit0 = '0'; // oder: mv[j] > 0
while ( pos < BITFRAME_LEN+BITAUX_LEN ) { while ( pos < BITFRAME_LEN+BITAUX_LEN ) {
header_found = !(pos>=BITFRAME_LEN-10); bitQ = read_spkbit(fp, symlen, &bit, option_inv, bitofs, bitpos==0, spike); // symlen=2
bitQ = read_spkbit(fp, symlen, &bit, option_inv, bitofs, bitpos==0, !header_found, spike); // symlen=2, return: zeroX/bit
if (bitQ == EOF) { break; } if (bitQ == EOF) { break; }
frame_bits[pos] = 0x31 ^ (bit0 ^ bit); frame_bits[pos] = 0x31 ^ (bit0 ^ bit);
pos++; pos++;
@ -945,7 +956,7 @@ int main(int argc, char **argv) {
// bis Ende der Sekunde vorspulen; allerdings Doppel-Frame alle 10 sek // bis Ende der Sekunde vorspulen; allerdings Doppel-Frame alle 10 sek
if (option_verbose < 3) { // && (regulare frame) // print_frame-return? if (option_verbose < 3) { // && (regulare frame) // print_frame-return?
while ( bitpos < 5*BITFRAME_LEN ) { 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; if ( bitQ == EOF) break;
bitpos++; bitpos++;
} }

Wyświetl plik

@ -1209,6 +1209,7 @@ int main(int argc, char *argv[]) {
int symlen = 1; int symlen = 1;
int bitofs = 2; int bitofs = 2;
int shift = 0;
#ifdef CYGWIN #ifdef CYGWIN
@ -1261,6 +1262,15 @@ int main(int argc, char *argv[]) {
} }
else return -1; 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 { else {
fp = fopen(*argv, "rb"); fp = fopen(*argv, "rb");
if (fp == NULL) { if (fp == NULL) {
@ -1291,8 +1301,9 @@ int main(int argc, char *argv[]) {
symlen = 1; symlen = 1;
bitofs += shift;
headerlen = strlen(header); headerlen = strlen(header);
bitofs = 2; // +1 .. +2
K = init_buffers(header, headerlen, 2); // shape=2 K = init_buffers(header, headerlen, 2); // shape=2
if ( K < 0 ) { if ( K < 0 ) {
fprintf(stderr, "error: init buffers\n"); fprintf(stderr, "error: init buffers\n");
@ -1301,14 +1312,15 @@ int main(int argc, char *argv[]) {
k = 0; 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; k += 1;
if (k >= K-4) { if (k >= K-4) {
mv0_pos = mv_pos; mv0_pos = mv_pos;
mp = getCorrDFT(0, K, 0, &mv, &mv_pos); mp = getCorrDFT(K, 0, &mv, &mv_pos);
k = 0; k = 0;
} }
else { else {
@ -1341,7 +1353,7 @@ int main(int argc, char *argv[]) {
ft_len = frmlen; ft_len = frmlen;
while ( byte_count < 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; if ( bitQ == EOF) break;
bit_count += 1; bit_count += 1;
bitbuf[bitpos] = bit; bitbuf[bitpos] = bit;
@ -1371,7 +1383,7 @@ int main(int argc, char *argv[]) {
header_found = 0; header_found = 0;
while ( bit_count < BITS*(FRAME_LEN-8+24) ) { 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; if ( bitQ == EOF) break;
bit_count++; bit_count++;
} }

Wyświetl plik

@ -1240,8 +1240,9 @@ int main(int argc, char *argv[]) {
float thres = 0.7; float thres = 0.7;
int bitofs = 0;
int symlen = 2; int symlen = 2;
int bitofs = 2; // +0 .. +3
int shift = 0;
#ifdef CYGWIN #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, "-g2") == 0) { option_vergps = 2; } // verbose2 GPS (bancroft)
else if (strcmp(*argv, "-gg") == 0) { option_vergps = 8; } // vverbose GPS else if (strcmp(*argv, "-gg") == 0) { option_vergps = 8; } // vverbose GPS
else if (strcmp(*argv, "--ecc") == 0) { option_ecc = 1; } 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, "--ch2") == 0) { wav_channel = 1; } // right channel (default: 0=left)
else if (strcmp(*argv, "--ths") == 0) { else if (strcmp(*argv, "--ths") == 0) {
++argv; ++argv;
@ -1351,6 +1352,15 @@ int main(int argc, char *argv[]) {
} }
else return -1; 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 { else {
if (!rawin) fp = fopen(*argv, "rb"); if (!rawin) fp = fopen(*argv, "rb");
else fp = fopen(*argv, "r"); else fp = fopen(*argv, "r");
@ -1405,8 +1415,9 @@ int main(int argc, char *argv[]) {
symlen = 2; symlen = 2;
bitofs += shift;
headerlen = strlen(rawheader); headerlen = strlen(rawheader);
bitofs = 2; // +1 .. +2
K = init_buffers(rawheader, headerlen, 2); // shape=2 K = init_buffers(rawheader, headerlen, 2); // shape=2
if ( K < 0 ) { if ( K < 0 ) {
fprintf(stderr, "error: init buffers\n"); fprintf(stderr, "error: init buffers\n");
@ -1414,14 +1425,15 @@ int main(int argc, char *argv[]) {
}; };
k = 0; 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; k += 1;
if (k >= K-4) { if (k >= K-4) {
mv0_pos = mv_pos; mv0_pos = mv_pos;
mp = getCorrDFT(0, K, 0, &mv, &mv_pos); mp = getCorrDFT(K, 0, &mv, &mv_pos);
k = 0; k = 0;
} }
else { else {
@ -1451,8 +1463,7 @@ int main(int argc, char *argv[]) {
bitpos = 0; bitpos = 0;
while ( byte_count < FRAME_LEN ) { while ( byte_count < FRAME_LEN ) {
header_found = !(byte_count>=FRAME_LEN-2); bitQ = read_sbit(fp, symlen, &bit, option_inv, bitofs, bit_count==0); // symlen=2
bitQ = read_sbit(fp, symlen, &bit, option_inv, bitofs, bit_count==0, !header_found); // symlen=2, return: zeroX/bit
if ( bitQ == EOF) break; if ( bitQ == EOF) break;
bit_count += 1; bit_count += 1;
bitbuf[bitpos] = bit; bitbuf[bitpos] = bit;