extended the number of frames NSW to provide more reliable sync, seems to be working OK
authordrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Tue, 23 Jun 2015 02:38:59 +0000 (02:38 +0000)
committerdrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Tue, 23 Jun 2015 02:38:59 +0000 (02:38 +0000)
git-svn-id: https://svn.code.sf.net/p/freetel/code@2211 01035d8c-6547-0410-b346-abe4f91aad63

codec2-dev/CMakeLists.txt
codec2-dev/octave/cohpsk.m
codec2-dev/octave/tcohpsk.m
codec2-dev/src/codec2_cohpsk.h
codec2-dev/src/cohpsk.c
codec2-dev/src/cohpsk_demod.c
codec2-dev/src/cohpsk_internal.h
codec2-dev/src/freedv_api.c
codec2-dev/src/freedv_rx.c
codec2-dev/unittest/tcohpsk.c

index 2745e11659eeee42c90b189fc6e877ddd4c1dc6f..3e6df371ae94e67a2a6fd15a4d23e565824f9012 100644 (file)
@@ -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)
index fdeb93576bedb4f870ff954fd8b24c20ba5c7233..34abfa7d6e4d5ba7d200c87da95236a63401d7e5 100644 (file)
@@ -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;
index e6fb60fa899de0b6b8bb48935d6bd58dbf5f6ddd..03eecacea16f1f68d5bee1d72cfd7fd9455c7d96 100644 (file)
@@ -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;
index c8d6d2501fe9b19f72034dd1a928df0de79a4e26..126b9760da1f4022fbc0a698dc67d8a05b16a2cd 100644 (file)
@@ -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
index cda8a727763c13d54ff26d35ffeaf19dc1d6747e..293af6a988cdcf3f0c44ff431e65546ec665fff0 100644 (file)
@@ -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()      
index eb75543929ce33cf3074734039ebb7cdfc6b2d63..fcac69d2db119b40e392c9f0f239281764e2d57c 100644 (file)
@@ -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 */
 
index ca2304cffcb57a7c269a6e1109489f596d57debb..f099573fffa7e86859ce27f672655422b872b7e4 100644 (file)
@@ -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
index 9b8701627e0e6f9852f47ad0e809a9e904622e5e..1accad2692a3552797d9c7ee6931913a89315aca 100644 (file)
@@ -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;
 }
 
index ffc499b611b01b1e10342e6664c3731b37fd98b8..3aac5caf9892ac36962e050cfc2fbbd275ae1cc5 100644 (file)
@@ -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);
index 6459946ed519dc464f0c24ff6c763343063ee58e..d92e98dc003bed35d333ece63329f80ae8e4e3a2 100644 (file)
@@ -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<NSYMROWPILOT*COHPSK_M; r++) {
             foff_rect.real = cos(2.0*M_PI*foff/COHPSK_FS); foff_rect.imag = sin(2.0*M_PI*foff/COHPSK_FS);
             foff += DFOFF;
@@ -171,6 +171,12 @@ int main(int argc, char *argv[])
             ch_fdm_frame[r] = cadd(ch_fdm_frame[r], scaled_noise);
         }
 
+        /* optional gain to test level sensitivity */
+
+        for(r=0; r<NSYMROWPILOT*COHPSK_M; r++) {
+            ch_fdm_frame[r] = fcmult(1.0, ch_fdm_frame[r]);
+        }
+
         /* tx vector logging */
 
        memcpy(&tx_bits_log[COHPSK_BITS_PER_FRAME*f], tx_bits, sizeof(int)*COHPSK_BITS_PER_FRAME);