From 2e7d6f638181231bad0a8fd2fa6fb72cf6ad1f7c Mon Sep 17 00:00:00 2001
From: Ben Reynwar <ben@reynwar.net>
Date: Mon, 31 Jan 2011 23:25:36 -0700
Subject: Added QPSK constellation object.

---
 gnuradio-core/src/lib/general/gr_constellation.cc | 25 ++++++++++++++++++++++
 gnuradio-core/src/lib/general/gr_constellation.h  | 26 +++++++++++++++++++++++
 gnuradio-core/src/lib/general/gr_constellation.i  | 17 +++++++++++++++
 3 files changed, 68 insertions(+)

(limited to 'gnuradio-core/src/lib/general')

diff --git a/gnuradio-core/src/lib/general/gr_constellation.cc b/gnuradio-core/src/lib/general/gr_constellation.cc
index 477532e5c9..403394eaac 100644
--- a/gnuradio-core/src/lib/general/gr_constellation.cc
+++ b/gnuradio-core/src/lib/general/gr_constellation.cc
@@ -29,6 +29,7 @@
 #include <stdlib.h>
 
 #define M_TWOPI (2*M_PI)
+#define SQRT_TWO 0.707107
 
 gr_constellation_sptr 
 gr_make_constellation(std::vector<gr_complex> constellation)
@@ -190,3 +191,27 @@ unsigned int gr_constellation_bpsk::decision_maker(gr_complex sample)
 {
   return (real(sample) > 0);
 }
+
+
+gr_constellation_qpsk_sptr 
+gr_make_constellation_qpsk()
+{
+  return gr_constellation_qpsk_sptr(new gr_constellation_qpsk ());
+}
+
+gr_constellation_qpsk::gr_constellation_qpsk ()
+{
+  d_constellation.resize(4);
+  // Gray-coded
+  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);
+}
+
+unsigned int gr_constellation_qpsk::decision_maker(gr_complex sample)
+{
+  // Real component determines small bit.
+  // Imag component determines big bit.
+  return 2*(imag(sample)>0) + (real(sample)>0);
+}
diff --git a/gnuradio-core/src/lib/general/gr_constellation.h b/gnuradio-core/src/lib/general/gr_constellation.h
index fcc947ca62..8ba22d59ac 100644
--- a/gnuradio-core/src/lib/general/gr_constellation.h
+++ b/gnuradio-core/src/lib/general/gr_constellation.h
@@ -213,4 +213,30 @@ class gr_constellation_bpsk : public gr_constellation
   
 };
 
+/************************************************************/
+/* gr_constellation_qpsk                                    */
+/*                                                          */
+/* Only works for QPSK.                                     */
+/*                                                          */
+/************************************************************/
+
+class gr_constellation_qpsk;
+typedef boost::shared_ptr<gr_constellation_qpsk> gr_constellation_qpsk_sptr;
+
+// public constructor
+gr_constellation_qpsk_sptr 
+gr_make_constellation_qpsk ();
+
+class gr_constellation_qpsk : public gr_constellation
+{
+ public:
+
+  gr_constellation_qpsk ();
+  unsigned int decision_maker (gr_complex sample);
+
+  friend gr_constellation_qpsk_sptr
+  gr_make_constellation_qpsk ();
+  
+};
+
 #endif
diff --git a/gnuradio-core/src/lib/general/gr_constellation.i b/gnuradio-core/src/lib/general/gr_constellation.i
index a34aade9f4..6620721ea2 100644
--- a/gnuradio-core/src/lib/general/gr_constellation.i
+++ b/gnuradio-core/src/lib/general/gr_constellation.i
@@ -97,3 +97,20 @@ public:
   gr_constellation_sptr base ();
 };
 
+class gr_constellation_qpsk;
+typedef boost::shared_ptr<gr_constellation_qpsk> gr_constellation_qpsk_sptr;
+%template(gr_constellation_qpsk_sptr) boost::shared_ptr<gr_constellation_qpsk>;
+%rename(constellation_qpsk) gr_make_constellation_qpsk;
+gr_constellation_qpsk_sptr gr_make_constellation_qpsk();
+%ignore gr_constellation_qpsk;
+
+class gr_constellation_qpsk : public gr_constellation
+{
+public:
+  gr_constellation_qpsk ();
+  std::vector<gr_complex> points();
+  unsigned int decision_maker (gr_complex sample);  
+  unsigned int bits_per_symbol ();
+  gr_constellation_sptr base ();
+};
+
-- 
cgit v1.2.3