From: drowe67 Date: Tue, 23 Jun 2015 02:38:59 +0000 (+0000) Subject: extended the number of frames NSW to provide more reliable sync, seems to be working OK X-Git-Url: http://git.whiteaudio.com/gitweb/?a=commitdiff_plain;h=665d5bf4fdd7256c7d13462b8ec381fd551968cb;p=freetel-svn-tracking.git extended the number of frames NSW to provide more reliable sync, seems to be working OK git-svn-id: https://svn.code.sf.net/p/freetel/code@2211 01035d8c-6547-0410-b346-abe4f91aad63 --- diff --git a/codec2-dev/CMakeLists.txt b/codec2-dev/CMakeLists.txt index 2745e116..3e6df371 100644 --- a/codec2-dev/CMakeLists.txt +++ b/codec2-dev/CMakeLists.txt @@ -53,7 +53,7 @@ endif() # Set default C++ flags. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall") -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -O2") +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -g -O2") # -fPIC is implied on MinGW... if(NOT WIN32) diff --git a/codec2-dev/octave/cohpsk.m b/codec2-dev/octave/cohpsk.m index fdeb9357..34abfa7d 100644 --- a/codec2-dev/octave/cohpsk.m +++ b/codec2-dev/octave/cohpsk.m @@ -568,6 +568,7 @@ function [next_sync cohpsk] = frame_sync_fine_freq_est(cohpsk, ch_symb, sync, ne max_corr = 0; for f_fine=-20:0.25:20 +% for f_fine=-1:0.25:1 f_fine_rect = exp(-j*f_fine*2*pi*sampling_points/Rs)'; % note: this could be pre-computed at init or compile time for t=0:cohpsk.Nsymbrowpilot-1 corr = 0; mag = 0; @@ -580,7 +581,7 @@ function [next_sync cohpsk] = frame_sync_fine_freq_est(cohpsk, ch_symb, sync, ne end corr += abs(acorr); end - %printf(" f: %f t: %d corr: %f mag: %f\n", f_fine, t, corr, mag); + %printf(" f: %f t: %d corr: %f mag: %f ratio: %f\n", f_fine, t, corr, mag, corr/mag); if corr >= max_corr max_corr = corr; max_mag = mag; diff --git a/codec2-dev/octave/tcohpsk.m b/codec2-dev/octave/tcohpsk.m index e6fb60fa..03eecace 100644 --- a/codec2-dev/octave/tcohpsk.m +++ b/codec2-dev/octave/tcohpsk.m @@ -93,8 +93,8 @@ end if strcmp(test, 'awgn') frames = 100; - foff = 0; - dfoff = -0/Fs; + foff = 58.7; + dfoff = -0.5/Fs; EsNodB = 8; fading_en = 0; hf_delay_ms = 2; @@ -106,9 +106,9 @@ end if strcmp(test, 'fading'); frames = 100; - foff = -10.5; - dfoff = 0.0/Fs; - EsNodB = 9; + foff = -25; + dfoff = 0.5/Fs; + EsNodB = 12; fading_en = 1; hf_delay_ms = 2; compare_with_c = 0; @@ -124,7 +124,7 @@ Nc = 7; % number of carriers Nd = 2; % diveristy factor framesize = 56; % number of payload data bits in the frame -Nsw = 3; % frames we demod for initial sync window +Nsw = 4; % frames we demod for initial sync window afdmdv.Nsym = 6; % size of tx/tx root nyquist filter in symbols afdmdv.Nt = 5; % number of symbols we estimate timing over @@ -362,11 +362,18 @@ while tin < length(ch_fdm_frame_log) %printf("tin: %f tout: %f f: %f\n", tin, tout, f); end ch_fdm_frame_log = ch_fdm_frame_log_out(1:tout-1); +%ch_fdm_frame_log *= 5000; %ch_fdm_frame_log = real(ch_fdm_frame_log); % Now run demod ---------------------------------------------------------------- +%ch_fdm_frame_log = load_raw("~/fdmdv2-dev/build_linux/tmp.raw"); +%ch_fdm_frame_log = ch_fdm_frame_log(M:length(ch_fdm_frame_log)); +%ch_fdm_frame_log /= 5000; + +%frames = floor(acohpsk.Nsymbrowpilot*M); + ch_fdm_frame_log_index = 1; nin = M; f = 0; @@ -398,6 +405,7 @@ for f=1:frames; max_ratio = 0; for acohpsk.f_est = Fcentre-40:40:Fcentre+40 +% for acohpsk.f_est = Fcentre printf(" [%d] acohpsk.f_est: %f +/- 20\n", f, acohpsk.f_est); @@ -642,7 +650,8 @@ else end plot(combined*exp(j*pi/4)/sqrt(Nd),'+') title('Scatter'); - axis([-2 2 -2 2]) + ymax = abs(max(max(combined))); + axis([-ymax ymax -ymax ymax]) figure(4) clf; diff --git a/codec2-dev/src/codec2_cohpsk.h b/codec2-dev/src/codec2_cohpsk.h index c8d6d250..126b9760 100644 --- a/codec2-dev/src/codec2_cohpsk.h +++ b/codec2-dev/src/codec2_cohpsk.h @@ -54,5 +54,6 @@ void cohpsk_set_verbose(struct COHPSK *coh, int verbose); void cohpsk_get_test_bits(struct COHPSK *coh, int rx_bits[]); void cohpsk_put_test_bits(struct COHPSK *coh, int *state, short error_pattern[], int *bit_errors, float rx_bits_sd[]); +void cohpsk_set_frame(struct COHPSK *coh, int frame); #endif diff --git a/codec2-dev/src/cohpsk.c b/codec2-dev/src/cohpsk.c index cda8a727..293af6a9 100644 --- a/codec2-dev/src/cohpsk.c +++ b/codec2-dev/src/cohpsk.c @@ -951,7 +951,7 @@ void cohpsk_demod(struct COHPSK *coh, float rx_bits[], int *sync_good, COMP rx_f coh->ch_fdm_frame_buf[i] = rx_fdm[j]; //printf("i: %d j: %d rx_fdm[0]: %f %f\n", i,j, rx_fdm[0].real, rx_fdm[0].imag); - /* if out of sync do Initial Freq offset estimation using NSW frames to flush out filter memories */ + /* if out of sync do Initial Freq offset estimation using NSW frames to flush out filter memories */ if (sync == 0) { @@ -1063,7 +1063,8 @@ void cohpsk_demod(struct COHPSK *coh, float rx_bits[], int *sync_good, COMP rx_f } coh->nin = nin; *nin_frame = (NSYMROWPILOT-1)*COHPSK_M + nin; - //printf("%f %d %d\n", coh->rx_timing, nin, *nin_frame); + //if (coh->verbose) + // fprintf(stderr, "%f %d %d\n", coh->rx_timing, nin, *nin_frame); } @@ -1142,6 +1143,13 @@ void cohpsk_set_verbose(struct COHPSK *coh, int verbose) } +void cohpsk_set_frame(struct COHPSK *coh, int frame) +{ + assert(coh != NULL); + coh->frame = frame; +} + + /*---------------------------------------------------------------------------*\ FUNCTION....: cohpsk_get_test_bits() diff --git a/codec2-dev/src/cohpsk_demod.c b/codec2-dev/src/cohpsk_demod.c index eb755439..fcac69d2 100644 --- a/codec2-dev/src/cohpsk_demod.c +++ b/codec2-dev/src/cohpsk_demod.c @@ -87,6 +87,7 @@ int main(int argc, char *argv[]) } cohpsk = cohpsk_create(); + cohpsk_set_verbose(cohpsk, 1); if (oct) { logframes = LOG_FRAMES; @@ -106,6 +107,7 @@ int main(int argc, char *argv[]) nin_frame = COHPSK_NOM_SAMPLES_PER_FRAME; while(fread(rx_fdm_scaled, sizeof(short), nin_frame, fin) == nin_frame) { frames++; + cohpsk_set_frame(cohpsk, frames); /* scale and demod */ diff --git a/codec2-dev/src/cohpsk_internal.h b/codec2-dev/src/cohpsk_internal.h index ca2304cf..f099573f 100644 --- a/codec2-dev/src/cohpsk_internal.h +++ b/codec2-dev/src/cohpsk_internal.h @@ -31,7 +31,7 @@ #define NCT_SYMB_BUF (2*NSYMROWPILOT+2) #define ND 2 /* diversity factor ND 1 is no diveristy, ND we have orginal plus one copy */ -#define NSW 3 /* number of sync window frames */ +#define NSW 4 /* number of sync window frames */ #define COHPSK_ND 2 /* diversity factor */ #define COHPSK_M 100 /* oversampling rate */ #define COHPSK_NSYM 6 diff --git a/codec2-dev/src/freedv_api.c b/codec2-dev/src/freedv_api.c index 9b870162..1accad26 100644 --- a/codec2-dev/src/freedv_api.c +++ b/codec2-dev/src/freedv_api.c @@ -682,8 +682,9 @@ int freedv_comprx(struct freedv *f, short speech_out[], COMP demod_in[]) { nout = f->n_speech_samples; //fprintf(stderr, "%d %d %d\n", f->n_speech_samples, speech_out[0], speech_out[nin_prev-1]); } + } - + return nout; } diff --git a/codec2-dev/src/freedv_rx.c b/codec2-dev/src/freedv_rx.c index ffc499b6..3aac5caf 100644 --- a/codec2-dev/src/freedv_rx.c +++ b/codec2-dev/src/freedv_rx.c @@ -83,9 +83,9 @@ int main(int argc, char *argv[]) { } freedv = freedv_open(mode); - if (mode == FREEDV_MODE_700) - cohpsk_set_verbose(freedv->cohpsk, 1); assert(freedv != NULL); + if (mode == FREEDV_MODE_700) + cohpsk_set_verbose(freedv->cohpsk, 0); if ( (argc > 4) && (strcmp(argv[4], "--testframes") == 0) ) { freedv->test_frames = 1; @@ -110,19 +110,20 @@ int main(int argc, char *argv[]) { nin = freedv_nin(freedv); while(fread(demod_in, sizeof(short), nin, fin) == nin) { + frame++; + cohpsk_set_frame(freedv->cohpsk, frame); + nout = freedv_rx(freedv, speech_out, demod_in); - fwrite(speech_out, sizeof(short), nout, fout); nin = freedv_nin(freedv); + fwrite(speech_out, sizeof(short), nout, fout); if (freedv->mode == FREEDV_MODE_1600) fdmdv_get_demod_stats(freedv->fdmdv, &freedv->stats); if (freedv->mode == FREEDV_MODE_700) cohpsk_get_demod_stats(freedv->cohpsk, &freedv->stats); - - /* log some side info to the txt file */ - frame++; - /* + /* log some side info to the txt file */ + /* if (ftxt != NULL) { fprintf(ftxt, "frame: %d demod sync: %d demod snr: %3.2f dB bit errors: %d\n", frame, freedv->stats.sync, freedv->stats.snr_est, freedv->total_bit_errors); diff --git a/codec2-dev/unittest/tcohpsk.c b/codec2-dev/unittest/tcohpsk.c index 6459946e..d92e98dc 100644 --- a/codec2-dev/unittest/tcohpsk.c +++ b/codec2-dev/unittest/tcohpsk.c @@ -105,6 +105,7 @@ int main(int argc, char *argv[]) coh = cohpsk_create(); fdmdv = coh->fdmdv; assert(coh != NULL); + cohpsk_set_verbose(coh, 1); /* these puppies are used for logging data in the bowels on the modem */ @@ -156,7 +157,6 @@ int main(int argc, char *argv[]) Channel \*---------------------------------------------------------*/ - for(r=0; r