summaryrefslogtreecommitdiff
path: root/gr-digital/python/digital/ofdm_txrx.py
diff options
context:
space:
mode:
Diffstat (limited to 'gr-digital/python/digital/ofdm_txrx.py')
-rw-r--r--gr-digital/python/digital/ofdm_txrx.py99
1 files changed, 80 insertions, 19 deletions
diff --git a/gr-digital/python/digital/ofdm_txrx.py b/gr-digital/python/digital/ofdm_txrx.py
index a48a48db41..06e375e3d6 100644
--- a/gr-digital/python/digital/ofdm_txrx.py
+++ b/gr-digital/python/digital/ofdm_txrx.py
@@ -63,6 +63,7 @@ _seq_seed = 42
def _get_active_carriers(fft_len, occupied_carriers, pilot_carriers):
+ """ Returns a list of all carriers that at some point carry data or pilots. """
active_carriers = list()
for carrier in list(occupied_carriers[0]) + list(pilot_carriers[0]):
if carrier < 0:
@@ -134,6 +135,8 @@ class ofdm_tx(gr.hier_block2):
sync_word2: The second sync preamble symbol. This has to be filled entirely. Also used for
coarse frequency offset and channel estimation.
rolloff: The rolloff length in samples. Must be smaller than the CP.
+ debug_log: Write output into log files (Warning: creates lots of data!)
+ scramble_bits: Activates the scramblers (set this to True unless debugging)
"""
def __init__(self, fft_len=_def_fft_len, cp_len=_def_cp_len,
packet_length_tag_key=_def_packet_length_tag_key,
@@ -145,7 +148,8 @@ class ofdm_tx(gr.hier_block2):
sync_word1=None,
sync_word2=None,
rolloff=0,
- debug_log=False
+ debug_log=False,
+ scramble_bits=False
):
gr.hier_block2.__init__(self, "ofdm_tx",
gr.io_signature(1, 1, gr.sizeof_char),
@@ -159,7 +163,6 @@ class ofdm_tx(gr.hier_block2):
self.pilot_symbols = pilot_symbols
self.bps_header = bps_header
self.bps_payload = bps_payload
- n_sync_words = 1
self.sync_word1 = sync_word1
if sync_word1 is None:
self.sync_word1 = _make_sync_word1(fft_len, occupied_carriers, pilot_carriers)
@@ -167,15 +170,19 @@ class ofdm_tx(gr.hier_block2):
if len(sync_word1) != self.fft_len:
raise ValueError("Length of sync sequence(s) must be FFT length.")
self.sync_words = [self.sync_word1,]
- self.sync_word2 = ()
if sync_word2 is None:
self.sync_word2 = _make_sync_word2(fft_len, occupied_carriers, pilot_carriers)
+ else:
+ self.sync_word2 = sync_word2
if len(self.sync_word2):
if len(self.sync_word2) != fft_len:
raise ValueError("Length of sync sequence(s) must be FFT length.")
self.sync_word2 = list(self.sync_word2)
- n_sync_words = 2
self.sync_words.append(self.sync_word2)
+ if scramble_bits:
+ self.scramble_seed = 0x7f
+ else:
+ self.scramble_seed = 0x00 # We deactivate the scrambler by init'ing it with zeros
### Header modulation ################################################
crc = digital.crc32_bb(False, self.packet_length_tag_key)
header_constellation = _get_constellation(bps_header)
@@ -183,18 +190,34 @@ class ofdm_tx(gr.hier_block2):
formatter_object = digital.packet_header_ofdm(
occupied_carriers=occupied_carriers, n_syms=1,
bits_per_header_sym=self.bps_header,
- bits_per_payload_sym=self.bps_payload
+ bits_per_payload_sym=self.bps_payload,
+ scramble_header=scramble_bits
)
header_gen = digital.packet_headergenerator_bb(formatter_object.base(), self.packet_length_tag_key)
header_payload_mux = blocks.tagged_stream_mux(gr.sizeof_gr_complex*1, self.packet_length_tag_key)
- self.connect(self, crc, header_gen, header_mod, (header_payload_mux, 0))
+ self.connect(
+ self,
+ crc,
+ header_gen,
+ header_mod,
+ (header_payload_mux, 0)
+ )
if debug_log:
self.connect(header_gen, blocks.file_sink(1, 'tx-hdr.dat'))
### Payload modulation ###############################################
payload_constellation = _get_constellation(bps_payload)
payload_mod = digital.chunks_to_symbols_bc(payload_constellation.points())
+ payload_scrambler = digital.additive_scrambler_bb(
+ 0x8a,
+ self.scramble_seed,
+ 7,
+ 0, # Don't reset after fixed length (let the reset tag do that)
+ bits_per_byte=bps_payload,
+ reset_tag_key=self.packet_length_tag_key
+ )
self.connect(
crc,
+ payload_scrambler,
blocks.repack_bits_bb(
8, # Unpack 8 bits per byte
bps_payload,
@@ -226,8 +249,8 @@ class ofdm_tx(gr.hier_block2):
)
self.connect(header_payload_mux, allocator, ffter, cyclic_prefixer, self)
if debug_log:
- self.connect(allocator, blocks.file_sink(8*64, 'tx-post-allocator.dat'))
- self.connect(cyclic_prefixer, blocks.file_sink(8, 'tx-signal.dat'))
+ self.connect(allocator, blocks.file_sink(gr.sizeof_gr_complex * fft_len, 'tx-post-allocator.dat'))
+ self.connect(cyclic_prefixer, blocks.file_sink(gr.sizeof_gr_complex, 'tx-signal.dat'))
class ofdm_rx(gr.hier_block2):
@@ -262,7 +285,8 @@ class ofdm_rx(gr.hier_block2):
bps_payload=1,
sync_word1=None,
sync_word2=None,
- debug_log=False
+ debug_log=False,
+ scramble_bits=False
):
gr.hier_block2.__init__(self, "ofdm_rx",
gr.io_signature(1, 1, gr.sizeof_gr_complex),
@@ -291,6 +315,10 @@ class ofdm_rx(gr.hier_block2):
raise ValueError("Length of sync sequence(s) must be FFT length.")
self.sync_word2 = sync_word2
n_sync_words = 2
+ if scramble_bits:
+ self.scramble_seed = 0x7f
+ else:
+ self.scramble_seed = 0x00 # We deactivate the scrambler by init'ing it with zeros
### Sync ############################################################
sync_detect = digital.ofdm_sync_sc_cfb(fft_len, cp_len)
delay = blocks.delay(gr.sizeof_gr_complex, fft_len+cp_len)
@@ -315,8 +343,12 @@ class ofdm_rx(gr.hier_block2):
chanest = digital.ofdm_chanest_vcvc(self.sync_word1, self.sync_word2, 1)
header_constellation = _get_constellation(bps_header)
header_equalizer = digital.ofdm_equalizer_simpledfe(
- fft_len, header_constellation.base(),
- occupied_carriers, pilot_carriers, pilot_symbols, 0, 0
+ fft_len,
+ header_constellation.base(),
+ occupied_carriers,
+ pilot_carriers,
+ pilot_symbols,
+ symbols_skipped=0,
)
header_eq = digital.ofdm_frame_equalizer_vcvc(
header_equalizer.base(),
@@ -336,10 +368,19 @@ class ofdm_rx(gr.hier_block2):
frame_length_tag_key,
packet_num_tag_key,
bps_header,
- bps_payload
+ bps_payload,
+ scramble_header=scramble_bits
)
header_parser = digital.packet_headerparser_b(header_formatter.formatter())
- self.connect((hpd, 0), header_fft, chanest, header_eq, header_serializer, header_demod, header_parser)
+ self.connect(
+ (hpd, 0),
+ header_fft,
+ chanest,
+ header_eq,
+ header_serializer,
+ header_demod,
+ header_parser
+ )
self.msg_connect(header_parser, "header_data", hpd, "header_data")
if debug_log:
self.connect((chanest, 1), blocks.file_sink(gr.sizeof_gr_complex * fft_len, 'channel-estimate.dat'))
@@ -347,16 +388,18 @@ class ofdm_rx(gr.hier_block2):
self.connect((chanest, 0), blocks.tag_debug(gr.sizeof_gr_complex * fft_len, 'post-hdr-chanest'))
self.connect(header_eq, blocks.file_sink(gr.sizeof_gr_complex * fft_len, 'post-hdr-eq.dat'))
self.connect(header_serializer, blocks.file_sink(gr.sizeof_gr_complex, 'post-hdr-serializer.dat'))
- self.connect(header_demod, blocks.file_sink(1, 'post-hdr-demod.dat'))
+ self.connect(header_descrambler, blocks.file_sink(1, 'post-hdr-demod.dat'))
### Payload demod ####################################################
payload_fft = fft.fft_vcc(self.fft_len, True, (), True)
payload_constellation = _get_constellation(bps_payload)
payload_equalizer = digital.ofdm_equalizer_simpledfe(
- fft_len, payload_constellation.base(),
+ fft_len,
+ payload_constellation.base(),
occupied_carriers,
pilot_carriers,
pilot_symbols,
- 1 # Skip 1 symbol (that was already in the header)
+ symbols_skipped=1, # (that was already in the header)
+ alpha=0.1
)
payload_eq = digital.ofdm_frame_equalizer_vcvc(
payload_equalizer.base(),
@@ -370,11 +413,29 @@ class ofdm_rx(gr.hier_block2):
1 # Skip 1 symbol (that was already in the header)
)
payload_demod = digital.constellation_decoder_cb(payload_constellation.base())
+ self.payload_descrambler = digital.additive_scrambler_bb(
+ 0x8a,
+ self.scramble_seed,
+ 7,
+ 0, # Don't reset after fixed length
+ bits_per_byte=bps_payload,
+ reset_tag_key=self.packet_length_tag_key
+ )
repack = blocks.repack_bits_bb(bps_payload, 8, self.packet_length_tag_key, True)
- crc = digital.crc32_bb(True, self.packet_length_tag_key)
- self.connect((hpd, 1), payload_fft, payload_eq, payload_serializer, payload_demod, repack, crc, self)
+ self.crc = digital.crc32_bb(True, self.packet_length_tag_key)
+ self.connect(
+ (hpd, 1),
+ payload_fft,
+ payload_eq,
+ payload_serializer,
+ payload_demod,
+ repack,
+ self.payload_descrambler,
+ self.crc,
+ self
+ )
if debug_log:
- self.connect((hpd, 1), blocks.tag_debug(gr.sizeof_gr_complex*fft_len, 'post-hpd'));
+ self.connect((hpd, 1), blocks.tag_debug(gr.sizeof_gr_complex*fft_len, 'post-hpd'))
self.connect(payload_fft, blocks.file_sink(gr.sizeof_gr_complex*fft_len, 'post-payload-fft.dat'))
self.connect(payload_eq, blocks.file_sink(gr.sizeof_gr_complex*fft_len, 'post-payload-eq.dat'))
self.connect(payload_serializer, blocks.file_sink(gr.sizeof_gr_complex, 'post-payload-serializer.dat'))