fixes to state machine and spare bit
authordrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Mon, 18 Mar 2013 07:12:02 +0000 (07:12 +0000)
committerdrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Mon, 18 Mar 2013 07:12:02 +0000 (07:12 +0000)
git-svn-id: https://svn.code.sf.net/p/freetel/code@1211 01035d8c-6547-0410-b346-abe4f91aad63

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

index bad11110c81f08140c4222f66c93b96125f6b963..db9377dbdf96d1addc4ed137ff44802848c55a97 100644 (file)
@@ -1400,8 +1400,8 @@ void CODEC2_WIN32SUPPORT codec2_set_lpc_post_filter(struct CODEC2 *c2, int enabl
 
 /* 
    Allows optional stealing of one of the voicing bits for use as a
-   spare bit, only 1400 & 1600 bit/s supported for now.  Experimental
-   method of sending voice/data frames for FreeDV.
+   spare bit, only 1300 & 1400 & 1600 bit/s supported for now.
+   Experimental method of sending voice/data frames for FreeDV.
 */
 
 int CODEC2_WIN32SUPPORT codec2_get_spare_bit_index(struct CODEC2 *c2)
@@ -1409,6 +1409,9 @@ int CODEC2_WIN32SUPPORT codec2_get_spare_bit_index(struct CODEC2 *c2)
     assert(c2 != NULL);
 
     switch(c2->mode) {
+    case CODEC2_MODE_1300:
+        return 2; // bit 2 (3th bit) is v2 (third voicing bit)
+        break;
     case CODEC2_MODE_1400:
         return 10; // bit 10 (11th bit) is v2 (third voicing bit)
         break;
@@ -1434,6 +1437,18 @@ int CODEC2_WIN32SUPPORT codec2_rebuild_spare_bit(struct CODEC2 *c2, int unpacked
     v1 = unpacked_bits[1];
 
     switch(c2->mode) {
+    case CODEC2_MODE_1300:
+
+        v3 = unpacked_bits[1+1+1];
+
+        /* if either adjacent frame is voiced, make this one voiced */
+
+        unpacked_bits[2] = (v1 || v3);  
+
+        return 0;
+
+        break;
+
     case CODEC2_MODE_1400:
 
         v3 = unpacked_bits[1+1+8+1];
index 1d6f33a620ea6cdf572e67141a45f47b5075845d..76dbdc861491ce2a000419ba506a827e5aa35a44 100644 (file)
@@ -1192,11 +1192,11 @@ int freq_state(int sync_bit, int *state, int *timer, int *sync_mem)
     unique_word = 0;
     for(i=0; i<NSYNC_MEM-1; i++)
         sync_mem[i] = sync_mem[i+1];
-    sync_mem[i] = sync_bit;
+    sync_mem[i] = 1 - 2*sync_bit;
     corr = 0;
     for(i=0; i<NSYNC_MEM; i++)
         corr += sync_mem[i]*sync_uw[i];
-    if (corr == NSYNC_MEM)
+    if (abs(corr) == NSYNC_MEM)
         unique_word = 1;
 
     /* iterate state machine */
@@ -1235,6 +1235,7 @@ int freq_state(int sync_bit, int *state, int *timer, int *sync_mem)
        break;
     }
 
+    printf("state: %d next_state: %d uw: %d timer: %d\n", *state, next_state, unique_word, *timer);
     *state = next_state;
     if (*state)
        sync = 1;