fixed sync state machine bug
authordrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Tue, 26 Feb 2013 02:21:57 +0000 (02:21 +0000)
committerdrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Tue, 26 Feb 2013 02:21:57 +0000 (02:21 +0000)
git-svn-id: https://svn.code.sf.net/p/freetel/code@1170 01035d8c-6547-0410-b346-abe4f91aad63

codec2-dev/src/fdmdv.c
codec2-dev/src/fdmdv_internal.h

index 9453b87d835afd2e00ad8a30ac737540c8ab470c..9fe7aa385865731faf0b6acf5dc6e966ebcf1d66 100644 (file)
@@ -221,7 +221,8 @@ struct FDMDV * CODEC2_WIN32SUPPORT fdmdv_create(void)
 
     f->fest_state = 0;
     f->coarse_fine = COARSE;
+    f->bad_sync = 0;
+
     for(c=0; c<NC+1; c++) {
        f->sig_est[c] = 0.0;
        f->noise_est[c] = 0.0;
@@ -1134,10 +1135,9 @@ void CODEC2_WIN32SUPPORT fdmdv_put_test_bits(struct FDMDV *f, int *sync,
 
 \*---------------------------------------------------------------------------*/
 
-int freq_state(int sync_bit, int *state)
+int freq_state(int sync_bit, int *state, int *bad_sync)
 {
     int next_state, coarse_fine;
-    int bad_sync = 0;
 
     /* acquire state, look for 6 symbol 010101 sequence from sync bit */
 
@@ -1174,7 +1174,7 @@ int freq_state(int sync_bit, int *state)
     case 5:
        if (sync_bit == 1) {
            next_state = 6;
-            bad_sync = 0;
+            *bad_sync = 0;
         }
        else 
            next_state = 0;
@@ -1189,10 +1189,10 @@ int freq_state(int sync_bit, int *state)
     case 6:
         next_state = 7;
        if (sync_bit == 0)
-            bad_sync = 0;
+            *bad_sync = 0;
        else {
-            bad_sync++;
-            if (bad_sync > 2)
+            (*bad_sync)++;
+            if (*bad_sync > 2)
                 next_state = 0;
         }
 
@@ -1200,10 +1200,10 @@ int freq_state(int sync_bit, int *state)
     case 7:
         next_state = 6;
        if (sync_bit == 1)
-           bad_sync = 0;
+           *bad_sync = 0;
         else {
-            bad_sync++;
-            if (bad_sync > 2)
+            (*bad_sync)++;
+            if (*bad_sync > 2)
                 next_state = 0;
         }
        break;
@@ -1278,7 +1278,7 @@ void CODEC2_WIN32SUPPORT fdmdv_demod(struct FDMDV *fdmdv, int rx_bits[],
 
     /* freq offset estimation state machine */
 
-    fdmdv->coarse_fine = freq_state(*sync_bit, &fdmdv->fest_state);
+    fdmdv->coarse_fine = freq_state(*sync_bit, &fdmdv->fest_state, &fdmdv->bad_sync);
     fdmdv->foff  -= TRACK_COEFF*foff_fine;
 }
 
index d41207332bb5e9f4a17bec8d0cef15fc9db45caf..b126bb9120c1234c3dc27e1527159ecc3ceba157 100644 (file)
@@ -130,6 +130,7 @@ struct FDMDV {
 
     int  fest_state;
     int  coarse_fine;
+    int  bad_sync;
 
     /* SNR estimation states */
 
@@ -167,7 +168,7 @@ float rx_est_timing(COMP  rx_symbols[],
                   int   nin);   
 float qpsk_to_bits(int rx_bits[], int *sync_bit, COMP phase_difference[], COMP prev_rx_symbols[], COMP rx_symbols[]);
 void snr_update(float sig_est[], float noise_est[], COMP phase_difference[]);
-int freq_state(int sync_bit, int *state);
+int freq_state(int sync_bit, int *state, int *bad_sync);
 float calc_snr(float sig_est[], float noise_est[]);
 
 #endif