normalised DPSK phase subtarctions to make scatter plot more accurate
authordrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Sat, 16 Feb 2013 04:51:46 +0000 (04:51 +0000)
committerdrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Sat, 16 Feb 2013 04:51:46 +0000 (04:51 +0000)
git-svn-id: https://svn.code.sf.net/p/freetel/code@1158 01035d8c-6547-0410-b346-abe4f91aad63

codec2-dev/src/fdmdv.c

index 703bd4cc39c2b3ac1dc4471564c7dd55222a48c6..8f065c38f57fdf5ebe945723634bc62cbf264579 100644 (file)
@@ -956,7 +956,7 @@ float qpsk_to_bits(int rx_bits[], int *sync_bit, COMP phase_difference[], COMP p
     COMP  pi_on_4;
     COMP  d;
     int   msb=0, lsb=0;
-    float ferr;
+    float ferr, norm;
 
     pi_on_4.real = cos(PI/4.0);
     pi_on_4.imag = sin(PI/4.0);
@@ -964,8 +964,10 @@ float qpsk_to_bits(int rx_bits[], int *sync_bit, COMP phase_difference[], COMP p
     /* Extra 45 degree clockwise lets us use real and imag axis as
        decision boundaries */
 
-    for(c=0; c<NC; c++)
-       phase_difference[c] = cmult(cmult(rx_symbols[c], cconj(prev_rx_symbols[c])), pi_on_4);
+    for(c=0; c<NC; c++) {
+        norm = 1.0/(cabsolute(prev_rx_symbols[c])+1E-6);
+       phase_difference[c] = cmult(cmult(rx_symbols[c], fcmult(norm,cconj(prev_rx_symbols[c]))), pi_on_4);
+    }
                                    
     /* map (Nc,1) DQPSK symbols back into an (1,Nc*Nb) array of bits */
 
@@ -989,7 +991,8 @@ float qpsk_to_bits(int rx_bits[], int *sync_bit, COMP phase_difference[], COMP p
  
     /* Extract DBPSK encoded Sync bit and fine freq offset estimate */
 
-    phase_difference[NC] = cmult(rx_symbols[NC], cconj(prev_rx_symbols[NC]));
+    norm = 1.0/(cabsolute(prev_rx_symbols[NC])+1E-6);
+    phase_difference[NC] = cmult(rx_symbols[NC], fcmult(norm, cconj(prev_rx_symbols[NC])));
     if (phase_difference[NC].real < 0) {
       *sync_bit = 1;
       ferr = phase_difference[NC].imag;