coarse freq estimator checks out between Octave and C - next step is build up an...
authordrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Sat, 17 Mar 2018 21:01:11 +0000 (21:01 +0000)
committerdrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Sat, 17 Mar 2018 21:01:11 +0000 (21:01 +0000)
git-svn-id: https://svn.code.sf.net/p/freetel/code@3413 01035d8c-6547-0410-b346-abe4f91aad63

codec2-dev/octave/ofdm_lib.m
codec2-dev/octave/tofdm.m
codec2-dev/src/ofdm.c
codec2-dev/unittest/tofdm.c

index c83e3423ba7bedd5dac969d236a42494e734add5..a71481da9ce36d482c97a69850429fb745060973 100644 (file)
@@ -78,7 +78,12 @@ function [t_est foff_est] = coarse_sync(states, rx, rate_fs_pilot_samples)
 
     corr = abs(corr1) + abs(corr2);
     [mx t_est] = max(corr);
+
     #{
+    % original freq offset est code that never made it into C.  Have some concerns about CPU
+    % load of performing FFT, althout a smaller one could have been used with interpolation
+    % to get the peak
+    
     C  = abs(fft(rx(t_est:t_est+Npsam-1) .* conj(rate_fs_pilot_samples), Fs));
     C += abs(fft(rx(t_est+Nsamperframe:t_est+Nsamperframe+Npsam-1) .* conj(rate_fs_pilot_samples), Fs));
 
@@ -91,6 +96,7 @@ function [t_est foff_est] = coarse_sync(states, rx, rate_fs_pilot_samples)
     else
       foff_est = foff_est_neg - fmax - 1;
     end
+    
     #}
 
     p1 = rx(t_est:t_est+Npsam/2-1) * rate_fs_pilot_samples(1:Npsam/2)';
@@ -306,7 +312,7 @@ function [rx_bits states aphase_est_pilot_log rx_np rx_amp] = ofdm_demod(states,
     st = M+Ncp + Nsamperframe + 1 - floor(ftwindow_width/2) + (timing_est-1);
     en = st + Nsamperframe-1 + M+Ncp + ftwindow_width-1;
           
-    ft_est = coarse_sync(states, rxbuf(st:en) .* exp(-j*woff_est*(st:en)), rate_fs_pilot_samples);
+    [ft_est coarse_foff_est_hz] = coarse_sync(states, rxbuf(st:en) .* exp(-j*woff_est*(st:en)), rate_fs_pilot_samples);
     timing_est = timing_est + ft_est - ceil(ftwindow_width/2);
 
     if verbose > 1
@@ -443,6 +449,7 @@ function [rx_bits states aphase_est_pilot_log rx_np rx_amp] = ofdm_demod(states,
   states.sample_point = sample_point;
   states.delta_t = delta_t;
   states.foff_est_hz = foff_est_hz;
+  states.coarse_foff_est_hz = coarse_foff_est_hz;
 endfunction
 
 
index 7d5747ac2bc891a9007d258b068e2c6a38cc4769..f7f153810a5e65349979049e2fbbff8cc8617ad3 100644 (file)
@@ -1,7 +1,7 @@
 % tofdm.m
 % David Rowe and Steve Sampson June 2017
 %
-% Octave script for comparing Octave and C versions of OFDZM modem
+% Octave script for comparing Octave and C versions of OFDM modem
 
 % ------------------------------------------------------------------
 
@@ -48,7 +48,7 @@ states.rxbuf(Nrxbuf-nin+1:Nrxbuf) = rx_log(prx:nin);
 prx += nin;
 
 rxbuf_log = []; rxbuf_in_log = []; rx_sym_log = []; foff_hz_log = []; 
-timing_est_log = []; sample_point_log = []; 
+timing_est_log = []; coarse_foff_est_hz_log = []; sample_point_log = []; 
 phase_est_pilot_log = []; rx_amp_log = [];
 rx_np_log = []; rx_bits_log = [];
 
@@ -87,6 +87,7 @@ for f=1:Nframes
   rx_amp_log = [rx_amp_log arx_amp];
   foff_hz_log = [foff_hz_log; states.foff_est_hz];
   timing_est_log = [timing_est_log; states.timing_est];
+  coarse_foff_est_hz_log = [coarse_foff_est_hz_log; states.coarse_foff_est_hz];
   sample_point_log = [sample_point_log; states.sample_point];
   rx_np_log = [rx_np_log arx_np];
   rx_bits_log = [rx_bits_log rx_bits];
@@ -99,6 +100,7 @@ end
 
 % Override default path by setting path_to_tofdm = "/your/path/to/tofdm"
 
+printf("\nRunning C version....\n");
 if exist("path_to_tofdm", "var") == 0
    path_to_tofdm = "../build_linux/unittest/tofdm";
 end
@@ -153,6 +155,7 @@ check(rx_sym_log, rx_sym_log_c, 'rx_sym', tol=5E-3);
 check(phase_est_pilot_log, phase_est_pilot_log_c, 'phase_est_pilot', tol=2E-3, its_an_angle=1);
 check(rx_amp_log, rx_amp_log_c, 'rx_amp');
 check(timing_est_log, timing_est_log_c, 'timing_est');
+check(coarse_foff_est_hz_log, coarse_foff_est_hz_log_c, 'coarse_foff_est_hz');
 check(sample_point_log, sample_point_log_c, 'sample_point');
 check(foff_hz_log, foff_hz_log_c, 'foff_est_hz');
 check(rx_bits_log, rx_bits_log_c, 'rx_bits');
index e128f911dee3e174268e413b9884ad93ae3a5221..6b2d696d826c9888a2304fc8c04a21297cb6ec96 100644 (file)
@@ -198,14 +198,14 @@ static int coarse_sync(struct OFDM *ofdm, complex float *rx, int length, float *
         /* pilot at start of frame */
         
         p1 = p1 + (rx[t_est + j] * csam1);
-        p2 = p2 + (rx[t_est + k] * csam1);
+        p2 = p2 + (rx[t_est + k] * csam2);
 
         /* pilot at end of frame */
         
-        p3 = p3 + (rx[t_est + j + SFrame] * csam2);
+        p3 = p3 + (rx[t_est + j + SFrame] * csam1);
         p4 = p4 + (rx[t_est + k + SFrame] * csam2);
     }
-
+    
     /* Calculate sample rate of phase samples, we are sampling phase
        of pilot at half a symbol intervals */
     
@@ -217,7 +217,7 @@ static int coarse_sync(struct OFDM *ofdm, complex float *rx, int length, float *
        with 0 inputs. */
     
     *foff_est = Fs1 * cargf(conjf(p1)*p2 + conjf(p3)*p4 + 1E-12)/(2.0*M_PI);
-   
+  
     return t_est;
 }
 
@@ -506,7 +506,7 @@ void ofdm_demod(struct OFDM *ofdm, int *rx_bits, COMP *rxbuf_in) {
 
         /* note coarse sync just used for timing est, we dont use coarse_foff_est in this call */
         
-        ft_est = coarse_sync(ofdm, work, (en - st), &coarse_foff_est);
+        ft_est = coarse_sync(ofdm, work, (en - st), &ofdm->coarse_foff_est_hz);
         ofdm->timing_est += (ft_est - ceilf(OFDM_FTWINDOWWIDTH / 2));
 
         if (ofdm->verbose > 1) {
index 9a39d610d9b293c2e15edc90675db7bcb48a44ab..b790292a2fcbca558f88a4c90e7ccfee02d468b3 100644 (file)
@@ -138,8 +138,9 @@ int main(int argc, char *argv[])
     float          rx_amp_log[OFDM_ROWSPERFRAME*OFDM_NC*NFRAMES];
     float          foff_hz_log[NFRAMES];
     int            rx_bits_log[OFDM_BITSPERFRAME*NFRAMES];
-    int            timing_est_log[OFDM_BITSPERFRAME*NFRAMES];
-    int            sample_point_log[OFDM_BITSPERFRAME*NFRAMES];
+    int            timing_est_log[NFRAMES];
+    float          coarse_foff_est_hz_log[NFRAMES];
+    int            sample_point_log[NFRAMES];
 
     FILE          *fout;
     int            f,i,j;
@@ -270,6 +271,7 @@ int main(int argc, char *argv[])
 
         foff_hz_log[f] = ofdm->foff_est_hz;
         timing_est_log[f] = ofdm->timing_est + 1;     /* offset by 1 to match Octave */
+        coarse_foff_est_hz_log[f] = ofdm->coarse_foff_est_hz;
         sample_point_log[f] = ofdm->sample_point + 1; /* offset by 1 to match Octave */
 
         memcpy(&rx_bits_log[OFDM_BITSPERFRAME*f], rx_bits, sizeof(rx_bits));
@@ -294,6 +296,7 @@ int main(int argc, char *argv[])
     octave_save_float(fout, "rx_amp_log_c", (float*)rx_amp_log, 1, OFDM_ROWSPERFRAME*OFDM_NC*NFRAMES, OFDM_ROWSPERFRAME*OFDM_NC*NFRAMES);
     octave_save_float(fout, "foff_hz_log_c", foff_hz_log, NFRAMES, 1, 1);
     octave_save_int(fout, "timing_est_log_c", timing_est_log, NFRAMES, 1);
+    octave_save_float(fout, "coarse_foff_est_hz_log_c", coarse_foff_est_hz_log, NFRAMES, 1, 1);
     octave_save_int(fout, "sample_point_log_c", sample_point_log, NFRAMES, 1);
     octave_save_complex(fout, "rx_np_log_c", (COMP*)rx_np_log, 1, OFDM_ROWSPERFRAME*OFDM_NC*NFRAMES, OFDM_ROWSPERFRAME*OFDM_NC*NFRAMES);
     octave_save_int(fout, "rx_bits_log_c", rx_bits_log, 1, OFDM_BITSPERFRAME*NFRAMES);