[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Commit-gnuradio] [gnuradio] 04/25: polar: Python implementation for cha
From: |
git |
Subject: |
[Commit-gnuradio] [gnuradio] 04/25: polar: Python implementation for channel construction |
Date: |
Wed, 23 Sep 2015 14:51:36 +0000 (UTC) |
This is an automated email from the git hooks/post-receive script.
jcorgan pushed a commit to branch master
in repository gnuradio.
commit 8b486050a7e425e21f069ad6742385d6496c63eb
Author: Johannes Demel <address@hidden>
Date: Mon Jul 6 19:22:26 2015 +0200
polar: Python implementation for channel construction
---
gr-fec/examples/polar_ber_curve_gen.grc | 1583 ++++++++++++++++++++
...er_decoder_chain.grc => polar_code_example.grc} | 512 +++++--
gr-fec/examples/polar_encoder_decoder_chain.grc | 87 +-
gr-fec/grc/fec_block_tree.xml | 1 +
gr-fec/grc/fec_polar_decoder_sc.xml | 45 +-
gr-fec/grc/fec_polar_decoder_sc_list.xml | 46 +-
gr-fec/grc/fec_polar_encoder.xml | 45 +-
gr-fec/grc/polar_code_configurator.xml | 54 +
gr-fec/include/gnuradio/fec/polar_decoder_sc.h | 4 +-
gr-fec/lib/polar_decoder_common.cc | 2 +-
gr-fec/python/fec/CMakeLists.txt | 2 +
.../fec/polar/{__init__.py => CMakeLists.txt} | 25 +-
gr-fec/python/fec/polar/__init__.py | 39 +
gr-fec/python/fec/polar/channel_construction.py | 131 ++
.../python/fec/polar/channel_construction_bec.py | 86 +-
.../python/fec/polar/channel_construction_bsc.py | 351 +++--
gr-fec/python/fec/polar/helper_functions.py | 74 +-
gr-fec/python/fec/polar/polar_channel_construction | 72 +
gr-fec/python/fec/polar/polar_code.py | 493 ------
gr-fec/python/fec/qa_polar_decoder_sc.py | 10 +-
gr-fec/python/fec/qa_polar_decoder_sc_list.py | 15 +-
gr-fec/python/fec/qa_polar_encoder.py | 8 +-
22 files changed, 2871 insertions(+), 814 deletions(-)
diff --git a/gr-fec/examples/polar_ber_curve_gen.grc
b/gr-fec/examples/polar_ber_curve_gen.grc
new file mode 100644
index 0000000..01fed83
--- /dev/null
+++ b/gr-fec/examples/polar_ber_curve_gen.grc
@@ -0,0 +1,1583 @@
+<?xml version='1.0' encoding='utf-8'?>
+<?grc format='1' created='3.7.8'?>
+<flow_graph>
+ <timestamp>Fri Jul 17 15:23:09 2015</timestamp>
+ <block>
+ <key>options</key>
+ <param>
+ <key>author</key>
+ <value>Johannes Demel</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>category</key>
+ <value>Custom</value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>description</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(10, 10)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>generate_options</key>
+ <value>qt_gui</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>polar_ber_curve_gen</value>
+ </param>
+ <param>
+ <key>max_nouts</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>realtime_scheduling</key>
+ <value></value>
+ </param>
+ <param>
+ <key>run_options</key>
+ <value>prompt</value>
+ </param>
+ <param>
+ <key>run</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>thread_safe_setters</key>
+ <value></value>
+ </param>
+ <param>
+ <key>title</key>
+ <value>polar code BER curve generator</value>
+ </param>
+ <param>
+ <key>window_size</key>
+ <value>1920,1080</value>
+ </param>
+ </block>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(304, 35)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>block_size</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>1024</value>
+ </param>
+ </block>
+ <block>
+ <key>variable_cc_decoder_def</key>
+ <param>
+ <key>padding</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>k</key>
+ <value>k</value>
+ </param>
+ <param>
+ <key>dim1</key>
+ <value>len(esno)</value>
+ </param>
+ <param>
+ <key>dim2</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>state_end</key>
+ <value>-1</value>
+ </param>
+ <param>
+ <key>framebits</key>
+ <value>block_size</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(1368, 395)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>dec_cc</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>"ok"</value>
+ </param>
+ <param>
+ <key>ndim</key>
+ <value>2</value>
+ </param>
+ <param>
+ <key>polys</key>
+ <value>polys</value>
+ </param>
+ <param>
+ <key>rate</key>
+ <value>rate</value>
+ </param>
+ <param>
+ <key>state_start</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>mode</key>
+ <value>fec.CC_STREAMING</value>
+ </param>
+ </block>
+ <block>
+ <key>variable_cc_encoder_def</key>
+ <param>
+ <key>padding</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>k</key>
+ <value>k</value>
+ </param>
+ <param>
+ <key>dim1</key>
+ <value>len(esno)</value>
+ </param>
+ <param>
+ <key>dim2</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>framebits</key>
+ <value>block_size</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(1368, 187)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>enc_cc</value>
+ </param>
+ <param>
+ <key>ndim</key>
+ <value>2</value>
+ </param>
+ <param>
+ <key>polys</key>
+ <value>polys</value>
+ </param>
+ <param>
+ <key>rate</key>
+ <value>rate</value>
+ </param>
+ <param>
+ <key>state_start</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>mode</key>
+ <value>fec.CC_STREAMING</value>
+ </param>
+ </block>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(704, 19)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>esno</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>numpy.arange(-1, 4, 0.5)</value>
+ </param>
+ </block>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(1368, 115)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>k</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>7</value>
+ </param>
+ </block>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(536, 171)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>list_size</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>8</value>
+ </param>
+ </block>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(424, 35)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>n_info_bits</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>block_size / 2</value>
+ </param>
+ </block>
+ <block>
+ <key>variable_polar_code_configurator</key>
+ <param>
+ <key>num_info_bits</key>
+ <value>n_info_bits</value>
+ </param>
+ <param>
+ <key>block_size</key>
+ <value>block_size</value>
+ </param>
+ <param>
+ <key>channel</key>
+ <value>bsc</value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(328, 107)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>polar_config</value>
+ </param>
+ <param>
+ <key>design_snr</key>
+ <value>0.0</value>
+ </param>
+ <param>
+ <key>mu</key>
+ <value>32</value>
+ </param>
+ </block>
+ <block>
+ <key>variable_polar_decoder_sc_def</key>
+ <param>
+ <key>num_info_bits</key>
+ <value>n_info_bits</value>
+ </param>
+ <param>
+ <key>block_size</key>
+ <value>block_size</value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>dim1</key>
+ <value>len(esno)</value>
+ </param>
+ <param>
+ <key>dim2</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>frozen_bit_positions</key>
+ <value>polar_config['positions']</value>
+ </param>
+ <param>
+ <key>frozen_bit_values</key>
+ <value>polar_config['values']</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(192, 419)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>polar_decoder</value>
+ </param>
+ <param>
+ <key>is_packed</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>ndim</key>
+ <value>2</value>
+ </param>
+ </block>
+ <block>
+ <key>variable_polar_encoder_def</key>
+ <param>
+ <key>num_info_bits</key>
+ <value>n_info_bits</value>
+ </param>
+ <param>
+ <key>block_size</key>
+ <value>block_size</value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>dim1</key>
+ <value>len(esno)</value>
+ </param>
+ <param>
+ <key>dim2</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>frozen_bit_positions</key>
+ <value>polar_config['positions']</value>
+ </param>
+ <param>
+ <key>frozen_bit_values</key>
+ <value>polar_config['values']</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(192, 251)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>polar_encoder</value>
+ </param>
+ <param>
+ <key>is_packed</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>ndim</key>
+ <value>2</value>
+ </param>
+ </block>
+ <block>
+ <key>variable_polar_encoder_def</key>
+ <param>
+ <key>num_info_bits</key>
+ <value>n_info_bits</value>
+ </param>
+ <param>
+ <key>block_size</key>
+ <value>block_size</value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>dim1</key>
+ <value>len(esno)</value>
+ </param>
+ <param>
+ <key>dim2</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>frozen_bit_positions</key>
+ <value>polar_config['positions']</value>
+ </param>
+ <param>
+ <key>frozen_bit_values</key>
+ <value>polar_config['values']</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(456, 243)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>polar_encoder_scld</value>
+ </param>
+ <param>
+ <key>is_packed</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>ndim</key>
+ <value>2</value>
+ </param>
+ </block>
+ <block>
+ <key>variable_polar_decoder_sc_list_def</key>
+ <param>
+ <key>num_info_bits</key>
+ <value>n_info_bits</value>
+ </param>
+ <param>
+ <key>block_size</key>
+ <value>block_size</value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>dim1</key>
+ <value>len(esno)</value>
+ </param>
+ <param>
+ <key>dim2</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>frozen_bit_positions</key>
+ <value>polar_config['positions']</value>
+ </param>
+ <param>
+ <key>frozen_bit_values</key>
+ <value>polar_config['values']</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(456, 411)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>polar_scld</value>
+ </param>
+ <param>
+ <key>max_list_size</key>
+ <value>list_size</value>
+ </param>
+ <param>
+ <key>is_packed</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>ndim</key>
+ <value>2</value>
+ </param>
+ </block>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(1440, 115)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>polys</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>[79, 109]</value>
+ </param>
+ </block>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(1368, 51)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>rate</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>2</value>
+ </param>
+ </block>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(16, 107)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>samp_rate</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>350e3</value>
+ </param>
+ </block>
+ <block>
+ <key>fec_bercurve_generator</key>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>decoder_list</key>
+ <value>polar_decoder</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>encoder_list</key>
+ <value>polar_encoder</value>
+ </param>
+ <param>
+ <key>esno</key>
+ <value>esno</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(808, 123)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>polar_curve_gen_sc</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>seed</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>puncpat</key>
+ <value>'11'</value>
+ </param>
+ <param>
+ <key>samp_rate</key>
+ <value>3200000</value>
+ </param>
+ <param>
+ <key>threadtype</key>
+ <value>"none"</value>
+ </param>
+ <bus_source>1</bus_source>
+ </block>
+ <block>
+ <key>fec_bercurve_generator</key>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>decoder_list</key>
+ <value>polar_scld</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>encoder_list</key>
+ <value>polar_encoder_scld</value>
+ </param>
+ <param>
+ <key>esno</key>
+ <value>esno</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(808, 227)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>polar_curve_gen_scld</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>seed</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>puncpat</key>
+ <value>'11'</value>
+ </param>
+ <param>
+ <key>samp_rate</key>
+ <value>3200000</value>
+ </param>
+ <param>
+ <key>threadtype</key>
+ <value>"none"</value>
+ </param>
+ <bus_source>1</bus_source>
+ </block>
+ <block>
+ <key>fec_bercurve_generator</key>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>decoder_list</key>
+ <value>dec_cc</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>encoder_list</key>
+ <value>enc_cc</value>
+ </param>
+ <param>
+ <key>esno</key>
+ <value>esno</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(808, 331)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>polar_curve_gen_scld_0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>seed</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>puncpat</key>
+ <value>'11'</value>
+ </param>
+ <param>
+ <key>samp_rate</key>
+ <value>3200000</value>
+ </param>
+ <param>
+ <key>threadtype</key>
+ <value>"capillary"</value>
+ </param>
+ <bus_source>1</bus_source>
+ </block>
+ <block>
+ <key>qtgui_bercurve_sink</key>
+ <param>
+ <key>berlimit</key>
+ <value>-7.0</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>curvenames</key>
+ <value>['POLAR decoder', 'POLAR decoder list', 'CC']</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(1176, 146)</value>
+ </param>
+ <param>
+ <key>gui_hint</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>qtgui_bercurve_sink_0</value>
+ </param>
+ <param>
+ <key>alpha1</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>color1</key>
+ <value>"blue"</value>
+ </param>
+ <param>
+ <key>label1</key>
+ <value>POLAR decoder</value>
+ </param>
+ <param>
+ <key>marker1</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>style1</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>width1</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>alpha10</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>color10</key>
+ <value>"blue"</value>
+ </param>
+ <param>
+ <key>label10</key>
+ <value></value>
+ </param>
+ <param>
+ <key>marker10</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>style10</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>width10</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>alpha2</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>color2</key>
+ <value>"red"</value>
+ </param>
+ <param>
+ <key>label2</key>
+ <value>POLAR list decoder</value>
+ </param>
+ <param>
+ <key>marker2</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>style2</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>width2</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>alpha3</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>color3</key>
+ <value>"green"</value>
+ </param>
+ <param>
+ <key>label3</key>
+ <value>CC convolutional</value>
+ </param>
+ <param>
+ <key>marker3</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>style3</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>width3</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>alpha4</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>color4</key>
+ <value>"black"</value>
+ </param>
+ <param>
+ <key>label4</key>
+ <value></value>
+ </param>
+ <param>
+ <key>marker4</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>style4</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>width4</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>alpha5</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>color5</key>
+ <value>"cyan"</value>
+ </param>
+ <param>
+ <key>label5</key>
+ <value></value>
+ </param>
+ <param>
+ <key>marker5</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>style5</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>width5</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>alpha6</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>color6</key>
+ <value>"magenta"</value>
+ </param>
+ <param>
+ <key>label6</key>
+ <value></value>
+ </param>
+ <param>
+ <key>marker6</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>style6</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>width6</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>alpha7</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>color7</key>
+ <value>"yellow"</value>
+ </param>
+ <param>
+ <key>label7</key>
+ <value></value>
+ </param>
+ <param>
+ <key>marker7</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>style7</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>width7</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>alpha8</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>color8</key>
+ <value>"dark red"</value>
+ </param>
+ <param>
+ <key>label8</key>
+ <value></value>
+ </param>
+ <param>
+ <key>marker8</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>style8</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>width8</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>alpha9</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>color9</key>
+ <value>"dark green"</value>
+ </param>
+ <param>
+ <key>label9</key>
+ <value></value>
+ </param>
+ <param>
+ <key>marker9</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>style9</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>width9</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>berminerrors</key>
+ <value>100</value>
+ </param>
+ <param>
+ <key>num_curves</key>
+ <value>3</value>
+ </param>
+ <param>
+ <key>update_time</key>
+ <value>0.10</value>
+ </param>
+ <param>
+ <key>ymax</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>ymin</key>
+ <value>-10</value>
+ </param>
+ <param>
+ <key>esno</key>
+ <value>esno</value>
+ </param>
+ <bus_sink>1</bus_sink>
+ </block>
+ <connection>
+ <source_block_id>polar_curve_gen_sc</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>20</source_key>
+ <sink_key>60</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>polar_curve_gen_sc</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>polar_curve_gen_sc</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>1</source_key>
+ <sink_key>1</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>polar_curve_gen_sc</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>10</source_key>
+ <sink_key>10</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>polar_curve_gen_sc</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>11</source_key>
+ <sink_key>11</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>polar_curve_gen_sc</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>12</source_key>
+ <sink_key>12</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>polar_curve_gen_sc</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>13</source_key>
+ <sink_key>13</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>polar_curve_gen_sc</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>14</source_key>
+ <sink_key>14</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>polar_curve_gen_sc</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>15</source_key>
+ <sink_key>15</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>polar_curve_gen_sc</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>16</source_key>
+ <sink_key>16</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>polar_curve_gen_sc</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>17</source_key>
+ <sink_key>17</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>polar_curve_gen_sc</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>18</source_key>
+ <sink_key>18</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>polar_curve_gen_sc</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>19</source_key>
+ <sink_key>19</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>polar_curve_gen_sc</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>2</source_key>
+ <sink_key>2</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>polar_curve_gen_sc</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>3</source_key>
+ <sink_key>3</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>polar_curve_gen_sc</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>4</source_key>
+ <sink_key>4</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>polar_curve_gen_sc</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>5</source_key>
+ <sink_key>5</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>polar_curve_gen_sc</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>6</source_key>
+ <sink_key>6</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>polar_curve_gen_sc</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>7</source_key>
+ <sink_key>7</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>polar_curve_gen_sc</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>8</source_key>
+ <sink_key>8</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>polar_curve_gen_sc</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>9</source_key>
+ <sink_key>9</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>polar_curve_gen_scld</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>20</source_key>
+ <sink_key>61</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>polar_curve_gen_scld</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>20</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>polar_curve_gen_scld</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>1</source_key>
+ <sink_key>21</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>polar_curve_gen_scld</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>10</source_key>
+ <sink_key>30</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>polar_curve_gen_scld</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>11</source_key>
+ <sink_key>31</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>polar_curve_gen_scld</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>12</source_key>
+ <sink_key>32</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>polar_curve_gen_scld</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>13</source_key>
+ <sink_key>33</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>polar_curve_gen_scld</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>14</source_key>
+ <sink_key>34</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>polar_curve_gen_scld</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>15</source_key>
+ <sink_key>35</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>polar_curve_gen_scld</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>16</source_key>
+ <sink_key>36</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>polar_curve_gen_scld</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>17</source_key>
+ <sink_key>37</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>polar_curve_gen_scld</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>18</source_key>
+ <sink_key>38</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>polar_curve_gen_scld</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>19</source_key>
+ <sink_key>39</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>polar_curve_gen_scld</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>2</source_key>
+ <sink_key>22</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>polar_curve_gen_scld</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>3</source_key>
+ <sink_key>23</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>polar_curve_gen_scld</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>4</source_key>
+ <sink_key>24</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>polar_curve_gen_scld</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>5</source_key>
+ <sink_key>25</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>polar_curve_gen_scld</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>6</source_key>
+ <sink_key>26</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>polar_curve_gen_scld</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>7</source_key>
+ <sink_key>27</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>polar_curve_gen_scld</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>8</source_key>
+ <sink_key>28</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>polar_curve_gen_scld</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>9</source_key>
+ <sink_key>29</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>polar_curve_gen_scld_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>20</source_key>
+ <sink_key>62</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>polar_curve_gen_scld_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>40</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>polar_curve_gen_scld_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>1</source_key>
+ <sink_key>41</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>polar_curve_gen_scld_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>10</source_key>
+ <sink_key>50</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>polar_curve_gen_scld_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>11</source_key>
+ <sink_key>51</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>polar_curve_gen_scld_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>12</source_key>
+ <sink_key>52</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>polar_curve_gen_scld_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>13</source_key>
+ <sink_key>53</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>polar_curve_gen_scld_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>14</source_key>
+ <sink_key>54</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>polar_curve_gen_scld_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>15</source_key>
+ <sink_key>55</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>polar_curve_gen_scld_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>16</source_key>
+ <sink_key>56</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>polar_curve_gen_scld_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>17</source_key>
+ <sink_key>57</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>polar_curve_gen_scld_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>18</source_key>
+ <sink_key>58</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>polar_curve_gen_scld_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>19</source_key>
+ <sink_key>59</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>polar_curve_gen_scld_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>2</source_key>
+ <sink_key>42</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>polar_curve_gen_scld_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>3</source_key>
+ <sink_key>43</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>polar_curve_gen_scld_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>4</source_key>
+ <sink_key>44</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>polar_curve_gen_scld_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>5</source_key>
+ <sink_key>45</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>polar_curve_gen_scld_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>6</source_key>
+ <sink_key>46</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>polar_curve_gen_scld_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>7</source_key>
+ <sink_key>47</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>polar_curve_gen_scld_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>8</source_key>
+ <sink_key>48</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>polar_curve_gen_scld_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>9</source_key>
+ <sink_key>49</sink_key>
+ </connection>
+</flow_graph>
diff --git a/gr-fec/examples/polar_encoder_decoder_chain.grc
b/gr-fec/examples/polar_code_example.grc
similarity index 72%
copy from gr-fec/examples/polar_encoder_decoder_chain.grc
copy to gr-fec/examples/polar_code_example.grc
index 7cab62d..729e8fe 100644
--- a/gr-fec/examples/polar_encoder_decoder_chain.grc
+++ b/gr-fec/examples/polar_code_example.grc
@@ -1,7 +1,7 @@
-<?xml version='1.0' encoding='ASCII'?>
+<?xml version='1.0' encoding='utf-8'?>
<?grc format='1' created='3.7.8'?>
<flow_graph>
- <timestamp>Mon Jun 15 10:51:02 2015</timestamp>
+ <timestamp>Thu Jul 16 16:19:12 2015</timestamp>
<block>
<key>options</key>
<param>
@@ -18,17 +18,7 @@
</param>
<param>
<key>comment</key>
- <value># for rough throughput measurements.
-
- tb = polar_encoder_decoder_chain()
- start_time = time.time()
- tb.start()
- tb.wait()
- stop_time = time.time()
- samps = 2 ** 22
- diff = stop_time - start_time
- throughput = tb.head_samps / diff
- print("exe time:", diff, ", with ", tb.head_samps, "samps, throughput: ",
throughput)</value>
+ <value></value>
</param>
<param>
<key>description</key>
@@ -48,11 +38,11 @@
</param>
<param>
<key>generate_options</key>
- <value>no_gui</value>
+ <value>qt_gui</value>
</param>
<param>
<key>id</key>
- <value>polar_encoder_decoder_chain</value>
+ <value>polar_code_example</value>
</param>
<param>
<key>max_nouts</key>
@@ -64,7 +54,7 @@
</param>
<param>
<key>run_options</key>
- <value>run</value>
+ <value>prompt</value>
</param>
<param>
<key>run</key>
@@ -76,11 +66,11 @@
</param>
<param>
<key>title</key>
- <value>POLAR Encoder and Decoder</value>
+ <value>POLAR code example flowgraph</value>
</param>
<param>
<key>window_size</key>
- <value>1920, 1080</value>
+ <value>1280, 1024</value>
</param>
</block>
<block>
@@ -95,7 +85,7 @@
</param>
<param>
<key>_coordinate</key>
- <value>(360, 11)</value>
+ <value>(440, 11)</value>
</param>
<param>
<key>_rotation</key>
@@ -103,42 +93,120 @@
</param>
<param>
<key>id</key>
- <value>head_samps</value>
+ <value>block_size</value>
</param>
<param>
<key>value</key>
- <value>2 ** 22</value>
+ <value>1024</value>
+ </param>
+ </block>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(560, 11)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>n_info_bits</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>block_size / 2</value>
+ </param>
+ </block>
+ <block>
+ <key>variable_polar_code_configurator</key>
+ <param>
+ <key>num_info_bits</key>
+ <value>n_info_bits</value>
+ </param>
+ <param>
+ <key>block_size</key>
+ <value>block_size</value>
+ </param>
+ <param>
+ <key>channel</key>
+ <value>bsc</value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(456, 75)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>polar_config</value>
+ </param>
+ <param>
+ <key>design_snr</key>
+ <value>0.0</value>
+ </param>
+ <param>
+ <key>mu</key>
+ <value>32</value>
</param>
</block>
<block>
<key>variable_polar_decoder_sc_def</key>
<param>
<key>num_info_bits</key>
- <value>128</value>
+ <value>n_info_bits</value>
</param>
<param>
<key>block_size</key>
- <value>256</value>
+ <value>block_size</value>
</param>
<param>
<key>comment</key>
<value></value>
</param>
<param>
+ <key>dim1</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>dim2</key>
+ <value>1</value>
+ </param>
+ <param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
<key>frozen_bit_positions</key>
- <value>range(128)</value>
+ <value>polar_config['positions']</value>
</param>
<param>
<key>frozen_bit_values</key>
- <value>[0] * 128</value>
+ <value>polar_config['values']</value>
</param>
<param>
<key>_coordinate</key>
- <value>(864, 555)</value>
+ <value>(640, 203)</value>
</param>
<param>
<key>_rotation</key>
@@ -152,36 +220,48 @@
<key>is_packed</key>
<value>False</value>
</param>
+ <param>
+ <key>ndim</key>
+ <value>0</value>
+ </param>
</block>
<block>
<key>variable_polar_encoder_def</key>
<param>
<key>num_info_bits</key>
- <value>128</value>
+ <value>n_info_bits</value>
</param>
<param>
<key>block_size</key>
- <value>256</value>
+ <value>block_size</value>
</param>
<param>
<key>comment</key>
<value></value>
</param>
<param>
+ <key>dim1</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>dim2</key>
+ <value>1</value>
+ </param>
+ <param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
<key>frozen_bit_positions</key>
- <value>range(128)</value>
+ <value>polar_config['positions']</value>
</param>
<param>
<key>frozen_bit_values</key>
- <value>[0] * 128</value>
+ <value>polar_config['values']</value>
</param>
<param>
<key>_coordinate</key>
- <value>(192, 451)</value>
+ <value>(256, 203)</value>
</param>
<param>
<key>_rotation</key>
@@ -193,38 +273,50 @@
</param>
<param>
<key>is_packed</key>
- <value>True</value>
+ <value>False</value>
+ </param>
+ <param>
+ <key>ndim</key>
+ <value>0</value>
</param>
</block>
<block>
<key>variable_polar_decoder_sc_list_def</key>
<param>
<key>num_info_bits</key>
- <value>128</value>
+ <value>n_info_bits</value>
</param>
<param>
<key>block_size</key>
- <value>256</value>
+ <value>block_size</value>
</param>
<param>
<key>comment</key>
<value></value>
</param>
<param>
+ <key>dim1</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>dim2</key>
+ <value>1</value>
+ </param>
+ <param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
<key>frozen_bit_positions</key>
- <value>range(128)</value>
+ <value>polar_config['positions']</value>
</param>
<param>
<key>frozen_bit_values</key>
- <value>[0,] * 128</value>
+ <value>polar_config['values']</value>
</param>
<param>
<key>_coordinate</key>
- <value>(608, 539)</value>
+ <value>(424, 203)</value>
</param>
<param>
<key>_rotation</key>
@@ -242,6 +334,37 @@
<key>is_packed</key>
<value>False</value>
</param>
+ <param>
+ <key>ndim</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(8, 107)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>samp_rate</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>350e3</value>
+ </param>
</block>
<block>
<key>analog_random_source_x</key>
@@ -263,7 +386,7 @@
</param>
<param>
<key>_coordinate</key>
- <value>(0, 323)</value>
+ <value>(40, 467)</value>
</param>
<param>
<key>_rotation</key>
@@ -291,7 +414,7 @@
</param>
<param>
<key>num_samps</key>
- <value>2 ** 10 </value>
+ <value>2 ** 10 +1</value>
</param>
<param>
<key>type</key>
@@ -326,7 +449,7 @@
</param>
<param>
<key>_coordinate</key>
- <value>(752, 347)</value>
+ <value>(616, 491)</value>
</param>
<param>
<key>_rotation</key>
@@ -369,11 +492,11 @@
</param>
<param>
<key>_enabled</key>
- <value>False</value>
+ <value>True</value>
</param>
<param>
<key>_coordinate</key>
- <value>(1112, 347)</value>
+ <value>(976, 491)</value>
</param>
<param>
<key>_rotation</key>
@@ -420,7 +543,7 @@
</param>
<param>
<key>_coordinate</key>
- <value>(616, 347)</value>
+ <value>(480, 491)</value>
</param>
<param>
<key>_rotation</key>
@@ -448,67 +571,20 @@
</param>
</block>
<block>
- <key>blocks_head</key>
- <param>
- <key>alias</key>
- <value></value>
- </param>
- <param>
- <key>comment</key>
- <value></value>
- </param>
- <param>
- <key>affinity</key>
- <value></value>
- </param>
- <param>
- <key>_enabled</key>
- <value>True</value>
- </param>
- <param>
- <key>_coordinate</key>
- <value>(944, 459)</value>
- </param>
- <param>
- <key>_rotation</key>
- <value>0</value>
- </param>
- <param>
- <key>id</key>
- <value>blocks_head_0</value>
- </param>
+ <key>fec_ber_bf</key>
<param>
- <key>maxoutbuf</key>
- <value>0</value>
- </param>
- <param>
- <key>minoutbuf</key>
- <value>0</value>
+ <key>berlimit</key>
+ <value>-7.0</value>
</param>
<param>
- <key>num_items</key>
- <value>head_samps</value>
+ <key>berminerrors</key>
+ <value>100</value>
</param>
<param>
- <key>type</key>
- <value>byte</value>
- </param>
- <param>
- <key>vlen</key>
- <value>1</value>
- </param>
- </block>
- <block>
- <key>blocks_null_sink</key>
- <param>
<key>alias</key>
<value></value>
</param>
<param>
- <key>bus_conns</key>
- <value>[[0,],]</value>
- </param>
- <param>
<key>comment</key>
<value></value>
</param>
@@ -522,7 +598,7 @@
</param>
<param>
<key>_coordinate</key>
- <value>(1160, 464)</value>
+ <value>(728, 360)</value>
</param>
<param>
<key>_rotation</key>
@@ -530,19 +606,19 @@
</param>
<param>
<key>id</key>
- <value>blocks_null_sink_0</value>
+ <value>fec_ber_bf_0</value>
</param>
<param>
- <key>type</key>
- <value>byte</value>
+ <key>maxoutbuf</key>
+ <value>0</value>
</param>
<param>
- <key>num_inputs</key>
- <value>1</value>
+ <key>minoutbuf</key>
+ <value>0</value>
</param>
<param>
- <key>vlen</key>
- <value>1</value>
+ <key>test_mode</key>
+ <value>False</value>
</param>
</block>
<block>
@@ -573,7 +649,7 @@
</param>
<param>
<key>_coordinate</key>
- <value>(872, 323)</value>
+ <value>(736, 467)</value>
</param>
<param>
<key>_rotation</key>
@@ -620,7 +696,7 @@
</param>
<param>
<key>_enabled</key>
- <value>False</value>
+ <value>True</value>
</param>
<param>
<key>encoder_list</key>
@@ -628,7 +704,7 @@
</param>
<param>
<key>_coordinate</key>
- <value>(192, 331)</value>
+ <value>(224, 475)</value>
</param>
<param>
<key>_rotation</key>
@@ -656,7 +732,15 @@
</param>
</block>
<block>
- <key>import</key>
+ <key>qtgui_number_sink</key>
+ <param>
+ <key>autoscale</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>avg</key>
+ <value>0</value>
+ </param>
<param>
<key>alias</key>
<value></value>
@@ -666,24 +750,216 @@
<value></value>
</param>
<param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
<key>_coordinate</key>
- <value>(968, 32)</value>
+ <value>(1008, 355)</value>
+ </param>
+ <param>
+ <key>gui_hint</key>
+ <value></value>
</param>
<param>
<key>_rotation</key>
<value>0</value>
</param>
<param>
+ <key>graph_type</key>
+ <value>qtgui.NUM_GRAPH_HORIZ</value>
+ </param>
+ <param>
<key>id</key>
- <value>import_0</value>
+ <value>qtgui_number_sink_0</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>float</value>
+ </param>
+ <param>
+ <key>color1</key>
+ <value>("black", "black")</value>
+ </param>
+ <param>
+ <key>factor1</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>label1</key>
+ <value></value>
+ </param>
+ <param>
+ <key>unit1</key>
+ <value></value>
+ </param>
+ <param>
+ <key>color10</key>
+ <value>("black", "black")</value>
+ </param>
+ <param>
+ <key>factor10</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>label10</key>
+ <value></value>
+ </param>
+ <param>
+ <key>unit10</key>
+ <value></value>
+ </param>
+ <param>
+ <key>color2</key>
+ <value>("black", "black")</value>
+ </param>
+ <param>
+ <key>factor2</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>label2</key>
+ <value></value>
+ </param>
+ <param>
+ <key>unit2</key>
+ <value></value>
</param>
<param>
- <key>import</key>
- <value>import time</value>
+ <key>color3</key>
+ <value>("black", "black")</value>
+ </param>
+ <param>
+ <key>factor3</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>label3</key>
+ <value></value>
+ </param>
+ <param>
+ <key>unit3</key>
+ <value></value>
+ </param>
+ <param>
+ <key>color4</key>
+ <value>("black", "black")</value>
+ </param>
+ <param>
+ <key>factor4</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>label4</key>
+ <value></value>
+ </param>
+ <param>
+ <key>unit4</key>
+ <value></value>
+ </param>
+ <param>
+ <key>color5</key>
+ <value>("black", "black")</value>
+ </param>
+ <param>
+ <key>factor5</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>label5</key>
+ <value></value>
+ </param>
+ <param>
+ <key>unit5</key>
+ <value></value>
+ </param>
+ <param>
+ <key>color6</key>
+ <value>("black", "black")</value>
+ </param>
+ <param>
+ <key>factor6</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>label6</key>
+ <value></value>
+ </param>
+ <param>
+ <key>unit6</key>
+ <value></value>
+ </param>
+ <param>
+ <key>color7</key>
+ <value>("black", "black")</value>
+ </param>
+ <param>
+ <key>factor7</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>label7</key>
+ <value></value>
+ </param>
+ <param>
+ <key>unit7</key>
+ <value></value>
+ </param>
+ <param>
+ <key>color8</key>
+ <value>("black", "black")</value>
+ </param>
+ <param>
+ <key>factor8</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>label8</key>
+ <value></value>
+ </param>
+ <param>
+ <key>unit8</key>
+ <value></value>
+ </param>
+ <param>
+ <key>color9</key>
+ <value>("black", "black")</value>
+ </param>
+ <param>
+ <key>factor9</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>label9</key>
+ <value></value>
+ </param>
+ <param>
+ <key>unit9</key>
+ <value></value>
+ </param>
+ <param>
+ <key>max</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>min</key>
+ <value>-1</value>
+ </param>
+ <param>
+ <key>name</key>
+ <value>""</value>
+ </param>
+ <param>
+ <key>nconnections</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>update_time</key>
+ <value>0.10</value>
</param>
</block>
<block>
@@ -714,11 +990,11 @@
</param>
<param>
<key>_enabled</key>
- <value>False</value>
+ <value>True</value>
</param>
<param>
<key>_coordinate</key>
- <value>(1256, 331)</value>
+ <value>(1112, 475)</value>
</param>
<param>
<key>gui_hint</key>
@@ -1047,7 +1323,7 @@
</block>
<connection>
<source_block_id>analog_random_source_x_0</source_block_id>
- <sink_block_id>blocks_char_to_float_0_0</sink_block_id>
+ <sink_block_id>fec_ber_bf_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
@@ -1076,8 +1352,8 @@
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>blocks_head_0</source_block_id>
- <sink_block_id>blocks_null_sink_0</sink_block_id>
+ <source_block_id>fec_ber_bf_0</source_block_id>
+ <sink_block_id>qtgui_number_sink_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
@@ -1089,9 +1365,9 @@
</connection>
<connection>
<source_block_id>fec_extended_decoder_0</source_block_id>
- <sink_block_id>blocks_head_0</sink_block_id>
+ <sink_block_id>fec_ber_bf_0</sink_block_id>
<source_key>0</source_key>
- <sink_key>0</sink_key>
+ <sink_key>1</sink_key>
</connection>
<connection>
<source_block_id>fec_extended_encoder_0</source_block_id>
diff --git a/gr-fec/examples/polar_encoder_decoder_chain.grc
b/gr-fec/examples/polar_encoder_decoder_chain.grc
index 7cab62d..69fb68b 100644
--- a/gr-fec/examples/polar_encoder_decoder_chain.grc
+++ b/gr-fec/examples/polar_encoder_decoder_chain.grc
@@ -1,4 +1,4 @@
-<?xml version='1.0' encoding='ASCII'?>
+<?xml version='1.0' encoding='utf-8'?>
<?grc format='1' created='3.7.8'?>
<flow_graph>
<timestamp>Mon Jun 15 10:51:02 2015</timestamp>
@@ -48,7 +48,7 @@
</param>
<param>
<key>generate_options</key>
- <value>no_gui</value>
+ <value>qt_gui</value>
</param>
<param>
<key>id</key>
@@ -111,6 +111,49 @@
</param>
</block>
<block>
+ <key>variable_polar_code_configurator</key>
+ <param>
+ <key>num_info_bits</key>
+ <value>128</value>
+ </param>
+ <param>
+ <key>block_size</key>
+ <value>256</value>
+ </param>
+ <param>
+ <key>channel</key>
+ <value>bsc</value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(600, 139)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>polar_config</value>
+ </param>
+ <param>
+ <key>design_snr</key>
+ <value>2.0</value>
+ </param>
+ <param>
+ <key>mu</key>
+ <value>16</value>
+ </param>
+ </block>
+ <block>
<key>variable_polar_decoder_sc_def</key>
<param>
<key>num_info_bits</key>
@@ -125,6 +168,14 @@
<value></value>
</param>
<param>
+ <key>dim1</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>dim2</key>
+ <value>4</value>
+ </param>
+ <param>
<key>_enabled</key>
<value>True</value>
</param>
@@ -152,6 +203,10 @@
<key>is_packed</key>
<value>False</value>
</param>
+ <param>
+ <key>ndim</key>
+ <value>0</value>
+ </param>
</block>
<block>
<key>variable_polar_encoder_def</key>
@@ -168,6 +223,14 @@
<value></value>
</param>
<param>
+ <key>dim1</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>dim2</key>
+ <value>4</value>
+ </param>
+ <param>
<key>_enabled</key>
<value>True</value>
</param>
@@ -195,6 +258,10 @@
<key>is_packed</key>
<value>True</value>
</param>
+ <param>
+ <key>ndim</key>
+ <value>0</value>
+ </param>
</block>
<block>
<key>variable_polar_decoder_sc_list_def</key>
@@ -211,16 +278,24 @@
<value></value>
</param>
<param>
+ <key>dim1</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>dim2</key>
+ <value>4</value>
+ </param>
+ <param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
<key>frozen_bit_positions</key>
- <value>range(128)</value>
+ <value>polar_config['positions']</value>
</param>
<param>
<key>frozen_bit_values</key>
- <value>[0,] * 128</value>
+ <value>polar_config['values']</value>
</param>
<param>
<key>_coordinate</key>
@@ -242,6 +317,10 @@
<key>is_packed</key>
<value>False</value>
</param>
+ <param>
+ <key>ndim</key>
+ <value>0</value>
+ </param>
</block>
<block>
<key>analog_random_source_x</key>
diff --git a/gr-fec/grc/fec_block_tree.xml b/gr-fec/grc/fec_block_tree.xml
index d15ef26..65a4fc8 100644
--- a/gr-fec/grc/fec_block_tree.xml
+++ b/gr-fec/grc/fec_block_tree.xml
@@ -45,5 +45,6 @@
<block>fec_depuncture_bb</block>
<block>fec_ber_bf</block>
<block>fec_bercurve_generator</block>
+ <block>variable_polar_code_configurator</block>
</cat>
</cat>
diff --git a/gr-fec/grc/fec_polar_decoder_sc.xml
b/gr-fec/grc/fec_polar_decoder_sc.xml
index e7cb1ea..8b04c3d 100644
--- a/gr-fec/grc/fec_polar_decoder_sc.xml
+++ b/gr-fec/grc/fec_polar_decoder_sc.xml
@@ -3,9 +3,13 @@
<name>POLAR Decoder SC Definition</name>
<key>variable_polar_decoder_sc_def</key>
<import>from gnuradio import fec</import>
- <var_make>
-self.$(id) = $(id) = fec.polar_decoder_sc.make($block_size, $num_info_bits,
$frozen_bit_positions, $frozen_bit_values, $is_packed)
- </var_make>
+ <var_make>#if int($ndim())==0 #
+self.$(id) = $(id) = fec.polar_decoder_sc.make($block_size, $num_info_bits,
$frozen_bit_positions, $frozen_bit_values, $is_packed) #slurp
+#else if int($ndim())==1 #
+self.$(id) = $(id) = map((lambda a: fec.polar_decoder_sc.make($block_size,
$num_info_bits, $frozen_bit_positions, $frozen_bit_values, $is_packed)),
range(0, $dim1) ) #slurp
+#else
+self.$(id) = $(id) = map((lambda b: map((lambda a:
fec.polar_decoder_sc.make($block_size, $num_info_bits, $frozen_bit_positions,
$frozen_bit_values, $is_packed)), range(0, $dim2))), range(0, $dim1)) #slurp
+#end if</var_make>
<var_value>fec.polar_decoder_sc.make($block_size, $num_info_bits,
$frozen_bit_positions, $frozen_bit_values, $is_packed)</var_value>
<make></make>
@@ -25,6 +29,41 @@ self.$(id) = $(id) = fec.polar_decoder_sc.make($block_size,
$num_info_bits, $fro
</param>
<param>
+ <name>Parallelism</name>
+ <key>ndim</key>
+ <value>0</value>
+ <type>enum</type>
+ <option>
+ <name>0</name>
+ <key>0</key>
+ </option>
+ <option>
+ <name>1</name>
+ <key>1</key>
+ </option>
+ <option>
+ <name>2</name>
+ <key>2</key>
+ </option>
+ </param>
+
+ <param>
+ <name>Dimension 1</name>
+ <key>dim1</key>
+ <value>1</value>
+ <type>int</type>
+ <hide>#if (int($ndim()) >= 1) then 'none' else 'all' #</hide>
+ </param>
+
+ <param>
+ <name>Dimension 2</name>
+ <key>dim2</key>
+ <value>4</value>
+ <type>int</type>
+ <hide>#if (int($ndim()) >= 2) then 'none' else 'all' #</hide>
+ </param>
+
+ <param>
<name>Block size (N)</name>
<key>block_size</key>
<type>int</type>
diff --git a/gr-fec/grc/fec_polar_decoder_sc_list.xml
b/gr-fec/grc/fec_polar_decoder_sc_list.xml
index fa8208f..f178664 100644
--- a/gr-fec/grc/fec_polar_decoder_sc_list.xml
+++ b/gr-fec/grc/fec_polar_decoder_sc_list.xml
@@ -3,13 +3,16 @@
<name>POLAR Decoder SC List Definition</name>
<key>variable_polar_decoder_sc_list_def</key>
<import>from gnuradio import fec</import>
- <var_make>
-self.$(id) = $(id) = fec.polar_decoder_sc_list.make($max_list_size,
$block_size, $num_info_bits, $frozen_bit_positions, $frozen_bit_values,
$is_packed)
- </var_make>
+ <var_make>#if int($ndim())==0 #
+self.$(id) = $(id) = fec.polar_decoder_sc_list.make($max_list_size,
$block_size, $num_info_bits, $frozen_bit_positions, $frozen_bit_values,
$is_packed) #slurp
+#else if int($ndim())==1 #
+self.$(id) = $(id) = map((lambda a:
fec.polar_decoder_sc_list.make($max_list_size, $block_size, $num_info_bits,
$frozen_bit_positions, $frozen_bit_values, $is_packed)), range(0, $dim1)) #slurp
+#else
+self.$(id) = $(id) = map((lambda b: map((lambda a:
fec.polar_decoder_sc_list.make($max_list_size, $block_size, $num_info_bits,
$frozen_bit_positions, $frozen_bit_values, $is_packed)), range(0, $dim2))),
range(0, $dim1)) #slurp
+#end if</var_make>
<var_value>fec.polar_decoder_sc_list.make($max_list_size, $block_size,
$num_info_bits, $frozen_bit_positions, $frozen_bit_values,
$is_packed)</var_value>
<make></make>
-
<param>
<name>Packed Bits</name>
<key>is_packed</key>
@@ -26,6 +29,41 @@ self.$(id) = $(id) =
fec.polar_decoder_sc_list.make($max_list_size, $block_size,
</param>
<param>
+ <name>Parallelism</name>
+ <key>ndim</key>
+ <value>0</value>
+ <type>enum</type>
+ <option>
+ <name>0</name>
+ <key>0</key>
+ </option>
+ <option>
+ <name>1</name>
+ <key>1</key>
+ </option>
+ <option>
+ <name>2</name>
+ <key>2</key>
+ </option>
+ </param>
+
+ <param>
+ <name>Dimension 1</name>
+ <key>dim1</key>
+ <value>1</value>
+ <type>int</type>
+ <hide>#if (int($ndim()) >= 1) then 'none' else 'all' #</hide>
+ </param>
+
+ <param>
+ <name>Dimension 2</name>
+ <key>dim2</key>
+ <value>4</value>
+ <type>int</type>
+ <hide>#if (int($ndim()) >= 2) then 'none' else 'all' #</hide>
+ </param>
+
+ <param>
<name>Maximum List Size (L)</name>
<key>max_list_size</key>
<type>int</type>
diff --git a/gr-fec/grc/fec_polar_encoder.xml b/gr-fec/grc/fec_polar_encoder.xml
index 14f1b88..4147cf1 100644
--- a/gr-fec/grc/fec_polar_encoder.xml
+++ b/gr-fec/grc/fec_polar_encoder.xml
@@ -3,9 +3,13 @@
<name>POLAR Encoder Definition</name>
<key>variable_polar_encoder_def</key>
<import>from gnuradio import fec</import>
- <var_make>
-self.$(id) = $(id) = fec.polar_encoder.make($block_size, $num_info_bits,
$frozen_bit_positions, $frozen_bit_values, $is_packed)
- </var_make>
+ <var_make>#if int($ndim())==0 #
+self.$(id) = $(id) = fec.polar_encoder.make($block_size, $num_info_bits,
$frozen_bit_positions, $frozen_bit_values, $is_packed) #slurp
+#else if int($ndim())==1 #
+self.$(id) = $(id) = map((lambda a: fec.polar_encoder.make($block_size,
$num_info_bits, $frozen_bit_positions, $frozen_bit_values, $is_packed)),
range(0, $dim1)) #slurp
+#else
+self.$(id) = $(id) = map((lambda b: map((lambda a:
fec.polar_encoder.make($block_size, $num_info_bits, $frozen_bit_positions,
$frozen_bit_values, $is_packed)), range(0, $dim2))), range(0, $dim1)) #slurp
+#end if</var_make>
<var_value>fec.polar_encoder.make($block_size, $num_info_bits,
$frozen_bit_positions, $frozen_bit_values, $is_packed)</var_value>
<make></make>
@@ -25,6 +29,41 @@ self.$(id) = $(id) = fec.polar_encoder.make($block_size,
$num_info_bits, $frozen
</param>
<param>
+ <name>Parallelism</name>
+ <key>ndim</key>
+ <value>0</value>
+ <type>enum</type>
+ <option>
+ <name>0</name>
+ <key>0</key>
+ </option>
+ <option>
+ <name>1</name>
+ <key>1</key>
+ </option>
+ <option>
+ <name>2</name>
+ <key>2</key>
+ </option>
+ </param>
+
+ <param>
+ <name>Dimension 1</name>
+ <key>dim1</key>
+ <value>1</value>
+ <type>int</type>
+ <hide>#if (int($ndim()) >= 1) then 'none' else 'all' #</hide>
+ </param>
+
+ <param>
+ <name>Dimension 2</name>
+ <key>dim2</key>
+ <value>4</value>
+ <type>int</type>
+ <hide>#if (int($ndim()) >= 2) then 'none' else 'all' #</hide>
+ </param>
+
+ <param>
<name>Block size (N)</name>
<key>block_size</key>
<type>int</type>
diff --git a/gr-fec/grc/polar_code_configurator.xml
b/gr-fec/grc/polar_code_configurator.xml
new file mode 100644
index 0000000..cfde368
--- /dev/null
+++ b/gr-fec/grc/polar_code_configurator.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0"?>
+<block>
+ <name>POLAR code Configurator</name>
+ <key>variable_polar_code_configurator</key>
+ <import>from gnuradio.fec import polar</import>
+ <var_make>self.$(id) = $(id) = polar.load_frozen_bits_info(False,
$channel.c, $block_size, $num_info_bits, $design_snr, $mu)</var_make>
+ <var_value>polar.load_frozen_bits_info(True, $channel.c, $block_size,
$num_info_bits, $design_snr, $mu)</var_value>
+ <make></make>
+
+ <param>
+ <name>Channel</name>
+ <key>channel</key>
+ <type>enum</type>
+ <option>
+ <name>BEC</name>
+ <key>bec</key>
+ <opt>c:'BEC'</opt>
+ <opt>h:True</opt>
+ </option>
+ <option>
+ <name>BSC</name>
+ <key>bsc</key>
+ <opt>c:'BSC'</opt>
+ <opt>h:False</opt>
+ </option>
+ </param>
+
+ <param>
+ <name>Block size (N)</name>
+ <key>block_size</key>
+ <type>int</type>
+ </param>
+
+ <param>
+ <name>#Info Bits (K)</name>
+ <key>num_info_bits</key>
+ <type>int</type>
+ </param>
+
+ <param>
+ <name>design SNR</name>
+ <key>design_snr</key>
+ <value>0.0</value>
+ <type>float</type>
+ </param>
+
+ <param>
+ <name>mu</name>
+ <key>mu</key>
+ <value>16</value>
+ <type>int</type>
+ <hide>#if str($channel.h) == 'True' then 'all' else 'none'#</hide>
+ </param>
+</block>
\ No newline at end of file
diff --git a/gr-fec/include/gnuradio/fec/polar_decoder_sc.h
b/gr-fec/include/gnuradio/fec/polar_decoder_sc.h
index d9aa959..e9fa6a2 100644
--- a/gr-fec/include/gnuradio/fec/polar_decoder_sc.h
+++ b/gr-fec/include/gnuradio/fec/polar_decoder_sc.h
@@ -33,8 +33,8 @@ namespace gr {
/*!
* \brief Standard successive cancellation decoder for POLAR codes
- * It expects float input with bits mapped 1 --> -1, 0 --> 1
- * Or: f = 1.0 - 2.0 * bit
+ * It expects float input with bits mapped 1 --> 1, 0 --> -1
+ * Or: f = 2.0 * bit - 1.0
*
*/
class FEC_API polar_decoder_sc : public polar_decoder_common
diff --git a/gr-fec/lib/polar_decoder_common.cc
b/gr-fec/lib/polar_decoder_common.cc
index 0285641..bcb70fc 100644
--- a/gr-fec/lib/polar_decoder_common.cc
+++ b/gr-fec/lib/polar_decoder_common.cc
@@ -39,7 +39,7 @@ namespace gr {
std::vector<int>
frozen_bit_positions,
std::vector<char>
frozen_bit_values, bool is_packed) :
polar_common(block_size, num_info_bits, frozen_bit_positions,
frozen_bit_values, is_packed),
- D_LLR_FACTOR(2.19722458f),
+ D_LLR_FACTOR(-2.19722458f),
d_frozen_bit_positions(frozen_bit_positions),
d_frozen_bit_values(frozen_bit_values)
{
diff --git a/gr-fec/python/fec/CMakeLists.txt b/gr-fec/python/fec/CMakeLists.txt
index 0328168..d5bebd7 100644
--- a/gr-fec/python/fec/CMakeLists.txt
+++ b/gr-fec/python/fec/CMakeLists.txt
@@ -39,6 +39,8 @@ GR_PYTHON_INSTALL(
COMPONENT "fec_python"
)
+add_subdirectory(polar)
+
########################################################################
# Handle the unit tests
########################################################################
diff --git a/gr-fec/python/fec/polar/__init__.py
b/gr-fec/python/fec/polar/CMakeLists.txt
similarity index 62%
copy from gr-fec/python/fec/polar/__init__.py
copy to gr-fec/python/fec/polar/CMakeLists.txt
index 497c064..1362ce1 100644
--- a/gr-fec/python/fec/polar/__init__.py
+++ b/gr-fec/python/fec/polar/CMakeLists.txt
@@ -1,5 +1,3 @@
-#!/usr/bin/env python
-#
# Copyright 2015 Free Software Foundation, Inc.
#
# This file is part of GNU Radio
@@ -19,4 +17,25 @@
# the Free Software Foundation, Inc., 51 Franklin Street,
# Boston, MA 02110-1301, USA.
-# turn this folder into a Python module
+########################################################################
+include(GrPython)
+
+GR_PYTHON_INSTALL(
+ FILES
+ __init__.py
+ channel_construction.py
+ channel_construction_bsc.py
+ channel_construction_bec.py
+ helper_functions.py
+ DESTINATION ${GR_PYTHON_DIR}/gnuradio/fec/polar
+ COMPONENT "fec_python"
+)
+
+GR_PYTHON_INSTALL(
+ PROGRAMS
+ polar_channel_construction
+ DESTINATION ${GR_RUNTIME_DIR}
+ COMPONENT "fec_python"
+)
+
+
diff --git a/gr-fec/python/fec/polar/__init__.py
b/gr-fec/python/fec/polar/__init__.py
index 497c064..4a9cc75 100644
--- a/gr-fec/python/fec/polar/__init__.py
+++ b/gr-fec/python/fec/polar/__init__.py
@@ -20,3 +20,42 @@
# Boston, MA 02110-1301, USA.
# turn this folder into a Python module
+
+import channel_construction as cc
+from channel_construction_bec import bhattacharyya_bounds
+from helper_functions import is_power_of_two
+
+
+def get_z_params(is_prototype, channel, block_size, design_snr, mu):
+ print('POLAR code channel construction called with parameters channel={0},
blocksize={1}, design SNR={2}, mu={3}'.format(channel, block_size, design_snr,
mu))
+ if not (channel == 'BSC' or channel == 'BEC'):
+ raise ValueError("channel is {0}, but only BEC and BSC are
supported!".format(channel))
+ if not is_power_of_two(block_size):
+ raise ValueError("block size={0} is not a power of
2!".format(block_size))
+ if design_snr < -1.5917:
+ raise ValueError("design SNR={0} < -1.5917. MUST be
greater!".format(design_snr))
+ if not mu > 0:
+ raise ValueError("mu={0} < 1. MUST be > 1!".format(mu))
+ if not is_prototype and channel == 'BSC':
+ z_params = cc.load_z_parameters(block_size, design_snr, mu)
+ print('Read Z-parameter file: {0}'.format(cc.default_dir() +
cc.generate_filename(block_size, design_snr, mu)))
+ return z_params
+ return bhattacharyya_bounds(design_snr, block_size)
+
+
+def load_frozen_bits_info(is_prototype, channel, block_size, num_info_bits,
design_snr, mu):
+ num_frozen_bits = block_size - num_info_bits
+ if not mu > 0:
+ mu = 2
+ z_params = get_z_params(is_prototype, channel, block_size, design_snr, mu)
+ data_set = {
+ 'positions': cc.get_frozen_bit_indices_from_z_parameters(z_params,
num_frozen_bits),
+ 'values': [0, ] * num_frozen_bits,
+ 'block_size': block_size,
+ 'num_info_bits': num_info_bits,
+ 'num_frozenbits': num_frozen_bits,
+ 'design_snr': design_snr,
+ 'channel': channel,
+ 'mu': mu,
+ }
+ return data_set
diff --git a/gr-fec/python/fec/polar/channel_construction.py
b/gr-fec/python/fec/polar/channel_construction.py
new file mode 100644
index 0000000..f971ce4
--- /dev/null
+++ b/gr-fec/python/fec/polar/channel_construction.py
@@ -0,0 +1,131 @@
+#!/usr/bin/env python
+#
+# Copyright 2015 Free Software Foundation, Inc.
+#
+# 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.
+#
+
+'''
+[0] Erdal Arikan: 'Channel Polarization: A Method for Constructing
Capacity-Achieving Codes for Symmetric Binary-Input Memoryless Channels', 2009
+foundational paper for polar codes.
+'''
+
+
+import numpy as np
+from channel_construction_bec import calculate_bec_channel_capacities
+from channel_construction_bec import design_snr_to_bec_eta
+from channel_construction_bsc import tal_vardy_tpm_algorithm
+import matplotlib.pyplot as plt
+
+
+Z_PARAM_FIRST_HEADER_LINE = "Bhattacharyya parameters (Z-parameters) for a
polar code"
+
+
+def get_frozen_bit_indices_from_capacities(chan_caps, nfrozen):
+ indexes = np.array([], dtype=int)
+ while indexes.size < nfrozen:
+ index = np.argmin(chan_caps)
+ indexes = np.append(indexes, index)
+ chan_caps[index] = 1.0
+ return np.sort(indexes)
+
+
+def get_frozen_bit_indices_from_z_parameters(z_params, nfrozen):
+ indexes = np.array([], dtype=int)
+ while indexes.size < nfrozen:
+ index = np.argmax(z_params)
+ indexes = np.append(indexes, index)
+ z_params[index] = 0.0
+ return np.sort(indexes)
+
+
+def get_bec_frozen_indices(nblock, kfrozen, eta):
+ bec_caps = calculate_bec_channel_capacities(eta, nblock)
+ positions = get_frozen_bit_indices_from_capacities(bec_caps, kfrozen)
+ return positions
+
+
+def frozen_bit_positions(block_size, info_size, design_snr=0.0):
+ if not design_snr > -1.5917:
+ print('bad value for design_nsr, must be > -1.5917! default=0.0')
+ design_snr = 0.0
+ eta = design_snr_to_bec_eta(design_snr)
+ return get_bec_frozen_indices(block_size, block_size - info_size, eta)
+
+
+def generate_filename(block_size, design_snr, mu):
+ filename = "polar_code_z_parameters_N" + str(int(block_size))
+ filename += "_SNR" + str(float(design_snr)) + "_MU" + str(int(mu)) +
".polar"
+ return filename
+
+
+def default_dir():
+ dir_def = "~/.gnuradio/polar/"
+ import os
+ path = os.path.expanduser(dir_def)
+
+ try:
+ os.makedirs(path)
+ except OSError:
+ if not os.path.isdir(path):
+ raise
+ return path
+
+
+def save_z_parameters(z_params, block_size, design_snr, mu):
+ path = default_dir()
+ filename = generate_filename(block_size, design_snr, mu)
+ header = Z_PARAM_FIRST_HEADER_LINE + "\n"
+ header += "Channel construction method: Tal-Vardy algorithm\n"
+ header += "Parameters:\n"
+ header += "block_size=" + str(block_size) + "\n"
+ header += "design_snr=" + str(design_snr) + "\n"
+ header += "mu=" + str(mu)
+ np.savetxt(path + filename, z_params, header=header)
+
+
+def load_z_parameters(block_size, design_snr, mu):
+ path = default_dir()
+ filename = generate_filename(block_size, design_snr, mu)
+ full_file = path + filename
+ import os
+ if not os.path.isfile(full_file):
+ z_params = tal_vardy_tpm_algorithm(block_size, design_snr, mu)
+ save_z_parameters(z_params, block_size, design_snr, mu)
+ z_params = np.loadtxt(full_file)
+ return z_params
+
+
+def main():
+ print 'channel construction Bhattacharyya bounds by Arikan'
+ n = 8
+ m = 2 ** n
+ k = m // 2
+ design_snr = -1.59
+ mu = 32
+
+ # ztv = tal_vardy_tpm_algorithm(m, design_snr, mu)
+
+ z_params = load_z_parameters(m, design_snr, mu)
+ plt.plot(z_params)
+ plt.show()
+
+
+
+if __name__ == '__main__':
+ main()
+
+
diff --git a/gr-fec/python/fec/polar/channel_construction_bec.py
b/gr-fec/python/fec/polar/channel_construction_bec.py
index 4d3654d..341b290 100644
--- a/gr-fec/python/fec/polar/channel_construction_bec.py
+++ b/gr-fec/python/fec/polar/channel_construction_bec.py
@@ -19,24 +19,7 @@
#
import numpy as np
-import matplotlib.pyplot as plt
-
-def bsc_channel(p):
- '''
- binary symmetric channel (BSC)
- output alphabet Y = {0, 1} and
- W(0|0) = W(1|1) and W(1|0) = W(0|1)
-
- this function returns a prob's vector for a BSC
- p denotes an erroneous transistion
- '''
- if not (p >= 0.0 and p <= 1.0):
- print "given p is out of range!"
- return np.array([], dtype=float)
-
- # 0 -> 0, 0 -> 1, 1 -> 0, 1 -> 1
- W = np.array([[1 - p, p], [p, 1 - p]], dtype=float)
- return W
+import helper_functions as hf
def bec_channel(eta):
@@ -51,7 +34,6 @@ def bec_channel(eta):
W = np.array((1 - eta, eta, 1 - eta), dtype=float)
return W
-
def odd_rec(iwn):
return iwn ** 2
@@ -69,48 +51,64 @@ def calc_one_recursion(iw0):
return iw1
-def calculate_bec_channel_capacities(eta, n):
+def calculate_bec_channel_capacities(eta, block_size):
+ # compare [0, Arikan] eq. 6
iw = 1 - eta # holds for BEC as stated in paper
iw = np.array([iw, ], dtype=float)
- lw = int(np.log2(n))
+ lw = int(np.log2(block_size))
for i in range(lw):
iw = calc_one_recursion(iw)
return iw
-def get_frozen_bit_indices_from_capacities(chan_caps, nfrozen):
- indexes = np.array([], dtype=int)
- while indexes.size < nfrozen:
- index = np.argmin(chan_caps)
- indexes = np.append(indexes, index)
- chan_caps[index] = 1.0
- return np.sort(indexes)
+def calculate_z_parameters_one_recursion(z_params):
+ z_next = np.zeros(2 * z_params.size)
+ for i in range(z_params.size):
+ z_sq = z_params[i] ** 2
+ z_next[2 * i] = 2 * z_params[i] - z_sq
+ z_next[2 * i + 1] = z_sq
+ return z_next
-def get_bec_frozen_indices(nblock, kfrozen, eta):
- bec_caps = calculate_bec_channel_capacities(eta, nblock)
- positions = get_frozen_bit_indices_from_capacities(bec_caps, kfrozen)
- return positions
+def calculate_bec_channel_z_parameters(eta, block_size):
+ # compare [0, Arikan] eq. 38
+ block_power = hf.power_of_2_int(block_size)
+ z_params = np.array([eta,], dtype=float)
+ for block_size in range(block_power):
+ z_params = calculate_z_parameters_one_recursion(z_params)
+ return z_params
-def bec_channel_contruction_tests():
- n = 2 ** 10
- k = n // 2
- eta = 0.3
- bec_capacities = calculate_bec_channel_capacities(eta, n)
- print(bec_capacities)
+def design_snr_to_bec_eta(design_snr):
+ s = 10. ** (design_snr / 10.)
+ return np.exp(-s)
- frozenbits_position =
get_frozen_bit_indices_from_capacities(bec_capacities, k)
- print('frozenbit_positions:')
- print(frozenbits_position)
- print('frozenbit_num:', frozenbits_position.size)
+def bhattacharyya_bounds(design_snr, block_size):
+ '''
+ Harish Vangala, Emanuele Viterbo, Yi Hong: 'A Comparative Study of Polar
Code Constructions for the AWGN Channel', 2015
+ In this paper it is called Bhattacharyya bounds channel construction and
is abbreviated PCC-0
+ Best design SNR for block_size = 2048, R = 0.5, is 0dB.
+ Compare with Arikan: 'Channel Polarization: A Method for Constructing
Capacity-Achieving Codes for Symmetric Binary-Input Memoryless Channels.
+ Proposition 5. inequalities turn into equalities for BEC channel.
Otherwise they represent an upper bound.
+ Also compare [0, Arikan] eq. 6 and 38
+ For BEC that translates to capacity(i) = 1 - bhattacharyya(i)
+ :return Z-parameters in natural bit-order. Choose according to desired
rate.
+ '''
+ # minimum design snr = -1.5917 corresponds to BER = 0.5
+ s = 10 ** (design_snr / 10) # 'initial z parameter'.
+ eta = np.exp(-s)
+ return calculate_bec_channel_z_parameters(eta, block_size)
def main():
print 'channel construction main'
- bec_channel_contruction_tests()
-
+ n = 4
+ block_size = 2 ** n
+ design_snr = 1.0
+ eta = design_snr_to_bec_eta(design_snr)
+ print(calculate_bec_channel_z_parameters(eta, block_size))
+ print(calculate_bec_channel_capacities(eta, block_size))
if __name__ == '__main__':
main()
diff --git a/gr-fec/python/fec/polar/channel_construction_bsc.py
b/gr-fec/python/fec/polar/channel_construction_bsc.py
index 2263bf0..fddad2e 100755
--- a/gr-fec/python/fec/polar/channel_construction_bsc.py
+++ b/gr-fec/python/fec/polar/channel_construction_bsc.py
@@ -18,9 +18,39 @@
# Boston, MA 02110-1301, USA.
#
-import numpy as np
+'''
+Based on 2 papers:
+[1] Ido Tal, Alexander Vardy: 'How To Construct Polar Codes', 2013
+for an in-depth description of a widely used algorithm for channel
construction.
+
+[2] Harish Vangala, Emanuele Viterbo, Yi Hong: 'A Comparative Study of Polar
Code Constructions for the AWGN Channel', 2015
+for an overview of different approaches
+'''
+
+
+from scipy.optimize import fsolve
+from scipy.special import erfc
from helper_functions import *
import matplotlib.pyplot as plt
+from channel_construction_bec import bhattacharyya_bounds
+
+
+def bsc_channel(p):
+ '''
+ binary symmetric channel (BSC)
+ output alphabet Y = {0, 1} and
+ W(0|0) = W(1|1) and W(1|0) = W(0|1)
+
+ this function returns a prob's vector for a BSC
+ p denotes an erroneous transistion
+ '''
+ if not (p >= 0.0 and p <= 1.0):
+ print "given p is out of range!"
+ return np.array([], dtype=float)
+
+ # 0 -> 0, 0 -> 1, 1 -> 0, 1 -> 1
+ W = np.array([[1 - p, p], [p, 1 - p]], dtype=float)
+ return W
def get_Bn(n):
@@ -73,116 +103,237 @@ def mutual_information(w):
return i
-def bhattacharyya_parameter(w):
- '''bhattacharyya parameter is a measure of similarity between two prob.
distributions'''
- # sum over all y e Y for sqrt( W(y|0) * W(y|1) )
- dim = np.shape(w)
- ydim = dim[0]
- xdim = dim[1]
- z = 0.0
- for y in range(ydim):
- z += np.sqrt(w[y][0] * w[y][1])
- # need all
+def solver_equation(val, s):
+ cw_lambda = codeword_lambda_callable(s)
+ ic_lambda = instantanious_capacity_callable()
+ return lambda y: ic_lambda(cw_lambda(y)) - val
+
+
+def solve_capacity(a, s):
+ eq = solver_equation(a, s)
+ res = fsolve(eq, 1)
+ return np.abs(res[0]) # only positive values needed.
+
+
+def codeword_lambda_callable(s):
+ return lambda y: np.exp(-2 * y * np.sqrt(2 * s))
+
+
+def codeword_lambda(y, s):
+ return codeword_lambda_callable(s)(y)
+
+
+def instantanious_capacity_callable():
+ return lambda x : 1 - np.log2(1 + x) + (x * np.log2(x) / (1 + x))
+
+
+def instantanious_capacity(x):
+ return instantanious_capacity_callable()(x)
+
+
+def q_function(x):
+ # Q(x) = (1 / sqrt(2 * pi) ) * integral (x to inf) exp(- x ^ 2 / 2) dx
+ return .5 * erfc(x / np.sqrt(2))
+
+
+def discretize_awgn(mu, design_snr):
+ '''
+ needed for Binary-AWGN channels.
+ in [1] described in Section VI
+ in [2] described as a function of the same name.
+ in both cases reduce infinite output alphabet to a finite output alphabet
of a given channel.
+ idea:
+ 1. instantaneous capacity C(x) in interval [0, 1]
+ 2. split into mu intervals.
+ 3. find corresponding output alphabet values y of likelihood ratio
function lambda(y) inserted into C(x)
+ 4. Calculate probability for each value given that a '0' or '1' is was
transmitted.
+ '''
+ s = 10 ** (design_snr / 10)
+ a = np.zeros(mu + 1, dtype=float)
+ a[-1] = np.inf
+ for i in range(1, mu):
+ a[i] = solve_capacity(1. * i / mu, s)
+
+ factor = np.sqrt(2 * s)
+ tpm = np.zeros((2, mu))
+ for j in range(mu):
+ tpm[0][j] = q_function(factor + a[j]) - q_function(factor + a[j + 1])
+ tpm[1][j] = q_function(-1. * factor + a[j]) - q_function(-1. * factor
+ a[j + 1])
+ return tpm
+
+
+def instant_capacity_delta_callable():
+ return lambda a, b: -1. * (a + b) * np.log2((a + b) / 2) + a * np.log2(a)
+ b * np.log2(b)
+
+
+def capacity_delta_callable():
+ c = instant_capacity_delta_callable()
+ return lambda a, b, at, bt: c(a, b) + c(at, bt) - c(a + at, b + bt)
+
+
+def quantize_to_size(tpm, mu):
+ # This is a degrading merge, compare [1]
+ calculate_delta_I = capacity_delta_callable()
+ L = np.shape(tpm)[1]
+ if not mu < L:
+ print('WARNING: This channel gets too small!')
+
+ # lambda works on vectors just fine. Use Numpy vector awesomeness.
+ delta_i_vec = calculate_delta_I(tpm[0, 0:-1], tpm[1, 0:-1], tpm[0, 1:],
tpm[1, 1:])
+
+ for i in range(L - mu):
+ d = np.argmin(delta_i_vec)
+ ap = tpm[0, d] + tpm[0, d + 1]
+ bp = tpm[1, d] + tpm[1, d + 1]
+ if d > 0:
+ delta_i_vec[d - 1] = calculate_delta_I(tpm[0, d - 1], tpm[1, d -
1], ap, bp)
+ if d < delta_i_vec.size - 1:
+ delta_i_vec[d + 1] = calculate_delta_I(ap, bp, tpm[0, d + 1],
tpm[1, d + 1])
+ delta_i_vec = np.delete(delta_i_vec, d)
+ tpm = np.delete(tpm, d, axis=1)
+ tpm[0, d] = ap
+ tpm[1, d] = bp
+ return tpm
+
+
+def upper_bound_z_params(z, block_size, design_snr):
+ upper_bound = bhattacharyya_bounds(design_snr, block_size)
+ z = np.minimum(z, upper_bound)
return z
-def w_transition_prob(y, u, p):
- return p[y == u]
- # return 1 - p if y == u else p
-
-# @profile
-def calculate_joint_transition_probability(N, y, x, transition_probs):
- single_ws = np.empty(N)
- single_ws[y == x] = transition_probs[True]
- single_ws[y != x] = transition_probs[False]
- return np.prod(single_ws)
-
-
-# @profile
-def w_split_prob(y, u, G, transition_probs):
- ''' Calculate channel splitting probabilities. '''
- N = len(y) # number of combined channels
- df = N - len(u) # degrees of freedom.
- prob = 0.0
- for uf in range(2 ** df):
- utemp = unpack_byte(np.array([uf, ]), df)
- ub = np.concatenate((u, utemp))
- x = np.dot(ub, G) % 2
- true_num = np.sum(y == x)
- false_num = N - true_num
- w = (transition_probs[True] ** true_num) * (transition_probs[False] **
false_num)
- # w = calculate_joint_transition_probability(N, y, x, transition_probs)
- prob += w
- divider = 1.0 / (2 ** (N - 1))
- return divider * prob
-
-# @profile
-def wn_split_channel(N, p):
- G = get_Gn(N)
- y = np.zeros((N, ), dtype=np.uint8)
- n = 1
- u = np.zeros((n + 1, ), dtype=np.uint8)
- transition_probs = np.array([p, 1 - p], dtype=float)
-
- z_params = []
- c_params = []
- for w in range(N):
- nentries = (2 ** N) * (2 ** w)
- print "for w=", w, " nentries=", nentries
- w_probs = np.zeros((nentries, 2), dtype=float)
- for y in range(2 ** N):
- yb = unpack_byte(np.array([y, ]), N)
- for u in range(2 ** (w + 1)):
- ub = unpack_byte(np.array([u, ]), w + 1)
- wp = w_split_prob(yb, ub, G, transition_probs)
- ufixed = ub[0:-1]
- yindex = y * (2 ** w) + pack_byte(ufixed)
- uindex = ub[-1]
- w_probs[yindex][uindex] = wp
-
- z = bhattacharyya_parameter(w_probs)
- z_params.append(z)
- c = mutual_information(w_probs)
- c_params.append(c)
- print "W=", w, "Z=", z, "capacity=", c
-
- return z_params, c_params
-
-
-def calculate_z_param(x):
- # variables etc taken from paper bei Ido Tal et al.
- # name there is f(x)
- # x is the cross over probability of a BSC.
- return 2 * np.sqrt(x * (1 - x))
-
-
-def calculate_capacity(x):
- # in paper it is called g(x)
- return -1. * x * np.log(x) - (1 - x) * np.log(1 - x)
-
-
-def splitting_masses_algorithm(n, k):
- m = 2 ** n
- p0 = 1.0 / m
- mass_vec
+def tal_vardy_tpm_algorithm(block_size, design_snr, mu):
+ block_power = power_of_2_int(block_size)
+ channels = np.zeros((block_size, 2, mu))
+ channels[0] = discretize_awgn(mu, design_snr) * 2
+
+ print('Constructing polar code with Tal-Vardy algorithm')
+ print('(block_size = {0}, design SNR = {1}, mu = {2}'.format(block_size,
design_snr, mu))
+ show_progress_bar(0, block_size)
+ for j in range(0, block_power):
+ u = 2 ** j
+ for t in range(u):
+ show_progress_bar(u + t, block_size)
+ # print("(u={0}, t={1}) = {2}".format(u, t, u + t))
+ ch1 = upper_convolve(channels[t], mu)
+ ch2 = lower_convolve(channels[t], mu)
+ channels[t] = quantize_to_size(ch1, mu)
+ channels[u + t] = quantize_to_size(ch2, mu)
+
+ z = np.zeros(block_size)
+ for i in range(block_size):
+ # z[i] = np.sum(channels[i][1])
+ z[i] = bhattacharyya_parameter(channels[i])
+
+ z = z[bit_reverse_vector(np.arange(block_size), block_power)]
+ z = upper_bound_z_params(z, block_size, design_snr)
+ show_progress_bar(block_size, block_size)
+ print('')
+ print('channel construction DONE')
+ return z
+
+
+def merge_lr_based(q, mu):
+ lrs = q[0] / q[1]
+ vals, indices, inv_indices = np.unique(lrs, return_index=True,
return_inverse=True)
+ # compare [1] (20). Ordering of representatives according to LRs.
+ temp = np.zeros((2, len(indices)), dtype=float)
+ if vals.size < mu:
+ return q
+ for i in range(len(indices)):
+ merge_pos = np.where(inv_indices == i)[0]
+ sum_items = q[:, merge_pos]
+ if merge_pos.size > 1:
+ sum_items = np.sum(q[:, merge_pos], axis=1)
+ temp[0, i] = sum_items[0]
+ temp[1, i] = sum_items[1]
+ return temp
+
+
+def upper_convolve(tpm, mu):
+ q = np.zeros((2, mu ** 2))
+ idx = -1
+ for i in range(mu):
+ idx += 1
+ q[0, idx] = (tpm[0, i] ** 2 + tpm[1, i] ** 2) / 2
+ q[1, idx] = tpm[0, i] * tpm[1, i]
+ for j in range(i + 1, mu):
+ idx += 1
+ q[0, idx] = tpm[0, i] * tpm[0, j] + tpm[1, i] * tpm[1, j]
+ q[1, idx] = tpm[0, i] * tpm[1, j] + tpm[1, i] * tpm[0, j]
+ if q[0, idx] < q[1, idx]:
+ q[0, idx], q[1, idx] = swap_values(q[0, idx], q[1, idx])
+
+ idx += 1
+ q = np.delete(q, np.arange(idx, np.shape(q)[1]), axis=1)
+ q = merge_lr_based(q, mu)
+ q = normalize_q(q, tpm)
+ return q
+
+
+def lower_convolve(tpm, mu):
+ q = np.zeros((2, mu * (mu + 1)))
+ idx = -1
+ for i in range(0, mu):
+ idx += 1
+ q[0, idx] = (tpm[0, i] ** 2) / 2
+ q[1, idx] = (tpm[1, i] ** 2) / 2
+ if q[0, idx] < q[1, idx]:
+ q[0, idx], q[1, idx] = swap_values(q[0, idx], q[1, idx])
+ idx += 1
+ q[0, idx] = tpm[0, i] * tpm[1, i]
+ q[1, idx] = q[0, idx]
+
+ for j in range(i + 1, mu):
+ idx += 1
+ q[0, idx] = tpm[0, i] * tpm[0, j]
+ q[1, idx] = tpm[1, i] * tpm[1, j]
+ if q[0, idx] < q[1, idx]:
+ q[0, idx], q[1, idx] = swap_values(q[0, idx], q[1, idx])
+ idx += 1
+ q[0, idx] = tpm[0, i] * tpm[1, j]
+ q[1, idx] = tpm[1, i] * tpm[0, j]
+ if q[0, idx] < q[1, idx]:
+ q[0, idx], q[1, idx] = swap_values(q[0, idx], q[1, idx])
+ idx += 1
+ q = np.delete(q, np.arange(idx, np.shape(q)[1]), axis=1)
+ q = merge_lr_based(q, mu)
+ q = normalize_q(q, tpm)
+ return q
+
+
+def swap_values(first, second):
+ return second, first
+
+
+def normalize_q(q, tpm):
+ original_factor = np.sum(tpm)
+ next_factor = np.sum(q)
+ factor = original_factor / next_factor
+ return q * factor
def main():
print 'channel construction BSC main'
- n = 3
+ n = 8
m = 2 ** n
k = m // 2
- eta = 0.3
- p = 0.1
- # z, c = wn_split_channel(m, p)
- # print(z)
- # print(c)
+ design_snr = 0.5
+ mu = 32
+
+
+ z_params = tal_vardy_tpm_algorithm(m, design_snr, mu)
+ plt.plot(z_params)
+ plt.show()
+
+ # q = discretize_awgn(mu, design_snr)
- u = np.zeros(m, dtype=bool)
- G = get_Gn(m).astype(dtype=bool)
- print G
- print np.dot(u, G)
+ # print('discretized:', np.sum(q))
+ # qu = upper_convolve(q, mu)
+ # print('upper_convolve:', np.sum(qu))
+ # q0 = lower_convolve(q, mu)
+ # print('lower_convolve:', np.sum(q0))
if __name__ == '__main__':
diff --git a/gr-fec/python/fec/polar/helper_functions.py
b/gr-fec/python/fec/polar/helper_functions.py
index 213f3cb..e93fa9a 100644
--- a/gr-fec/python/fec/polar/helper_functions.py
+++ b/gr-fec/python/fec/polar/helper_functions.py
@@ -19,7 +19,11 @@
#
import numpy as np
-from channel_construction_bec import get_bec_frozen_indices
+import time, sys
+
+
+def power_of_2_int(num):
+ return int(np.log2(num))
def is_power_of_two(num):
@@ -71,28 +75,43 @@ def pack_byte(bits):
return res
-def get_frozen_bit_positions(directory, n, k, p):
- import glob, os
- if not os.getcwd().endswith(directory):
- os.chdir(directory)
- prefix = 'frozen_bit_positions_'
- prefix_len = len(prefix)
- for file in glob.glob("*.npy"):
- if file.find(prefix) < 0:
- continue
- filename = file
- file = file[file.find(prefix) + prefix_len:]
- file = file[:-4]
- file = file.split('_')
- nstr = [x for x in file if x.startswith('n')]
- kstr = [x for x in file if x.startswith('k')]
- pstr = [x for x in file if x.startswith('p')]
- nstr = int(nstr[0][1:])
- kstr = int(kstr[0][1:])
- pstr = float(pstr[0][1:])
- if n == nstr and k == kstr:
- return np.load(filename)
- return get_bec_frozen_indices(n, k, p)
+def show_progress_bar(ndone, ntotal):
+ nchars = 50
+
+ fract = (1. * ndone / ntotal)
+ percentage = 100. * fract
+ ndone_chars = int(nchars * fract)
+ nundone_chars = nchars - ndone_chars
+ sys.stdout.write('\r[{0}{1}] {2:5.2f}% ({3} / {4})'.format('=' *
ndone_chars, ' ' * nundone_chars, percentage, ndone, ntotal))
+
+
+
+def mutual_information(w):
+ '''
+ calculate mutual information I(W)
+ I(W) = sum over y e Y ( sum over x e X ( ... ) )
+ .5 W(y|x) log frac { W(y|x) }{ .5 W(y|0) + .5 W(y|1) }
+ '''
+ ydim, xdim = np.shape(w)
+ i = 0.0
+ for y in range(ydim):
+ for x in range(xdim):
+ v = w[y][x] * np.log2(w[y][x] / (0.5 * w[y][0] + 0.5 * w[y][1]))
+ i += v
+ i /= 2.0
+ return i
+
+
+def bhattacharyya_parameter(w):
+ '''bhattacharyya parameter is a measure of similarity between two prob.
distributions'''
+ # sum over all y e Y for sqrt( W(y|0) * W(y|1) )
+ dim = np.shape(w)
+ ydim = dim[0]
+ z = 0.0
+ for y in range(ydim):
+ z += np.sqrt(w[0, y] * w[1, y])
+ # need all
+ return z
def main():
@@ -110,5 +129,14 @@ def main():
print(np.arange(16))
print bit_reverse_vector(np.arange(16), 4)
+ ntotal = 99
+ for i in range(ntotal):
+ show_progress_bar(i, ntotal)
+ time.sleep(0.1)
+
+ # sys.stdout.write('Hello')
+ # time.sleep(1)
+ # sys.stdout.write('\rMomy ')
+
if __name__ == '__main__':
main()
diff --git a/gr-fec/python/fec/polar/polar_channel_construction
b/gr-fec/python/fec/polar/polar_channel_construction
new file mode 100644
index 0000000..b69ad3b
--- /dev/null
+++ b/gr-fec/python/fec/polar/polar_channel_construction
@@ -0,0 +1,72 @@
+#!/usr/bin/env python
+#
+# Copyright 2015 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.
+#
+""" A tool for POLAR code channel construction."""
+
+from optparse import OptionParser
+import gnuradio.fec.polar as cc
+
+
+def setup_parser():
+ """ Init the option parser. If derived classes need to add options,
+ override this and call the parent function. """
+ parser = OptionParser(add_help_option=False)
+ parser.usage = '%prog [blocksize] [designsnr] [mu]'
+
+ parser.add_option("-h", "--help", action="help", help="Displays this help
message.")
+
+ parser.add_option("-c", "--channel", action="store", type="string",
dest="channel", help="specify channel, currently BEC or BSC (default='BEC')",
default='BEC')
+ parser.add_option("-b", "--blocksize", action="store", type="int",
dest="block_size", help="specify block size of polar code (default=16)",
default=16)
+ parser.add_option("-s", "--desgin-snr", action="store", type="float",
dest="design_snr", help="specify design SNR of polar code (default=0.0)",
default=0.0)
+ parser.add_option("-k", "--mu", action="store", type="int", dest="mu",
help="specify block size of polar code (default=2)", default=2)
+
+ return parser
+
+
+def main():
+ """ Here we go. Parse command, choose class and run. """
+ print('POLAR code channel constructor commandline tool')
+ parser = setup_parser()
+ (options, args) = parser.parse_args()
+
+ channel = str(options.channel)
+ block_size = int(options.block_size)
+ design_snr = float(options.design_snr)
+ mu = int(options.mu)
+
+ if len(args) > 0:
+ channel = str(args[0])
+ if len(args) > 1:
+ block_size = int(args[1])
+ if len(args) > 2:
+ design_snr = float(args[2])
+ if len(args) == 4:
+ mu = int(args[3])
+
+ z_params = cc.get_z_params(False, channel, block_size, design_snr, mu)
+ print(z_params)
+
+
+if __name__ == '__main__':
+ try:
+ main()
+ except KeyboardInterrupt:
+ pass
\ No newline at end of file
diff --git a/gr-fec/python/fec/polar/polar_code.py
b/gr-fec/python/fec/polar/polar_code.py
deleted file mode 100644
index f263c6d..0000000
--- a/gr-fec/python/fec/polar/polar_code.py
+++ /dev/null
@@ -1,493 +0,0 @@
-#!/usr/bin/env python
-
-import numpy as np
-import matplotlib.pyplot as plt
-
-from encoder import PolarEncoder as enc
-
-# input alphabet X is always {0,1}
-# output alphabet is arbitrary
-# transition probabilities are arbitrary W(y|x)
-
-
-def bit_reverse(value, n):
- # is this really missing in NumPy???
- bits = np.zeros(n, type(value))
- for index in range(n):
- mask = 1
- mask = np.left_shift(mask, index)
- bit = np.bitwise_and(value, mask)
- bit = np.right_shift(bit, index)
- bits[index] = bit
- bits = bits[::-1]
- result = 0
- for index, bit in enumerate(bits):
- bit = np.left_shift(bit, index)
- result += bit
- return result
-
-
-def get_Bn(n):
- # this is a bit reversal matrix.
- lw = int(np.log2(n)) # number of used bits
- indexes = [bit_reverse(i, lw) for i in range(n)]
- Bn = np.zeros((n, n), type(n))
- for i, index in enumerate(indexes):
- Bn[i][index] = 1
- return Bn
-
-
-def get_Fn(n):
- # this matrix defines the actual channel combining.
- if n == 1:
- return np.array([1, ])
- F2 = np.array([[1, 0], [1, 1]], np.int)
- nump = int(np.log2(n)) - 1 # number of Kronecker products to calculate
- Fn = F2
- for i in range(nump):
- Fn = np.kron(Fn, F2)
- return Fn
-
-def get_Gn(n):
- # this matrix is called generator matrix
- if not is_power_of_2(n):
- print "invalid input"
- return None
- if n == 1:
- return np.array([1, ])
- Bn = get_Bn(n)
- Fn = get_Fn(n)
- Gn = np.dot(Bn, Fn)
- return Gn
-
-
-def odd_rec(iwn):
- return iwn ** 2
-
-
-def even_rec(iwn):
- return 2 * iwn - iwn ** 2
-
-
-def calc_one_recursion(iw0):
- iw1 = np.zeros(2 * len(iw0)) # double values
- for i in range(len(iw0)):
- # careful indices screw you because paper is '1' based :(
- iw1[2 * i] = odd_rec(iw0[i])
- iw1[2 * i + 1] = even_rec(iw0[i])
- return iw1
-
-
-def calculate_bec_channel_capacities(eta, n):
- iw = 1 - eta # holds for BEC as stated in paper
- lw = int(np.log2(n))
- iw = [iw, ]
- for i in range(lw):
- iw = calc_one_recursion(iw)
- return iw
-
-
-def bsc_channel(p):
- '''
- binary symmetric channel (BSC)
- output alphabet Y = {0, 1} and
- W(0|0) = W(1|1) and W(1|0) = W(0|1)
-
- this function returns a prob's vector for a BSC
- p denotes an erroneous transistion
- '''
- if not (p >= 0.0 and p <= 1.0):
- print "given p is out of range!"
- return ()
-
- # 0 -> 0, 0 -> 1, 1 -> 0, 1 -> 1
- W = np.array([[1 - p, p], [p, 1 - p]])
- return W
-
-
-def bec_channel(eta):
- '''
- binary erasure channel (BEC)
- for each y e Y
- W(y|0) * W(y|1) = 0 or W(y|0) = W(y|1)
- transistions are 1 -> 1 or 0 -> 0 or {0, 1} -> ? (erased symbol)
- '''
- print eta
-
- # looks like BSC but should be interpreted differently.
- W = (1 - eta, eta, 1 - eta)
- return W
-
-
-def is_power_of_2(num):
- if type(num) != int:
- return False # make sure we only compute integers.
- return num != 0 and ((num & (num - 1)) == 0)
-
-
-def combine_W2(u):
- # This function applies the channel combination for W2
- x1 = (u[0] + u[1]) % 2
- x2 = (u[1])
- return np.array([x1, x2], np.int)
-
-
-def combine_W4(u):
- im = np.concatenate((combine_W2(u[0:2]), combine_W2(u[2:4])))
- print "combine_W4.im = ", im
- swappy = im[1]
- im[1] = im[2]
- im[2] = swappy
- print "combine_W4.reverse_shuffled = ", im
-
- return np.concatenate((combine_W2(im[0:2]), combine_W2(im[2:4])))
-
-
-def combine_Wn(u):
- '''Combine vector u for encoding. It's described in the "Channel
combining" section'''
- # will throw error if len(u) isn't a power of 2!
- n = len(u)
- G = get_Gn(n)
- return np.dot(u, G) % 2
-
-
-def unpack_byte(byte, nactive):
- if np.amin(byte) < 0 or np.amax(byte) > 255:
- return None
- if not byte.dtype == np.uint8:
- byte = byte.astype(np.uint8)
- if nactive == 0:
- return np.array([], dtype=np.uint8)
- return np.unpackbits(byte)[-nactive:]
-
-
-def pack_byte(bits):
- if len(bits) == 0:
- return 0
- if np.amin(bits) < 0 or np.amax(bits) > 1: # only '1' and '0' in bits
array allowed!
- return None
- bits = np.concatenate((np.zeros(8 - len(bits), dtype=np.uint8), bits))
- res = np.packbits(bits)[0]
- return res
-
-
-def calculate_conditional_prob(y, u, channel):
- # y and u same size and 1d!
- # channel 2 x 2 matrix!
- x1 = (u[0] + u[1]) % 2
- s = 0 if y[0] == x1 else 1
- # print "W(", y[0], "|", u[0], "+", u[1], "=", s, ") =", channel[y[0]][x1]
- w112 = channel[y[0]][x1]
- w22 = channel[y[1]][u[1]]
- return w112 * w22
-
-
-def calculate_w2_probs():
- w0 = np.array([[0.9, 0.1], [0.1, 0.9]])
- print w0
-
- w2 = np.zeros((4, 4), dtype=float)
-
- print "W(y1|u1+u2)"
- for y in range(4):
- ybits = unpack_byte(np.array([y, ]), 2)
- for u in range(4):
- ubits = unpack_byte(np.array([u, ]), 2)
- prob = calculate_conditional_prob(ybits, ubits, w0)
- w2[y][u] = prob
- # print "W(y1,y2|u1,u2) =", prob
- return w2
-
-
-def get_prob(y, u, channel):
- return channel[y][u]
-
-
-def get_wn_prob(y, u, channel):
- x = combine_Wn(u)
- result = 1
- for i in range(len(x)):
- result *= get_prob(y[i], x[i], channel)
- return result
-
-
-def calculate_Wn_probs(n, channel):
- # print "calculate_wn_probs"
- ncomb = 2 ** n
- wn = np.ones((ncomb, ncomb), dtype=float)
- for y in range(ncomb):
- ybits = unpack_byte(np.array([y, ]), n)
- for u in range(ncomb):
- ubits = unpack_byte(np.array([u, ]), n)
- xbits = combine_Wn(ubits)
- wn[y][u] = get_wn_prob(ybits, ubits, channel)
- return wn
-
-
-def calculate_channel_splitting_probs(wn, n):
- print wn
-
- wi = np.zeros((n, 2 ** n, 2 ** n), dtype=float)
- divider = (1.0 / (2 ** (n - 1)))
- for i in range(n):
- for y in range(2 ** n):
- ybits = unpack_byte(np.array([y, ]), n)
- print
- for u in range(2 ** n):
- ubits = unpack_byte(np.array([u, ]), n)
- usc = ubits[0:i]
- u = ubits[i]
- usum = ubits[i+1:]
- fixed_pu = np.append(usc, u)
-
- my_iter = []
- if len(usum) == 0:
- my_iter.append(np.append(np.zeros(8 - len(fixed_pu),
dtype=np.uint8), fixed_pu))
- else:
- uiter = np.arange(2 ** len(usum), dtype=np.uint8)
- for ui in uiter:
- element = unpack_byte(ui, len(usum))
- item = np.append(fixed_pu, element)
- item = np.append(np.zeros(8 - len(item),
dtype=np.uint8), item)
- my_iter.append(item)
- my_iter = np.array(my_iter)
-
- prob_sum = 0
- for item in my_iter:
- upos = np.packbits(item)
- # print "y=", np.binary_repr(y, n), "item=", item, "u=",
np.binary_repr(upos, n)
- wni = wn[y][upos]
- prob_sum += wni
- prob_sum *= divider
-
- print "W[{5}]({0},{1},{2}|{3}) = {4}".format(ybits[0],
ybits[1], usc, u, prob_sum, i)
-
- # print "i=", i, "y=", np.binary_repr(y, n), " fixed=",
fixed_pu, "usum=", usum, " WN(i) =", prob_sum
- wi[i][y][u] = prob_sum
-
- for i in range(n):
- print
- for y in range(2 ** n):
- ybits = unpack_byte(np.array([y, ]), n)
- for u in range(2 ** n):
-
- print "W[{}] ({},{}|{})".format(i, ybits[0], ybits[1], u)
-
-
-
- return wi
-
-
-
-def mutual_information(w):
- '''
- calculate mutual information I(W)
- I(W) = sum over y e Y ( sum over x e X ( ... ) )
- .5 W(y|x) log frac { W(y|x) }{ .5 W(y|0) + .5 W(y|1) }
- '''
- ydim, xdim = np.shape(w)
- i = 0.0
- for y in range(ydim):
- for x in range(xdim):
- v = w[y][x] * np.log2(w[y][x] / (0.5 * w[y][0] + 0.5 * w[y][1]))
- i += v
- i /= 2.0
- return i
-
-
-def capacity(w):
- '''
- find supremum I(W) of a channel.
- '''
- return w
-
-
-def bhattacharyya_parameter(w):
- '''bhattacharyya parameter is a measure of similarity between two prob.
distributions'''
- # sum over all y e Y for sqrt( W(y|0) * W(y|1) )
- dim = np.shape(w)
- ydim = dim[0]
- xdim = dim[1]
- z = 0.0
- for y in range(ydim):
- z += np.sqrt(w[y][0] * w[y][1])
- # need all
- return z
-
-
-def w_transition_prob(y, u, p):
- return 1 - p if y == u else p
-
-
-def w_split_prob(y, u, G, p):
- ''' Calculate channel splitting probabilities. '''
- N = len(y) # number of combined channels
- df = N - len(u) # degrees of freedom.
- prob = 0.0
- for uf in range(2 ** df):
- utemp = unpack_byte(np.array([uf, ]), df)
- ub = np.concatenate((u, utemp))
- # print "y=", y, "\tu=", ub
- x = np.dot(ub, G) % 2
- # print "x=", x
- w = 1.0
- for i in range(N):
- w *= w_transition_prob(y[i], x[i], p)
- # print "for u1=", uf, "prob=", w
- prob += w
- divider = 1.0 / (2 ** (N - 1))
- return divider * prob
-
-
-def wn_split_channel(N, p):
- G = get_Gn(N)
- y = np.zeros((N, ), dtype=np.uint8)
- n = 1
- u = np.zeros((n + 1, ), dtype=np.uint8)
-
- pn = w_split_prob(y, u, G, p)
- # print "pn=", pn
- z_params = []
- c_params = []
- for w in range(N):
- nentries = (2 ** N) * (2 ** w)
- print "for w=", w, " nentries=", nentries
- w_probs = np.zeros((nentries, 2), dtype=float)
- for y in range(2 ** N):
- yb = unpack_byte(np.array([y, ]), N)
- # print "\n\nyb", yb
- for u in range(2 ** (w + 1)):
- ub = unpack_byte(np.array([u, ]), w + 1)
- # print "ub", ub
- wp = w_split_prob(yb, ub, G, p)
- ufixed = ub[0:-1]
- yindex = y * (2 ** w) + pack_byte(ufixed)
- uindex = ub[-1]
- # print "y=", y, "ub", u, " prob=", wp, "index=[", yindex, ",
", uindex, "]"
- w_probs[yindex][uindex] = wp
- print "\n", np.sum(w_probs, axis=0)
- z = bhattacharyya_parameter(w_probs)
- z_params.append(z)
- c = mutual_information(w_probs)
- c_params.append(c)
- print "W=", w, "Z=", z, "capacity=", c
-
- return z_params, c_params
-
-
-def wminus(y0, y1, u0, p):
- prob = 0.0
- for i in range(2):
- # print y0, y1, u0, i
- u0u1 = (i + u0) % 2
- w0 = w_transition_prob(y0, u0u1, p)
- w1 = w_transition_prob(y1, i, p)
- # print "w0=", w0, "\tw1=", w1
- prob += w0 * w1
- prob *= 0.5
- return prob
-
-
-def wplus(y0, y1, u0, u1, p):
- u0u1 = (u0 + u1) % 2
- w0 = w_transition_prob(y0, u0u1, p)
- w1 = w_transition_prob(y1, u1, p)
- return 0.5 * w0 * w1
-
-
-def w2_split_channel(p):
-
- wm_probs = np.zeros((4, 2), dtype=float)
- for y0 in range(2):
- for y1 in range(2):
- for u0 in range(2):
- wm = wminus(y0, y1, u0, p)
- wm_probs[y0 * 2 + y1][u0] = wm
-
- print wm_probs
- print "W- Z parameter=", bhattacharyya_parameter(wm_probs)
- print "I(W-)=", mutual_information(wm_probs)
-
- chan_prob = 0.0
- wp_probs = np.zeros((8, 2), dtype=float)
- for y0 in range(2):
- for y1 in range(2):
- for u0 in range(2):
- for u1 in range(2):
- wp = wplus(y0, y1, u0, u1, p)
- wp_probs[4 * y0 + 2 * y1 + u0][u1] = wp
-
- print wp_probs
- print "W+ Z parameter=", bhattacharyya_parameter(wp_probs)
- print "I(W+)=", mutual_information(wp_probs)
-
-
-def plot_channel(probs, p, name):
- nc = len(probs)
- plt.plot(probs)
- plt.grid()
- plt.xlim((0, nc - 1))
- plt.ylim((0.0, 1.0))
- plt.xlabel('channel')
- plt.ylabel('capacity')
-
- fname = name, '_', p, '_', nc
- print fname
- fname = ''.join(str(n) for n in fname)
- print fname
- fname = fname.replace('.', '_')
- print fname
- fname = ''.join((fname, '.pdf'))
- print fname
- plt.savefig(fname)
- # plt.show()
-
-
-def main():
- np.set_printoptions(precision=4, linewidth=150)
- print "POLAR code!"
- w2 = calculate_w2_probs()
- print w2
-
- p = 0.1
- n = 2
- wn = calculate_Wn_probs(n, bsc_channel(p))
-
- wi = calculate_channel_splitting_probs(wn, n)
-
- w0 = bsc_channel(p)
- print w0
- iw = mutual_information(w0)
- print "I(W)=", iw
- print 1 - (p * np.log2(1.0 / p) + (1 - p) * np.log2(1.0 / (1 - p)))
-
- print "Z param call"
- bhattacharyya_parameter(w0)
-
- print "old vs new encoder"
-
- p = 0.1
- w2_split_channel(p)
- z, c = wn_split_channel(4, p)
-
- eta = 0.3
- nc = 1024
- probs = calculate_bec_channel_capacities(eta, nc)
- # plot_channel(probs, eta, 'bec_capacity')
- # plot_channel(c, p, 'bsc_capacity')
-
- nt = 2 ** 5
-
-
- fG = get_Gn(nt)
- # print fG
- encoder = enc(nt, 4, np.arange(nt - 4, dtype=int))
- # print encoder.get_gn()
- comp = np.equal(fG, encoder.get_gn())
-
- print "is equal?", np.all(comp)
-
-
-
-if __name__ == '__main__':
- main()
diff --git a/gr-fec/python/fec/qa_polar_decoder_sc.py
b/gr-fec/python/fec/qa_polar_decoder_sc.py
index f26bf9a..966a9f1 100644
--- a/gr-fec/python/fec/qa_polar_decoder_sc.py
+++ b/gr-fec/python/fec/qa_polar_decoder_sc.py
@@ -31,7 +31,7 @@ from extended_encoder import extended_encoder
from extended_decoder import extended_decoder
from polar.encoder import PolarEncoder
from polar.decoder import PolarDecoder
-from polar.helper_functions import get_frozen_bit_positions
+import polar.channel_construction as cc
# from polar.helper_functions import bit_reverse_vector
# print('PID:', os.getpid())
@@ -66,7 +66,7 @@ class test_polar_decoder_sc(gr_unittest.TestCase):
block_size = 2 ** block_power
num_info_bits = 2 ** (block_power - 1)
num_frozen_bits = block_size - num_info_bits
- frozen_bit_positions = get_frozen_bit_positions('polar', block_size,
num_frozen_bits, 0.11)
+ frozen_bit_positions = cc.frozen_bit_positions(block_size,
num_info_bits, 0.0)
frozen_bit_values = np.array([0] * num_frozen_bits,)
print frozen_bit_positions
@@ -77,7 +77,7 @@ class test_polar_decoder_sc(gr_unittest.TestCase):
encoder = PolarEncoder(block_size, num_info_bits,
frozen_bit_positions, frozen_bit_values)
data = encoder.encode(bits)
# data = np.array([0, 1, 1, 0, 1, 0, 1, 0], dtype=int)
- gr_data = -2.0 * data + 1.0
+ gr_data = 2.0 * data - 1.0
polar_decoder = fec.polar_decoder_sc.make(block_size, num_info_bits,
frozen_bit_positions, frozen_bit_values, is_packed)
src = blocks.vector_source_f(gr_data, False)
@@ -106,7 +106,7 @@ class test_polar_decoder_sc(gr_unittest.TestCase):
block_size = 2 ** block_power
num_info_bits = 2 ** (block_power - 1)
num_frozen_bits = block_size - num_info_bits
- frozen_bit_positions = get_frozen_bit_positions('polar', block_size,
num_frozen_bits, 0.11)
+ frozen_bit_positions = cc.frozen_bit_positions(block_size,
num_info_bits, 0.0)
frozen_bit_values = np.array([0] * num_frozen_bits,)
print frozen_bit_positions
@@ -124,7 +124,7 @@ class test_polar_decoder_sc(gr_unittest.TestCase):
# bits = np.random.randint(2, size=num_info_bits)
# data = encoder.encode(bits)
# data = np.array([0, 1, 1, 0, 1, 0, 1, 0], dtype=int)
- gr_data = -2.0 * data + 1.0
+ gr_data = 2.0 * data - 1.0
polar_decoder = fec.polar_decoder_sc.make(block_size, num_info_bits,
frozen_bit_positions, frozen_bit_values, is_packed)
src = blocks.vector_source_f(gr_data, False)
diff --git a/gr-fec/python/fec/qa_polar_decoder_sc_list.py
b/gr-fec/python/fec/qa_polar_decoder_sc_list.py
index f698a4e..3aefd0f 100644
--- a/gr-fec/python/fec/qa_polar_decoder_sc_list.py
+++ b/gr-fec/python/fec/qa_polar_decoder_sc_list.py
@@ -29,12 +29,13 @@ from extended_encoder import extended_encoder
from extended_decoder import extended_decoder
from polar.encoder import PolarEncoder
from polar.decoder import PolarDecoder
-from polar.helper_functions import get_frozen_bit_positions
-# from polar.helper_functions import bit_reverse_vector
-#
+import polar.channel_construction as cc
+
+
# print('PID:', os.getpid())
# raw_input('tell me smth')
+
class test_polar_decoder_sc_list(gr_unittest.TestCase):
def setUp(self):
@@ -66,7 +67,7 @@ class test_polar_decoder_sc_list(gr_unittest.TestCase):
num_info_bits = 2 ** (expo - 1)
max_list_size = 2 ** (expo - 2)
num_frozen_bits = block_size - num_info_bits
- frozen_bit_positions = get_frozen_bit_positions('polar', block_size,
num_frozen_bits, 0.11)
+ frozen_bit_positions = cc.frozen_bit_positions(block_size,
num_info_bits, 0.0)
frozen_bit_values = np.array([0] * num_frozen_bits,)
print(frozen_bit_positions)
@@ -78,7 +79,7 @@ class test_polar_decoder_sc_list(gr_unittest.TestCase):
encoder = PolarEncoder(block_size, num_info_bits,
frozen_bit_positions, frozen_bit_values)
data = encoder.encode(bits)
# data = np.array([0, 1, 1, 0, 1, 0, 1, 0], dtype=int)
- gr_data = -2.0 * data + 1.0
+ gr_data = 2.0 * data - 1.0
polar_decoder = fec.polar_decoder_sc_list.make(max_list_size,
block_size, num_info_bits, frozen_bit_positions, frozen_bit_values, is_packed)
src = blocks.vector_source_f(gr_data, False)
@@ -109,7 +110,7 @@ class test_polar_decoder_sc_list(gr_unittest.TestCase):
num_info_bits = 2 ** (expo - 1)
max_list_size = 2 ** (expo - 2)
num_frozen_bits = block_size - num_info_bits
- frozen_bit_positions = get_frozen_bit_positions('polar', block_size,
num_frozen_bits, 0.11)
+ frozen_bit_positions = cc.frozen_bit_positions(block_size,
num_info_bits, 0.0)
frozen_bit_values = np.array([0] * num_frozen_bits,)
print(frozen_bit_positions)
@@ -127,7 +128,7 @@ class test_polar_decoder_sc_list(gr_unittest.TestCase):
# bits = np.ones(num_info_bits, dtype=int)
# data = encoder.encode(bits)
# data = np.array([0, 1, 1, 0, 1, 0, 1, 0], dtype=int)
- gr_data = -2.0 * data + 1.0
+ gr_data = 2.0 * data - 1.0
polar_decoder = fec.polar_decoder_sc_list.make(max_list_size,
block_size, num_info_bits, frozen_bit_positions, frozen_bit_values, is_packed)
src = blocks.vector_source_f(gr_data, False)
diff --git a/gr-fec/python/fec/qa_polar_encoder.py
b/gr-fec/python/fec/qa_polar_encoder.py
index 4af193e..b4f26e4 100644
--- a/gr-fec/python/fec/qa_polar_encoder.py
+++ b/gr-fec/python/fec/qa_polar_encoder.py
@@ -26,7 +26,7 @@ import numpy as np
from extended_encoder import extended_encoder
from polar.encoder import PolarEncoder
-from polar.helper_functions import get_frozen_bit_positions
+import polar.channel_construction as cc
class test_polar_encoder(gr_unittest.TestCase):
@@ -40,7 +40,7 @@ class test_polar_encoder(gr_unittest.TestCase):
def test_001_setup(self):
block_size = 16
num_info_bits = 8
- frozen_bit_positions = np.arange(block_size - num_info_bits)
+ frozen_bit_positions = cc.frozen_bit_positions(block_size,
num_info_bits, 0.0)
frozen_bit_values = np.array([],)
polar_encoder = fec.polar_encoder.make(block_size, num_info_bits,
frozen_bit_positions, frozen_bit_values)
@@ -54,7 +54,7 @@ class test_polar_encoder(gr_unittest.TestCase):
block_size = 256
num_info_bits = 128
num_frozen_bits = block_size - num_info_bits
- frozen_bit_positions = get_frozen_bit_positions('polar', block_size,
num_frozen_bits, 0.11)
+ frozen_bit_positions = cc.frozen_bit_positions(block_size,
num_info_bits, 0.0)
frozen_bit_values = np.array([0] * num_frozen_bits,)
python_encoder = PolarEncoder(block_size, num_info_bits,
frozen_bit_positions, frozen_bit_values)
@@ -83,7 +83,7 @@ class test_polar_encoder(gr_unittest.TestCase):
block_size = 256
num_info_bits = 128
num_frozen_bits = block_size - num_info_bits
- frozen_bit_positions =
get_frozen_bit_positions('/home/johannes/src/gnuradio-polar/gr-fec/python/fec/polar',
block_size, num_frozen_bits, 0.11)
+ frozen_bit_positions = cc.frozen_bit_positions(block_size,
num_info_bits, 0.0)
frozen_bit_values = np.array([0] * num_frozen_bits,)
python_encoder = PolarEncoder(block_size, num_info_bits,
frozen_bit_positions, frozen_bit_values)
- [Commit-gnuradio] [gnuradio] 19/25: polar: rearranged polar_code_example flowgraph, (continued)
- [Commit-gnuradio] [gnuradio] 19/25: polar: rearranged polar_code_example flowgraph, git, 2015/09/23
- [Commit-gnuradio] [gnuradio] 21/25: Merge branch 'maint', git, 2015/09/23
- [Commit-gnuradio] [gnuradio] 05/25: polar: VOLK kernel integration, git, 2015/09/23
- [Commit-gnuradio] [gnuradio] 24/25: Merge remote-tracking branch 'gnuradio-wg-grc/master_grcwg', git, 2015/09/23
- [Commit-gnuradio] [gnuradio] 07/25: polar: updated polar code example GRC, git, 2015/09/23
- [Commit-gnuradio] [gnuradio] 02/25: polar: encoder implemented in C++, git, 2015/09/23
- [Commit-gnuradio] [gnuradio] 25/25: Merge remote-tracking branch 'tom/socis/master', git, 2015/09/23
- [Commit-gnuradio] [gnuradio] 06/25: polar: refarctoring and clean-up, git, 2015/09/23
- [Commit-gnuradio] [gnuradio] 03/25: polar: SC and SC List decoder implemented in C++, git, 2015/09/23
- [Commit-gnuradio] [gnuradio] 01/25: polar: Python test code for polar codes, git, 2015/09/23
- [Commit-gnuradio] [gnuradio] 04/25: polar: Python implementation for channel construction,
git <=
- [Commit-gnuradio] [gnuradio] 13/25: polar: updated documentation and examples, git, 2015/09/23
- [Commit-gnuradio] [gnuradio] 15/25: fec: polar: moving polar codes into ::code:: namespace like the others., git, 2015/09/23
- [Commit-gnuradio] [gnuradio] 16/25: fec: polar: whitespace fixes/tabs to go along with namespace change from last commit., git, 2015/09/23
- [Commit-gnuradio] [gnuradio] 14/25: polar: updated documentation and examples, git, 2015/09/23