diff --git a/lib/wsprd/wsprd_exp.c b/lib/wsprd/wsprd_exp.c index ad6449763..558449f59 100644 --- a/lib/wsprd/wsprd_exp.c +++ b/lib/wsprd/wsprd_exp.c @@ -326,8 +326,10 @@ void sync_and_demodulate(double *id, double *qd, long np, } return; } -//*************************************************************************** -void subtract_signal(double *id, double *qd, long np, +/*************************************************************************** +symbol-by-symbol signal subtraction +****************************************************************************/ + void subtract_signal(double *id, double *qd, long np, float f0, int shift0, float drift0, unsigned char* channel_symbols) { float dt=1.0/375.0, df=375.0/256.0; @@ -364,10 +366,12 @@ void subtract_signal(double *id, double *qd, long np, } } + // subtract the signal here. i0=i0/256.0; //will be wrong for partial symbols at the edges... q0=q0/256.0; + for (j=0; j<256; j++) { k=shift0+i*256+j; if( (k>0) & (k0) & (k0) & (k path to writeable data files, default=\".\"\n"); + printf(" -c write .c2 file at the end of the first pass\n"); printf(" -e x (x is transceiver dial frequency error in Hz)\n"); printf(" -f x (x is transceiver dial frequency in MHz)\n"); // blanking is not yet implemented. The options are accepted for compatibility @@ -425,7 +516,6 @@ void usage(void) // printf(" -b n (n is pct of time that is blanked)\n"); printf(" -H do not use (or update) the hash table\n"); printf(" -m decode wspr-15 .wav file\n"); - printf(" -n write noise estimates to file noise.dat\n"); printf(" -q quick mode - doesn't dig deep for weak signals\n"); printf(" -s signal subtraction mode\n"); printf(" -t signal subtraction followed by a second pass\n"); @@ -449,7 +539,8 @@ int main(int argc, char *argv[]) char timer_fname[200],hash_fname[200]; char uttime[5],date[7]; int c,delta,maxpts=65536,verbose=0,quickmode=0; - int writenoise=0,usehashtable=1,wspr_type=2, subtraction=0, ipass, npasses=1; + int writenoise=0,usehashtable=1,wspr_type=2, subtraction=0, ipass; + int writec2=0, npasses=1; int shift1, lagmin, lagmax, lagstep, worth_a_try, not_decoded; unsigned int nbits=81; unsigned int npoints, metric, maxcycles, cycles, maxnp; @@ -478,7 +569,7 @@ int main(int argc, char *argv[]) char allcalls[100][13]; memset(allfreqs,0,sizeof(float)*100); memset(allcalls,0,sizeof(char)*100*13); - + int uniques=0, noprint=0; // Parameters used for performance-tuning: @@ -501,11 +592,14 @@ int main(int argc, char *argv[]) idat=malloc(sizeof(double)*maxpts); qdat=malloc(sizeof(double)*maxpts); - while ( (c = getopt(argc, argv, "a:b:e:f:Hmnqstwvz:")) !=-1 ) { + while ( (c = getopt(argc, argv, "a:ce:f:Hmqstwvz:")) !=-1 ) { switch (c) { case 'a': data_dir = optarg; break; + case 'c': + writec2=1; + break; case 'e': dialfreq_error = strtof(optarg,NULL); // units of Hz // dialfreq_error = dial reading - actual, correct frequency @@ -519,17 +613,14 @@ int main(int argc, char *argv[]) case 'm': wspr_type = 15; break; - case 'n': - writenoise = 1; - break; case 'q': quickmode = 1; break; case 's': - subtraction = 1; + subtraction = 1; //subtraction only, no second pass break; case 't': - subtraction = 1; + subtraction = 1; //subtraction and a second pass (t for two) npasses = 2; //npasses defaults to 1 break; case 'v': @@ -654,6 +745,14 @@ int main(int argc, char *argv[]) //*************** main loop starts here ***************** for (ipass=0; ipass minsync2) && (rms > minrms)) { deinterleave(symbols); t0 = clock(); - + not_decoded = fano(&metric,&cycles,&maxnp,decdata,symbols,nbits, mettab,delta,maxcycles); tfano += (double)(clock()-t0)/CLOCKS_PER_SEC; @@ -927,9 +1025,9 @@ int main(int argc, char *argv[]) } if( worth_a_try && !not_decoded ) { - + for(i=0; i<11; i++) { - + if( decdata[i]>127 ) { message[i]=decdata[i]-256; } else { @@ -943,12 +1041,12 @@ int main(int argc, char *argv[]) // call_loc_pow string and also callsign (for de-duping). noprint=unpk_(message,hashtab,call_loc_pow,callsign); - if( subtraction && !noprint ) { - - unsigned char channel_symbols[162]; + if( subtraction && (ipass == 0) && !noprint ) { + unsigned char channel_symbols[162]; + if( get_wspr_channel_symbols(call_loc_pow, channel_symbols) ) { - subtract_signal(idat, qdat, npoints, f1, shift1, drift1, channel_symbols); + subtract_signal2(idat, qdat, npoints, f1, shift1, drift1, channel_symbols); } else { break; } @@ -965,7 +1063,7 @@ int main(int argc, char *argv[]) strcpy(allcalls[uniques],callsign); allfreqs[uniques]=f1; uniques++; - + // Add an extra space at the end of each line so that wspr-x doesn't // truncate the power (TNX to DL8FCL!) @@ -1002,6 +1100,15 @@ int main(int argc, char *argv[]) } } } + + if( ipass == 0 && writec2 ) { + char c2filename[15]; + double carrierfreq=dialfreq; + int wsprtype=2; + strcpy(c2filename,"000000_0001.c2"); + printf("Writing %s\n",c2filename); + writec2file(c2filename, wsprtype, carrierfreq, idat, qdat); + } } printf("\n"); @@ -1048,13 +1155,6 @@ int main(int argc, char *argv[]) fclose(fhash); } -// char c2filename[15]; -// double carrierfreq=dialfreq; -// int wsprtype=2; -// strcpy(c2filename,"000000_0001.c2"); -// printf("Writing %s\n",c2filename); -// writec2file(c2filename, wsprtype, carrierfreq, idat, qdat); - if(writenoise == 999) return -1; //Silence compiler warning return 0; } diff --git a/lib/wsprd/wsprd_utils.c b/lib/wsprd/wsprd_utils.c index 9cd757b62..4dea677ce 100644 --- a/lib/wsprd/wsprd_utils.c +++ b/lib/wsprd/wsprd_utils.c @@ -66,7 +66,7 @@ void unpack50( signed char *dat, int32_t *n1, int32_t *n2 ) *n2=*n2+((i4>>6)&3); } -void unpackcall( int32_t ncall, char *call ) +int unpackcall( int32_t ncall, char *call ) { char c[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E', 'F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T', @@ -108,10 +108,13 @@ void unpackcall( int32_t ncall, char *call ) call[i]='\0'; } } + } else { + return 0; } + return 1; } -void unpackgrid( int32_t ngrid, char *grid) +int unpackgrid( int32_t ngrid, char *grid) { char c[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E', 'F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T', @@ -139,7 +142,9 @@ void unpackgrid( int32_t ngrid, char *grid) grid[3]=c[n2]; } else { strcpy(grid,"XXXX"); + return 0; } + return 1; } int unpackpfx( int32_t nprefix, char *call) @@ -233,8 +238,8 @@ int unpk_(signed char *message, char hashtab[32768][13], char *call_loc_pow, cha char grid[5],grid6[7],cdbm[3]; unpack50(message,&n1,&n2); - unpackcall(n1,callsign); - unpackgrid(n2, grid); + if( !unpackcall(n1,callsign) ) return 1; + if( !unpackgrid(n2, grid) ) return 1; int ntype = (n2&127) - 64; callsign[12]=0; grid[4]=0; diff --git a/lib/wsprd/wsprd_utils.h b/lib/wsprd/wsprd_utils.h index 71299b330..c86f7ec85 100644 --- a/lib/wsprd/wsprd_utils.h +++ b/lib/wsprd/wsprd_utils.h @@ -12,9 +12,9 @@ void unpack50( signed char *dat, int32_t *n1, int32_t *n2 ); -void unpackcall( int32_t ncall, char *call ); +int unpackcall( int32_t ncall, char *call ); -void unpackgrid( int32_t ngrid, char *grid); +int unpackgrid( int32_t ngrid, char *grid); int unpackpfx( int32_t nprefix, char *call); diff --git a/lib/wsprd/wsprsim.c b/lib/wsprd/wsprsim.c index 54189686c..f262d7ef3 100644 --- a/lib/wsprd/wsprsim.c +++ b/lib/wsprd/wsprsim.c @@ -133,7 +133,6 @@ int main(int argc, char *argv[]) message=malloc(sizeof(char)*23); strcpy(c2filename,"000000_0001.c2"); - printf("%s\n",c2filename); while ( (c = getopt(argc, argv, "cdo:s:")) !=-1 ) { switch (c) { case 'c': diff --git a/lib/wsprd/wsprsim_utils.c b/lib/wsprd/wsprsim_utils.c index 211065582..06e2a53e6 100644 --- a/lib/wsprd/wsprsim_utils.c +++ b/lib/wsprd/wsprsim_utils.c @@ -84,7 +84,6 @@ void pack_prefix(char *callsign, int32_t *n, int32_t *m, int32_t *nadd ) { char *call6; call6=malloc(sizeof(char)*6); memset(call6,32,sizeof(char)*6); - int i1=strcspn(callsign,"/"); if( callsign[i1+2] == 0 ) { @@ -200,10 +199,9 @@ int get_wspr_channel_symbols(char* rawmessage, unsigned char* symbols) { if( (i1>3) & (i1<7) & (i2==mlen) & (i3==mlen) ) { // Type 1 message: K9AN EN50 33 // xxnxxxx xxnn nn - const char s[2]=" "; - callsign = strtok(message,s); - grid = strtok(NULL,s); - powstr = strtok(NULL,s); + callsign = strtok(message," "); + grid = strtok(NULL," "); + powstr = strtok(NULL," "); int power = atoi(powstr); n = pack_call(callsign); @@ -239,6 +237,7 @@ int get_wspr_channel_symbols(char* rawmessage, unsigned char* symbols) { } else if ( i2 < mlen ) { // just looks for a right slash // Type 2: PJ4/K1ABC 37 callsign=strtok(message," "); + if( strlen(callsign) < i2 ) return 0; //guards against pathological case powstr=strtok(NULL," "); int power = atoi(powstr); if( power < 0 ) power=0; @@ -250,7 +249,6 @@ int get_wspr_channel_symbols(char* rawmessage, unsigned char* symbols) { m=128*ng+ntype+64; n=n1; } else { -// printf("Error: bad message format\n"); return 0; }