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.py319
1 files changed, 184 insertions, 135 deletions
diff --git a/gr-digital/python/digital/ofdm_txrx.py b/gr-digital/python/digital/ofdm_txrx.py
index 9d083c5fe2..60109ceaaa 100644
--- a/gr-digital/python/digital/ofdm_txrx.py
+++ b/gr-digital/python/digital/ofdm_txrx.py
@@ -31,15 +31,20 @@ _def_frame_length_tag_key = "frame_length"
_def_packet_length_tag_key = "packet_length"
_def_packet_num_tag_key = "packet_num"
# Data and pilot carriers are same as in 802.11a
-_def_occupied_carriers = (list(range(-26, -21)) + list(range(-20, -7)) + list(range(-6, 0)) + list(range(1, 7)) + list(range(8, 21)) + list(range(22, 27)),)
-_def_pilot_carriers=((-21, -7, 7, 21,),)
+_def_occupied_carriers = (list(range(-26, -21)) + list(range(-20, -7)) + list(
+ range(-6, 0)) + list(range(1, 7)) + list(range(8, 21)) + list(range(22, 27)),)
+_def_pilot_carriers = ((-21, -7, 7, 21,),)
_pilot_sym_scramble_seq = (
- 1,1,1,1, -1,-1,-1,1, -1,-1,-1,-1, 1,1,-1,1, -1,-1,1,1, -1,1,1,-1, 1,1,1,1, 1,1,-1,1,
- 1,1,-1,1, 1,-1,-1,1, 1,1,-1,1, -1,-1,-1,1, -1,1,-1,-1, 1,-1,-1,1, 1,1,1,1, -1,-1,1,1,
- -1,-1,1,-1, 1,-1,1,1, -1,-1,-1,1, 1,-1,-1,-1, -1,1,-1,-1, 1,-1,1,1, 1,1,-1,1, -1,1,-1,1,
- -1,-1,-1,-1, -1,1,-1,1, 1,-1,1,-1, 1,1,1,-1, -1,1,-1,-1, -1,1,1,1, -1,-1,-1,-1, -1,-1,-1
+ 1, 1, 1, 1, -1, -1, -1, 1, -1, -1, -1, -1, 1, 1, -1, 1, -
+ 1, -1, 1, 1, -1, 1, 1, -1, 1, 1, 1, 1, 1, 1, -1, 1,
+ 1, 1, -1, 1, 1, -1, -1, 1, 1, 1, -1, 1, -1, -1, -1, 1, -
+ 1, 1, -1, -1, 1, -1, -1, 1, 1, 1, 1, 1, -1, -1, 1, 1,
+ -1, -1, 1, -1, 1, -1, 1, 1, -1, -1, -1, 1, 1, -1, -1, -
+ 1, -1, 1, -1, -1, 1, -1, 1, 1, 1, 1, -1, 1, -1, 1, -1, 1,
+ -1, -1, -1, -1, -1, 1, -1, 1, 1, -1, 1, -1, 1, 1, 1, -1, -
+ 1, 1, -1, -1, -1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1
)
-_def_pilot_symbols= tuple([(x, x, x, -x) for x in _pilot_sym_scramble_seq])
+_def_pilot_symbols = tuple([(x, x, x, -x) for x in _pilot_sym_scramble_seq])
_seq_seed = 42
@@ -52,6 +57,7 @@ def _get_active_carriers(fft_len, occupied_carriers, pilot_carriers):
active_carriers.append(carrier)
return active_carriers
+
def _make_sync_word1(fft_len, occupied_carriers, pilot_carriers):
""" Creates a random sync sequence for fine frequency offset and timing
estimation. This is the first of typically two sync preamble symbols
@@ -64,31 +70,37 @@ def _make_sync_word1(fft_len, occupied_carriers, pilot_carriers):
Carrier 0 (DC carrier) is always zero. If used, carrier 1 is non-zero.
This means the sync algorithm has to check on odd carriers!
"""
- active_carriers = _get_active_carriers(fft_len, occupied_carriers, pilot_carriers)
+ active_carriers = _get_active_carriers(
+ fft_len, occupied_carriers, pilot_carriers)
numpy.random.seed(_seq_seed)
bpsk = {0: numpy.sqrt(2), 1: -numpy.sqrt(2)}
- sw1 = [bpsk[numpy.random.randint(2)] if x in active_carriers and x % 2 else 0 for x in range(fft_len)]
+ sw1 = [bpsk[numpy.random.randint(
+ 2)] if x in active_carriers and x % 2 else 0 for x in range(fft_len)]
return numpy.fft.fftshift(sw1)
+
def _make_sync_word2(fft_len, occupied_carriers, pilot_carriers):
""" Creates a random sync sequence for coarse frequency offset and channel
estimation. This is the second of typically two sync preamble symbols
for the Schmidl & Cox sync algorithm.
Symbols are always BPSK symbols.
"""
- active_carriers = _get_active_carriers(fft_len, occupied_carriers, pilot_carriers)
+ active_carriers = _get_active_carriers(
+ fft_len, occupied_carriers, pilot_carriers)
numpy.random.seed(_seq_seed)
bpsk = {0: 1, 1: -1}
- sw2 = [bpsk[numpy.random.randint(2)] if x in active_carriers else 0 for x in range(fft_len)]
+ sw2 = [bpsk[numpy.random.randint(
+ 2)] if x in active_carriers else 0 for x in range(fft_len)]
sw2[0] = 0j
return numpy.fft.fftshift(sw2)
+
def _get_constellation(bps):
""" Returns a modulator block for a given number of bits per symbol """
constellation = {
- 1: digital.constellation_bpsk(),
- 2: digital.constellation_qpsk(),
- 3: digital.constellation_8psk()
+ 1: digital.constellation_bpsk(),
+ 2: digital.constellation_qpsk(),
+ 3: digital.constellation_8psk()
}
try:
return constellation[bps]
@@ -96,6 +108,7 @@ def _get_constellation(bps):
print('Modulation not supported.')
exit(1)
+
class ofdm_tx(gr.hier_block2):
"""Hierarchical block for OFDM modulation.
@@ -122,6 +135,7 @@ class ofdm_tx(gr.hier_block2):
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,
occupied_carriers=_def_occupied_carriers,
@@ -136,75 +150,82 @@ class ofdm_tx(gr.hier_block2):
scramble_bits=False
):
gr.hier_block2.__init__(self, "ofdm_tx",
- gr.io_signature(1, 1, gr.sizeof_char),
- gr.io_signature(1, 1, gr.sizeof_gr_complex))
+ gr.io_signature(1, 1, gr.sizeof_char),
+ gr.io_signature(1, 1, gr.sizeof_gr_complex))
### Param init / sanity check ########################################
- self.fft_len = fft_len
- self.cp_len = cp_len
+ self.fft_len = fft_len
+ self.cp_len = cp_len
self.packet_length_tag_key = packet_length_tag_key
self.occupied_carriers = occupied_carriers
- self.pilot_carriers = pilot_carriers
- self.pilot_symbols = pilot_symbols
- self.bps_header = bps_header
- self.bps_payload = bps_payload
+ self.pilot_carriers = pilot_carriers
+ self.pilot_symbols = pilot_symbols
+ self.bps_header = bps_header
+ self.bps_payload = bps_payload
self.sync_word1 = sync_word1
if sync_word1 is None:
- self.sync_word1 = _make_sync_word1(fft_len, occupied_carriers, pilot_carriers)
+ self.sync_word1 = _make_sync_word1(
+ fft_len, occupied_carriers, pilot_carriers)
else:
if len(sync_word1) != self.fft_len:
- raise ValueError("Length of sync sequence(s) must be FFT length.")
- self.sync_words = [self.sync_word1,]
+ raise ValueError(
+ "Length of sync sequence(s) must be FFT length.")
+ self.sync_words = [self.sync_word1, ]
if sync_word2 is None:
- self.sync_word2 = _make_sync_word2(fft_len, occupied_carriers, pilot_carriers)
+ 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.")
+ raise ValueError(
+ "Length of sync sequence(s) must be FFT length.")
self.sync_word2 = list(self.sync_word2)
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
+ 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)
- header_mod = digital.chunks_to_symbols_bc(header_constellation.points())
+ header_constellation = _get_constellation(bps_header)
+ header_mod = digital.chunks_to_symbols_bc(
+ header_constellation.points())
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,
scramble_header=scramble_bits
)
- header_gen = digital.packet_headergenerator_bb(formatter_object.base(), self.packet_length_tag_key)
+ header_gen = digital.packet_headergenerator_bb(
+ formatter_object.base(), self.packet_length_tag_key)
header_payload_mux = blocks.tagged_stream_mux(
- itemsize=gr.sizeof_gr_complex*1,
- lengthtagname=self.packet_length_tag_key,
- tag_preserve_head_pos=1 # Head tags on the payload stream stay on the head
+ itemsize=gr.sizeof_gr_complex * 1,
+ lengthtagname=self.packet_length_tag_key,
+ tag_preserve_head_pos=1 # Head tags on the payload stream stay on the head
)
self.connect(
- self,
- crc,
- header_gen,
- header_mod,
- (header_payload_mux, 0)
+ 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_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=8, # This is before unpacking
+ 0, # Don't reset after fixed length (let the reset tag do that)
+ bits_per_byte=8, # This is before unpacking
reset_tag_key=self.packet_length_tag_key
)
payload_unpack = blocks.repack_bits_bb(
- 8, # Unpack 8 bits per byte
+ 8, # Unpack 8 bits per byte
bps_payload,
self.packet_length_tag_key
)
@@ -225,21 +246,24 @@ class ofdm_tx(gr.hier_block2):
len_tag_key=self.packet_length_tag_key
)
ffter = fft.fft_vcc(
- self.fft_len,
- False, # Inverse FFT
- (), # No window
- True # Shift
+ self.fft_len,
+ False, # Inverse FFT
+ (), # No window
+ True # Shift
)
cyclic_prefixer = digital.ofdm_cyclic_prefixer(
self.fft_len,
- self.fft_len+self.cp_len,
+ self.fft_len + self.cp_len,
rolloff,
self.packet_length_tag_key
)
- self.connect(header_payload_mux, allocator, ffter, cyclic_prefixer, self)
+ self.connect(header_payload_mux, allocator,
+ ffter, cyclic_prefixer, self)
if debug_log:
- 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'))
+ 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):
@@ -265,6 +289,7 @@ class ofdm_rx(gr.hier_block2):
| entirely. Also used for coarse frequency offset and
| channel estimation.
"""
+
def __init__(self, fft_len=_def_fft_len, cp_len=_def_cp_len,
frame_length_tag_key=_def_frame_length_tag_key,
packet_length_tag_key=_def_packet_length_tag_key,
@@ -280,60 +305,69 @@ class ofdm_rx(gr.hier_block2):
scramble_bits=False
):
gr.hier_block2.__init__(self, "ofdm_rx",
- gr.io_signature(1, 1, gr.sizeof_gr_complex),
- gr.io_signature(1, 1, gr.sizeof_char))
+ gr.io_signature(1, 1, gr.sizeof_gr_complex),
+ gr.io_signature(1, 1, gr.sizeof_char))
### Param init / sanity check ########################################
- self.fft_len = fft_len
- self.cp_len = cp_len
- self.frame_length_tag_key = frame_length_tag_key
- self.packet_length_tag_key = packet_length_tag_key
+ self.fft_len = fft_len
+ self.cp_len = cp_len
+ self.frame_length_tag_key = frame_length_tag_key
+ self.packet_length_tag_key = packet_length_tag_key
self.occupied_carriers = occupied_carriers
- self.bps_header = bps_header
- self.bps_payload = bps_payload
+ self.bps_header = bps_header
+ self.bps_payload = bps_payload
n_sync_words = 1
if sync_word1 is None:
- self.sync_word1 = _make_sync_word1(fft_len, occupied_carriers, pilot_carriers)
+ self.sync_word1 = _make_sync_word1(
+ fft_len, occupied_carriers, pilot_carriers)
else:
if len(sync_word1) != self.fft_len:
- raise ValueError("Length of sync sequence(s) must be FFT length.")
+ raise ValueError(
+ "Length of sync sequence(s) must be FFT length.")
self.sync_word1 = sync_word1
self.sync_word2 = ()
if sync_word2 is None:
- self.sync_word2 = _make_sync_word2(fft_len, occupied_carriers, pilot_carriers)
+ self.sync_word2 = _make_sync_word2(
+ fft_len, occupied_carriers, pilot_carriers)
n_sync_words = 2
elif len(sync_word2):
if len(sync_word2) != fft_len:
- raise ValueError("Length of sync sequence(s) must be FFT length.")
+ 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
+ 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)
+ delay = blocks.delay(gr.sizeof_gr_complex, fft_len + cp_len)
oscillator = analog.frequency_modulator_fc(-2.0 / fft_len)
mixer = blocks.multiply_cc()
hpd = digital.header_payload_demux(
- n_sync_words+1, # Number of OFDM symbols before payload (sync + 1 sym header)
+ # Number of OFDM symbols before payload (sync + 1 sym header)
+ n_sync_words + 1,
fft_len, cp_len, # FFT length, guard interval
- frame_length_tag_key, # Frame length tag key
+ frame_length_tag_key, # Frame length tag key
"", # We're not using trigger tags
- True # One output item is one OFDM symbol (False would output complex scalars)
+ # One output item is one OFDM symbol (False would output complex scalars)
+ True
)
self.connect(self, sync_detect)
self.connect(self, delay, (mixer, 0), (hpd, 0))
self.connect((sync_detect, 0), oscillator, (mixer, 1))
self.connect((sync_detect, 1), (hpd, 1))
if debug_log:
- self.connect((sync_detect, 0), blocks.file_sink(gr.sizeof_float, 'freq-offset.dat'))
- self.connect((sync_detect, 1), blocks.file_sink(gr.sizeof_char, 'sync-detect.dat'))
+ self.connect((sync_detect, 0), blocks.file_sink(
+ gr.sizeof_float, 'freq-offset.dat'))
+ self.connect((sync_detect, 1), blocks.file_sink(
+ gr.sizeof_char, 'sync-detect.dat'))
### Header demodulation ##############################################
- header_fft = fft.fft_vcc(self.fft_len, True, (), True)
- chanest = digital.ofdm_chanest_vcvc(self.sync_word1, self.sync_word2, 1)
+ header_fft = fft.fft_vcc(self.fft_len, True, (), True)
+ chanest = digital.ofdm_chanest_vcvc(
+ self.sync_word1, self.sync_word2, 1)
header_constellation = _get_constellation(bps_header)
- header_equalizer = digital.ofdm_equalizer_simpledfe(
+ header_equalizer = digital.ofdm_equalizer_simpledfe(
fft_len,
header_constellation.base(),
occupied_carriers,
@@ -342,93 +376,108 @@ class ofdm_rx(gr.hier_block2):
symbols_skipped=0,
)
header_eq = digital.ofdm_frame_equalizer_vcvc(
- header_equalizer.base(),
- cp_len,
- self.frame_length_tag_key,
- True,
- 1 # Header is 1 symbol long
+ header_equalizer.base(),
+ cp_len,
+ self.frame_length_tag_key,
+ True,
+ 1 # Header is 1 symbol long
)
header_serializer = digital.ofdm_serializer_vcc(
- fft_len, occupied_carriers,
- self.frame_length_tag_key
+ fft_len, occupied_carriers,
+ self.frame_length_tag_key
)
- header_demod = digital.constellation_decoder_cb(header_constellation.base())
+ header_demod = digital.constellation_decoder_cb(
+ header_constellation.base())
header_formatter = digital.packet_header_ofdm(
- occupied_carriers, 1,
- packet_length_tag_key,
- frame_length_tag_key,
- packet_num_tag_key,
- bps_header,
- bps_payload,
- scramble_header=scramble_bits
+ occupied_carriers, 1,
+ packet_length_tag_key,
+ frame_length_tag_key,
+ packet_num_tag_key,
+ bps_header,
+ bps_payload,
+ scramble_header=scramble_bits
)
- header_parser = digital.packet_headerparser_b(header_formatter.formatter())
+ header_parser = digital.packet_headerparser_b(
+ header_formatter.formatter())
self.connect(
- (hpd, 0),
- header_fft,
- chanest,
- header_eq,
- header_serializer,
- header_demod,
- header_parser
+ (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'))
- self.connect((chanest, 0), blocks.file_sink(gr.sizeof_gr_complex * fft_len, 'post-hdr-chanest.dat'))
- 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((chanest, 1), blocks.file_sink(
+ gr.sizeof_gr_complex * fft_len, 'channel-estimate.dat'))
+ self.connect((chanest, 0), blocks.file_sink(
+ gr.sizeof_gr_complex * fft_len, 'post-hdr-chanest.dat'))
+ 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'))
### 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(),
- occupied_carriers,
- pilot_carriers,
- pilot_symbols,
- symbols_skipped=1, # (that was already in the header)
- alpha=0.1
+ fft_len,
+ payload_constellation.base(),
+ occupied_carriers,
+ pilot_carriers,
+ pilot_symbols,
+ symbols_skipped=1, # (that was already in the header)
+ alpha=0.1
)
payload_eq = digital.ofdm_frame_equalizer_vcvc(
- payload_equalizer.base(),
- cp_len,
- self.frame_length_tag_key
+ payload_equalizer.base(),
+ cp_len,
+ self.frame_length_tag_key
)
payload_serializer = digital.ofdm_serializer_vcc(
- fft_len, occupied_carriers,
- self.frame_length_tag_key,
- self.packet_length_tag_key,
- 1 # Skip 1 symbol (that was already in the header)
+ fft_len, occupied_carriers,
+ self.frame_length_tag_key,
+ self.packet_length_tag_key,
+ 1 # Skip 1 symbol (that was already in the header)
)
- payload_demod = digital.constellation_decoder_cb(payload_constellation.base())
+ 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=8, # This is after packing
+ 0, # Don't reset after fixed length
+ bits_per_byte=8, # This is after packing
reset_tag_key=self.packet_length_tag_key
)
- payload_pack = blocks.repack_bits_bb(bps_payload, 8, self.packet_length_tag_key, True)
+ payload_pack = blocks.repack_bits_bb(
+ bps_payload, 8, self.packet_length_tag_key, True)
self.crc = digital.crc32_bb(True, self.packet_length_tag_key)
self.connect(
- (hpd, 1),
- payload_fft,
- payload_eq,
- payload_serializer,
- payload_demod,
- payload_pack,
- self.payload_descrambler,
- self.crc,
- self
+ (hpd, 1),
+ payload_fft,
+ payload_eq,
+ payload_serializer,
+ payload_demod,
+ payload_pack,
+ 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(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'))
- self.connect(payload_demod, blocks.file_sink(1, 'post-payload-demod.dat'))
- self.connect(payload_pack, blocks.file_sink(1, 'post-payload-pack.dat'))
- self.connect(self.crc, blocks.file_sink(1, 'post-payload-crc.dat'))
+ 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'))
+ self.connect(payload_demod, blocks.file_sink(
+ 1, 'post-payload-demod.dat'))
+ self.connect(payload_pack, blocks.file_sink(
+ 1, 'post-payload-pack.dat'))
+ self.connect(self.crc, blocks.file_sink(1, 'post-payload-crc.dat'))