From 41cf2b306a210c3600c1c35a8e952679a94c00a6 Mon Sep 17 00:00:00 2001
From: Tom Rondeau <trondeau@vt.edu>
Date: Mon, 29 Aug 2011 17:37:38 -0400
Subject: digital: created a separate DQPSK constellation that does not gray
 code inside the block. This forces a slower decision making routine but
 allows differential encoding. Gray coding is done using pre_diff_code.

---
 gr-digital/lib/digital_constellation.cc | 80 +++++++++++++++++++++++++++++++++
 1 file changed, 80 insertions(+)

(limited to 'gr-digital/lib/digital_constellation.cc')

diff --git a/gr-digital/lib/digital_constellation.cc b/gr-digital/lib/digital_constellation.cc
index 2263bba0bc..ed6d32bcb0 100644
--- a/gr-digital/lib/digital_constellation.cc
+++ b/gr-digital/lib/digital_constellation.cc
@@ -407,6 +407,20 @@ digital_constellation_qpsk::digital_constellation_qpsk ()
   d_constellation[1] = gr_complex(SQRT_TWO, -SQRT_TWO);
   d_constellation[2] = gr_complex(-SQRT_TWO, SQRT_TWO);
   d_constellation[3] = gr_complex(SQRT_TWO, SQRT_TWO);
+  
+  /*
+  d_constellation[0] = gr_complex(SQRT_TWO, SQRT_TWO);
+  d_constellation[1] = gr_complex(-SQRT_TWO, SQRT_TWO);
+  d_constellation[2] = gr_complex(SQRT_TWO, -SQRT_TWO);
+  d_constellation[3] = gr_complex(SQRT_TWO, -SQRT_TWO);
+  */
+
+  d_pre_diff_code.resize(4);
+  d_pre_diff_code[0] = 0x0;
+  d_pre_diff_code[1] = 0x2;
+  d_pre_diff_code[2] = 0x3;
+  d_pre_diff_code[3] = 0x1;
+
   d_rotational_symmetry = 4;
   d_dimensionality = 1;
   calc_arity();
@@ -418,8 +432,74 @@ digital_constellation_qpsk::decision_maker(const gr_complex *sample)
   // Real component determines small bit.
   // Imag component determines big bit.
   return 2*(imag(*sample)>0) + (real(*sample)>0);
+
+  /*
+  bool a = real(*sample) > 0;
+  bool b = imag(*sample) > 0;
+  if(a) {
+    if(b)
+      return 0x0;
+    else
+      return 0x1;
+  }
+  else {
+    if(b)
+      return 0x2;
+    else
+      return 0x3;
+  }
+  */
+}
+
+
+/********************************************************************/
+
+
+digital_constellation_dqpsk_sptr 
+digital_make_constellation_dqpsk()
+{
+  return digital_constellation_dqpsk_sptr(new digital_constellation_dqpsk ());
 }
 
+digital_constellation_dqpsk::digital_constellation_dqpsk ()
+{
+  d_constellation.resize(4);
+  d_constellation[0] = gr_complex(+SQRT_TWO, +SQRT_TWO);
+  d_constellation[1] = gr_complex(-SQRT_TWO, +SQRT_TWO);
+  d_constellation[2] = gr_complex(-SQRT_TWO, -SQRT_TWO);
+  d_constellation[3] = gr_complex(+SQRT_TWO, -SQRT_TWO);
+
+  d_pre_diff_code.resize(4);
+  d_pre_diff_code[0] = 0x0;
+  d_pre_diff_code[1] = 0x1;
+  d_pre_diff_code[2] = 0x3;
+  d_pre_diff_code[3] = 0x2;
+  d_apply_pre_diff_code = true;
+
+  d_rotational_symmetry = 4;
+  d_dimensionality = 1;
+  calc_arity();
+}
+
+#include <cstdio>
+unsigned int
+digital_constellation_dqpsk::decision_maker(const gr_complex *sample)
+{
+  bool a = real(*sample) > 0;
+  bool b = imag(*sample) > 0;
+  if(a) {
+    if(b)
+      return 0x0;
+    else
+      return 0x3;
+  }
+  else {
+    if(b)
+      return 0x1;
+    else
+      return 0x2;
+  }
+}
 
 digital_constellation_8psk_sptr 
 digital_make_constellation_8psk()
-- 
cgit v1.2.3


From 5784b0c53c6d19b7a74f82e57c816beecd8b5edb Mon Sep 17 00:00:00 2001
From: Tom Rondeau <trondeau@vt.edu>
Date: Mon, 29 Aug 2011 17:58:25 -0400
Subject: digital: fixing qa code to test new dqpsk; a few minor formatting
 changes.

---
 gr-digital/lib/digital_constellation.cc |  8 +++++++-
 gr-digital/lib/digital_constellation.h  |  1 +
 gr-digital/python/qa_constellation.py   | 11 +++++------
 3 files changed, 13 insertions(+), 7 deletions(-)

(limited to 'gr-digital/lib/digital_constellation.cc')

diff --git a/gr-digital/lib/digital_constellation.cc b/gr-digital/lib/digital_constellation.cc
index ed6d32bcb0..3dfc70273d 100644
--- a/gr-digital/lib/digital_constellation.cc
+++ b/gr-digital/lib/digital_constellation.cc
@@ -463,12 +463,16 @@ digital_make_constellation_dqpsk()
 
 digital_constellation_dqpsk::digital_constellation_dqpsk ()
 {
+  // This constellation is not gray coded, which allows
+  // us to use differential encodings (through gr_diff_encode and
+  // gr_diff_decode) on the symbols.
   d_constellation.resize(4);
   d_constellation[0] = gr_complex(+SQRT_TWO, +SQRT_TWO);
   d_constellation[1] = gr_complex(-SQRT_TWO, +SQRT_TWO);
   d_constellation[2] = gr_complex(-SQRT_TWO, -SQRT_TWO);
   d_constellation[3] = gr_complex(+SQRT_TWO, -SQRT_TWO);
 
+  // Use this mapping to convert to gray code before diff enc.
   d_pre_diff_code.resize(4);
   d_pre_diff_code[0] = 0x0;
   d_pre_diff_code[1] = 0x1;
@@ -481,10 +485,12 @@ digital_constellation_dqpsk::digital_constellation_dqpsk ()
   calc_arity();
 }
 
-#include <cstdio>
 unsigned int
 digital_constellation_dqpsk::decision_maker(const gr_complex *sample)
 {
+  // Slower deicison maker as we can't slice along one axis.
+  // Maybe there's a better way to do this, still.
+
   bool a = real(*sample) > 0;
   bool b = imag(*sample) > 0;
   if(a) {
diff --git a/gr-digital/lib/digital_constellation.h b/gr-digital/lib/digital_constellation.h
index fd773a9075..3e54e7d965 100644
--- a/gr-digital/lib/digital_constellation.h
+++ b/gr-digital/lib/digital_constellation.h
@@ -344,6 +344,7 @@ class digital_constellation_qpsk : public digital_constellation
 /*                                                          */
 /************************************************************/
 
+//! \brief DQPSK-specific constellation and decision maker
 class digital_constellation_dqpsk;
 typedef boost::shared_ptr<digital_constellation_dqpsk> digital_constellation_dqpsk_sptr;
 
diff --git a/gr-digital/python/qa_constellation.py b/gr-digital/python/qa_constellation.py
index 02afb8d2da..264ff7de64 100755
--- a/gr-digital/python/qa_constellation.py
+++ b/gr-digital/python/qa_constellation.py
@@ -70,10 +70,8 @@ tested_constellation_info = (
       'mod_code': tested_mod_codes, },
      True, None),
     (digital_swig.constellation_bpsk, {}, True, None),
-    # No differential testing for qpsk because it is gray-coded.
-    # This is because soft decision making is simpler if we can assume
-    # gray coding.
     (digital_swig.constellation_qpsk, {}, False, None),
+    (digital_swig.constellation_dqpsk, {}, True, None),
     (digital_swig.constellation_8psk, {}, False, None),
     (twod_constell, {}, True, None),
     (threed_constell, {}, True, None),
@@ -143,8 +141,8 @@ class test_constellation (gr_unittest.TestCase):
 class mod_demod(gr.hier_block2):
     def __init__(self, constellation, differential, rotation):
         if constellation.arity() > 256:
-            # If this becomes limiting some of the blocks should be generalised so that they can work
-            # with shorts and ints as well as chars.
+            # If this becomes limiting some of the blocks should be generalised so
+            # that they can work with shorts and ints as well as chars.
             raise ValueError("Constellation cannot contain more than 256 points.")
 
 	gr.hier_block2.__init__(self, "mod_demod",
@@ -174,7 +172,8 @@ class mod_demod(gr.hier_block2):
         if self.differential:
             self.blocks.append(gr.diff_encoder_bb(arity))
         # Convert to constellation symbols.
-        self.blocks.append(gr.chunks_to_symbols_bc(self.constellation.points(), self.constellation.dimensionality()))
+        self.blocks.append(gr.chunks_to_symbols_bc(self.constellation.points(),
+                                                   self.constellation.dimensionality()))
         # CHANNEL
         # Channel just consists of a rotation to check differential coding.
         if rotation is not None:
-- 
cgit v1.2.3