summaryrefslogtreecommitdiff
path: root/gnuradio-core/src/python
diff options
context:
space:
mode:
authorJohnathan Corgan2011-07-17 16:13:53 -0700
committerJohnathan Corgan2011-07-17 16:13:53 -0700
commit37d2e0ecdb74183d40a4097c6404d252acea5fd1 (patch)
treef17ab7b9e92c05f7372b783cadad5c1aa744115b /gnuradio-core/src/python
parentfd1a28f693ed41d4bba9f1c800e79693e4c55ed2 (diff)
parent4daafa4e7d91b01e64cd8260fcbb9a97708524ba (diff)
downloadgnuradio-37d2e0ecdb74183d40a4097c6404d252acea5fd1.tar.gz
gnuradio-37d2e0ecdb74183d40a4097c6404d252acea5fd1.tar.bz2
gnuradio-37d2e0ecdb74183d40a4097c6404d252acea5fd1.zip
Merge remote branch 'gnuradio/next' into wip/vocoders
Diffstat (limited to 'gnuradio-core/src/python')
-rw-r--r--gnuradio-core/src/python/gnuradio/blks2impl/ofdm.py75
-rw-r--r--gnuradio-core/src/python/gnuradio/blks2impl/pkt.py36
-rw-r--r--gnuradio-core/src/python/gnuradio/modulation_utils2.py20
3 files changed, 51 insertions, 80 deletions
diff --git a/gnuradio-core/src/python/gnuradio/blks2impl/ofdm.py b/gnuradio-core/src/python/gnuradio/blks2impl/ofdm.py
index 3b1cd12ac..2663f7cf8 100644
--- a/gnuradio-core/src/python/gnuradio/blks2impl/ofdm.py
+++ b/gnuradio-core/src/python/gnuradio/blks2impl/ofdm.py
@@ -21,26 +21,12 @@
#
import math
-from gnuradio import gr, ofdm_packet_utils, modulation_utils2
+from gnuradio import gr, ofdm_packet_utils
import gnuradio.gr.gr_threading as _threading
import psk, qam
from gnuradio.blks2impl.ofdm_receiver import ofdm_receiver
-def _add_common_options(normal, expert):
- """
- Adds OFDM-specific options to the Options Parser that are common
- both to the modulator and demodulator.
- """
- mods_list = ", ".join(modulation_utils2.type_1_constellations().keys())
- normal.add_option("-m", "--modulation", type="string", default="psk",
- help="set modulation type (" + mods_list + ") [default=%default]")
- expert.add_option("", "--fft-length", type="intx", default=512,
- help="set the number of FFT bins [default=%default]")
- expert.add_option("", "--occupied-tones", type="intx", default=200,
- help="set the number of occupied FFT bins [default=%default]")
- expert.add_option("", "--cp-length", type="intx", default=128,
- help="set the number of bits in the cyclic prefix [default=%default]")
# /////////////////////////////////////////////////////////////////////////////
# mod/demod with packets as i/o
@@ -75,8 +61,6 @@ class ofdm_mod(gr.hier_block2):
self._fft_length = options.fft_length
self._occupied_tones = options.occupied_tones
self._cp_length = options.cp_length
-
- arity = options.constellation_points
win = [] #[1 for i in range(self._fft_length)]
@@ -98,9 +82,19 @@ class ofdm_mod(gr.hier_block2):
symbol_length = options.fft_length + options.cp_length
- const = modulation_utils2.type_1_constellations()[self._modulation](arity).points()
-
- self._pkt_input = gr.ofdm_mapper_bcv(const, msgq_limit,
+ mods = {"bpsk": 2, "qpsk": 4, "8psk": 8, "qam8": 8, "qam16": 16, "qam64": 64, "qam256": 256}
+ arity = mods[self._modulation]
+
+ rot = 1
+ if self._modulation == "qpsk":
+ rot = (0.707+0.707j)
+
+ if(self._modulation.find("psk") >= 0):
+ rotated_const = map(lambda pt: pt * rot, psk.gray_constellation[arity])
+ elif(self._modulation.find("qam") >= 0):
+ rotated_const = map(lambda pt: pt * rot, qam.constellation[arity])
+ #print rotated_const
+ self._pkt_input = gr.ofdm_mapper_bcv(rotated_const, msgq_limit,
options.occupied_tones, options.fft_length)
self.preambles = gr.ofdm_insert_preamble(self._fft_length, padded_preambles)
@@ -146,10 +140,14 @@ class ofdm_mod(gr.hier_block2):
"""
Adds OFDM-specific options to the Options Parser
"""
- _add_common_options(normal, expert)
- for mod in modulation_utils2.type_1_mods().values():
- mod.add_options(expert)
-
+ normal.add_option("-m", "--modulation", type="string", default="bpsk",
+ help="set modulation type (bpsk, qpsk, 8psk, qam{16,64}) [default=%default]")
+ expert.add_option("", "--fft-length", type="intx", default=512,
+ help="set the number of FFT bins [default=%default]")
+ expert.add_option("", "--occupied-tones", type="intx", default=200,
+ help="set the number of occupied FFT bins [default=%default]")
+ expert.add_option("", "--cp-length", type="intx", default=128,
+ help="set the number of bits in the cyclic prefix [default=%default]")
# Make a static method to call before instantiation
add_options = staticmethod(add_options)
@@ -198,9 +196,6 @@ class ofdm_demod(gr.hier_block2):
self._cp_length = options.cp_length
self._snr = options.snr
- arity = options.constellation_points
- print("con points is %s" % options.constellation_points)
-
# Use freq domain to get doubled-up known symbol for correlation in time domain
zeros_on_left = int(math.ceil((self._fft_length - self._occupied_tones)/2.0))
ksfreq = known_symbols_4512_3[0:self._occupied_tones]
@@ -216,11 +211,22 @@ class ofdm_demod(gr.hier_block2):
self._occupied_tones, self._snr, preambles,
options.log)
- constell = modulation_utils2.type_1_constellations()[self._modulation](arity)
+ mods = {"bpsk": 2, "qpsk": 4, "8psk": 8, "qam8": 8, "qam16": 16, "qam64": 64, "qam256": 256}
+ arity = mods[self._modulation]
+
+ rot = 1
+ if self._modulation == "qpsk":
+ rot = (0.707+0.707j)
+
+ if(self._modulation.find("psk") >= 0):
+ rotated_const = map(lambda pt: pt * rot, psk.gray_constellation[arity])
+ elif(self._modulation.find("qam") >= 0):
+ rotated_const = map(lambda pt: pt * rot, qam.constellation[arity])
+ #print rotated_const
phgain = 0.25
frgain = phgain*phgain / 4.0
- self.ofdm_demod = gr.ofdm_frame_sink2(constell.base(),
+ self.ofdm_demod = gr.ofdm_frame_sink(rotated_const, range(arity),
self._rcvd_pktq,
self._occupied_tones,
phgain, frgain)
@@ -247,9 +253,14 @@ class ofdm_demod(gr.hier_block2):
"""
Adds OFDM-specific options to the Options Parser
"""
- _add_common_options(normal, expert)
- for mod in modulation_utils2.type_1_mods().values():
- mod.add_options(expert)
+ normal.add_option("-m", "--modulation", type="string", default="bpsk",
+ help="set modulation type (bpsk or qpsk) [default=%default]")
+ expert.add_option("", "--fft-length", type="intx", default=512,
+ help="set the number of FFT bins [default=%default]")
+ expert.add_option("", "--occupied-tones", type="intx", default=200,
+ help="set the number of occupied FFT bins [default=%default]")
+ expert.add_option("", "--cp-length", type="intx", default=128,
+ help="set the number of bits in the cyclic prefix [default=%default]")
# Make a static method to call before instantiation
add_options = staticmethod(add_options)
diff --git a/gnuradio-core/src/python/gnuradio/blks2impl/pkt.py b/gnuradio-core/src/python/gnuradio/blks2impl/pkt.py
index aa720d1a5..908437ef2 100644
--- a/gnuradio-core/src/python/gnuradio/blks2impl/pkt.py
+++ b/gnuradio-core/src/python/gnuradio/blks2impl/pkt.py
@@ -34,8 +34,7 @@ class mod_pkts(gr.hier_block2):
Send packets by calling send_pkt
"""
- def __init__(self, modulator, access_code=None, msgq_limit=2, pad_for_usrp=True, use_whitener_offset=False,
- modulate=True):
+ def __init__(self, modulator, access_code=None, msgq_limit=2, pad_for_usrp=True, use_whitener_offset=False):
"""
Hierarchical block for sending packets
@@ -50,18 +49,13 @@ class mod_pkts(gr.hier_block2):
@type msgq_limit: int
@param pad_for_usrp: If true, packets are padded such that they end up a multiple of 128 samples
@param use_whitener_offset: If true, start of whitener XOR string is incremented each packet
- @param modulate: If false, no modulation will be performed.
See gmsk_mod for remaining parameters
"""
- if modulate:
- output_size = gr.sizeof_gr_complex
- else:
- output_size = gr.sizeof_char
gr.hier_block2.__init__(self, "mod_pkts",
gr.io_signature(0, 0, 0), # Input signature
- gr.io_signature(1, 1, output_size)) # Output signature
+ gr.io_signature(1, 1, gr.sizeof_gr_complex)) # Output signature
self._modulator = modulator
self._pad_for_usrp = pad_for_usrp
@@ -76,10 +70,7 @@ class mod_pkts(gr.hier_block2):
# accepts messages from the outside world
self._pkt_input = gr.message_source(gr.sizeof_char, msgq_limit)
- if modulate:
- self.connect(self._pkt_input, self._modulator, self)
- else:
- self.connect(self._pkt_input, self)
+ self.connect(self._pkt_input, self._modulator, self)
def send_pkt(self, payload='', eof=False):
"""
@@ -115,15 +106,13 @@ class demod_pkts(gr.hier_block2):
app via the callback.
"""
- def __init__(self, demodulator, access_code=None, callback=None, threshold=-1, demodulate=True):
+ def __init__(self, demodulator, access_code=None, callback=None, threshold=-1):
"""
Hierarchical block for demodulating and deframing packets.
The input is the complex modulated signal at baseband.
Demodulated packets are sent to the handler.
- If demodulator is None it is assumed the input is already demodulated.
-
@param demodulator: instance of demodulator class (gr_block or hier_block2)
@type demodulator: complex baseband in
@param access_code: AKA sync vector
@@ -134,14 +123,9 @@ class demod_pkts(gr.hier_block2):
@type threshold: int
"""
- if demodulator is not None:
- input_size = gr.sizeof_gr_complex
- else:
- input_size = gr.sizeof_char
-
gr.hier_block2.__init__(self, "demod_pkts",
- gr.io_signature(1, 1, input_size), # Input signature
- gr.io_signature(0, 0, 0)) # Output signature
+ gr.io_signature(1, 1, gr.sizeof_gr_complex), # Input signature
+ gr.io_signature(0, 0, 0)) # Output signature
self._demodulator = demodulator
if access_code is None:
@@ -157,13 +141,9 @@ class demod_pkts(gr.hier_block2):
self.correlator = gr.correlate_access_code_bb(access_code, threshold)
self.framer_sink = gr.framer_sink_1(self._rcvd_pktq)
- if self._demodulator is not None:
- self.connect(self, self._demodulator, self.correlator, self.framer_sink)
- else:
- self.connect(self, self.correlator, self.framer_sink)
+ self.connect(self, self._demodulator, self.correlator, self.framer_sink)
- if callback is not None:
- self._watcher = _queue_watcher_thread(self._rcvd_pktq, callback)
+ self._watcher = _queue_watcher_thread(self._rcvd_pktq, callback)
class _queue_watcher_thread(_threading.Thread):
diff --git a/gnuradio-core/src/python/gnuradio/modulation_utils2.py b/gnuradio-core/src/python/gnuradio/modulation_utils2.py
index f30055f4a..c5dba3e79 100644
--- a/gnuradio-core/src/python/gnuradio/modulation_utils2.py
+++ b/gnuradio-core/src/python/gnuradio/modulation_utils2.py
@@ -47,15 +47,6 @@ def type_1_demods():
def add_type_1_demod(name, demod_class):
_type_1_demodulators[name] = demod_class
-# Also record the constellation making functions of the modulations
-_type_1_constellations = {}
-
-def type_1_constellations():
- return _type_1_constellations
-
-def add_type_1_constellation(name, constellation):
- _type_1_constellations[name] = constellation
-
def extract_kwargs_from_options(function, excluded_args, options):
"""
@@ -88,14 +79,3 @@ def extract_kwargs_from_options(function, excluded_args, options):
if getattr(options, kw) is not None:
d[kw] = getattr(options, kw)
return d
-
-def extract_kwargs_from_options_for_class(cls, options):
- """
- Given command line options, create dictionary suitable for passing to __init__
- """
- d = extract_kwargs_from_options(
- cls.__init__, ('self',), options)
- for base in cls.__bases__:
- if hasattr(base, 'extract_kwargs_from_options'):
- d.update(base.extract_kwargs_from_options(options))
- return d