From f2196f9ca883114d2c39beb59489387a43b8bff7 Mon Sep 17 00:00:00 2001
From: Ben Reynwar <ben@reynwar.net>
Date: Mon, 31 Jan 2011 22:30:15 -0700
Subject: Added BPSK constellation object.

---
 gnuradio-core/src/lib/general/gr_constellation.cc  | 21 +++++
 gnuradio-core/src/lib/general/gr_constellation.h   | 43 ++++++++--
 gnuradio-core/src/lib/general/gr_constellation.i   | 23 +++--
 .../src/python/gnuradio/blks2impl/Makefile.am      |  1 +
 .../src/python/gnuradio/blks2impl/bpsk.py          | 98 ++++++++++++++++++++++
 5 files changed, 171 insertions(+), 15 deletions(-)
 create mode 100644 gnuradio-core/src/python/gnuradio/blks2impl/bpsk.py

(limited to 'gnuradio-core/src')

diff --git a/gnuradio-core/src/lib/general/gr_constellation.cc b/gnuradio-core/src/lib/general/gr_constellation.cc
index 8b98a57311..477532e5c9 100644
--- a/gnuradio-core/src/lib/general/gr_constellation.cc
+++ b/gnuradio-core/src/lib/general/gr_constellation.cc
@@ -43,6 +43,10 @@ gr_constellation::gr_constellation (std::vector<gr_complex> constellation) :
 {
 }
 
+gr_constellation::gr_constellation ()
+{
+}
+
 unsigned int get_closest_point(std::vector<gr_complex> constellation, gr_complex sample) {
 
   unsigned int table_size = constellation.size();
@@ -169,3 +173,20 @@ unsigned int gr_constellation_psk::calc_sector_value (unsigned int sector) {
 }
 
 
+gr_constellation_bpsk_sptr 
+gr_make_constellation_bpsk()
+{
+  return gr_constellation_bpsk_sptr(new gr_constellation_bpsk ());
+}
+
+gr_constellation_bpsk::gr_constellation_bpsk ()
+{
+  d_constellation.resize(2);
+  d_constellation[0] = gr_complex(-1, 0);
+  d_constellation[1] = gr_complex(1, 0);
+}
+
+unsigned int gr_constellation_bpsk::decision_maker(gr_complex sample)
+{
+  return (real(sample) > 0);
+}
diff --git a/gnuradio-core/src/lib/general/gr_constellation.h b/gnuradio-core/src/lib/general/gr_constellation.h
index d7f7b09b43..fcc947ca62 100644
--- a/gnuradio-core/src/lib/general/gr_constellation.h
+++ b/gnuradio-core/src/lib/general/gr_constellation.h
@@ -42,12 +42,12 @@ gr_constellation_sptr
   gr_make_constellation (std::vector<gr_complex> constellation);
 
 class gr_constellation : public boost::enable_shared_from_this<gr_constellation>
-//class gr_constellation
 {
  public:
 
   gr_constellation (std::vector<gr_complex> constellation);
-  
+  gr_constellation ();
+
   //! Returns the set of points in this constellation.
   std::vector<gr_complex> points() { return d_constellation;}
   
@@ -60,7 +60,6 @@ class gr_constellation : public boost::enable_shared_from_this<gr_constellation>
   }
 
   gr_constellation_sptr base() {
-    //return gr_constellation_sptr(this);
     return shared_from_this();
   }  
 
@@ -91,7 +90,7 @@ class gr_constellation_sector : public gr_constellation
 
   unsigned int decision_maker (gr_complex sample);
 
-  // protected:
+ protected:
 
   virtual unsigned int get_sector (gr_complex sample) = 0;
   
@@ -101,7 +100,7 @@ class gr_constellation_sector : public gr_constellation
 
   unsigned int n_sectors;
 
-  // private:
+ private:
 
   std::vector<unsigned int> sector_values;
 
@@ -133,13 +132,13 @@ class gr_constellation_rect : public gr_constellation_sector
   gr_constellation_rect (std::vector<gr_complex> constellation, unsigned int real_sectors, unsigned int imag_sectors,
 			   float width_real_sectors, float width_imag_sectors);
 
-  // protected:
+ protected:
 
   unsigned int get_sector (gr_complex sample);
   
   unsigned int calc_sector_value (unsigned int sector);
 
-  // private:
+ private:
 
   unsigned int n_real_sectors;
   unsigned int n_imag_sectors;
@@ -175,17 +174,43 @@ class gr_constellation_psk : public gr_constellation_sector
 
   gr_constellation_psk (std::vector<gr_complex> constellation, unsigned int n_sectors);
 
-  // protected:
+ protected:
 
   unsigned int get_sector (gr_complex sample);
   
   unsigned int calc_sector_value (unsigned int sector);
 
-  // private:
+ private:
 
   friend gr_constellation_psk_sptr
   gr_make_constellation_psk (std::vector<gr_complex> constellation, unsigned int n_sectors);
   
 };
 
+/************************************************************/
+/* gr_constellation_bpsk                                    */
+/*                                                          */
+/* Only works for BPSK.                                     */
+/*                                                          */
+/************************************************************/
+
+class gr_constellation_bpsk;
+typedef boost::shared_ptr<gr_constellation_bpsk> gr_constellation_bpsk_sptr;
+
+// public constructor
+gr_constellation_bpsk_sptr 
+gr_make_constellation_bpsk ();
+
+class gr_constellation_bpsk : public gr_constellation
+{
+ public:
+
+  gr_constellation_bpsk ();
+  unsigned int decision_maker (gr_complex sample);
+
+  friend gr_constellation_bpsk_sptr
+  gr_make_constellation_bpsk ();
+  
+};
+
 #endif
diff --git a/gnuradio-core/src/lib/general/gr_constellation.i b/gnuradio-core/src/lib/general/gr_constellation.i
index 2d15b8b1e3..a34aade9f4 100644
--- a/gnuradio-core/src/lib/general/gr_constellation.i
+++ b/gnuradio-core/src/lib/general/gr_constellation.i
@@ -77,12 +77,23 @@ public:
   std::vector<gr_complex> points ();
   unsigned int decision_maker (gr_complex sample);  
   unsigned int bits_per_symbol ();
-  
   gr_constellation_sptr base ();
+};
+
+class gr_constellation_bpsk;
+typedef boost::shared_ptr<gr_constellation_bpsk> gr_constellation_bpsk_sptr;
+%template(gr_constellation_bpsk_sptr) boost::shared_ptr<gr_constellation_bpsk>;
+%rename(constellation_bpsk) gr_make_constellation_bpsk;
+gr_constellation_bpsk_sptr gr_make_constellation_bpsk();
+%ignore gr_constellation_bpsk;
 
-  unsigned int get_sector (gr_complex sample);
-  unsigned int calc_sector_value (unsigned int sector);
-  void find_sector_values ();
-  unsigned int n_sectors;
-  std::vector<unsigned int> sector_values;
+class gr_constellation_bpsk : public gr_constellation
+{
+public:
+  gr_constellation_bpsk ();
+  std::vector<gr_complex> points();
+  unsigned int decision_maker (gr_complex sample);  
+  unsigned int bits_per_symbol ();
+  gr_constellation_sptr base ();
 };
+
diff --git a/gnuradio-core/src/python/gnuradio/blks2impl/Makefile.am b/gnuradio-core/src/python/gnuradio/blks2impl/Makefile.am
index f7e92442f2..2a7f591766 100644
--- a/gnuradio-core/src/python/gnuradio/blks2impl/Makefile.am
+++ b/gnuradio-core/src/python/gnuradio/blks2impl/Makefile.am
@@ -29,6 +29,7 @@ grblkspythondir = $(grpythondir)/blks2impl
 grblkspython_PYTHON =		\
 	__init__.py		\
 	am_demod.py		\
+	bpsk.py			\
 	channel_model.py	\
 	dbpsk.py		\
 	dbpsk2.py		\
diff --git a/gnuradio-core/src/python/gnuradio/blks2impl/bpsk.py b/gnuradio-core/src/python/gnuradio/blks2impl/bpsk.py
new file mode 100644
index 0000000000..222178abb6
--- /dev/null
+++ b/gnuradio-core/src/python/gnuradio/blks2impl/bpsk.py
@@ -0,0 +1,98 @@
+#
+# Copyright 2005,2006 Free Software Foundation, Inc.
+# 
+# This file is part of GNU Radio
+# 
+# GNU Radio is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3, or (at your option)
+# any later version.
+# 
+# GNU Radio is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with GNU Radio; see the file COPYING.  If not, write to
+# the Free Software Foundation, Inc., 51 Franklin Street,
+# Boston, MA 02110-1301, USA.
+# 
+
+"""
+BPSK modulation and demodulation.
+"""
+
+from math import pi, log
+from cmath import exp
+
+from gnuradio import gr, modulation_utils2
+from gnuradio.blks2impl.generic_mod_demod import generic_mod, generic_demod
+
+# Default number of points in constellation.
+_def_constellation_points = 2
+# Whether differential coding is used.
+_def_differential = True
+
+# /////////////////////////////////////////////////////////////////////////////
+#                           BPSK constellation
+# /////////////////////////////////////////////////////////////////////////////
+
+def bpsk_constellation(m=_def_constellation_points):
+    if m != _def_constellation_points:
+        raise ValueError("BPSK can only have 2 constellation points.")
+    return gr.constellation_bpsk()
+
+# /////////////////////////////////////////////////////////////////////////////
+#                           BPSK modulator
+# /////////////////////////////////////////////////////////////////////////////
+
+class bpsk_mod(generic_mod):
+
+    def __init__(self, constellation_points=_def_constellation_points,
+                 *args, **kwargs):
+
+        """
+	Hierarchical block for RRC-filtered BPSK modulation.
+
+	The input is a byte stream (unsigned char) and the
+	output is the complex modulated signal at baseband.
+
+        See generic_mod block for list of parameters.
+	"""
+
+        constellation = gr.constellation_bpsk()
+        if constellation_points != 2:
+            raise ValueError('Number of constellation points must be 2 for BPSK.')
+        super(bpsk_mod, self).__init__(constellation, *args, **kwargs)
+
+# /////////////////////////////////////////////////////////////////////////////
+#                           BPSK demodulator
+#
+# /////////////////////////////////////////////////////////////////////////////
+
+class bpsk_demod(generic_demod):
+
+    def __init__(self, constellation_points=_def_constellation_points,
+                 *args, **kwargs):
+
+        """
+	Hierarchical block for RRC-filtered BPSK modulation.
+
+	The input is a byte stream (unsigned char) and the
+	output is the complex modulated signal at baseband.
+
+        See generic_demod block for list of parameters.
+        """
+
+        constellation = gr.constellation_bpsk()
+        if constellation_points != 2:
+            raise ValueError('Number of constellation points must be 2 for BPSK.')
+        super(bpsk_demod, self).__init__(constellation, *args, **kwargs)
+
+#
+# Add these to the mod/demod registry
+#
+modulation_utils2.add_type_1_mod('bpsk', bpsk_mod)
+modulation_utils2.add_type_1_demod('bpsk', bpsk_demod)
+modulation_utils2.add_type_1_constellation('bpsk', bpsk_constellation)
-- 
cgit v1.2.3