small constant to prevent instability in freq offset est atan()
authordrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Wed, 21 Jun 2017 21:21:39 +0000 (21:21 +0000)
committerdrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Wed, 21 Jun 2017 21:21:39 +0000 (21:21 +0000)
git-svn-id: https://svn.code.sf.net/p/freetel/code@3234 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 323fbfde7b60eebee45430e436c913ef6d51bf31..6d6b827dfb84d0b078a8232e0431eab38a988680 100644 (file)
@@ -331,6 +331,12 @@ function [rx_bits states aphase_est_pilot_log rx_np rx_amp] = ofdm_demod(states,
       
   if foff_est_en
     freq_err_rect = sum(rx_sym(2,:))' * sum(rx_sym(2+Ns,:));
+
+    % prevent instability in atan(im/re) when real part near 0 
+
+    freq_err_rect += 1E-6;
+
+    %printf("freq_err_rect: %f %f angle: %f\n", real(freq_err_rect), imag(freq_err_rect), angle(freq_err_rect));
     freq_err_hz = angle(freq_err_rect)*Rs/(2*pi*Ns);
     foff_est_hz = foff_est_hz + foff_est_gain*freq_err_hz;
   end
index 63391aac9443a0e051d4ff607116552f6980e486..0abb1780e2bcee1e36437c009a0ccc63901f3959 100644 (file)
@@ -47,7 +47,7 @@ phase_est_pilot_log = []; rx_amp_log = [];
 rx_np_log = []; rx_bits_log = [];
 
 states.timing_en = 1;
-states.foff_est_en = 0;
+states.foff_est_en = 1;
 states.phase_est_en = 1;
 
 if states.timing_en == 0
index 7732a5aced7da635f34aeb06cf78c1b423e69d2c..ce3eb18dc2ff4e546a40778ad62c3a60fb9bce08 100644 (file)
@@ -539,7 +539,13 @@ void ofdm_demod(struct OFDM *ofdm, int *rx_bits, COMP *rxbuf_in) {
     /* est freq err based on all carriers ------------------------------------ */
 
     if (ofdm->foff_est_en == true) {
-        complex float freq_err_rect = conjf(vector_sum(ofdm->rx_sym[1], OFDM_NC)) * vector_sum(ofdm->rx_sym[OFDM_NS + 1], OFDM_NC);
+        complex float freq_err_rect = conjf(vector_sum(ofdm->rx_sym[1], OFDM_NC+2)) * vector_sum(ofdm->rx_sym[OFDM_NS + 1], OFDM_NC+2);
+
+        /* prevent instability in atan(im/re) when real part near 0 */
+
+        freq_err_rect += 1E-6;
+
+        // fprintf(stderr, "freq_err_rect: %f %f angle: %f\n", crealf(freq_err_rect), cimagf(freq_err_rect),cargf(freq_err_rect) );
         freq_err_hz = cargf(freq_err_rect) * OFDM_RS / (TAU * OFDM_NS);
 
         ofdm->foff_est_hz += (ofdm->foff_est_gain * freq_err_hz);
index 10088039aa97d33274b9a504f6d6f01acef71fd7..78638ea23662642fbb12e652ee5fd7813a2272cc 100644 (file)
@@ -116,7 +116,7 @@ int main(int argc, char *argv[])
 
     ofdm_set_verbose(ofdm, true);
     ofdm_set_timing_enable(ofdm, true);
-    ofdm_set_foff_est_enable(ofdm, false);
+    ofdm_set_foff_est_enable(ofdm, true);
     ofdm_set_phase_est_enable(ofdm, true);
 
     for(f=0; f<NFRAMES; f++) {