debugged freq offset correction issue
authordrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Thu, 10 Jul 2014 01:54:21 +0000 (01:54 +0000)
committerdrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Thu, 10 Jul 2014 01:54:21 +0000 (01:54 +0000)
git-svn-id: https://svn.code.sf.net/p/freetel/code@1749 01035d8c-6547-0410-b346-abe4f91aad63

codec2-dev/octave/fdmdv_demod.m
codec2-dev/octave/fdmdv_demod_c.m
codec2-dev/octave/fdmdv_ut.m
codec2-dev/src/fdmdv.c
codec2-dev/src/fdmdv_mod.c

index 53a303acad21f533f20e4f7a7d3a0960de76cd89..704ac2317f897f3c255169348017ae4bd5d08009 100644 (file)
@@ -48,12 +48,12 @@ function fdmdv_demod(rawfilename, nbits, NumCarriers, errorpatternfilename, symb
 
   nin = M;                 % timing correction for sample rate differences
   foff = 0;
-  track_log = [];
-  track = 0;
+
   fest_state = 0;
-  bad_sync = 0;
-  sync_track = 0;
-  entered_track_log = [];
+  fest_timer = 0;
+  sync_mem = zeros(1,Nsync_mem);
+  sync = 0;
+  sync_log = [];
 
   % spectrum states
 
@@ -94,8 +94,8 @@ function fdmdv_demod(rawfilename, nbits, NumCarriers, errorpatternfilename, symb
     [pilot prev_pilot pilot_lut_index prev_pilot_lut_index] = get_pilot(pilot_lut_index, prev_pilot_lut_index, nin);
     [foff_coarse S1 S2] = rx_est_freq_offset(rx_fdm, pilot, prev_pilot, nin);
     
-    if track == 0
-      foff  = foff_coarse = 0;
+    if sync == 0
+      foff  = foff_coarse;
     end
     foff_log = [ foff_log foff ];
     foff_rect = exp(j*2*pi*foff/Fs);
@@ -110,7 +110,7 @@ function fdmdv_demod(rawfilename, nbits, NumCarriers, errorpatternfilename, symb
     rx_baseband = fdm_downconvert(rx_fdm, nin);
     rx_filt = rx_filter(rx_baseband, nin);
 
-    [rx_symbols rx_timing] = rx_est_timing(rx_filt, rx_baseband, nin);
+    [rx_symbols rx_timing] = rx_est_timing(rx_filt, nin);
 
     rx_timing_log = [rx_timing_log rx_timing];
     nin = M;
@@ -126,7 +126,7 @@ function fdmdv_demod(rawfilename, nbits, NumCarriers, errorpatternfilename, symb
     else
       rx_symbols_log = [rx_symbols_log rx_symbols];
     endif
-    [rx_bits sync f_err pd] = psk_to_bits(prev_rx_symbols, rx_symbols, modulation);
+    [rx_bits sync_bit f_err pd] = psk_to_bits(prev_rx_symbols, rx_symbols, modulation);
 
     % optionally save output symbols 
 
@@ -163,16 +163,11 @@ function fdmdv_demod(rawfilename, nbits, NumCarriers, errorpatternfilename, symb
     snr_est_log = [snr_est_log snr_est];
     foff -= 0.5*f_err;
     prev_rx_symbols = rx_symbols;
-    sync_log = [sync_log sync];
 
     % freq est state machine
 
-    [entered_track track fest_state bad_sync] = freq_state(sync, fest_state, bad_sync);
-    track_log = [track_log track];
-    if (entered_track == 1)
-        sync_track = 1;
-    end
-    entered_track_log = [entered_track_log entered_track];
+    [sync reliable_sync_bit fest_state fest_timer sync_mem] = freq_state(sync_bit, fest_state, fest_timer, sync_mem);
+    sync_log = [sync_log sync];
 
     % count bit errors if we find a test frame
 
@@ -254,7 +249,7 @@ function fdmdv_demod(rawfilename, nbits, NumCarriers, errorpatternfilename, symb
   subplot(212)
   plot(xt, foff_log, '-;freq offset;')
   hold on;
-  plot(xt, track_log*75, 'r;course-fine;');
+  plot(xt, sync_log*75, 'r;course-fine;');
   hold off;
   title('Freq offset (Hz)');
   grid
index d63f85109b584f90b3c1db5ee9d22f263674855f..98b571b3588f60e697549649ca29eeec5f24726d 100644 (file)
@@ -91,7 +91,7 @@ function fdmdv_demod_c(dumpfilename, bits)
   subplot(212)
   plot(xt, foff_log_c(1:frames), '-;freq offset;')
   hold on;
-  plot(xt, coarse_fine_log_c(1:frames)*75, 'r;course-fine;');
+  plot(xt, sync_log_c(1:frames)*75, 'r;course-fine;');
   hold off;
   title('Freq offset (Hz)');
   grid
index 19b8c0b0e96e1861d3e34c682f9cb590cafadeb5..398c82232e635f6e414807a2c5c0757966849b2b 100644 (file)
@@ -14,7 +14,7 @@ fdmdv;               % load modem code
 
 frames = 100;
 EbNo_dB = 7.3;
-Foff_hz = 10;
+Foff_hz = -100;
 modulation = 'dqpsk';
 hpa_clip = 150;
 
index 835b514c92ca3bdc3af3d5b1ccb61f263b483885..aba531140a51a01bef21e4056c1e22dbf8c9e056 100644 (file)
@@ -1380,7 +1380,7 @@ void fdmdv_demod(struct FDMDV *fdmdv, int rx_bits[],
        
     /* baseband processing */
 
-    down_convert_and_rx_filter(rx_filt, fdmdv->Nc, rx_fdm, fdmdv->rx_fdm_mem, fdmdv->phase_rx, fdmdv->freq, 
+    down_convert_and_rx_filter(rx_filt, fdmdv->Nc, rx_fdm_fcorr, fdmdv->rx_fdm_mem, fdmdv->phase_rx, fdmdv->freq, 
                                fdmdv->freq_pol, *nin);
     fdmdv->rx_timing = rx_est_timing(rx_symbols, fdmdv->Nc, rx_filt, fdmdv->rx_filter_mem_timing, env, *nin);   
     
index 22318db878d3cb02c87542b4e35a7764eabb84b6..de2d578dadb1be83d530eec0db3bd2ff572ab9ec 100644 (file)
@@ -53,6 +53,8 @@ int main(int argc, char *argv[])
     int           bits_per_codec_frame;
     int           bytes_per_codec_frame;
     int           Nc;
+    COMP          foff_phase_rect;
+    float         foff;
 
     if (argc < 3) {
        printf("usage: %s InputBitFile OutputModemRawFile [Nc]\n", argv[0]);
@@ -100,6 +102,9 @@ int main(int argc, char *argv[])
     tx_bits = (int*)malloc(sizeof(int)*bits_per_codec_frame);
     assert(tx_bits != NULL);
 
+    foff = -100;
+    foff_phase_rect.real = 1.0; foff_phase_rect.imag = 0.0; 
+
     frames = 0;
 
     while(fread(packed_bits, sizeof(char), bytes_per_codec_frame, fin) == bytes_per_codec_frame) {
@@ -126,6 +131,10 @@ int main(int argc, char *argv[])
        fdmdv_mod(fdmdv, &tx_fdm[FDMDV_NOM_SAMPLES_PER_FRAME], &tx_bits[bits_per_fdmdv_frame], &sync_bit);
        assert(sync_bit == 0);
 
+        /* optional frequency offset */
+
+        fdmdv_freq_shift(tx_fdm, tx_fdm, foff, &foff_phase_rect, 2*FDMDV_NOM_SAMPLES_PER_FRAME);
+
        /* scale and save to disk as shorts */
 
        for(i=0; i<2*FDMDV_NOM_SAMPLES_PER_FRAME; i++)