summaryrefslogtreecommitdiff
path: root/gr-trellis
diff options
context:
space:
mode:
Diffstat (limited to 'gr-trellis')
-rw-r--r--gr-trellis/CMakeLists.txt22
-rw-r--r--gr-trellis/doc/gr-trellis.xml12
-rw-r--r--gr-trellis/doc/test_tcm.py14
-rw-r--r--gr-trellis/doc/test_tcm.py.xml8
-rwxr-xr-xgr-trellis/doc/test_viterbi_equalization1.py16
-rw-r--r--gr-trellis/doc/test_viterbi_equalization1.py.xml10
-rw-r--r--gr-trellis/examples/grc/CMakeLists.txt (renamed from gr-trellis/src/examples/grc/CMakeLists.txt)0
-rw-r--r--gr-trellis/examples/grc/interference_cancellation.grc (renamed from gr-trellis/src/examples/grc/interference_cancellation.grc)1286
-rw-r--r--gr-trellis/examples/grc/pccc.grc (renamed from gr-trellis/src/examples/grc/pccc.grc)340
-rw-r--r--gr-trellis/examples/grc/pccc1.grc (renamed from gr-trellis/src/examples/grc/pccc1.grc)358
-rw-r--r--gr-trellis/examples/grc/readme.txt (renamed from gr-trellis/src/examples/grc/readme.txt)0
-rw-r--r--gr-trellis/examples/grc/sccc.grc (renamed from gr-trellis/src/examples/grc/sccc.grc)358
-rw-r--r--gr-trellis/examples/grc/sccc1.grc (renamed from gr-trellis/src/examples/grc/sccc1.grc)260
-rw-r--r--gr-trellis/examples/python/CMakeLists.txt (renamed from gr-trellis/src/examples/python/CMakeLists.txt)0
-rw-r--r--gr-trellis/examples/python/README (renamed from gr-trellis/src/examples/python/README)0
-rw-r--r--gr-trellis/examples/python/fsm_files/awgn1o2_128.fsm (renamed from gr-trellis/src/examples/python/fsm_files/awgn1o2_128.fsm)0
-rw-r--r--gr-trellis/examples/python/fsm_files/awgn1o2_16.fsm (renamed from gr-trellis/src/examples/python/fsm_files/awgn1o2_16.fsm)0
-rw-r--r--gr-trellis/examples/python/fsm_files/awgn1o2_4.fsm (renamed from gr-trellis/src/examples/python/fsm_files/awgn1o2_4.fsm)0
-rw-r--r--gr-trellis/examples/python/fsm_files/awgn1o2_8.fsm (renamed from gr-trellis/src/examples/python/fsm_files/awgn1o2_8.fsm)0
-rw-r--r--gr-trellis/examples/python/fsm_files/awgn2o3_16.fsm (renamed from gr-trellis/src/examples/python/fsm_files/awgn2o3_16.fsm)0
-rw-r--r--gr-trellis/examples/python/fsm_files/awgn2o3_4.fsm (renamed from gr-trellis/src/examples/python/fsm_files/awgn2o3_4.fsm)0
-rw-r--r--gr-trellis/examples/python/fsm_files/awgn2o3_4_msb.fsm (renamed from gr-trellis/src/examples/python/fsm_files/awgn2o3_4_msb.fsm)0
-rw-r--r--gr-trellis/examples/python/fsm_files/awgn2o3_4_msbG.fsm (renamed from gr-trellis/src/examples/python/fsm_files/awgn2o3_4_msbG.fsm)0
-rw-r--r--gr-trellis/examples/python/fsm_files/awgn2o3_8.fsm (renamed from gr-trellis/src/examples/python/fsm_files/awgn2o3_8.fsm)0
-rw-r--r--gr-trellis/examples/python/fsm_files/awgn2o4_4.fsm (renamed from gr-trellis/src/examples/python/fsm_files/awgn2o4_4.fsm)0
-rw-r--r--gr-trellis/examples/python/fsm_files/disconnected.fsm (renamed from gr-trellis/src/examples/python/fsm_files/disconnected.fsm)0
-rw-r--r--gr-trellis/examples/python/fsm_files/irregular.fsm (renamed from gr-trellis/src/examples/python/fsm_files/irregular.fsm)0
-rw-r--r--gr-trellis/examples/python/fsm_files/joint_16_16.fsm (renamed from gr-trellis/src/examples/python/fsm_files/joint_16_16.fsm)0
-rw-r--r--gr-trellis/examples/python/fsm_files/joint_4_16.fsm (renamed from gr-trellis/src/examples/python/fsm_files/joint_4_16.fsm)0
-rw-r--r--gr-trellis/examples/python/fsm_files/rep3.fsm (renamed from gr-trellis/src/examples/python/fsm_files/rep3.fsm)0
-rw-r--r--gr-trellis/examples/python/fsm_files/rep5.fsm (renamed from gr-trellis/src/examples/python/fsm_files/rep5.fsm)0
-rw-r--r--gr-trellis/examples/python/fsm_files/simple.fsm (renamed from gr-trellis/src/examples/python/fsm_files/simple.fsm)0
-rwxr-xr-xgr-trellis/examples/python/fsm_utils.py (renamed from gr-trellis/src/examples/python/fsm_utils.py)0
-rwxr-xr-xgr-trellis/examples/python/test_cpm.py (renamed from gr-trellis/src/examples/python/test_cpm.py)55
-rwxr-xr-xgr-trellis/examples/python/test_pccc_turbo1.py (renamed from gr-trellis/src/examples/python/test_pccc_turbo1.py)15
-rwxr-xr-xgr-trellis/examples/python/test_sccc_hard.py (renamed from gr-trellis/src/examples/python/test_sccc_hard.py)14
-rwxr-xr-xgr-trellis/examples/python/test_sccc_soft.py (renamed from gr-trellis/src/examples/python/test_sccc_soft.py)15
-rwxr-xr-xgr-trellis/examples/python/test_sccc_turbo.py (renamed from gr-trellis/src/examples/python/test_sccc_turbo.py)16
-rwxr-xr-xgr-trellis/examples/python/test_sccc_turbo1.py (renamed from gr-trellis/src/examples/python/test_sccc_turbo1.py)13
-rwxr-xr-xgr-trellis/examples/python/test_sccc_turbo2.py (renamed from gr-trellis/src/examples/python/test_sccc_turbo2.py)15
-rwxr-xr-xgr-trellis/examples/python/test_tcm.py (renamed from gr-trellis/src/examples/python/test_tcm.py)14
-rwxr-xr-xgr-trellis/examples/python/test_tcm_bit.py (renamed from gr-trellis/src/examples/python/test_tcm_bit.py)13
-rwxr-xr-xgr-trellis/examples/python/test_tcm_combined.py (renamed from gr-trellis/src/examples/python/test_tcm_combined.py)13
-rwxr-xr-xgr-trellis/examples/python/test_tcm_parallel.py (renamed from gr-trellis/src/examples/python/test_tcm_parallel.py)17
-rwxr-xr-xgr-trellis/examples/python/test_turbo_equalization.py (renamed from gr-trellis/src/examples/python/test_turbo_equalization.py)15
-rwxr-xr-xgr-trellis/examples/python/test_turbo_equalization1.py (renamed from gr-trellis/src/examples/python/test_turbo_equalization1.py)18
-rwxr-xr-xgr-trellis/examples/python/test_turbo_equalization2.py (renamed from gr-trellis/src/examples/python/test_turbo_equalization2.py)18
-rwxr-xr-xgr-trellis/examples/python/test_viterbi_equalization.py (renamed from gr-trellis/src/examples/python/test_viterbi_equalization.py)14
-rwxr-xr-xgr-trellis/examples/python/test_viterbi_equalization1.py (renamed from gr-trellis/src/examples/python/test_viterbi_equalization1.py)16
-rw-r--r--gr-trellis/include/trellis/CMakeLists.txt102
-rw-r--r--gr-trellis/include/trellis/api.h (renamed from gr-trellis/src/lib/trellis_api.h)0
-rw-r--r--gr-trellis/include/trellis/base.h (renamed from gr-trellis/src/lib/base.h)23
-rw-r--r--gr-trellis/include/trellis/calc_metric.h54
-rw-r--r--gr-trellis/include/trellis/constellation_metrics_cf.h51
-rw-r--r--gr-trellis/include/trellis/core_algorithms.h124
-rw-r--r--gr-trellis/include/trellis/encoder_XX.h.t (renamed from gr-trellis/src/lib/trellis_encoder_XX.h.t)52
-rw-r--r--gr-trellis/include/trellis/fsm.h191
-rw-r--r--gr-trellis/include/trellis/interleaver.h (renamed from gr-trellis/src/lib/interleaver.h)52
-rw-r--r--gr-trellis/include/trellis/metrics_X.h.t58
-rw-r--r--gr-trellis/include/trellis/pccc_decoder_X.h.t69
-rw-r--r--gr-trellis/include/trellis/pccc_decoder_combined_XX.h.t79
-rw-r--r--gr-trellis/include/trellis/pccc_encoder_XX.h.t63
-rw-r--r--gr-trellis/include/trellis/permutation.h55
-rw-r--r--gr-trellis/include/trellis/quicksort_index.h (renamed from gr-trellis/src/lib/quicksort_index.h)19
-rw-r--r--gr-trellis/include/trellis/sccc_decoder_X.h.t69
-rw-r--r--gr-trellis/include/trellis/sccc_decoder_combined_XX.h.t79
-rw-r--r--gr-trellis/include/trellis/sccc_encoder_XX.h.t63
-rw-r--r--gr-trellis/include/trellis/siso_combined_f.h68
-rw-r--r--gr-trellis/include/trellis/siso_f.h61
-rw-r--r--gr-trellis/include/trellis/siso_type.h (renamed from gr-trellis/src/lib/siso_type.h)16
-rw-r--r--gr-trellis/include/trellis/viterbi_X.h.t (renamed from gr-trellis/src/lib/trellis_metrics_X.i.t)45
-rw-r--r--gr-trellis/include/trellis/viterbi_combined_XX.h.t64
-rw-r--r--gr-trellis/lib/CMakeLists.txt141
-rw-r--r--gr-trellis/lib/base.cc86
-rw-r--r--gr-trellis/lib/calc_metric.cc251
-rw-r--r--gr-trellis/lib/constellation_metrics_cf_impl.cc96
-rw-r--r--gr-trellis/lib/constellation_metrics_cf_impl.h57
-rw-r--r--gr-trellis/lib/core_algorithms.cc1324
-rw-r--r--gr-trellis/lib/encoder_XX_impl.cc.t82
-rw-r--r--gr-trellis/lib/encoder_XX_impl.h.t (renamed from gr-trellis/src/lib/trellis_viterbi_X.i.t)57
-rw-r--r--gr-trellis/lib/fsm.cc521
-rw-r--r--gr-trellis/lib/interleaver.cc147
-rw-r--r--gr-trellis/lib/metrics_X_impl.cc.t98
-rw-r--r--gr-trellis/lib/metrics_X_impl.h.t64
-rw-r--r--gr-trellis/lib/pccc_decoder_X_impl.cc.t120
-rw-r--r--gr-trellis/lib/pccc_decoder_X_impl.h.t80
-rw-r--r--gr-trellis/lib/pccc_decoder_combined_XX_impl.cc.t139
-rw-r--r--gr-trellis/lib/pccc_decoder_combined_XX_impl.h.t93
-rw-r--r--gr-trellis/lib/pccc_encoder_XX_impl.cc.t91
-rw-r--r--gr-trellis/lib/pccc_encoder_XX_impl.h.t66
-rw-r--r--gr-trellis/lib/permutation_impl.cc90
-rw-r--r--gr-trellis/lib/permutation_impl.h58
-rw-r--r--gr-trellis/lib/quicksort_index.cc70
-rw-r--r--gr-trellis/lib/sccc_decoder_X_impl.cc.t118
-rw-r--r--gr-trellis/lib/sccc_decoder_X_impl.h.t80
-rw-r--r--gr-trellis/lib/sccc_decoder_combined_XX_impl.cc.t139
-rw-r--r--gr-trellis/lib/sccc_decoder_combined_XX_impl.h.t93
-rw-r--r--gr-trellis/lib/sccc_encoder_XX_impl.cc.t93
-rw-r--r--gr-trellis/lib/sccc_encoder_XX_impl.h.t66
-rw-r--r--gr-trellis/lib/siso_combined_f_impl.cc180
-rw-r--r--gr-trellis/lib/siso_combined_f_impl.h79
-rw-r--r--gr-trellis/lib/siso_f_impl.cc171
-rw-r--r--gr-trellis/lib/siso_f_impl.h75
-rw-r--r--gr-trellis/lib/viterbi_X_impl.cc.t99
-rw-r--r--gr-trellis/lib/viterbi_X_impl.h.t65
-rw-r--r--gr-trellis/lib/viterbi_combined_XX_impl.cc.t112
-rw-r--r--gr-trellis/lib/viterbi_combined_XX_impl.h.t74
-rw-r--r--gr-trellis/python/CMakeLists.txt (renamed from gr-trellis/src/python/CMakeLists.txt)25
-rw-r--r--gr-trellis/python/__init__.py (renamed from gr-trellis/src/lib/generate_all.py)27
-rw-r--r--gr-trellis/python/awgn1o2_4.fsm (renamed from gr-trellis/src/python/awgn1o2_4.fsm)0
-rwxr-xr-xgr-trellis/python/qa_trellis.py (renamed from gr-trellis/src/python/qa_trellis.py)27
-rw-r--r--gr-trellis/src/lib/CMakeLists.txt226
-rw-r--r--gr-trellis/src/lib/Makefile.gen174
-rw-r--r--gr-trellis/src/lib/base.cc92
-rw-r--r--gr-trellis/src/lib/calc_metric.cc250
-rw-r--r--gr-trellis/src/lib/calc_metric.h46
-rw-r--r--gr-trellis/src/lib/core_algorithms.cc1437
-rw-r--r--gr-trellis/src/lib/core_algorithms.h140
-rw-r--r--gr-trellis/src/lib/fsm.cc548
-rw-r--r--gr-trellis/src/lib/fsm.h166
-rw-r--r--gr-trellis/src/lib/fsm.i59
-rw-r--r--gr-trellis/src/lib/generate_trellis.py129
-rw-r--r--gr-trellis/src/lib/interleaver.cc144
-rw-r--r--gr-trellis/src/lib/interleaver.i38
-rw-r--r--gr-trellis/src/lib/quicksort_index.cc68
-rw-r--r--gr-trellis/src/lib/trellis.i58
-rw-r--r--gr-trellis/src/lib/trellis_constellation_metrics_cf.cc90
-rw-r--r--gr-trellis/src/lib/trellis_constellation_metrics_cf.h62
-rw-r--r--gr-trellis/src/lib/trellis_constellation_metrics_cf.i33
-rw-r--r--gr-trellis/src/lib/trellis_encoder_XX.cc.t76
-rw-r--r--gr-trellis/src/lib/trellis_encoder_XX.i.t36
-rw-r--r--gr-trellis/src/lib/trellis_metrics_X.cc.t97
-rw-r--r--gr-trellis/src/lib/trellis_metrics_X.h.t66
-rw-r--r--gr-trellis/src/lib/trellis_pccc_decoder_X.cc.t124
-rw-r--r--gr-trellis/src/lib/trellis_pccc_decoder_X.h.t103
-rw-r--r--gr-trellis/src/lib/trellis_pccc_decoder_X.i.t60
-rw-r--r--gr-trellis/src/lib/trellis_pccc_decoder_combined_XX.cc.t147
-rw-r--r--gr-trellis/src/lib/trellis_pccc_decoder_combined_XX.h.t125
-rw-r--r--gr-trellis/src/lib/trellis_pccc_decoder_combined_XX.i.t73
-rw-r--r--gr-trellis/src/lib/trellis_pccc_encoder_XX.cc.t90
-rw-r--r--gr-trellis/src/lib/trellis_pccc_encoder_XX.h.t84
-rw-r--r--gr-trellis/src/lib/trellis_pccc_encoder_XX.i.t50
-rw-r--r--gr-trellis/src/lib/trellis_permutation.cc82
-rw-r--r--gr-trellis/src/lib/trellis_permutation.h61
-rw-r--r--gr-trellis/src/lib/trellis_permutation.i41
-rw-r--r--gr-trellis/src/lib/trellis_sccc_decoder_X.cc.t124
-rw-r--r--gr-trellis/src/lib/trellis_sccc_decoder_X.h.t103
-rw-r--r--gr-trellis/src/lib/trellis_sccc_decoder_X.i.t60
-rw-r--r--gr-trellis/src/lib/trellis_sccc_decoder_combined_XX.cc.t147
-rw-r--r--gr-trellis/src/lib/trellis_sccc_decoder_combined_XX.h.t125
-rw-r--r--gr-trellis/src/lib/trellis_sccc_decoder_combined_XX.i.t73
-rw-r--r--gr-trellis/src/lib/trellis_sccc_encoder_XX.cc.t91
-rw-r--r--gr-trellis/src/lib/trellis_sccc_encoder_XX.h.t84
-rw-r--r--gr-trellis/src/lib/trellis_sccc_encoder_XX.i.t50
-rw-r--r--gr-trellis/src/lib/trellis_siso_combined_f.cc357
-rw-r--r--gr-trellis/src/lib/trellis_siso_combined_f.h112
-rw-r--r--gr-trellis/src/lib/trellis_siso_combined_f.i64
-rw-r--r--gr-trellis/src/lib/trellis_siso_f.cc338
-rw-r--r--gr-trellis/src/lib/trellis_siso_f.h97
-rw-r--r--gr-trellis/src/lib/trellis_siso_f.i55
-rw-r--r--gr-trellis/src/lib/trellis_viterbi_X.cc.t183
-rw-r--r--gr-trellis/src/lib/trellis_viterbi_X.h.t91
-rw-r--r--gr-trellis/src/lib/trellis_viterbi_combined_XX.cc.t191
-rw-r--r--gr-trellis/src/lib/trellis_viterbi_combined_XX.h.t99
-rw-r--r--gr-trellis/src/lib/trellis_viterbi_combined_XX.i.t59
-rw-r--r--gr-trellis/swig/CMakeLists.txt60
-rw-r--r--gr-trellis/swig/trellis_swig.i216
167 files changed, 8420 insertions, 9110 deletions
diff --git a/gr-trellis/CMakeLists.txt b/gr-trellis/CMakeLists.txt
index 16a3e7c191..b764998e8c 100644
--- a/gr-trellis/CMakeLists.txt
+++ b/gr-trellis/CMakeLists.txt
@@ -1,4 +1,4 @@
-# Copyright 2011 Free Software Foundation, Inc.
+# Copyright 2012 Free Software Foundation, Inc.
#
# This file is part of GNU Radio
#
@@ -29,12 +29,18 @@ include(GrComponent)
GR_REGISTER_COMPONENT("gr-trellis" ENABLE_GR_TRELLIS
Boost_FOUND
ENABLE_GR_CORE
+ ENABLE_GR_ANALOG
+ ENABLE_GR_BLOCKS
ENABLE_GR_DIGITAL
)
GR_SET_GLOBAL(GR_TRELLIS_INCLUDE_DIRS
- ${CMAKE_CURRENT_BINARY_DIR}/src/lib
- ${CMAKE_CURRENT_SOURCE_DIR}/src/lib
+ ${CMAKE_CURRENT_SOURCE_DIR}/include
+ ${CMAKE_CURRENT_BINARY_DIR}/include
+)
+
+GR_SET_GLOBAL(GR_TRELLIS_SWIG_INCLUDE_DIRS
+ ${CMAKE_CURRENT_SOURCE_DIR}/swig
)
SET(GR_PKG_TRELLIS_EXAMPLES_DIR ${GR_PKG_DATA_DIR}/examples/trellis)
@@ -94,13 +100,15 @@ CPACK_COMPONENT("trellis_swig"
########################################################################
# Add subdirectories
########################################################################
-add_subdirectory(src/lib)
+add_subdirectory(include/trellis)
+add_subdirectory(lib)
add_subdirectory(doc)
if(ENABLE_PYTHON)
+ add_subdirectory(swig)
+ add_subdirectory(python)
+ add_subdirectory(examples/python)
+ add_subdirectory(examples/grc)
add_subdirectory(grc)
- add_subdirectory(src/python)
- add_subdirectory(src/examples/python)
- add_subdirectory(src/examples/grc)
endif(ENABLE_PYTHON)
########################################################################
diff --git a/gr-trellis/doc/gr-trellis.xml b/gr-trellis/doc/gr-trellis.xml
index 4657dab384..083c2f1637 100644
--- a/gr-trellis/doc/gr-trellis.xml
+++ b/gr-trellis/doc/gr-trellis.xml
@@ -587,7 +587,7 @@ outputs a sequence of D numbers ci1,ci2,...,ciD representing the
coordianates of the constellation symbol c_i with i=y_k.
</para>
<programlisting>
- 20 mod = gr.chunks_to_symbols_sf(constellation,dimensionality)
+ 20 mod = digital.chunks_to_symbols_sf(constellation,dimensionality)
</programlisting>
<para>
@@ -597,8 +597,8 @@ r_k=(rk1,rk2,...,rkD).
</para>
<programlisting>
22 # CHANNEL
- 23 add = gr.add_ff()
- 24 noise = gr.noise_source_f(gr.GR_GAUSSIAN,math.sqrt(N0/2),seed)
+ 23 add = blocks.add_ff()
+ 24 noise = analog.noise_source_f(analog.GR_GAUSSIAN,math.sqrt(N0/2),seed)
</programlisting>
@@ -804,7 +804,7 @@ L being the channel length. This is sufficient to drive the initial and final st
23 packet[i] = 0
24 packet[len(packet)-i-1] = 0
25 src = gr.vector_source_s(packet,False)
- 26 mod = gr.chunks_to_symbols_sf(modulation[1],modulation[0])
+ 26 mod = digital.chunks_to_symbols_sf(modulation[1],modulation[0])
</programlisting>
@@ -814,8 +814,8 @@ The modulated symbols are filtered by the ISI channel and AWGN with appropriate
<programlisting>
28 # CHANNEL
29 isi = gr.fir_filter_fff(1,channel)
- 30 add = gr.add_ff()
- 31 noise = gr.noise_source_f(gr.GR_GAUSSIAN,math.sqrt(N0/2),seed)
+ 30 add = blocks.add_ff()
+ 31 noise = analog.noise_source_f(analog.GR_GAUSSIAN,math.sqrt(N0/2),seed)
</programlisting>
diff --git a/gr-trellis/doc/test_tcm.py b/gr-trellis/doc/test_tcm.py
index 8c046d697b..641e7dd6db 100644
--- a/gr-trellis/doc/test_tcm.py
+++ b/gr-trellis/doc/test_tcm.py
@@ -2,13 +2,19 @@
from gnuradio import gr
from gnuradio import audio
-from gnuradio import trellis, digital
+from gnuradio import trellis, digital, blocks
from gnuradio import eng_notation
import math
import sys
import random
import fsm_utils
+try:
+ from gnuradio import analog
+except ImportError:
+ sys.stderr.write("Error: Program requires gr-analog.\n")
+ sys.exit(1)
+
def run_test (f,Kb,bitspersymbol,K,dimensionality,constellation,N0,seed):
tb = gr.top_block ()
@@ -17,11 +23,11 @@ def run_test (f,Kb,bitspersymbol,K,dimensionality,constellation,N0,seed):
src_head = gr.head (gr.sizeof_short,Kb/16) # packet size in shorts
s2fsmi = gr.packed_to_unpacked_ss(bitspersymbol,gr.GR_MSB_FIRST) # unpack shorts to symbols compatible with the FSM input cardinality
enc = trellis.encoder_ss(f,0) # initial state = 0
- mod = gr.chunks_to_symbols_sf(constellation,dimensionality)
+ mod = digital.chunks_to_symbols_sf(constellation,dimensionality)
# CHANNEL
- add = gr.add_ff()
- noise = gr.noise_source_f(gr.GR_GAUSSIAN,math.sqrt(N0/2),seed)
+ add = blocks.add_ff()
+ noise = analog.noise_source_f(analog.GR_GAUSSIAN,math.sqrt(N0/2),seed)
# RX
metrics = trellis.metrics_f(f.O(),dimensionality,constellation,digital.TRELLIS_EUCLIDEAN) # data preprocessing to generate metrics for Viterbi
diff --git a/gr-trellis/doc/test_tcm.py.xml b/gr-trellis/doc/test_tcm.py.xml
index b5074cb2f4..29052faebc 100644
--- a/gr-trellis/doc/test_tcm.py.xml
+++ b/gr-trellis/doc/test_tcm.py.xml
@@ -4,7 +4,7 @@
2
3 from gnuradio import gr
4 from gnuradio import audio
- 5 from gnuradio import trellis
+ 5 from gnuradio import trellis, digital, analog, blocks
6 from gnuradio import eng_notation
7 import math
8 import sys
@@ -19,11 +19,11 @@
17 src_head = gr.head (gr.sizeof_short,Kb/16) # packet size in shorts
18 s2fsmi = gr.packed_to_unpacked_ss(bitspersymbol,gr.GR_MSB_FIRST) # unpack shorts to symbols compatible with the FSM input cardinality
19 enc = trellis.encoder_ss(f,0) # initial state = 0
- 20 mod = gr.chunks_to_symbols_sf(constellation,dimensionality)
+ 20 mod = digital.chunks_to_symbols_sf(constellation,dimensionality)
21
22 # CHANNEL
- 23 add = gr.add_ff()
- 24 noise = gr.noise_source_f(gr.GR_GAUSSIAN,math.sqrt(N0/2),seed)
+ 23 add = blocks.add_ff()
+ 24 noise = analog.noise_source_f(analog.GR_GAUSSIAN,math.sqrt(N0/2),seed)
25
26 # RX
27 metrics = trellis.metrics_f(f.O(),dimensionality,constellation,trellis.TRELLIS_EUCLIDEAN) # data preprocessing to generate metrics for Viterbi
diff --git a/gr-trellis/doc/test_viterbi_equalization1.py b/gr-trellis/doc/test_viterbi_equalization1.py
index 5967384cf9..d53e2b3304 100755
--- a/gr-trellis/doc/test_viterbi_equalization1.py
+++ b/gr-trellis/doc/test_viterbi_equalization1.py
@@ -2,13 +2,19 @@
from gnuradio import gr
from gnuradio import audio
-from gnuradio import trellis, digital
+from gnuradio import trellis, digital, filter, blocks
from gnuradio import eng_notation
import math
import sys
import random
import fsm_utils
+try:
+ from gnuradio import analog
+except ImportError:
+ sys.stderr.write("Error: Program requires gr-analog.\n")
+ sys.exit(1)
+
def run_test (f,Kb,bitspersymbol,K,channel,modulation,dimensionality,tot_constellation,N0,seed):
tb = gr.top_block ()
L = len(channel)
@@ -23,12 +29,12 @@ def run_test (f,Kb,bitspersymbol,K,channel,modulation,dimensionality,tot_constel
packet[i] = 0
packet[len(packet)-i-1] = 0
src = gr.vector_source_s(packet,False)
- mod = gr.chunks_to_symbols_sf(modulation[1],modulation[0])
+ mod = digital.chunks_to_symbols_sf(modulation[1],modulation[0])
# CHANNEL
- isi = gr.fir_filter_fff(1,channel)
- add = gr.add_ff()
- noise = gr.noise_source_f(gr.GR_GAUSSIAN,math.sqrt(N0/2),seed)
+ isi = filter.fir_filter_fff(1,channel)
+ add = blocks.add_ff()
+ noise = analog.noise_source_f(analog.GR_GAUSSIAN,math.sqrt(N0/2),seed)
# RX
skip = gr.skiphead(gr.sizeof_float, L) # skip the first L samples since you know they are coming from the L zero symbols
diff --git a/gr-trellis/doc/test_viterbi_equalization1.py.xml b/gr-trellis/doc/test_viterbi_equalization1.py.xml
index 27605870e8..5aca46ab35 100644
--- a/gr-trellis/doc/test_viterbi_equalization1.py.xml
+++ b/gr-trellis/doc/test_viterbi_equalization1.py.xml
@@ -4,7 +4,7 @@
2
3 from gnuradio import gr
4 from gnuradio import audio
- 5 from gnuradio import trellis
+ 5 from gnuradio import trellis, digital, analog, filter, blocks
6 from gnuradio import eng_notation
7 import math
8 import sys
@@ -25,12 +25,12 @@
23 packet[i] = 0
24 packet[len(packet)-i-1] = 0
25 src = gr.vector_source_s(packet,False)
- 26 mod = gr.chunks_to_symbols_sf(modulation[1],modulation[0])
+ 26 mod = digital.chunks_to_symbols_sf(modulation[1],modulation[0])
27
28 # CHANNEL
- 29 isi = gr.fir_filter_fff(1,channel)
- 30 add = gr.add_ff()
- 31 noise = gr.noise_source_f(gr.GR_GAUSSIAN,math.sqrt(N0/2),seed)
+ 29 isi = filter.fir_filter_fff(1,channel)
+ 30 add = blocs.add_ff()
+ 31 noise = analog.noise_source_f(analog.GR_GAUSSIAN,math.sqrt(N0/2),seed)
32
33 # RX
34 skip = gr.skiphead(gr.sizeof_float, L) # skip the first L samples since you know they are coming from the L zero symbols
diff --git a/gr-trellis/src/examples/grc/CMakeLists.txt b/gr-trellis/examples/grc/CMakeLists.txt
index 46b825d888..46b825d888 100644
--- a/gr-trellis/src/examples/grc/CMakeLists.txt
+++ b/gr-trellis/examples/grc/CMakeLists.txt
diff --git a/gr-trellis/src/examples/grc/interference_cancellation.grc b/gr-trellis/examples/grc/interference_cancellation.grc
index 7674b4bf16..891426660a 100644
--- a/gr-trellis/src/examples/grc/interference_cancellation.grc
+++ b/gr-trellis/examples/grc/interference_cancellation.grc
@@ -1,6 +1,6 @@
<?xml version='1.0' encoding='ASCII'?>
<flow_graph>
- <timestamp>Wed Aug 31 17:40:25 2011</timestamp>
+ <timestamp>Sat Nov 10 15:39:57 2012</timestamp>
<block>
<key>options</key>
<param>
@@ -44,6 +44,10 @@
<value>True</value>
</param>
<param>
+ <key>max_nouts</key>
+ <value>0</value>
+ </param>
+ <param>
<key>realtime_scheduling</key>
<value></value>
</param>
@@ -229,37 +233,6 @@
</param>
</block>
<block>
- <key>gr_multiply_const_vxx</key>
- <param>
- <key>id</key>
- <value>gr_multiply_const_vxx_0</value>
- </param>
- <param>
- <key>_enabled</key>
- <value>True</value>
- </param>
- <param>
- <key>type</key>
- <value>complex</value>
- </param>
- <param>
- <key>const</key>
- <value>alpha**0.5</value>
- </param>
- <param>
- <key>vlen</key>
- <value>1</value>
- </param>
- <param>
- <key>_coordinate</key>
- <value>(988, 196)</value>
- </param>
- <param>
- <key>_rotation</key>
- <value>0</value>
- </param>
- </block>
- <block>
<key>random_source_x</key>
<param>
<key>id</key>
@@ -299,146 +272,10 @@
</param>
</block>
<block>
- <key>gr_chunks_to_symbols_xx</key>
+ <key>blocks_sub_xx</key>
<param>
<key>id</key>
- <value>gr_chunks_to_symbols_xx_1</value>
- </param>
- <param>
- <key>_enabled</key>
- <value>True</value>
- </param>
- <param>
- <key>in_type</key>
- <value>short</value>
- </param>
- <param>
- <key>out_type</key>
- <value>complex</value>
- </param>
- <param>
- <key>symbol_table</key>
- <value>1,1j,-1j,-1</value>
- </param>
- <param>
- <key>dimension</key>
- <value>1</value>
- </param>
- <param>
- <key>num_ports</key>
- <value>1</value>
- </param>
- <param>
- <key>_coordinate</key>
- <value>(660, 311)</value>
- </param>
- <param>
- <key>_rotation</key>
- <value>0</value>
- </param>
- </block>
- <block>
- <key>gr_multiply_const_vxx</key>
- <param>
- <key>id</key>
- <value>gr_multiply_const_vxx_1</value>
- </param>
- <param>
- <key>_enabled</key>
- <value>True</value>
- </param>
- <param>
- <key>type</key>
- <value>complex</value>
- </param>
- <param>
- <key>const</key>
- <value>(1-alpha)**0.5</value>
- </param>
- <param>
- <key>vlen</key>
- <value>1</value>
- </param>
- <param>
- <key>_coordinate</key>
- <value>(994, 319)</value>
- </param>
- <param>
- <key>_rotation</key>
- <value>0</value>
- </param>
- </block>
- <block>
- <key>gr_add_xx</key>
- <param>
- <key>id</key>
- <value>gr_add_xx_0</value>
- </param>
- <param>
- <key>_enabled</key>
- <value>True</value>
- </param>
- <param>
- <key>type</key>
- <value>complex</value>
- </param>
- <param>
- <key>num_inputs</key>
- <value>2</value>
- </param>
- <param>
- <key>vlen</key>
- <value>1</value>
- </param>
- <param>
- <key>_coordinate</key>
- <value>(1224, 244)</value>
- </param>
- <param>
- <key>_rotation</key>
- <value>0</value>
- </param>
- </block>
- <block>
- <key>gr_noise_source_x</key>
- <param>
- <key>id</key>
- <value>gr_noise_source_x_0</value>
- </param>
- <param>
- <key>_enabled</key>
- <value>True</value>
- </param>
- <param>
- <key>type</key>
- <value>complex</value>
- </param>
- <param>
- <key>noise_type</key>
- <value>gr.GR_GAUSSIAN</value>
- </param>
- <param>
- <key>amp</key>
- <value>noisevar</value>
- </param>
- <param>
- <key>seed</key>
- <value>42</value>
- </param>
- <param>
- <key>_coordinate</key>
- <value>(1146, 369)</value>
- </param>
- <param>
- <key>_rotation</key>
- <value>0</value>
- </param>
- </block>
- <block>
- <key>gr_sub_xx</key>
- <param>
- <key>id</key>
- <value>gr_sub_xx_0</value>
+ <value>blocks_sub_xx_0</value>
</param>
<param>
<key>_enabled</key>
@@ -466,10 +303,10 @@
</param>
</block>
<block>
- <key>gr_multiply_xx</key>
+ <key>blocks_multiply_xx</key>
<param>
<key>id</key>
- <value>gr_multiply_xx_0</value>
+ <value>blocks_multiply_xx_0</value>
</param>
<param>
<key>_enabled</key>
@@ -497,16 +334,24 @@
</param>
</block>
<block>
- <key>gr_short_to_float</key>
+ <key>blocks_short_to_float</key>
<param>
<key>id</key>
- <value>gr_short_to_float_0</value>
+ <value>blocks_short_to_float_0</value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
+ <key>vlen</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>scale</key>
+ <value>1</value>
+ </param>
+ <param>
<key>_coordinate</key>
<value>(994, 545)</value>
</param>
@@ -516,10 +361,10 @@
</param>
</block>
<block>
- <key>gr_sub_xx</key>
+ <key>blocks_sub_xx</key>
<param>
<key>id</key>
- <value>gr_sub_xx_3</value>
+ <value>blocks_sub_xx_3</value>
</param>
<param>
<key>_enabled</key>
@@ -547,10 +392,10 @@
</param>
</block>
<block>
- <key>gr_multiply_xx</key>
+ <key>blocks_multiply_xx</key>
<param>
<key>id</key>
- <value>gr_multiply_xx_1</value>
+ <value>blocks_multiply_xx_1</value>
</param>
<param>
<key>_enabled</key>
@@ -578,88 +423,26 @@
</param>
</block>
<block>
- <key>gr_short_to_float</key>
+ <key>blocks_short_to_float</key>
<param>
<key>id</key>
- <value>gr_short_to_float_2</value>
+ <value>blocks_short_to_float_2</value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
- <key>_coordinate</key>
- <value>(1005, 798)</value>
- </param>
- <param>
- <key>_rotation</key>
- <value>0</value>
- </param>
- </block>
- <block>
- <key>gr_chunks_to_symbols_xx</key>
- <param>
- <key>id</key>
- <value>gr_chunks_to_symbols_xx_2</value>
- </param>
- <param>
- <key>_enabled</key>
- <value>True</value>
- </param>
- <param>
- <key>in_type</key>
- <value>short</value>
- </param>
- <param>
- <key>out_type</key>
- <value>complex</value>
- </param>
- <param>
- <key>symbol_table</key>
- <value>1,1j,-1j,-1</value>
- </param>
- <param>
- <key>dimension</key>
- <value>1</value>
- </param>
- <param>
- <key>num_ports</key>
+ <key>vlen</key>
<value>1</value>
</param>
<param>
- <key>_coordinate</key>
- <value>(405, 998)</value>
- </param>
- <param>
- <key>_rotation</key>
- <value>0</value>
- </param>
- </block>
- <block>
- <key>gr_multiply_const_vxx</key>
- <param>
- <key>id</key>
- <value>gr_multiply_const_vxx_2</value>
- </param>
- <param>
- <key>_enabled</key>
- <value>True</value>
- </param>
- <param>
- <key>type</key>
- <value>complex</value>
- </param>
- <param>
- <key>const</key>
- <value>alpha**0.5</value>
- </param>
- <param>
- <key>vlen</key>
+ <key>scale</key>
<value>1</value>
</param>
<param>
<key>_coordinate</key>
- <value>(710, 1008)</value>
+ <value>(1005, 798)</value>
</param>
<param>
<key>_rotation</key>
@@ -667,10 +450,10 @@
</param>
</block>
<block>
- <key>gr_sub_xx</key>
+ <key>blocks_sub_xx</key>
<param>
<key>id</key>
- <value>gr_sub_xx_2</value>
+ <value>blocks_sub_xx_2</value>
</param>
<param>
<key>_enabled</key>
@@ -698,10 +481,10 @@
</param>
</block>
<block>
- <key>gr_sub_xx</key>
+ <key>blocks_sub_xx</key>
<param>
<key>id</key>
- <value>gr_sub_xx_1</value>
+ <value>blocks_sub_xx_1</value>
</param>
<param>
<key>_enabled</key>
@@ -729,10 +512,10 @@
</param>
</block>
<block>
- <key>gr_multiply_xx</key>
+ <key>blocks_multiply_xx</key>
<param>
<key>id</key>
- <value>gr_multiply_xx_2</value>
+ <value>blocks_multiply_xx_2</value>
</param>
<param>
<key>_enabled</key>
@@ -760,88 +543,26 @@
</param>
</block>
<block>
- <key>gr_short_to_float</key>
+ <key>blocks_short_to_float</key>
<param>
<key>id</key>
- <value>gr_short_to_float_1</value>
+ <value>blocks_short_to_float_1</value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
- <key>_coordinate</key>
- <value>(1009, 1156)</value>
- </param>
- <param>
- <key>_rotation</key>
- <value>0</value>
- </param>
- </block>
- <block>
- <key>gr_chunks_to_symbols_xx</key>
- <param>
- <key>id</key>
- <value>gr_chunks_to_symbols_xx_2_0</value>
- </param>
- <param>
- <key>_enabled</key>
- <value>True</value>
- </param>
- <param>
- <key>in_type</key>
- <value>short</value>
- </param>
- <param>
- <key>out_type</key>
- <value>complex</value>
- </param>
- <param>
- <key>symbol_table</key>
- <value>1,1j,-1j,-1</value>
- </param>
- <param>
- <key>dimension</key>
- <value>1</value>
- </param>
- <param>
- <key>num_ports</key>
+ <key>vlen</key>
<value>1</value>
</param>
<param>
- <key>_coordinate</key>
- <value>(420, 1368)</value>
- </param>
- <param>
- <key>_rotation</key>
- <value>0</value>
- </param>
- </block>
- <block>
- <key>gr_multiply_const_vxx</key>
- <param>
- <key>id</key>
- <value>gr_multiply_const_vxx_2_0</value>
- </param>
- <param>
- <key>_enabled</key>
- <value>True</value>
- </param>
- <param>
- <key>type</key>
- <value>complex</value>
- </param>
- <param>
- <key>const</key>
- <value>(1-alpha)**0.5</value>
- </param>
- <param>
- <key>vlen</key>
+ <key>scale</key>
<value>1</value>
</param>
<param>
<key>_coordinate</key>
- <value>(733, 1374)</value>
+ <value>(1009, 1156)</value>
</param>
<param>
<key>_rotation</key>
@@ -849,10 +570,10 @@
</param>
</block>
<block>
- <key>gr_sub_xx</key>
+ <key>blocks_sub_xx</key>
<param>
<key>id</key>
- <value>gr_sub_xx_2_0</value>
+ <value>blocks_sub_xx_2_0</value>
</param>
<param>
<key>_enabled</key>
@@ -880,10 +601,10 @@
</param>
</block>
<block>
- <key>gr_sub_xx</key>
+ <key>blocks_sub_xx</key>
<param>
<key>id</key>
- <value>gr_sub_xx_1_0</value>
+ <value>blocks_sub_xx_1_0</value>
</param>
<param>
<key>_enabled</key>
@@ -911,10 +632,10 @@
</param>
</block>
<block>
- <key>gr_multiply_xx</key>
+ <key>blocks_multiply_xx</key>
<param>
<key>id</key>
- <value>gr_multiply_xx_2_0</value>
+ <value>blocks_multiply_xx_2_0</value>
</param>
<param>
<key>_enabled</key>
@@ -942,49 +663,26 @@
</param>
</block>
<block>
- <key>gr_short_to_float</key>
- <param>
- <key>id</key>
- <value>gr_short_to_float_1_0</value>
- </param>
- <param>
- <key>_enabled</key>
- <value>True</value>
- </param>
- <param>
- <key>_coordinate</key>
- <value>(1010, 1551)</value>
- </param>
- <param>
- <key>_rotation</key>
- <value>0</value>
- </param>
- </block>
- <block>
- <key>trellis_encoder_xx</key>
+ <key>blocks_short_to_float</key>
<param>
<key>id</key>
- <value>trellis_encoder_xx_1</value>
+ <value>blocks_short_to_float_1_0</value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
- <key>type</key>
- <value>ss</value>
- </param>
- <param>
- <key>fsm_args</key>
- <value>prefix+"gr-trellis/src/examples/fsm_files/awgn1o2_16.fsm"</value>
+ <key>vlen</key>
+ <value>1</value>
</param>
<param>
- <key>init_state</key>
- <value>0</value>
+ <key>scale</key>
+ <value>1</value>
</param>
<param>
<key>_coordinate</key>
- <value>(336, 311)</value>
+ <value>(1010, 1551)</value>
</param>
<param>
<key>_rotation</key>
@@ -1035,7 +733,7 @@
</param>
<param>
<key>metric_type</key>
- <value>trellis.TRELLIS_EUCLIDEAN</value>
+ <value>digital.TRELLIS_EUCLIDEAN</value>
</param>
<param>
<key>_coordinate</key>
@@ -1090,7 +788,7 @@
</param>
<param>
<key>metric_type</key>
- <value>trellis.TRELLIS_EUCLIDEAN</value>
+ <value>digital.TRELLIS_EUCLIDEAN</value>
</param>
<param>
<key>_coordinate</key>
@@ -1102,37 +800,6 @@
</param>
</block>
<block>
- <key>trellis_encoder_xx</key>
- <param>
- <key>id</key>
- <value>trellis_encoder_xx_2</value>
- </param>
- <param>
- <key>_enabled</key>
- <value>True</value>
- </param>
- <param>
- <key>type</key>
- <value>ss</value>
- </param>
- <param>
- <key>fsm_args</key>
- <value>prefix+"gr-trellis/src/examples/fsm_files/awgn1o2_16.fsm"</value>
- </param>
- <param>
- <key>init_state</key>
- <value>0</value>
- </param>
- <param>
- <key>_coordinate</key>
- <value>(89, 998)</value>
- </param>
- <param>
- <key>_rotation</key>
- <value>0</value>
- </param>
- </block>
- <block>
<key>trellis_viterbi_combined_xx</key>
<param>
<key>id</key>
@@ -1176,7 +843,7 @@
</param>
<param>
<key>metric_type</key>
- <value>trellis.TRELLIS_EUCLIDEAN</value>
+ <value>digital.TRELLIS_EUCLIDEAN</value>
</param>
<param>
<key>_coordinate</key>
@@ -1188,37 +855,6 @@
</param>
</block>
<block>
- <key>trellis_encoder_xx</key>
- <param>
- <key>id</key>
- <value>trellis_encoder_xx_2_0</value>
- </param>
- <param>
- <key>_enabled</key>
- <value>True</value>
- </param>
- <param>
- <key>type</key>
- <value>ss</value>
- </param>
- <param>
- <key>fsm_args</key>
- <value>prefix+"gr-trellis/src/examples/fsm_files/awgn1o2_16.fsm"</value>
- </param>
- <param>
- <key>init_state</key>
- <value>0</value>
- </param>
- <param>
- <key>_coordinate</key>
- <value>(105, 1367)</value>
- </param>
- <param>
- <key>_rotation</key>
- <value>0</value>
- </param>
- </block>
- <block>
<key>trellis_viterbi_combined_xx</key>
<param>
<key>id</key>
@@ -1262,7 +898,7 @@
</param>
<param>
<key>metric_type</key>
- <value>trellis.TRELLIS_EUCLIDEAN</value>
+ <value>digital.TRELLIS_EUCLIDEAN</value>
</param>
<param>
<key>_coordinate</key>
@@ -1274,37 +910,6 @@
</param>
</block>
<block>
- <key>gr_add_xx</key>
- <param>
- <key>id</key>
- <value>gr_add_xx_1</value>
- </param>
- <param>
- <key>_enabled</key>
- <value>True</value>
- </param>
- <param>
- <key>type</key>
- <value>complex</value>
- </param>
- <param>
- <key>num_inputs</key>
- <value>2</value>
- </param>
- <param>
- <key>vlen</key>
- <value>1</value>
- </param>
- <param>
- <key>_coordinate</key>
- <value>(1400, 262)</value>
- </param>
- <param>
- <key>_rotation</key>
- <value>0</value>
- </param>
- </block>
- <block>
<key>wxgui_scopesink2</key>
<param>
<key>id</key>
@@ -1434,76 +1039,6 @@
</param>
</block>
<block>
- <key>gr_throttle</key>
- <param>
- <key>id</key>
- <value>gr_throttle_0</value>
- </param>
- <param>
- <key>_enabled</key>
- <value>True</value>
- </param>
- <param>
- <key>type</key>
- <value>short</value>
- </param>
- <param>
- <key>samples_per_second</key>
- <value>R</value>
- </param>
- <param>
- <key>vlen</key>
- <value>1</value>
- </param>
- <param>
- <key>_coordinate</key>
- <value>(534, 149)</value>
- </param>
- <param>
- <key>_rotation</key>
- <value>0</value>
- </param>
- </block>
- <block>
- <key>gr_chunks_to_symbols_xx</key>
- <param>
- <key>id</key>
- <value>gr_chunks_to_symbols_xx_0</value>
- </param>
- <param>
- <key>_enabled</key>
- <value>True</value>
- </param>
- <param>
- <key>in_type</key>
- <value>short</value>
- </param>
- <param>
- <key>out_type</key>
- <value>complex</value>
- </param>
- <param>
- <key>symbol_table</key>
- <value>1,1j,-1j,-1</value>
- </param>
- <param>
- <key>dimension</key>
- <value>1</value>
- </param>
- <param>
- <key>num_ports</key>
- <value>1</value>
- </param>
- <param>
- <key>_coordinate</key>
- <value>(682, 186)</value>
- </param>
- <param>
- <key>_rotation</key>
- <value>0</value>
- </param>
- </block>
- <block>
<key>variable</key>
<param>
<key>id</key>
@@ -1874,6 +1409,507 @@
<value>0</value>
</param>
</block>
+ <block>
+ <key>blocks_add_xx</key>
+ <param>
+ <key>id</key>
+ <value>blocks_add_xx_1</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>complex</value>
+ </param>
+ <param>
+ <key>num_inputs</key>
+ <value>2</value>
+ </param>
+ <param>
+ <key>vlen</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(1400, 262)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>blocks_add_xx</key>
+ <param>
+ <key>id</key>
+ <value>blocks_add_xx_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>complex</value>
+ </param>
+ <param>
+ <key>num_inputs</key>
+ <value>2</value>
+ </param>
+ <param>
+ <key>vlen</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(1224, 245)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>analog_noise_source_x</key>
+ <param>
+ <key>id</key>
+ <value>analog_noise_source_x_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>complex</value>
+ </param>
+ <param>
+ <key>noise_type</key>
+ <value>analog.GR_GAUSSIAN</value>
+ </param>
+ <param>
+ <key>amp</key>
+ <value>noisevar</value>
+ </param>
+ <param>
+ <key>seed</key>
+ <value>-42</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(1178, 321)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>gr_throttle</key>
+ <param>
+ <key>id</key>
+ <value>gr_throttle_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>short</value>
+ </param>
+ <param>
+ <key>samples_per_second</key>
+ <value>R</value>
+ </param>
+ <param>
+ <key>vlen</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(579, 143)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>blocks_multiply_const_vxx</key>
+ <param>
+ <key>id</key>
+ <value>blocks_multiply_const_vxx_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>complex</value>
+ </param>
+ <param>
+ <key>const</key>
+ <value>alpha**0.5</value>
+ </param>
+ <param>
+ <key>vlen</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(988, 196)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>digital_chunks_to_symbols_xx</key>
+ <param>
+ <key>id</key>
+ <value>digital_chunks_to_symbols_xx_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>in_type</key>
+ <value>short</value>
+ </param>
+ <param>
+ <key>out_type</key>
+ <value>complex</value>
+ </param>
+ <param>
+ <key>symbol_table</key>
+ <value>1,1j,-1j,-1</value>
+ </param>
+ <param>
+ <key>dimension</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>num_ports</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(703, 211)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>blocks_multiply_const_vxx</key>
+ <param>
+ <key>id</key>
+ <value>blocks_multiply_const_vxx_1</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>complex</value>
+ </param>
+ <param>
+ <key>const</key>
+ <value>(1-alpha)**0.5</value>
+ </param>
+ <param>
+ <key>vlen</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(994, 319)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>trellis_encoder_xx</key>
+ <param>
+ <key>id</key>
+ <value>trellis_encoder_xx_1</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>ss</value>
+ </param>
+ <param>
+ <key>fsm_args</key>
+ <value>prefix+"gr-trellis/src/examples/fsm_files/awgn1o2_16.fsm"</value>
+ </param>
+ <param>
+ <key>init_state</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(336, 311)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>digital_chunks_to_symbols_xx</key>
+ <param>
+ <key>id</key>
+ <value>digital_chunks_to_symbols_xx_0_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>in_type</key>
+ <value>short</value>
+ </param>
+ <param>
+ <key>out_type</key>
+ <value>complex</value>
+ </param>
+ <param>
+ <key>symbol_table</key>
+ <value>1,1j,-1j,-1</value>
+ </param>
+ <param>
+ <key>dimension</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>num_ports</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(703, 311)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>digital_chunks_to_symbols_xx</key>
+ <param>
+ <key>id</key>
+ <value>digital_chunks_to_symbols_xx_0_0_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>in_type</key>
+ <value>short</value>
+ </param>
+ <param>
+ <key>out_type</key>
+ <value>complex</value>
+ </param>
+ <param>
+ <key>symbol_table</key>
+ <value>1,1j,-1j,-1</value>
+ </param>
+ <param>
+ <key>dimension</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>num_ports</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(418, 1000)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>blocks_multiply_const_vxx</key>
+ <param>
+ <key>id</key>
+ <value>blocks_multiply_const_vxx_2</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>complex</value>
+ </param>
+ <param>
+ <key>const</key>
+ <value>alpha**0.5</value>
+ </param>
+ <param>
+ <key>vlen</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(710, 1008)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>trellis_encoder_xx</key>
+ <param>
+ <key>id</key>
+ <value>trellis_encoder_xx_2</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>ss</value>
+ </param>
+ <param>
+ <key>fsm_args</key>
+ <value>prefix+"gr-trellis/src/examples/fsm_files/awgn1o2_16.fsm"</value>
+ </param>
+ <param>
+ <key>init_state</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(89, 1000)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>blocks_multiply_const_vxx</key>
+ <param>
+ <key>id</key>
+ <value>blocks_multiply_const_vxx_2_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>complex</value>
+ </param>
+ <param>
+ <key>const</key>
+ <value>(1-alpha)**0.5</value>
+ </param>
+ <param>
+ <key>vlen</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(733, 1374)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>trellis_encoder_xx</key>
+ <param>
+ <key>id</key>
+ <value>trellis_encoder_xx_2_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>ss</value>
+ </param>
+ <param>
+ <key>fsm_args</key>
+ <value>prefix+"gr-trellis/src/examples/fsm_files/awgn1o2_16.fsm"</value>
+ </param>
+ <param>
+ <key>init_state</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(103, 1366)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>digital_chunks_to_symbols_xx</key>
+ <param>
+ <key>id</key>
+ <value>digital_chunks_to_symbols_xx_0_0_1</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>in_type</key>
+ <value>short</value>
+ </param>
+ <param>
+ <key>out_type</key>
+ <value>complex</value>
+ </param>
+ <param>
+ <key>symbol_table</key>
+ <value>1,1j,-1j,-1</value>
+ </param>
+ <param>
+ <key>dimension</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>num_ports</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(420, 1366)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
<connection>
<source_block_id>random_source_x_1</source_block_id>
<sink_block_id>trellis_encoder_xx_1</sink_block_id>
@@ -1881,74 +1917,50 @@
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>trellis_encoder_xx_1</source_block_id>
- <sink_block_id>gr_chunks_to_symbols_xx_1</sink_block_id>
- <source_key>0</source_key>
- <sink_key>0</sink_key>
- </connection>
- <connection>
- <source_block_id>gr_chunks_to_symbols_xx_0</source_block_id>
- <sink_block_id>gr_multiply_const_vxx_0</sink_block_id>
- <source_key>0</source_key>
- <sink_key>0</sink_key>
- </connection>
- <connection>
- <source_block_id>gr_multiply_const_vxx_0</source_block_id>
- <sink_block_id>gr_add_xx_0</sink_block_id>
- <source_key>0</source_key>
- <sink_key>0</sink_key>
- </connection>
- <connection>
- <source_block_id>gr_add_xx_0</source_block_id>
- <sink_block_id>gr_add_xx_1</sink_block_id>
+ <source_block_id>blocks_multiply_const_vxx_0</source_block_id>
+ <sink_block_id>blocks_add_xx_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>gr_noise_source_x_0</source_block_id>
- <sink_block_id>gr_add_xx_1</sink_block_id>
- <source_key>0</source_key>
- <sink_key>1</sink_key>
- </connection>
- <connection>
- <source_block_id>gr_chunks_to_symbols_xx_1</source_block_id>
- <sink_block_id>gr_multiply_const_vxx_1</sink_block_id>
+ <source_block_id>blocks_add_xx_0</source_block_id>
+ <sink_block_id>blocks_add_xx_1</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>gr_multiply_const_vxx_1</source_block_id>
- <sink_block_id>gr_add_xx_0</sink_block_id>
+ <source_block_id>blocks_multiply_const_vxx_1</source_block_id>
+ <sink_block_id>blocks_add_xx_0</sink_block_id>
<source_key>0</source_key>
<sink_key>1</sink_key>
</connection>
<connection>
- <source_block_id>gr_sub_xx_0</source_block_id>
- <sink_block_id>gr_multiply_xx_0</sink_block_id>
+ <source_block_id>blocks_sub_xx_0</source_block_id>
+ <sink_block_id>blocks_multiply_xx_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>gr_sub_xx_0</source_block_id>
- <sink_block_id>gr_multiply_xx_0</sink_block_id>
+ <source_block_id>blocks_sub_xx_0</source_block_id>
+ <sink_block_id>blocks_multiply_xx_0</sink_block_id>
<source_key>0</source_key>
<sink_key>1</sink_key>
</connection>
<connection>
- <source_block_id>gr_multiply_xx_0</source_block_id>
- <sink_block_id>gr_short_to_float_0</sink_block_id>
+ <source_block_id>blocks_multiply_xx_0</source_block_id>
+ <sink_block_id>blocks_short_to_float_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>gr_short_to_float_0</source_block_id>
+ <source_block_id>blocks_short_to_float_0</source_block_id>
<sink_block_id>wxgui_numbersink2_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>gr_multiply_xx_2</source_block_id>
- <sink_block_id>gr_short_to_float_1</sink_block_id>
+ <source_block_id>blocks_multiply_xx_2</source_block_id>
+ <sink_block_id>blocks_short_to_float_1</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
@@ -1959,74 +1971,62 @@
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>gr_add_xx_1</source_block_id>
+ <source_block_id>blocks_add_xx_1</source_block_id>
<sink_block_id>trellis_viterbi_combined_xx_1</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
<source_block_id>random_source_x_0</source_block_id>
- <sink_block_id>gr_sub_xx_0</sink_block_id>
+ <sink_block_id>blocks_sub_xx_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
<source_block_id>trellis_viterbi_combined_xx_1</source_block_id>
- <sink_block_id>gr_sub_xx_0</sink_block_id>
+ <sink_block_id>blocks_sub_xx_0</sink_block_id>
<source_key>0</source_key>
<sink_key>1</sink_key>
</connection>
<connection>
<source_block_id>trellis_viterbi_combined_xx_0</source_block_id>
- <sink_block_id>gr_sub_xx_1</sink_block_id>
+ <sink_block_id>blocks_sub_xx_1</sink_block_id>
<source_key>0</source_key>
<sink_key>1</sink_key>
</connection>
<connection>
<source_block_id>random_source_x_1</source_block_id>
- <sink_block_id>gr_sub_xx_1</sink_block_id>
+ <sink_block_id>blocks_sub_xx_1</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>gr_sub_xx_1</source_block_id>
- <sink_block_id>gr_multiply_xx_2</sink_block_id>
+ <source_block_id>blocks_sub_xx_1</source_block_id>
+ <sink_block_id>blocks_multiply_xx_2</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>gr_sub_xx_1</source_block_id>
- <sink_block_id>gr_multiply_xx_2</sink_block_id>
+ <source_block_id>blocks_sub_xx_1</source_block_id>
+ <sink_block_id>blocks_multiply_xx_2</sink_block_id>
<source_key>0</source_key>
<sink_key>1</sink_key>
</connection>
<connection>
- <source_block_id>gr_sub_xx_2</source_block_id>
+ <source_block_id>blocks_sub_xx_2</source_block_id>
<sink_block_id>trellis_viterbi_combined_xx_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>gr_add_xx_1</source_block_id>
- <sink_block_id>gr_sub_xx_2</sink_block_id>
- <source_key>0</source_key>
- <sink_key>0</sink_key>
- </connection>
- <connection>
- <source_block_id>trellis_encoder_xx_2</source_block_id>
- <sink_block_id>gr_chunks_to_symbols_xx_2</sink_block_id>
- <source_key>0</source_key>
- <sink_key>0</sink_key>
- </connection>
- <connection>
- <source_block_id>gr_chunks_to_symbols_xx_2</source_block_id>
- <sink_block_id>gr_multiply_const_vxx_2</sink_block_id>
+ <source_block_id>blocks_add_xx_1</source_block_id>
+ <sink_block_id>blocks_sub_xx_2</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>gr_multiply_const_vxx_2</source_block_id>
- <sink_block_id>gr_sub_xx_2</sink_block_id>
+ <source_block_id>blocks_multiply_const_vxx_2</source_block_id>
+ <sink_block_id>blocks_sub_xx_2</sink_block_id>
<source_key>0</source_key>
<sink_key>1</sink_key>
</connection>
@@ -2037,127 +2037,115 @@
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>gr_multiply_xx_1</source_block_id>
- <sink_block_id>gr_short_to_float_2</sink_block_id>
+ <source_block_id>blocks_multiply_xx_1</source_block_id>
+ <sink_block_id>blocks_short_to_float_2</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>gr_short_to_float_2</source_block_id>
+ <source_block_id>blocks_short_to_float_2</source_block_id>
<sink_block_id>wxgui_numbersink2_2</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
<source_block_id>trellis_viterbi_combined_xx_2</source_block_id>
- <sink_block_id>gr_sub_xx_3</sink_block_id>
+ <sink_block_id>blocks_sub_xx_3</sink_block_id>
<source_key>0</source_key>
<sink_key>1</sink_key>
</connection>
<connection>
- <source_block_id>gr_sub_xx_3</source_block_id>
- <sink_block_id>gr_multiply_xx_1</sink_block_id>
+ <source_block_id>blocks_sub_xx_3</source_block_id>
+ <sink_block_id>blocks_multiply_xx_1</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>gr_sub_xx_3</source_block_id>
- <sink_block_id>gr_multiply_xx_1</sink_block_id>
+ <source_block_id>blocks_sub_xx_3</source_block_id>
+ <sink_block_id>blocks_multiply_xx_1</sink_block_id>
<source_key>0</source_key>
<sink_key>1</sink_key>
</connection>
<connection>
- <source_block_id>gr_add_xx_1</source_block_id>
+ <source_block_id>blocks_add_xx_1</source_block_id>
<sink_block_id>trellis_viterbi_combined_xx_2</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
<source_block_id>random_source_x_1</source_block_id>
- <sink_block_id>gr_sub_xx_3</sink_block_id>
+ <sink_block_id>blocks_sub_xx_3</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>gr_short_to_float_1</source_block_id>
+ <source_block_id>blocks_short_to_float_1</source_block_id>
<sink_block_id>wxgui_numbersink2_3</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>trellis_encoder_xx_2_0</source_block_id>
- <sink_block_id>gr_chunks_to_symbols_xx_2_0</sink_block_id>
- <source_key>0</source_key>
- <sink_key>0</sink_key>
- </connection>
- <connection>
- <source_block_id>gr_chunks_to_symbols_xx_2_0</source_block_id>
- <sink_block_id>gr_multiply_const_vxx_2_0</sink_block_id>
- <source_key>0</source_key>
- <sink_key>0</sink_key>
- </connection>
- <connection>
<source_block_id>trellis_viterbi_combined_xx_2</source_block_id>
<sink_block_id>trellis_encoder_xx_2_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>gr_multiply_xx_2_0</source_block_id>
- <sink_block_id>gr_short_to_float_1_0</sink_block_id>
+ <source_block_id>blocks_multiply_xx_2_0</source_block_id>
+ <sink_block_id>blocks_short_to_float_1_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
<source_block_id>trellis_viterbi_combined_xx_0_0</source_block_id>
- <sink_block_id>gr_sub_xx_1_0</sink_block_id>
+ <sink_block_id>blocks_sub_xx_1_0</sink_block_id>
<source_key>0</source_key>
<sink_key>1</sink_key>
</connection>
<connection>
- <source_block_id>gr_sub_xx_1_0</source_block_id>
- <sink_block_id>gr_multiply_xx_2_0</sink_block_id>
+ <source_block_id>blocks_sub_xx_1_0</source_block_id>
+ <sink_block_id>blocks_multiply_xx_2_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>gr_sub_xx_1_0</source_block_id>
- <sink_block_id>gr_multiply_xx_2_0</sink_block_id>
+ <source_block_id>blocks_sub_xx_1_0</source_block_id>
+ <sink_block_id>blocks_multiply_xx_2_0</sink_block_id>
<source_key>0</source_key>
<sink_key>1</sink_key>
</connection>
<connection>
- <source_block_id>gr_sub_xx_2_0</source_block_id>
+ <source_block_id>blocks_sub_xx_2_0</source_block_id>
<sink_block_id>trellis_viterbi_combined_xx_0_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>gr_short_to_float_1_0</source_block_id>
+ <source_block_id>blocks_short_to_float_1_0</source_block_id>
<sink_block_id>wxgui_numbersink2_3_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>gr_add_xx_1</source_block_id>
- <sink_block_id>gr_sub_xx_2_0</sink_block_id>
+ <source_block_id>blocks_add_xx_1</source_block_id>
+ <sink_block_id>blocks_sub_xx_2_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
<source_block_id>random_source_x_0</source_block_id>
- <sink_block_id>gr_sub_xx_1_0</sink_block_id>
+ <sink_block_id>blocks_sub_xx_1_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>gr_multiply_const_vxx_2_0</source_block_id>
- <sink_block_id>gr_sub_xx_2_0</sink_block_id>
+ <source_block_id>blocks_multiply_const_vxx_2_0</source_block_id>
+ <sink_block_id>blocks_sub_xx_2_0</sink_block_id>
<source_key>0</source_key>
<sink_key>1</sink_key>
</connection>
<connection>
- <source_block_id>gr_add_xx_1</source_block_id>
+ <source_block_id>blocks_add_xx_1</source_block_id>
<sink_block_id>wxgui_scopesink2_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
@@ -2169,8 +2157,56 @@
<sink_key>0</sink_key>
</connection>
<connection>
+ <source_block_id>analog_noise_source_x_0</source_block_id>
+ <sink_block_id>blocks_add_xx_1</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>1</sink_key>
+ </connection>
+ <connection>
<source_block_id>gr_throttle_0</source_block_id>
- <sink_block_id>gr_chunks_to_symbols_xx_0</sink_block_id>
+ <sink_block_id>digital_chunks_to_symbols_xx_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>digital_chunks_to_symbols_xx_0</source_block_id>
+ <sink_block_id>blocks_multiply_const_vxx_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>digital_chunks_to_symbols_xx_0_0</source_block_id>
+ <sink_block_id>blocks_multiply_const_vxx_1</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>trellis_encoder_xx_1</source_block_id>
+ <sink_block_id>digital_chunks_to_symbols_xx_0_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>trellis_encoder_xx_2</source_block_id>
+ <sink_block_id>digital_chunks_to_symbols_xx_0_0_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>digital_chunks_to_symbols_xx_0_0_0</source_block_id>
+ <sink_block_id>blocks_multiply_const_vxx_2</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>trellis_encoder_xx_2_0</source_block_id>
+ <sink_block_id>digital_chunks_to_symbols_xx_0_0_1</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>digital_chunks_to_symbols_xx_0_0_1</source_block_id>
+ <sink_block_id>blocks_multiply_const_vxx_2_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
diff --git a/gr-trellis/src/examples/grc/pccc.grc b/gr-trellis/examples/grc/pccc.grc
index c3111c3211..a9f65cf856 100644
--- a/gr-trellis/src/examples/grc/pccc.grc
+++ b/gr-trellis/examples/grc/pccc.grc
@@ -1,6 +1,6 @@
<?xml version='1.0' encoding='ASCII'?>
<flow_graph>
- <timestamp>Thu Sep 1 12:53:13 2011</timestamp>
+ <timestamp>Thu Dec 27 13:49:53 2012</timestamp>
<block>
<key>options</key>
<param>
@@ -44,6 +44,10 @@
<value>True</value>
</param>
<param>
+ <key>max_nouts</key>
+ <value>0</value>
+ </param>
+ <param>
<key>realtime_scheduling</key>
<value></value>
</param>
@@ -181,10 +185,10 @@
</param>
</block>
<block>
- <key>gr_multiply_xx</key>
+ <key>blocks_multiply_xx</key>
<param>
<key>id</key>
- <value>gr_multiply_xx_2_0</value>
+ <value>blocks_multiply_xx_2_0</value>
</param>
<param>
<key>_enabled</key>
@@ -212,16 +216,24 @@
</param>
</block>
<block>
- <key>gr_short_to_float</key>
+ <key>blocks_short_to_float</key>
<param>
<key>id</key>
- <value>gr_short_to_float_1_0</value>
+ <value>blocks_short_to_float_1_0</value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
+ <key>vlen</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>scale</key>
+ <value>1</value>
+ </param>
+ <param>
<key>_coordinate</key>
<value>(535, 609)</value>
</param>
@@ -318,41 +330,6 @@
</param>
</block>
<block>
- <key>gr_noise_source_x</key>
- <param>
- <key>id</key>
- <value>gr_noise_source_x_0</value>
- </param>
- <param>
- <key>_enabled</key>
- <value>True</value>
- </param>
- <param>
- <key>type</key>
- <value>float</value>
- </param>
- <param>
- <key>noise_type</key>
- <value>gr.GR_GAUSSIAN</value>
- </param>
- <param>
- <key>amp</key>
- <value>noisevar</value>
- </param>
- <param>
- <key>seed</key>
- <value>42</value>
- </param>
- <param>
- <key>_coordinate</key>
- <value>(672, 290)</value>
- </param>
- <param>
- <key>_rotation</key>
- <value>0</value>
- </param>
- </block>
- <block>
<key>wxgui_scopesink2</key>
<param>
<key>id</key>
@@ -467,10 +444,10 @@
</param>
</block>
<block>
- <key>gr_throttle</key>
+ <key>trellis_pccc_encoder_xx</key>
<param>
<key>id</key>
- <value>gr_throttle_0</value>
+ <value>trellis_pccc_encoder_xx_0</value>
</param>
<param>
<key>_enabled</key>
@@ -478,58 +455,58 @@
</param>
<param>
<key>type</key>
- <value>short</value>
+ <value>ss</value>
</param>
<param>
- <key>samples_per_second</key>
- <value>R</value>
+ <key>o_fsm_args</key>
+ <value>prefix+"gr-trellis/src/examples/fsm_files/awgn1o2_4.fsm"</value>
</param>
<param>
- <key>vlen</key>
- <value>1</value>
+ <key>o_init_state</key>
+ <value>0</value>
</param>
<param>
- <key>_coordinate</key>
- <value>(517, 103)</value>
+ <key>i_fsm_args</key>
+ <value>prefix+"gr-trellis/src/examples/fsm_files/awgn1o2_4.fsm"</value>
</param>
<param>
- <key>_rotation</key>
+ <key>i_init_state</key>
<value>0</value>
</param>
- </block>
- <block>
- <key>gr_chunks_to_symbols_xx</key>
<param>
- <key>id</key>
- <value>gr_chunks_to_symbols_xx_0</value>
+ <key>interleaver_args</key>
+ <value>trellis.interleaver(block,666)</value>
</param>
<param>
- <key>_enabled</key>
- <value>True</value>
+ <key>bl</key>
+ <value>block</value>
</param>
<param>
- <key>in_type</key>
- <value>short</value>
+ <key>_coordinate</key>
+ <value>(236, 147)</value>
</param>
<param>
- <key>out_type</key>
- <value>float</value>
+ <key>_rotation</key>
+ <value>0</value>
</param>
+ </block>
+ <block>
+ <key>variable</key>
<param>
- <key>symbol_table</key>
- <value>-7,0, -5,0, -3,0, -1,0, 1,0, 3,0, 5,0, 7,0, 0,-7,0, -5,0, -3,0, -1,0, 1,0, 3,0, 5,0, 7</value>
+ <key>id</key>
+ <value>R</value>
</param>
<param>
- <key>dimension</key>
- <value>2</value>
+ <key>_enabled</key>
+ <value>True</value>
</param>
<param>
- <key>num_ports</key>
- <value>1</value>
+ <key>value</key>
+ <value>100e3</value>
</param>
<param>
<key>_coordinate</key>
- <value>(551, 184)</value>
+ <value>(482, 17)</value>
</param>
<param>
<key>_rotation</key>
@@ -537,10 +514,10 @@
</param>
</block>
<block>
- <key>trellis_pccc_encoder_xx</key>
+ <key>trellis_pccc_decoder_combined_xx</key>
<param>
<key>id</key>
- <value>trellis_pccc_encoder_xx_0</value>
+ <value>trellis_pccc_decoder_combined_xx_0</value>
</param>
<param>
<key>_enabled</key>
@@ -548,7 +525,11 @@
</param>
<param>
<key>type</key>
- <value>ss</value>
+ <value>f</value>
+ </param>
+ <param>
+ <key>out_type</key>
+ <value>s</value>
</param>
<param>
<key>o_fsm_args</key>
@@ -559,6 +540,10 @@
<value>0</value>
</param>
<param>
+ <key>o_final_state</key>
+ <value>-1</value>
+ </param>
+ <param>
<key>i_fsm_args</key>
<value>prefix+"gr-trellis/src/examples/fsm_files/awgn1o2_4.fsm"</value>
</param>
@@ -567,16 +552,44 @@
<value>0</value>
</param>
<param>
- <key>interleaver_args</key>
+ <key>i_final_state</key>
+ <value>-1</value>
+ </param>
+ <param>
+ <key>interleaver</key>
<value>trellis.interleaver(block,666)</value>
</param>
<param>
- <key>bl</key>
+ <key>block_size</key>
<value>block</value>
</param>
<param>
+ <key>iterations</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>dim</key>
+ <value>2</value>
+ </param>
+ <param>
+ <key>table</key>
+ <value>-7,0, -5,0, -3,0, -1,0, 1,0, 3,0, 5,0, 7,0, 0,-7,0, -5,0, -3,0, -1,0, 1,0, 3,0, 5,0, 7</value>
+ </param>
+ <param>
+ <key>metric_type</key>
+ <value>digital.TRELLIS_EUCLIDEAN</value>
+ </param>
+ <param>
+ <key>siso_type</key>
+ <value>trellis.TRELLIS_MIN_SUM</value>
+ </param>
+ <param>
+ <key>scaling</key>
+ <value>1.0</value>
+ </param>
+ <param>
<key>_coordinate</key>
- <value>(236, 147)</value>
+ <value>(196, 274)</value>
</param>
<param>
<key>_rotation</key>
@@ -584,22 +597,30 @@
</param>
</block>
<block>
- <key>variable</key>
+ <key>blocks_sub_xx</key>
<param>
<key>id</key>
- <value>R</value>
+ <value>blocks_sub_xx_0</value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
- <key>value</key>
- <value>100e3</value>
+ <key>type</key>
+ <value>short</value>
+ </param>
+ <param>
+ <key>vlen</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>num_inputs</key>
+ <value>2</value>
</param>
<param>
<key>_coordinate</key>
- <value>(482, 17)</value>
+ <value>(217, 597)</value>
</param>
<param>
<key>_rotation</key>
@@ -607,10 +628,10 @@
</param>
</block>
<block>
- <key>gr_add_xx</key>
+ <key>analog_noise_source_x</key>
<param>
<key>id</key>
- <value>gr_add_xx_1</value>
+ <value>analog_noise_source_x_0</value>
</param>
<param>
<key>_enabled</key>
@@ -621,16 +642,20 @@
<value>float</value>
</param>
<param>
- <key>num_inputs</key>
- <value>2</value>
+ <key>noise_type</key>
+ <value>analog.GR_GAUSSIAN</value>
</param>
<param>
- <key>vlen</key>
- <value>1</value>
+ <key>amp</key>
+ <value>noisevar</value>
+ </param>
+ <param>
+ <key>seed</key>
+ <value>-42</value>
</param>
<param>
<key>_coordinate</key>
- <value>(951, 256)</value>
+ <value>(584, 259)</value>
</param>
<param>
<key>_rotation</key>
@@ -638,10 +663,10 @@
</param>
</block>
<block>
- <key>trellis_pccc_decoder_combined_xx</key>
+ <key>gr_throttle</key>
<param>
<key>id</key>
- <value>trellis_pccc_decoder_combined_xx_0</value>
+ <value>gr_throttle_0</value>
</param>
<param>
<key>_enabled</key>
@@ -649,71 +674,58 @@
</param>
<param>
<key>type</key>
- <value>f</value>
- </param>
- <param>
- <key>out_type</key>
- <value>s</value>
- </param>
- <param>
- <key>o_fsm_args</key>
- <value>prefix+"gr-trellis/src/examples/fsm_files/awgn1o2_4.fsm"</value>
+ <value>short</value>
</param>
<param>
- <key>o_init_state</key>
- <value>0</value>
+ <key>samples_per_second</key>
+ <value>R</value>
</param>
<param>
- <key>o_final_state</key>
- <value>-1</value>
+ <key>vlen</key>
+ <value>1</value>
</param>
<param>
- <key>i_fsm_args</key>
- <value>prefix+"gr-trellis/src/examples/fsm_files/awgn1o2_4.fsm"</value>
+ <key>_coordinate</key>
+ <value>(517, 103)</value>
</param>
<param>
- <key>i_init_state</key>
+ <key>_rotation</key>
<value>0</value>
</param>
+ </block>
+ <block>
+ <key>digital_chunks_to_symbols_xx</key>
<param>
- <key>i_final_state</key>
- <value>-1</value>
- </param>
- <param>
- <key>interleaver</key>
- <value>trellis.interleaver(block,666)</value>
- </param>
- <param>
- <key>block_size</key>
- <value>block</value>
+ <key>id</key>
+ <value>digital_chunks_to_symbols_xx_0</value>
</param>
<param>
- <key>iterations</key>
- <value>10</value>
+ <key>_enabled</key>
+ <value>True</value>
</param>
<param>
- <key>dim</key>
- <value>2</value>
+ <key>in_type</key>
+ <value>short</value>
</param>
<param>
- <key>table</key>
- <value>-7,0, -5,0, -3,0, -1,0, 1,0, 3,0, 5,0, 7,0, 0,-7,0, -5,0, -3,0, -1,0, 1,0, 3,0, 5,0, 7</value>
+ <key>out_type</key>
+ <value>float</value>
</param>
<param>
- <key>metric_type</key>
- <value>trellis.TRELLIS_EUCLIDEAN</value>
+ <key>symbol_table</key>
+ <value>-7,0,-5,0,-3,0,-1,0,1,0,3,0,5,0,7,0,-7,0,-5,0,-3,0,-1,0,1,0,3,0,5,0,7</value>
</param>
<param>
- <key>siso_type</key>
- <value>trellis.TRELLIS_MIN_SUM</value>
+ <key>dimension</key>
+ <value>2</value>
</param>
<param>
- <key>scaling</key>
- <value>1.0</value>
+ <key>num_ports</key>
+ <value>1</value>
</param>
<param>
<key>_coordinate</key>
- <value>(196, 274)</value>
+ <value>(559, 180)</value>
</param>
<param>
<key>_rotation</key>
@@ -721,10 +733,10 @@
</param>
</block>
<block>
- <key>gr_sub_xx</key>
+ <key>blocks_add_xx</key>
<param>
<key>id</key>
- <value>gr_sub_xx_0</value>
+ <value>blocks_add_xx_1</value>
</param>
<param>
<key>_enabled</key>
@@ -732,19 +744,19 @@
</param>
<param>
<key>type</key>
- <value>short</value>
- </param>
- <param>
- <key>vlen</key>
- <value>1</value>
+ <value>float</value>
</param>
<param>
<key>num_inputs</key>
<value>2</value>
</param>
<param>
+ <key>vlen</key>
+ <value>1</value>
+ </param>
+ <param>
<key>_coordinate</key>
- <value>(217, 597)</value>
+ <value>(951, 256)</value>
</param>
<param>
<key>_rotation</key>
@@ -753,55 +765,37 @@
</block>
<connection>
<source_block_id>random_source_x_0</source_block_id>
- <sink_block_id>gr_sub_xx_0</sink_block_id>
+ <sink_block_id>blocks_sub_xx_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>gr_throttle_0</source_block_id>
- <sink_block_id>gr_chunks_to_symbols_xx_0</sink_block_id>
- <source_key>0</source_key>
- <sink_key>0</sink_key>
- </connection>
- <connection>
- <source_block_id>gr_add_xx_1</source_block_id>
+ <source_block_id>blocks_add_xx_1</source_block_id>
<sink_block_id>wxgui_scopesink2_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>gr_noise_source_x_0</source_block_id>
- <sink_block_id>gr_add_xx_1</sink_block_id>
- <source_key>0</source_key>
- <sink_key>1</sink_key>
- </connection>
- <connection>
- <source_block_id>gr_chunks_to_symbols_xx_0</source_block_id>
- <sink_block_id>gr_add_xx_1</sink_block_id>
+ <source_block_id>blocks_multiply_xx_2_0</source_block_id>
+ <sink_block_id>blocks_short_to_float_1_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>gr_multiply_xx_2_0</source_block_id>
- <sink_block_id>gr_short_to_float_1_0</sink_block_id>
- <source_key>0</source_key>
- <sink_key>0</sink_key>
- </connection>
- <connection>
- <source_block_id>gr_short_to_float_1_0</source_block_id>
+ <source_block_id>blocks_short_to_float_1_0</source_block_id>
<sink_block_id>wxgui_numbersink2_3_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>gr_sub_xx_0</source_block_id>
- <sink_block_id>gr_multiply_xx_2_0</sink_block_id>
+ <source_block_id>blocks_sub_xx_0</source_block_id>
+ <sink_block_id>blocks_multiply_xx_2_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>gr_sub_xx_0</source_block_id>
- <sink_block_id>gr_multiply_xx_2_0</sink_block_id>
+ <source_block_id>blocks_sub_xx_0</source_block_id>
+ <sink_block_id>blocks_multiply_xx_2_0</sink_block_id>
<source_key>0</source_key>
<sink_key>1</sink_key>
</connection>
@@ -818,15 +812,33 @@
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>gr_add_xx_1</source_block_id>
+ <source_block_id>blocks_add_xx_1</source_block_id>
<sink_block_id>trellis_pccc_decoder_combined_xx_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
<source_block_id>trellis_pccc_decoder_combined_xx_0</source_block_id>
- <sink_block_id>gr_sub_xx_0</sink_block_id>
+ <sink_block_id>blocks_sub_xx_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>1</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>analog_noise_source_x_0</source_block_id>
+ <sink_block_id>blocks_add_xx_1</sink_block_id>
<source_key>0</source_key>
<sink_key>1</sink_key>
</connection>
+ <connection>
+ <source_block_id>gr_throttle_0</source_block_id>
+ <sink_block_id>digital_chunks_to_symbols_xx_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>digital_chunks_to_symbols_xx_0</source_block_id>
+ <sink_block_id>blocks_add_xx_1</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
</flow_graph>
diff --git a/gr-trellis/src/examples/grc/pccc1.grc b/gr-trellis/examples/grc/pccc1.grc
index 15a63707ee..1bc0e189d0 100644
--- a/gr-trellis/src/examples/grc/pccc1.grc
+++ b/gr-trellis/examples/grc/pccc1.grc
@@ -1,6 +1,6 @@
<?xml version='1.0' encoding='ASCII'?>
<flow_graph>
- <timestamp>Wed Aug 31 20:34:39 2011</timestamp>
+ <timestamp>Sat Nov 10 15:36:08 2012</timestamp>
<block>
<key>options</key>
<param>
@@ -44,6 +44,10 @@
<value>True</value>
</param>
<param>
+ <key>max_nouts</key>
+ <value>0</value>
+ </param>
+ <param>
<key>realtime_scheduling</key>
<value></value>
</param>
@@ -181,10 +185,10 @@
</param>
</block>
<block>
- <key>gr_multiply_xx</key>
+ <key>blocks_multiply_xx</key>
<param>
<key>id</key>
- <value>gr_multiply_xx_2_0</value>
+ <value>blocks_multiply_xx_2_0</value>
</param>
<param>
<key>_enabled</key>
@@ -212,16 +216,24 @@
</param>
</block>
<block>
- <key>gr_short_to_float</key>
+ <key>blocks_short_to_float</key>
<param>
<key>id</key>
- <value>gr_short_to_float_1_0</value>
+ <value>blocks_short_to_float_1_0</value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
+ <key>vlen</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>scale</key>
+ <value>1</value>
+ </param>
+ <param>
<key>_coordinate</key>
<value>(535, 609)</value>
</param>
@@ -318,72 +330,6 @@
</param>
</block>
<block>
- <key>gr_noise_source_x</key>
- <param>
- <key>id</key>
- <value>gr_noise_source_x_0</value>
- </param>
- <param>
- <key>_enabled</key>
- <value>True</value>
- </param>
- <param>
- <key>type</key>
- <value>float</value>
- </param>
- <param>
- <key>noise_type</key>
- <value>gr.GR_GAUSSIAN</value>
- </param>
- <param>
- <key>amp</key>
- <value>noisevar</value>
- </param>
- <param>
- <key>seed</key>
- <value>42</value>
- </param>
- <param>
- <key>_coordinate</key>
- <value>(672, 290)</value>
- </param>
- <param>
- <key>_rotation</key>
- <value>0</value>
- </param>
- </block>
- <block>
- <key>gr_add_xx</key>
- <param>
- <key>id</key>
- <value>gr_add_xx_1</value>
- </param>
- <param>
- <key>_enabled</key>
- <value>True</value>
- </param>
- <param>
- <key>type</key>
- <value>float</value>
- </param>
- <param>
- <key>num_inputs</key>
- <value>2</value>
- </param>
- <param>
- <key>vlen</key>
- <value>1</value>
- </param>
- <param>
- <key>_coordinate</key>
- <value>(951, 256)</value>
- </param>
- <param>
- <key>_rotation</key>
- <value>0</value>
- </param>
- </block>
- <block>
<key>wxgui_scopesink2</key>
<param>
<key>id</key>
@@ -498,41 +444,10 @@
</param>
</block>
<block>
- <key>gr_throttle</key>
- <param>
- <key>id</key>
- <value>gr_throttle_0</value>
- </param>
- <param>
- <key>_enabled</key>
- <value>True</value>
- </param>
- <param>
- <key>type</key>
- <value>short</value>
- </param>
- <param>
- <key>samples_per_second</key>
- <value>R</value>
- </param>
- <param>
- <key>vlen</key>
- <value>1</value>
- </param>
- <param>
- <key>_coordinate</key>
- <value>(517, 103)</value>
- </param>
- <param>
- <key>_rotation</key>
- <value>0</value>
- </param>
- </block>
- <block>
- <key>gr_sub_xx</key>
+ <key>blocks_sub_xx</key>
<param>
<key>id</key>
- <value>gr_sub_xx_0</value>
+ <value>blocks_sub_xx_0</value>
</param>
<param>
<key>_enabled</key>
@@ -560,45 +475,6 @@
</param>
</block>
<block>
- <key>gr_chunks_to_symbols_xx</key>
- <param>
- <key>id</key>
- <value>gr_chunks_to_symbols_xx_0</value>
- </param>
- <param>
- <key>_enabled</key>
- <value>True</value>
- </param>
- <param>
- <key>in_type</key>
- <value>short</value>
- </param>
- <param>
- <key>out_type</key>
- <value>float</value>
- </param>
- <param>
- <key>symbol_table</key>
- <value>-7,0, -5,0, -3,0, -1,0, 1,0, 3,0, 5,0, 7,0, 0,-7,0, -5,0, -3,0, -1,0, 1,0, 3,0, 5,0, 7</value>
- </param>
- <param>
- <key>dimension</key>
- <value>2</value>
- </param>
- <param>
- <key>num_ports</key>
- <value>1</value>
- </param>
- <param>
- <key>_coordinate</key>
- <value>(551, 184)</value>
- </param>
- <param>
- <key>_rotation</key>
- <value>0</value>
- </param>
- </block>
- <block>
<key>trellis_pccc_encoder_xx</key>
<param>
<key>id</key>
@@ -736,7 +612,7 @@
</param>
<param>
<key>metric_type</key>
- <value>trellis.TRELLIS_EUCLIDEAN</value>
+ <value>digital.TRELLIS_EUCLIDEAN</value>
</param>
<param>
<key>_coordinate</key>
@@ -770,62 +646,180 @@
<value>0</value>
</param>
</block>
+ <block>
+ <key>gr_throttle</key>
+ <param>
+ <key>id</key>
+ <value>gr_throttle_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>short</value>
+ </param>
+ <param>
+ <key>samples_per_second</key>
+ <value>R</value>
+ </param>
+ <param>
+ <key>vlen</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(517, 103)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>blocks_add_xx</key>
+ <param>
+ <key>id</key>
+ <value>blocks_add_xx_1</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>float</value>
+ </param>
+ <param>
+ <key>num_inputs</key>
+ <value>2</value>
+ </param>
+ <param>
+ <key>vlen</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(951, 256)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>digital_chunks_to_symbols_xx</key>
+ <param>
+ <key>id</key>
+ <value>digital_chunks_to_symbols_xx_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>in_type</key>
+ <value>short</value>
+ </param>
+ <param>
+ <key>out_type</key>
+ <value>float</value>
+ </param>
+ <param>
+ <key>symbol_table</key>
+ <value>-7,0,-5,0,-3,0,-1,0,1,0,3,0,5,0,7,0,-7,0,-5,0,-3,0,-1,0,1,0,3,0,5,0,7</value>
+ </param>
+ <param>
+ <key>dimension</key>
+ <value>2</value>
+ </param>
+ <param>
+ <key>num_ports</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(552, 178)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>analog_noise_source_x</key>
+ <param>
+ <key>id</key>
+ <value>analog_noise_source_x_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>float</value>
+ </param>
+ <param>
+ <key>noise_type</key>
+ <value>analog.GR_GAUSSIAN</value>
+ </param>
+ <param>
+ <key>amp</key>
+ <value>noisevar</value>
+ </param>
+ <param>
+ <key>seed</key>
+ <value>-42</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(622, 257)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
<connection>
<source_block_id>random_source_x_0</source_block_id>
- <sink_block_id>gr_sub_xx_0</sink_block_id>
+ <sink_block_id>blocks_sub_xx_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>gr_throttle_0</source_block_id>
- <sink_block_id>gr_chunks_to_symbols_xx_0</sink_block_id>
- <source_key>0</source_key>
- <sink_key>0</sink_key>
- </connection>
- <connection>
- <source_block_id>gr_add_xx_1</source_block_id>
+ <source_block_id>blocks_add_xx_1</source_block_id>
<sink_block_id>wxgui_scopesink2_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>gr_noise_source_x_0</source_block_id>
- <sink_block_id>gr_add_xx_1</sink_block_id>
- <source_key>0</source_key>
- <sink_key>1</sink_key>
- </connection>
- <connection>
- <source_block_id>gr_chunks_to_symbols_xx_0</source_block_id>
- <sink_block_id>gr_add_xx_1</sink_block_id>
+ <source_block_id>blocks_multiply_xx_2_0</source_block_id>
+ <sink_block_id>blocks_short_to_float_1_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>gr_multiply_xx_2_0</source_block_id>
- <sink_block_id>gr_short_to_float_1_0</sink_block_id>
- <source_key>0</source_key>
- <sink_key>0</sink_key>
- </connection>
- <connection>
- <source_block_id>gr_short_to_float_1_0</source_block_id>
+ <source_block_id>blocks_short_to_float_1_0</source_block_id>
<sink_block_id>wxgui_numbersink2_3_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>gr_sub_xx_0</source_block_id>
- <sink_block_id>gr_multiply_xx_2_0</sink_block_id>
+ <source_block_id>blocks_sub_xx_0</source_block_id>
+ <sink_block_id>blocks_multiply_xx_2_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>gr_sub_xx_0</source_block_id>
- <sink_block_id>gr_multiply_xx_2_0</sink_block_id>
+ <source_block_id>blocks_sub_xx_0</source_block_id>
+ <sink_block_id>blocks_multiply_xx_2_0</sink_block_id>
<source_key>0</source_key>
<sink_key>1</sink_key>
</connection>
<connection>
- <source_block_id>gr_add_xx_1</source_block_id>
+ <source_block_id>blocks_add_xx_1</source_block_id>
<sink_block_id>trellis_metrics_x_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
@@ -850,7 +844,25 @@
</connection>
<connection>
<source_block_id>trellis_pccc_decoder_x_0</source_block_id>
- <sink_block_id>gr_sub_xx_0</sink_block_id>
+ <sink_block_id>blocks_sub_xx_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>1</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>gr_throttle_0</source_block_id>
+ <sink_block_id>digital_chunks_to_symbols_xx_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>digital_chunks_to_symbols_xx_0</source_block_id>
+ <sink_block_id>blocks_add_xx_1</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>analog_noise_source_x_0</source_block_id>
+ <sink_block_id>blocks_add_xx_1</sink_block_id>
<source_key>0</source_key>
<sink_key>1</sink_key>
</connection>
diff --git a/gr-trellis/src/examples/grc/readme.txt b/gr-trellis/examples/grc/readme.txt
index a5261ac0b2..a5261ac0b2 100644
--- a/gr-trellis/src/examples/grc/readme.txt
+++ b/gr-trellis/examples/grc/readme.txt
diff --git a/gr-trellis/src/examples/grc/sccc.grc b/gr-trellis/examples/grc/sccc.grc
index e8f656f637..abfbeb8b81 100644
--- a/gr-trellis/src/examples/grc/sccc.grc
+++ b/gr-trellis/examples/grc/sccc.grc
@@ -1,6 +1,6 @@
<?xml version='1.0' encoding='ASCII'?>
<flow_graph>
- <timestamp>Wed Aug 31 19:57:09 2011</timestamp>
+ <timestamp>Sat Nov 10 15:34:26 2012</timestamp>
<block>
<key>options</key>
<param>
@@ -44,6 +44,10 @@
<value>True</value>
</param>
<param>
+ <key>max_nouts</key>
+ <value>0</value>
+ </param>
+ <param>
<key>realtime_scheduling</key>
<value></value>
</param>
@@ -165,41 +169,10 @@
</param>
</block>
<block>
- <key>gr_add_xx</key>
- <param>
- <key>id</key>
- <value>gr_add_xx_1</value>
- </param>
- <param>
- <key>_enabled</key>
- <value>True</value>
- </param>
- <param>
- <key>type</key>
- <value>complex</value>
- </param>
- <param>
- <key>num_inputs</key>
- <value>2</value>
- </param>
- <param>
- <key>vlen</key>
- <value>1</value>
- </param>
- <param>
- <key>_coordinate</key>
- <value>(951, 256)</value>
- </param>
- <param>
- <key>_rotation</key>
- <value>0</value>
- </param>
- </block>
- <block>
- <key>gr_sub_xx</key>
+ <key>blocks_sub_xx</key>
<param>
<key>id</key>
- <value>gr_sub_xx_0</value>
+ <value>blocks_sub_xx_0</value>
</param>
<param>
<key>_enabled</key>
@@ -227,10 +200,10 @@
</param>
</block>
<block>
- <key>gr_multiply_xx</key>
+ <key>blocks_multiply_xx</key>
<param>
<key>id</key>
- <value>gr_multiply_xx_2_0</value>
+ <value>blocks_multiply_xx_2_0</value>
</param>
<param>
<key>_enabled</key>
@@ -258,16 +231,24 @@
</param>
</block>
<block>
- <key>gr_short_to_float</key>
+ <key>blocks_short_to_float</key>
<param>
<key>id</key>
- <value>gr_short_to_float_1_0</value>
+ <value>blocks_short_to_float_1_0</value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
+ <key>vlen</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>scale</key>
+ <value>1</value>
+ </param>
+ <param>
<key>_coordinate</key>
<value>(416, 815)</value>
</param>
@@ -430,111 +411,6 @@
</param>
</block>
<block>
- <key>gr_throttle</key>
- <param>
- <key>id</key>
- <value>gr_throttle_0</value>
- </param>
- <param>
- <key>_enabled</key>
- <value>True</value>
- </param>
- <param>
- <key>type</key>
- <value>short</value>
- </param>
- <param>
- <key>samples_per_second</key>
- <value>R</value>
- </param>
- <param>
- <key>vlen</key>
- <value>1</value>
- </param>
- <param>
- <key>_coordinate</key>
- <value>(514, 105)</value>
- </param>
- <param>
- <key>_rotation</key>
- <value>0</value>
- </param>
- </block>
- <block>
- <key>gr_chunks_to_symbols_xx</key>
- <param>
- <key>id</key>
- <value>gr_chunks_to_symbols_xx_0</value>
- </param>
- <param>
- <key>_enabled</key>
- <value>True</value>
- </param>
- <param>
- <key>in_type</key>
- <value>short</value>
- </param>
- <param>
- <key>out_type</key>
- <value>complex</value>
- </param>
- <param>
- <key>symbol_table</key>
- <value>1,0,1j,0,-1j,0,-1,0, 0,1,0,1j,0,-1j,0,-1</value>
- </param>
- <param>
- <key>dimension</key>
- <value>2</value>
- </param>
- <param>
- <key>num_ports</key>
- <value>1</value>
- </param>
- <param>
- <key>_coordinate</key>
- <value>(551, 184)</value>
- </param>
- <param>
- <key>_rotation</key>
- <value>0</value>
- </param>
- </block>
- <block>
- <key>gr_noise_source_x</key>
- <param>
- <key>id</key>
- <value>gr_noise_source_x_0</value>
- </param>
- <param>
- <key>_enabled</key>
- <value>True</value>
- </param>
- <param>
- <key>type</key>
- <value>complex</value>
- </param>
- <param>
- <key>noise_type</key>
- <value>gr.GR_GAUSSIAN</value>
- </param>
- <param>
- <key>amp</key>
- <value>noisevar</value>
- </param>
- <param>
- <key>seed</key>
- <value>42</value>
- </param>
- <param>
- <key>_coordinate</key>
- <value>(672, 290)</value>
- </param>
- <param>
- <key>_rotation</key>
- <value>0</value>
- </param>
- </block>
- <block>
<key>trellis_sccc_encoder_xx</key>
<param>
<key>id</key>
@@ -732,7 +608,7 @@
</param>
<param>
<key>metric_type</key>
- <value>trellis.TRELLIS_EUCLIDEAN</value>
+ <value>digital.TRELLIS_EUCLIDEAN</value>
</param>
<param>
<key>siso_type</key>
@@ -751,37 +627,155 @@
<value>0</value>
</param>
</block>
+ <block>
+ <key>gr_throttle</key>
+ <param>
+ <key>id</key>
+ <value>gr_throttle_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>short</value>
+ </param>
+ <param>
+ <key>samples_per_second</key>
+ <value>R</value>
+ </param>
+ <param>
+ <key>vlen</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(514, 105)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>blocks_add_xx</key>
+ <param>
+ <key>id</key>
+ <value>blocks_add_xx_1</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>complex</value>
+ </param>
+ <param>
+ <key>num_inputs</key>
+ <value>2</value>
+ </param>
+ <param>
+ <key>vlen</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(951, 256)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>digital_chunks_to_symbols_xx</key>
+ <param>
+ <key>id</key>
+ <value>digital_chunks_to_symbols_xx_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>in_type</key>
+ <value>short</value>
+ </param>
+ <param>
+ <key>out_type</key>
+ <value>complex</value>
+ </param>
+ <param>
+ <key>symbol_table</key>
+ <value>1,0,1j,0,-1j,0,-1,0,0,1,0,1j,0,-1j,0,01</value>
+ </param>
+ <param>
+ <key>dimension</key>
+ <value>2</value>
+ </param>
+ <param>
+ <key>num_ports</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(551, 181)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>analog_noise_source_x</key>
+ <param>
+ <key>id</key>
+ <value>analog_noise_source_x_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>complex</value>
+ </param>
+ <param>
+ <key>noise_type</key>
+ <value>analog.GR_GAUSSIAN</value>
+ </param>
+ <param>
+ <key>amp</key>
+ <value>noisevar</value>
+ </param>
+ <param>
+ <key>seed</key>
+ <value>-42</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(651, 270)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
<connection>
<source_block_id>random_source_x_0</source_block_id>
- <sink_block_id>gr_sub_xx_0</sink_block_id>
+ <sink_block_id>blocks_sub_xx_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>gr_throttle_0</source_block_id>
- <sink_block_id>gr_chunks_to_symbols_xx_0</sink_block_id>
- <source_key>0</source_key>
- <sink_key>0</sink_key>
- </connection>
- <connection>
- <source_block_id>gr_add_xx_1</source_block_id>
+ <source_block_id>blocks_add_xx_1</source_block_id>
<sink_block_id>wxgui_scopesink2_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>gr_noise_source_x_0</source_block_id>
- <sink_block_id>gr_add_xx_1</sink_block_id>
- <source_key>0</source_key>
- <sink_key>1</sink_key>
- </connection>
- <connection>
- <source_block_id>gr_chunks_to_symbols_xx_0</source_block_id>
- <sink_block_id>gr_add_xx_1</sink_block_id>
- <source_key>0</source_key>
- <sink_key>0</sink_key>
- </connection>
- <connection>
<source_block_id>random_source_x_0</source_block_id>
<sink_block_id>trellis_sccc_encoder_xx_0</sink_block_id>
<source_key>0</source_key>
@@ -794,39 +788,57 @@
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>gr_add_xx_1</source_block_id>
+ <source_block_id>blocks_add_xx_1</source_block_id>
<sink_block_id>trellis_sccc_decoder_combined_xx_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
<source_block_id>trellis_sccc_decoder_combined_xx_0</source_block_id>
- <sink_block_id>gr_sub_xx_0</sink_block_id>
+ <sink_block_id>blocks_sub_xx_0</sink_block_id>
<source_key>0</source_key>
<sink_key>1</sink_key>
</connection>
<connection>
- <source_block_id>gr_multiply_xx_2_0</source_block_id>
- <sink_block_id>gr_short_to_float_1_0</sink_block_id>
+ <source_block_id>blocks_multiply_xx_2_0</source_block_id>
+ <sink_block_id>blocks_short_to_float_1_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>gr_short_to_float_1_0</source_block_id>
+ <source_block_id>blocks_short_to_float_1_0</source_block_id>
<sink_block_id>wxgui_numbersink2_3_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>gr_sub_xx_0</source_block_id>
- <sink_block_id>gr_multiply_xx_2_0</sink_block_id>
+ <source_block_id>blocks_sub_xx_0</source_block_id>
+ <sink_block_id>blocks_multiply_xx_2_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>gr_sub_xx_0</source_block_id>
- <sink_block_id>gr_multiply_xx_2_0</sink_block_id>
+ <source_block_id>blocks_sub_xx_0</source_block_id>
+ <sink_block_id>blocks_multiply_xx_2_0</sink_block_id>
<source_key>0</source_key>
<sink_key>1</sink_key>
</connection>
+ <connection>
+ <source_block_id>gr_throttle_0</source_block_id>
+ <sink_block_id>digital_chunks_to_symbols_xx_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>analog_noise_source_x_0</source_block_id>
+ <sink_block_id>blocks_add_xx_1</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>1</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>digital_chunks_to_symbols_xx_0</source_block_id>
+ <sink_block_id>blocks_add_xx_1</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
</flow_graph>
diff --git a/gr-trellis/src/examples/grc/sccc1.grc b/gr-trellis/examples/grc/sccc1.grc
index 0be59d0c47..906ca25389 100644
--- a/gr-trellis/src/examples/grc/sccc1.grc
+++ b/gr-trellis/examples/grc/sccc1.grc
@@ -1,6 +1,6 @@
<?xml version='1.0' encoding='ASCII'?>
<flow_graph>
- <timestamp>Wed Aug 31 20:09:23 2011</timestamp>
+ <timestamp>Sat Nov 10 15:41:10 2012</timestamp>
<block>
<key>options</key>
<param>
@@ -44,6 +44,10 @@
<value>True</value>
</param>
<param>
+ <key>max_nouts</key>
+ <value>0</value>
+ </param>
+ <param>
<key>realtime_scheduling</key>
<value></value>
</param>
@@ -353,10 +357,10 @@
</param>
</block>
<block>
- <key>gr_sub_xx</key>
+ <key>blocks_sub_xx</key>
<param>
<key>id</key>
- <value>gr_sub_xx_0</value>
+ <value>blocks_sub_xx_0</value>
</param>
<param>
<key>_enabled</key>
@@ -384,10 +388,10 @@
</param>
</block>
<block>
- <key>gr_multiply_xx</key>
+ <key>blocks_multiply_xx</key>
<param>
<key>id</key>
- <value>gr_multiply_xx_2_0</value>
+ <value>blocks_multiply_xx_2_0</value>
</param>
<param>
<key>_enabled</key>
@@ -415,16 +419,24 @@
</param>
</block>
<block>
- <key>gr_short_to_float</key>
+ <key>blocks_short_to_float</key>
<param>
<key>id</key>
- <value>gr_short_to_float_1_0</value>
+ <value>blocks_short_to_float_1_0</value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
+ <key>vlen</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>scale</key>
+ <value>1</value>
+ </param>
+ <param>
<key>_coordinate</key>
<value>(535, 609)</value>
</param>
@@ -521,10 +533,10 @@
</param>
</block>
<block>
- <key>gr_noise_source_x</key>
+ <key>trellis_metrics_x</key>
<param>
<key>id</key>
- <value>gr_noise_source_x_0</value>
+ <value>trellis_metrics_x_0</value>
</param>
<param>
<key>_enabled</key>
@@ -532,23 +544,27 @@
</param>
<param>
<key>type</key>
- <value>float</value>
+ <value>f</value>
</param>
<param>
- <key>noise_type</key>
- <value>gr.GR_GAUSSIAN</value>
+ <key>card</key>
+ <value>8</value>
</param>
<param>
- <key>amp</key>
- <value>noisevar</value>
+ <key>dim</key>
+ <value>1</value>
</param>
<param>
- <key>seed</key>
- <value>42</value>
+ <key>table</key>
+ <value>-7, -5, -3, -1, 1, 3, 5, 7</value>
+ </param>
+ <param>
+ <key>metric_type</key>
+ <value>digital.TRELLIS_EUCLIDEAN</value>
</param>
<param>
<key>_coordinate</key>
- <value>(672, 290)</value>
+ <value>(58, 354)</value>
</param>
<param>
<key>_rotation</key>
@@ -556,69 +572,74 @@
</param>
</block>
<block>
- <key>gr_add_xx</key>
+ <key>wxgui_scopesink2</key>
<param>
<key>id</key>
- <value>gr_add_xx_1</value>
+ <value>wxgui_scopesink2_0</value>
</param>
<param>
<key>_enabled</key>
- <value>True</value>
+ <value>False</value>
</param>
<param>
<key>type</key>
<value>float</value>
</param>
<param>
- <key>num_inputs</key>
- <value>2</value>
+ <key>title</key>
+ <value>Scope Plot</value>
</param>
<param>
- <key>vlen</key>
- <value>1</value>
+ <key>samp_rate</key>
+ <value>R</value>
</param>
<param>
- <key>_coordinate</key>
- <value>(951, 256)</value>
+ <key>v_scale</key>
+ <value>0</value>
</param>
<param>
- <key>_rotation</key>
+ <key>v_offset</key>
<value>0</value>
</param>
- </block>
- <block>
- <key>trellis_metrics_x</key>
<param>
- <key>id</key>
- <value>trellis_metrics_x_0</value>
+ <key>t_scale</key>
+ <value>0</value>
</param>
<param>
- <key>_enabled</key>
- <value>True</value>
+ <key>ac_couple</key>
+ <value>False</value>
</param>
<param>
- <key>type</key>
- <value>f</value>
+ <key>xy_mode</key>
+ <value>False</value>
</param>
<param>
- <key>card</key>
- <value>8</value>
+ <key>num_inputs</key>
+ <value>1</value>
</param>
<param>
- <key>dim</key>
- <value>1</value>
+ <key>win_size</key>
+ <value></value>
</param>
<param>
- <key>table</key>
- <value>-7, -5, -3, -1, 1, 3, 5, 7</value>
+ <key>grid_pos</key>
+ <value></value>
</param>
<param>
- <key>metric_type</key>
- <value>trellis.TRELLIS_EUCLIDEAN</value>
+ <key>notebook</key>
+ <value></value>
+ </param>
+ <param>
+ <key>trig_mode</key>
+ <value>gr.gr_TRIG_MODE_AUTO</value>
+ </param>
+ <param>
+ <key>y_axis_label</key>
+ <value>Counts</value>
</param>
<param>
<key>_coordinate</key>
- <value>(58, 354)</value>
+ <value>(952, 73)</value>
</param>
<param>
<key>_rotation</key>
@@ -657,74 +678,69 @@
</param>
</block>
<block>
- <key>wxgui_scopesink2</key>
+ <key>digital_chunks_to_symbols_xx</key>
<param>
<key>id</key>
- <value>wxgui_scopesink2_0</value>
+ <value>digital_chunks_to_symbols_xx_0</value>
</param>
<param>
<key>_enabled</key>
- <value>False</value>
- </param>
- <param>
- <key>type</key>
- <value>float</value>
- </param>
- <param>
- <key>title</key>
- <value>Scope Plot</value>
+ <value>True</value>
</param>
<param>
- <key>samp_rate</key>
- <value>R</value>
+ <key>in_type</key>
+ <value>short</value>
</param>
<param>
- <key>v_scale</key>
- <value>0</value>
+ <key>out_type</key>
+ <value>float</value>
</param>
<param>
- <key>v_offset</key>
- <value>0</value>
+ <key>symbol_table</key>
+ <value>-7,-5,-3,-1,1,3,5,7</value>
</param>
<param>
- <key>t_scale</key>
- <value>0</value>
+ <key>dimension</key>
+ <value>1</value>
</param>
<param>
- <key>ac_couple</key>
- <value>False</value>
+ <key>num_ports</key>
+ <value>1</value>
</param>
<param>
- <key>xy_mode</key>
- <value>False</value>
+ <key>_coordinate</key>
+ <value>(607, 175)</value>
</param>
<param>
- <key>num_inputs</key>
- <value>1</value>
+ <key>_rotation</key>
+ <value>0</value>
</param>
+ </block>
+ <block>
+ <key>blocks_add_xx</key>
<param>
- <key>win_size</key>
- <value></value>
+ <key>id</key>
+ <value>blocks_add_xx_1</value>
</param>
<param>
- <key>grid_pos</key>
- <value></value>
+ <key>_enabled</key>
+ <value>True</value>
</param>
<param>
- <key>notebook</key>
- <value></value>
+ <key>type</key>
+ <value>float</value>
</param>
<param>
- <key>trig_mode</key>
- <value>gr.gr_TRIG_MODE_AUTO</value>
+ <key>num_inputs</key>
+ <value>2</value>
</param>
<param>
- <key>y_axis_label</key>
- <value>Counts</value>
+ <key>vlen</key>
+ <value>1</value>
</param>
<param>
<key>_coordinate</key>
- <value>(952, 73)</value>
+ <value>(951, 256)</value>
</param>
<param>
<key>_rotation</key>
@@ -732,38 +748,34 @@
</param>
</block>
<block>
- <key>gr_chunks_to_symbols_xx</key>
+ <key>analog_noise_source_x</key>
<param>
<key>id</key>
- <value>gr_chunks_to_symbols_xx_0</value>
+ <value>analog_noise_source_x_0</value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
- <key>in_type</key>
- <value>short</value>
- </param>
- <param>
- <key>out_type</key>
+ <key>type</key>
<value>float</value>
</param>
<param>
- <key>symbol_table</key>
- <value>-7, -5, -3, -1, 1, 3, 5, 7</value>
+ <key>noise_type</key>
+ <value>analog.GR_GAUSSIAN</value>
</param>
<param>
- <key>dimension</key>
- <value>1</value>
+ <key>amp</key>
+ <value>noisevar</value>
</param>
<param>
- <key>num_ports</key>
- <value>1</value>
+ <key>seed</key>
+ <value>-42</value>
</param>
<param>
<key>_coordinate</key>
- <value>(551, 184)</value>
+ <value>(632, 254)</value>
</param>
<param>
<key>_rotation</key>
@@ -772,35 +784,17 @@
</block>
<connection>
<source_block_id>random_source_x_0</source_block_id>
- <sink_block_id>gr_sub_xx_0</sink_block_id>
+ <sink_block_id>blocks_sub_xx_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>gr_throttle_0</source_block_id>
- <sink_block_id>gr_chunks_to_symbols_xx_0</sink_block_id>
- <source_key>0</source_key>
- <sink_key>0</sink_key>
- </connection>
- <connection>
- <source_block_id>gr_add_xx_1</source_block_id>
+ <source_block_id>blocks_add_xx_1</source_block_id>
<sink_block_id>wxgui_scopesink2_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>gr_noise_source_x_0</source_block_id>
- <sink_block_id>gr_add_xx_1</sink_block_id>
- <source_key>0</source_key>
- <sink_key>1</sink_key>
- </connection>
- <connection>
- <source_block_id>gr_chunks_to_symbols_xx_0</source_block_id>
- <sink_block_id>gr_add_xx_1</sink_block_id>
- <source_key>0</source_key>
- <sink_key>0</sink_key>
- </connection>
- <connection>
<source_block_id>random_source_x_0</source_block_id>
<sink_block_id>trellis_sccc_encoder_xx_0</sink_block_id>
<source_key>0</source_key>
@@ -813,31 +807,31 @@
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>gr_multiply_xx_2_0</source_block_id>
- <sink_block_id>gr_short_to_float_1_0</sink_block_id>
+ <source_block_id>blocks_multiply_xx_2_0</source_block_id>
+ <sink_block_id>blocks_short_to_float_1_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>gr_short_to_float_1_0</source_block_id>
+ <source_block_id>blocks_short_to_float_1_0</source_block_id>
<sink_block_id>wxgui_numbersink2_3_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>gr_sub_xx_0</source_block_id>
- <sink_block_id>gr_multiply_xx_2_0</sink_block_id>
+ <source_block_id>blocks_sub_xx_0</source_block_id>
+ <sink_block_id>blocks_multiply_xx_2_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>gr_sub_xx_0</source_block_id>
- <sink_block_id>gr_multiply_xx_2_0</sink_block_id>
+ <source_block_id>blocks_sub_xx_0</source_block_id>
+ <sink_block_id>blocks_multiply_xx_2_0</sink_block_id>
<source_key>0</source_key>
<sink_key>1</sink_key>
</connection>
<connection>
- <source_block_id>gr_add_xx_1</source_block_id>
+ <source_block_id>blocks_add_xx_1</source_block_id>
<sink_block_id>trellis_metrics_x_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
@@ -850,7 +844,25 @@
</connection>
<connection>
<source_block_id>trellis_sccc_decoder_x_0</source_block_id>
- <sink_block_id>gr_sub_xx_0</sink_block_id>
+ <sink_block_id>blocks_sub_xx_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>1</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>gr_throttle_0</source_block_id>
+ <sink_block_id>digital_chunks_to_symbols_xx_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>digital_chunks_to_symbols_xx_0</source_block_id>
+ <sink_block_id>blocks_add_xx_1</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>analog_noise_source_x_0</source_block_id>
+ <sink_block_id>blocks_add_xx_1</sink_block_id>
<source_key>0</source_key>
<sink_key>1</sink_key>
</connection>
diff --git a/gr-trellis/src/examples/python/CMakeLists.txt b/gr-trellis/examples/python/CMakeLists.txt
index e2c7e70ff7..e2c7e70ff7 100644
--- a/gr-trellis/src/examples/python/CMakeLists.txt
+++ b/gr-trellis/examples/python/CMakeLists.txt
diff --git a/gr-trellis/src/examples/python/README b/gr-trellis/examples/python/README
index d51f231ac3..d51f231ac3 100644
--- a/gr-trellis/src/examples/python/README
+++ b/gr-trellis/examples/python/README
diff --git a/gr-trellis/src/examples/python/fsm_files/awgn1o2_128.fsm b/gr-trellis/examples/python/fsm_files/awgn1o2_128.fsm
index 4b47007c50..4b47007c50 100644
--- a/gr-trellis/src/examples/python/fsm_files/awgn1o2_128.fsm
+++ b/gr-trellis/examples/python/fsm_files/awgn1o2_128.fsm
diff --git a/gr-trellis/src/examples/python/fsm_files/awgn1o2_16.fsm b/gr-trellis/examples/python/fsm_files/awgn1o2_16.fsm
index cdab41359e..cdab41359e 100644
--- a/gr-trellis/src/examples/python/fsm_files/awgn1o2_16.fsm
+++ b/gr-trellis/examples/python/fsm_files/awgn1o2_16.fsm
diff --git a/gr-trellis/src/examples/python/fsm_files/awgn1o2_4.fsm b/gr-trellis/examples/python/fsm_files/awgn1o2_4.fsm
index fb316b5ef8..fb316b5ef8 100644
--- a/gr-trellis/src/examples/python/fsm_files/awgn1o2_4.fsm
+++ b/gr-trellis/examples/python/fsm_files/awgn1o2_4.fsm
diff --git a/gr-trellis/src/examples/python/fsm_files/awgn1o2_8.fsm b/gr-trellis/examples/python/fsm_files/awgn1o2_8.fsm
index 604bac6c2c..604bac6c2c 100644
--- a/gr-trellis/src/examples/python/fsm_files/awgn1o2_8.fsm
+++ b/gr-trellis/examples/python/fsm_files/awgn1o2_8.fsm
diff --git a/gr-trellis/src/examples/python/fsm_files/awgn2o3_16.fsm b/gr-trellis/examples/python/fsm_files/awgn2o3_16.fsm
index 9630cd9afb..9630cd9afb 100644
--- a/gr-trellis/src/examples/python/fsm_files/awgn2o3_16.fsm
+++ b/gr-trellis/examples/python/fsm_files/awgn2o3_16.fsm
diff --git a/gr-trellis/src/examples/python/fsm_files/awgn2o3_4.fsm b/gr-trellis/examples/python/fsm_files/awgn2o3_4.fsm
index 3ac57be18d..3ac57be18d 100644
--- a/gr-trellis/src/examples/python/fsm_files/awgn2o3_4.fsm
+++ b/gr-trellis/examples/python/fsm_files/awgn2o3_4.fsm
diff --git a/gr-trellis/src/examples/python/fsm_files/awgn2o3_4_msb.fsm b/gr-trellis/examples/python/fsm_files/awgn2o3_4_msb.fsm
index d834c52718..d834c52718 100644
--- a/gr-trellis/src/examples/python/fsm_files/awgn2o3_4_msb.fsm
+++ b/gr-trellis/examples/python/fsm_files/awgn2o3_4_msb.fsm
diff --git a/gr-trellis/src/examples/python/fsm_files/awgn2o3_4_msbG.fsm b/gr-trellis/examples/python/fsm_files/awgn2o3_4_msbG.fsm
index 8956c53da2..8956c53da2 100644
--- a/gr-trellis/src/examples/python/fsm_files/awgn2o3_4_msbG.fsm
+++ b/gr-trellis/examples/python/fsm_files/awgn2o3_4_msbG.fsm
diff --git a/gr-trellis/src/examples/python/fsm_files/awgn2o3_8.fsm b/gr-trellis/examples/python/fsm_files/awgn2o3_8.fsm
index 34deeb68cb..34deeb68cb 100644
--- a/gr-trellis/src/examples/python/fsm_files/awgn2o3_8.fsm
+++ b/gr-trellis/examples/python/fsm_files/awgn2o3_8.fsm
diff --git a/gr-trellis/src/examples/python/fsm_files/awgn2o4_4.fsm b/gr-trellis/examples/python/fsm_files/awgn2o4_4.fsm
index a895be8965..a895be8965 100644
--- a/gr-trellis/src/examples/python/fsm_files/awgn2o4_4.fsm
+++ b/gr-trellis/examples/python/fsm_files/awgn2o4_4.fsm
diff --git a/gr-trellis/src/examples/python/fsm_files/disconnected.fsm b/gr-trellis/examples/python/fsm_files/disconnected.fsm
index 847963e7b2..847963e7b2 100644
--- a/gr-trellis/src/examples/python/fsm_files/disconnected.fsm
+++ b/gr-trellis/examples/python/fsm_files/disconnected.fsm
diff --git a/gr-trellis/src/examples/python/fsm_files/irregular.fsm b/gr-trellis/examples/python/fsm_files/irregular.fsm
index 80b82b889d..80b82b889d 100644
--- a/gr-trellis/src/examples/python/fsm_files/irregular.fsm
+++ b/gr-trellis/examples/python/fsm_files/irregular.fsm
diff --git a/gr-trellis/src/examples/python/fsm_files/joint_16_16.fsm b/gr-trellis/examples/python/fsm_files/joint_16_16.fsm
index 293ff4e7c6..293ff4e7c6 100644
--- a/gr-trellis/src/examples/python/fsm_files/joint_16_16.fsm
+++ b/gr-trellis/examples/python/fsm_files/joint_16_16.fsm
diff --git a/gr-trellis/src/examples/python/fsm_files/joint_4_16.fsm b/gr-trellis/examples/python/fsm_files/joint_4_16.fsm
index 427a182071..427a182071 100644
--- a/gr-trellis/src/examples/python/fsm_files/joint_4_16.fsm
+++ b/gr-trellis/examples/python/fsm_files/joint_4_16.fsm
diff --git a/gr-trellis/src/examples/python/fsm_files/rep3.fsm b/gr-trellis/examples/python/fsm_files/rep3.fsm
index ef1bd1f025..ef1bd1f025 100644
--- a/gr-trellis/src/examples/python/fsm_files/rep3.fsm
+++ b/gr-trellis/examples/python/fsm_files/rep3.fsm
diff --git a/gr-trellis/src/examples/python/fsm_files/rep5.fsm b/gr-trellis/examples/python/fsm_files/rep5.fsm
index 2aa5d77cfb..2aa5d77cfb 100644
--- a/gr-trellis/src/examples/python/fsm_files/rep5.fsm
+++ b/gr-trellis/examples/python/fsm_files/rep5.fsm
diff --git a/gr-trellis/src/examples/python/fsm_files/simple.fsm b/gr-trellis/examples/python/fsm_files/simple.fsm
index f27f6b4b05..f27f6b4b05 100644
--- a/gr-trellis/src/examples/python/fsm_files/simple.fsm
+++ b/gr-trellis/examples/python/fsm_files/simple.fsm
diff --git a/gr-trellis/src/examples/python/fsm_utils.py b/gr-trellis/examples/python/fsm_utils.py
index 06855ea775..06855ea775 100755
--- a/gr-trellis/src/examples/python/fsm_utils.py
+++ b/gr-trellis/examples/python/fsm_utils.py
diff --git a/gr-trellis/src/examples/python/test_cpm.py b/gr-trellis/examples/python/test_cpm.py
index 5342e57e82..8d1e2024c1 100755
--- a/gr-trellis/src/examples/python/test_cpm.py
+++ b/gr-trellis/examples/python/test_cpm.py
@@ -8,8 +8,7 @@
##################################################
from gnuradio import gr
-from gnuradio import trellis, digital
-from gnuradio.gr import firdes
+from gnuradio import trellis, digital, filter, blocks
from grc_gnuradio import blks2 as grc_blks2
import math
import numpy
@@ -17,6 +16,12 @@ import fsm_utils
from gnuradio import trellis
try:
+ from gnuradio import analog
+except ImportError:
+ sys.stderr.write("Error: Program requires gr-analog.\n")
+ sys.exit(1)
+
+try:
import scipy.stats
except ImportError:
print "Error: Program requires scipy (see: www.scipy.org)."
@@ -45,7 +50,7 @@ def run_test(seed,blocksize):
BT=0.3;
tt=numpy.arange(0,L*Q)/(1.0*Q)-L/2.0;
#print tt
- p=(0.5*scipy.stats.erfc(2*math.pi*BT*(tt-0.5)/math.sqrt(math.log(2.0))/math.sqrt(2.0))-0.5*scipy.stats.erfc(2*math.pi*BT*(tt+0.5)/math.sqrt(math.log(2.0))/math.sqrt(2.0)))/2.0;
+ p=(0.5*scipy.special.erfc(2*math.pi*BT*(tt-0.5)/math.sqrt(math.log(2.0))/math.sqrt(2.0))-0.5*scipy.special.erfc(2*math.pi*BT*(tt+0.5)/math.sqrt(math.log(2.0))/math.sqrt(2.0)))/2.0;
p=p/sum(p)*Q/2.0;
#print p
q=numpy.cumsum(p)/Q;
@@ -89,19 +94,19 @@ def run_test(seed,blocksize):
# Blocks
##################################################
random_source_x_0 = gr.vector_source_b(data.tolist(), False)
- gr_chunks_to_symbols_xx_0 = gr.chunks_to_symbols_bf((-1, 1), 1)
- gr_interp_fir_filter_xxx_0 = gr.interp_fir_filter_fff(Q, p)
- gr_frequency_modulator_fc_0 = gr.frequency_modulator_fc(2*math.pi*h*(1.0/Q))
+ digital_chunks_to_symbols_xx_0 = digital.chunks_to_symbols_bf((-1, 1), 1)
+ filter_interp_fir_filter_xxx_0 = filter.interp_fir_filter_fff(Q, p)
+ analog_frequency_modulator_fc_0 = analog.frequency_modulator_fc(2*math.pi*h*(1.0/Q))
- gr_add_vxx_0 = gr.add_vcc(1)
- gr_noise_source_x_0 = gr.noise_source_c(gr.GR_GAUSSIAN, (N0/2.0)**0.5, -long(seed))
+ blocks_add_vxx_0 = blocks.add_vcc(1)
+ analog_noise_source_x_0 = analog.noise_source_c(analog.GR_GAUSSIAN, (N0/2.0)**0.5, -long(seed))
- gr_multiply_vxx_0 = gr.multiply_vcc(1)
- gr_sig_source_x_0 = gr.sig_source_c(Q, gr.GR_COS_WAVE, -f0T, 1, 0)
+ blokcs_multiply_vxx_0 = blocks.multiply_vcc(1)
+ analog_sig_source_x_0 = analog.sig_source_c(Q, analog.GR_COS_WAVE, -f0T, 1, 0)
# only works for N=2, do it manually for N>2...
- gr_fir_filter_xxx_0_0 = gr.fir_filter_ccc(Q, MF[0].conjugate())
- gr_fir_filter_xxx_0_0_0 = gr.fir_filter_ccc(Q, MF[1].conjugate())
- gr_streams_to_stream_0 = gr.streams_to_stream(gr.sizeof_gr_complex*1, int(N))
+ filter_fir_filter_xxx_0_0 = filter.fir_filter_ccc(Q, MF[0].conjugate())
+ filter_fir_filter_xxx_0_0_0 = filter.fir_filter_ccc(Q, MF[1].conjugate())
+ blocks_streams_to_stream_0 = blocks.streams_to_stream(gr.sizeof_gr_complex*1, int(N))
gr_skiphead_0 = gr.skiphead(gr.sizeof_gr_complex*1, int(N*(1+0)))
viterbi = trellis.viterbi_combined_cb(f, head+blocksize+tail, 0, -1, int(N),
constellation, digital.TRELLIS_EUCLIDEAN)
@@ -111,18 +116,18 @@ def run_test(seed,blocksize):
##################################################
# Connections
##################################################
- tb.connect((random_source_x_0, 0), (gr_chunks_to_symbols_xx_0, 0))
- tb.connect((gr_chunks_to_symbols_xx_0, 0), (gr_interp_fir_filter_xxx_0, 0))
- tb.connect((gr_interp_fir_filter_xxx_0, 0), (gr_frequency_modulator_fc_0, 0))
- tb.connect((gr_frequency_modulator_fc_0, 0), (gr_add_vxx_0, 0))
- tb.connect((gr_noise_source_x_0, 0), (gr_add_vxx_0, 1))
- tb.connect((gr_add_vxx_0, 0), (gr_multiply_vxx_0, 0))
- tb.connect((gr_sig_source_x_0, 0), (gr_multiply_vxx_0, 1))
- tb.connect((gr_multiply_vxx_0, 0), (gr_fir_filter_xxx_0_0, 0))
- tb.connect((gr_multiply_vxx_0, 0), (gr_fir_filter_xxx_0_0_0, 0))
- tb.connect((gr_fir_filter_xxx_0_0, 0), (gr_streams_to_stream_0, 0))
- tb.connect((gr_fir_filter_xxx_0_0_0, 0), (gr_streams_to_stream_0, 1))
- tb.connect((gr_streams_to_stream_0, 0), (gr_skiphead_0, 0))
+ tb.connect((random_source_x_0, 0), (digital_chunks_to_symbols_xx_0, 0))
+ tb.connect((digital_chunks_to_symbols_xx_0, 0), (filter_interp_fir_filter_xxx_0, 0))
+ tb.connect((filter_interp_fir_filter_xxx_0, 0), (analog_frequency_modulator_fc_0, 0))
+ tb.connect((analog_frequency_modulator_fc_0, 0), (blocks_add_vxx_0, 0))
+ tb.connect((analog_noise_source_x_0, 0), (blocks_add_vxx_0, 1))
+ tb.connect((blocks_add_vxx_0, 0), (blocks_multiply_vxx_0, 0))
+ tb.connect((analog_sig_source_x_0, 0), (blocks_multiply_vxx_0, 1))
+ tb.connect((blocks_multiply_vxx_0, 0), (filter_fir_filter_xxx_0_0, 0))
+ tb.connect((blocks_multiply_vxx_0, 0), (filter_fir_filter_xxx_0_0_0, 0))
+ tb.connect((filter_fir_filter_xxx_0_0, 0), (blocks_streams_to_stream_0, 0))
+ tb.connect((filter_fir_filter_xxx_0_0_0, 0), (blocks_streams_to_stream_0, 1))
+ tb.connect((blocks_streams_to_stream_0, 0), (gr_skiphead_0, 0))
tb.connect((gr_skiphead_0, 0), (viterbi, 0))
tb.connect((viterbi, 0), (gr_vector_sink_x_0, 0))
diff --git a/gr-trellis/src/examples/python/test_pccc_turbo1.py b/gr-trellis/examples/python/test_pccc_turbo1.py
index 0655b972de..121659ccf5 100755
--- a/gr-trellis/src/examples/python/test_pccc_turbo1.py
+++ b/gr-trellis/examples/python/test_pccc_turbo1.py
@@ -1,13 +1,18 @@
#!/usr/bin/env python
from gnuradio import gr
-from gnuradio import trellis, digital
+from gnuradio import trellis, digital, blocks
from gnuradio import eng_notation
import math
import sys
import random
import fsm_utils
+try:
+ from gnuradio import analog
+except ImportError:
+ sys.stderr.write("Error: Program requires gr-analog.\n")
+ sys.exit(1)
def run_test (fo,fi,interleaver,Kb,bitspersymbol,K,dimensionality,constellation,Es,N0,IT,seed):
tb = gr.top_block ()
@@ -20,15 +25,15 @@ def run_test (fo,fi,interleaver,Kb,bitspersymbol,K,dimensionality,constellation,
#src = gr.vector_source_s([0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1],False)
enc = trellis.pccc_encoder_ss(fo,0,fi,0,interleaver,K)
code = gr.vector_sink_s()
- mod = gr.chunks_to_symbols_sf(constellation,dimensionality)
+ mod = digital.chunks_to_symbols_sf(constellation,dimensionality)
# CHANNEL
- add = gr.add_ff()
- noise = gr.noise_source_f(gr.GR_GAUSSIAN,math.sqrt(N0/2),seed)
+ add = blocks.add_ff()
+ noise = analog.noise_source_f(analog.GR_GAUSSIAN,math.sqrt(N0/2),seed)
# RX
metrics_in = trellis.metrics_f(fi.O()*fo.O(),dimensionality,constellation,digital.TRELLIS_EUCLIDEAN) # data preprocessing to generate metrics for innner SISO
- scale = gr.multiply_const_ff(1.0/N0)
+ scale = blocks.multiply_const_ff(1.0/N0)
dec = trellis.pccc_decoder_s(fo,0,-1,fi,0,-1,interleaver,K,IT,trellis.TRELLIS_MIN_SUM)
fsmi2s = gr.unpacked_to_packed_ss(bitspersymbol,gr.GR_MSB_FIRST) # pack FSM input symbols to shorts
diff --git a/gr-trellis/src/examples/python/test_sccc_hard.py b/gr-trellis/examples/python/test_sccc_hard.py
index 4eeb94a12d..8676a6064d 100755
--- a/gr-trellis/src/examples/python/test_sccc_hard.py
+++ b/gr-trellis/examples/python/test_sccc_hard.py
@@ -1,13 +1,19 @@
#!/usr/bin/env python
from gnuradio import gr
-from gnuradio import trellis, digital
+from gnuradio import trellis, digital, blocks
from gnuradio import eng_notation
import math
import sys
import random
import fsm_utils
+try:
+ from gnuradio import analog
+except ImportError:
+ sys.stderr.write("Error: Program requires gr-analog.\n")
+ sys.exit(1)
+
def run_test (fo,fi,interleaver,Kb,bitspersymbol,K,dimensionality,constellation,N0,seed):
tb = gr.top_block ()
@@ -19,11 +25,11 @@ def run_test (fo,fi,interleaver,Kb,bitspersymbol,K,dimensionality,constellation,
enc_out = trellis.encoder_ss(fo,0) # initial state = 0
inter = trellis.permutation(interleaver.K(),interleaver.INTER(),1,gr.sizeof_short)
enc_in = trellis.encoder_ss(fi,0) # initial state = 0
- mod = gr.chunks_to_symbols_sf(constellation,dimensionality)
+ mod = digital.chunks_to_symbols_sf(constellation,dimensionality)
# CHANNEL
- add = gr.add_ff()
- noise = gr.noise_source_f(gr.GR_GAUSSIAN,math.sqrt(N0/2),seed)
+ add = blocks.add_ff()
+ noise = analog.noise_source_f(analog.GR_GAUSSIAN,math.sqrt(N0/2),seed)
# RX
metrics_in = trellis.metrics_f(fi.O(),dimensionality,constellation,digital.TRELLIS_EUCLIDEAN) # data preprocessing to generate metrics for innner Viterbi
diff --git a/gr-trellis/src/examples/python/test_sccc_soft.py b/gr-trellis/examples/python/test_sccc_soft.py
index 10c28419a8..1885934a46 100755
--- a/gr-trellis/src/examples/python/test_sccc_soft.py
+++ b/gr-trellis/examples/python/test_sccc_soft.py
@@ -1,15 +1,18 @@
#!/usr/bin/env python
from gnuradio import gr
-from gnuradio import trellis, digital
+from gnuradio import trellis, digital, blocks
from gnuradio import eng_notation
import math
import sys
import random
import fsm_utils
-
-
+try:
+ from gnuradio import analog
+except ImportError:
+ sys.stderr.write("Error: Program requires gr-analog.\n")
+ sys.exit(1)
def run_test (fo,fi,interleaver,Kb,bitspersymbol,K,dimensionality,constellation,N0,seed):
tb = gr.top_block ()
@@ -22,11 +25,11 @@ def run_test (fo,fi,interleaver,Kb,bitspersymbol,K,dimensionality,constellation,
enc_out = trellis.encoder_ss(fo,0) # initial state = 0
inter = trellis.permutation(interleaver.K(),interleaver.INTER(),1,gr.sizeof_short)
enc_in = trellis.encoder_ss(fi,0) # initial state = 0
- mod = gr.chunks_to_symbols_sf(constellation,dimensionality)
+ mod = digital.chunks_to_symbols_sf(constellation,dimensionality)
# CHANNEL
- add = gr.add_ff()
- noise = gr.noise_source_f(gr.GR_GAUSSIAN,math.sqrt(N0/2),seed)
+ add = blocks.add_ff()
+ noise = analog.noise_source_f(analog.GR_GAUSSIAN,math.sqrt(N0/2),seed)
# RX
metrics_in = trellis.metrics_f(fi.O(),dimensionality,constellation,digital.TRELLIS_EUCLIDEAN) # data preprocessing to generate metrics for innner Viterbi
diff --git a/gr-trellis/src/examples/python/test_sccc_turbo.py b/gr-trellis/examples/python/test_sccc_turbo.py
index 762a93ba51..677c07a05c 100755
--- a/gr-trellis/src/examples/python/test_sccc_turbo.py
+++ b/gr-trellis/examples/python/test_sccc_turbo.py
@@ -1,18 +1,22 @@
#!/usr/bin/env python
from gnuradio import gr
-from gnuradio import trellis, digital
+from gnuradio import trellis, digital, blocks
from gnuradio import eng_notation
import math
import sys
import random
import fsm_utils
-
+try:
+ from gnuradio import analog
+except ImportError:
+ sys.stderr.write("Error: Program requires gr-analog.\n")
+ sys.exit(1)
def make_rx(tb,fo,fi,dimensionality,constellation,K,interleaver,IT,Es,N0,type):
metrics_in = trellis.metrics_f(fi.O(),dimensionality,constellation,digital.TRELLIS_EUCLIDEAN) # data preprocessing to generate metrics for innner Viterbi
- scale = gr.multiply_const_ff(1.0/N0)
+ scale = blocks.multiply_const_ff(1.0/N0)
gnd = gr.vector_source_f([0],True);
inter=[]
@@ -61,11 +65,11 @@ def run_test (fo,fi,interleaver,Kb,bitspersymbol,K,dimensionality,constellation,
enc_out = trellis.encoder_ss(fo,0) # initial state = 0
inter = trellis.permutation(interleaver.K(),interleaver.INTER(),1,gr.sizeof_short)
enc_in = trellis.encoder_ss(fi,0) # initial state = 0
- mod = gr.chunks_to_symbols_sf(constellation,dimensionality)
+ mod = digital.chunks_to_symbols_sf(constellation,dimensionality)
# CHANNEL
- add = gr.add_ff()
- noise = gr.noise_source_f(gr.GR_GAUSSIAN,math.sqrt(N0/2),seed)
+ add = blocks.add_ff()
+ noise = analog.noise_source_f(analog.GR_GAUSSIAN,math.sqrt(N0/2),seed)
# RX
(head,tail) = make_rx(tb,fo,fi,dimensionality,constellation,K,interleaver,IT,Es,N0,trellis.TRELLIS_MIN_SUM)
diff --git a/gr-trellis/src/examples/python/test_sccc_turbo1.py b/gr-trellis/examples/python/test_sccc_turbo1.py
index 187a75185f..62a0b6e318 100755
--- a/gr-trellis/src/examples/python/test_sccc_turbo1.py
+++ b/gr-trellis/examples/python/test_sccc_turbo1.py
@@ -1,13 +1,18 @@
#!/usr/bin/env python
from gnuradio import gr
-from gnuradio import trellis, digital
+from gnuradio import trellis, digital, blocks
from gnuradio import eng_notation
import math
import sys
import random
import fsm_utils
+try:
+ from gnuradio import analog
+except ImportError:
+ sys.stderr.write("Error: Program requires gr-analog.\n")
+ sys.exit(1)
def run_test (fo,fi,interleaver,Kb,bitspersymbol,K,dimensionality,constellation,Es,N0,IT,seed):
tb = gr.top_block ()
@@ -17,11 +22,11 @@ def run_test (fo,fi,interleaver,Kb,bitspersymbol,K,dimensionality,constellation,
src_head = gr.head (gr.sizeof_short,Kb/16) # packet size in shorts
s2fsmi = gr.packed_to_unpacked_ss(bitspersymbol,gr.GR_MSB_FIRST) # unpack shorts to symbols compatible with the outer FSM input cardinality
enc = trellis.sccc_encoder_ss(fo,0,fi,0,interleaver,K)
- mod = gr.chunks_to_symbols_sf(constellation,dimensionality)
+ mod = digital.chunks_to_symbols_sf(constellation,dimensionality)
# CHANNEL
- add = gr.add_ff()
- noise = gr.noise_source_f(gr.GR_GAUSSIAN,math.sqrt(N0/2),seed)
+ add = blocks.add_ff()
+ noise = analog.noise_source_f(analog.GR_GAUSSIAN,math.sqrt(N0/2),seed)
# RX
dec = trellis.sccc_decoder_combined_fs(fo,0,-1,fi,0,-1,interleaver,K,IT,trellis.TRELLIS_MIN_SUM,dimensionality,constellation,digital.TRELLIS_EUCLIDEAN,1.0)
diff --git a/gr-trellis/src/examples/python/test_sccc_turbo2.py b/gr-trellis/examples/python/test_sccc_turbo2.py
index dff1ba93c3..510748a68a 100755
--- a/gr-trellis/src/examples/python/test_sccc_turbo2.py
+++ b/gr-trellis/examples/python/test_sccc_turbo2.py
@@ -1,13 +1,18 @@
#!/usr/bin/env python
from gnuradio import gr
-from gnuradio import trellis, digital
+from gnuradio import trellis, digital, blocks
from gnuradio import eng_notation
import math
import sys
import random
import fsm_utils
+try:
+ from gnuradio import analog
+except ImportError:
+ sys.stderr.write("Error: Program requires gr-analog.\n")
+ sys.exit(1)
def run_test (fo,fi,interleaver,Kb,bitspersymbol,K,dimensionality,constellation,Es,N0,IT,seed):
tb = gr.top_block ()
@@ -17,15 +22,15 @@ def run_test (fo,fi,interleaver,Kb,bitspersymbol,K,dimensionality,constellation,
src_head = gr.head (gr.sizeof_short,Kb/16) # packet size in shorts
s2fsmi = gr.packed_to_unpacked_ss(bitspersymbol,gr.GR_MSB_FIRST) # unpack shorts to symbols compatible with the outer FSM input cardinality
enc = trellis.sccc_encoder_ss(fo,0,fi,0,interleaver,K)
- mod = gr.chunks_to_symbols_sf(constellation,dimensionality)
+ mod = digital.chunks_to_symbols_sf(constellation,dimensionality)
# CHANNEL
- add = gr.add_ff()
- noise = gr.noise_source_f(gr.GR_GAUSSIAN,math.sqrt(N0/2),seed)
+ add = blocks.add_ff()
+ noise = analog.noise_source_f(analog.GR_GAUSSIAN,math.sqrt(N0/2),seed)
# RX
metrics_in = trellis.metrics_f(fi.O(),dimensionality,constellation,digital.TRELLIS_EUCLIDEAN) # data preprocessing to generate metrics for innner SISO
- scale = gr.multiply_const_ff(1.0/N0)
+ scale = blocks.multiply_const_ff(1.0/N0)
dec = trellis.sccc_decoder_s(fo,0,-1,fi,0,-1,interleaver,K,IT,trellis.TRELLIS_MIN_SUM)
fsmi2s = gr.unpacked_to_packed_ss(bitspersymbol,gr.GR_MSB_FIRST) # pack FSM input symbols to shorts
dst = gr.check_lfsr_32k_s()
diff --git a/gr-trellis/src/examples/python/test_tcm.py b/gr-trellis/examples/python/test_tcm.py
index a7d6a02d04..aca06f783e 100755
--- a/gr-trellis/src/examples/python/test_tcm.py
+++ b/gr-trellis/examples/python/test_tcm.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
from gnuradio import gr
-from gnuradio import trellis, digital
+from gnuradio import trellis, digital, blocks
from gnuradio import eng_notation
import math
import sys
@@ -10,6 +10,12 @@ import fsm_utils
from gnuradio.eng_option import eng_option
from optparse import OptionParser
+try:
+ from gnuradio import analog
+except ImportError:
+ sys.stderr.write("Error: Program requires gr-analog.\n")
+ sys.exit(1)
+
def run_test (f,Kb,bitspersymbol,K,dimensionality,constellation,N0,seed):
tb = gr.top_block ()
@@ -24,11 +30,11 @@ def run_test (f,Kb,bitspersymbol,K,dimensionality,constellation,N0,seed):
#b2s = gr.unpacked_to_packed_ss(1,gr.GR_MSB_FIRST) # pack bits in shorts
s2fsmi = gr.packed_to_unpacked_ss(bitspersymbol,gr.GR_MSB_FIRST) # unpack shorts to symbols compatible with the FSM input cardinality
enc = trellis.encoder_ss(f,0) # initial state = 0
- mod = gr.chunks_to_symbols_sf(constellation,dimensionality)
+ mod = digital.chunks_to_symbols_sf(constellation,dimensionality)
# CHANNEL
- add = gr.add_ff()
- noise = gr.noise_source_f(gr.GR_GAUSSIAN,math.sqrt(N0/2),seed)
+ add = blocks.add_ff()
+ noise = analog.noise_source_f(analog.GR_GAUSSIAN,math.sqrt(N0/2),seed)
# RX
metrics = trellis.metrics_f(f.O(),dimensionality,constellation,digital.TRELLIS_EUCLIDEAN) # data preprocessing to generate metrics for Viterbi
diff --git a/gr-trellis/src/examples/python/test_tcm_bit.py b/gr-trellis/examples/python/test_tcm_bit.py
index 7f69c0e294..4438db91ac 100755
--- a/gr-trellis/src/examples/python/test_tcm_bit.py
+++ b/gr-trellis/examples/python/test_tcm_bit.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
from gnuradio import gr
-from gnuradio import trellis, digital
+from gnuradio import trellis, digital, blocks
from gnuradio import eng_notation
import math
import sys
@@ -10,6 +10,11 @@ import fsm_utils
from gnuradio.eng_option import eng_option
from optparse import OptionParser
+try:
+ from gnuradio import analog
+except ImportError:
+ sys.stderr.write("Error: Program requires gr-analog.\n")
+ sys.exit(1)
def run_test (f,Kb,bitspersymbol,K,dimensionality,constellation,N0,seed):
tb = gr.top_block ()
@@ -25,12 +30,12 @@ def run_test (f,Kb,bitspersymbol,K,dimensionality,constellation,N0,seed):
b2s = gr.unpacked_to_packed_ss(1,gr.GR_MSB_FIRST) # pack bits in shorts
s2fsmi = gr.packed_to_unpacked_ss(bitspersymbol,gr.GR_MSB_FIRST) # unpack shorts to symbols compatible with the FSM input cardinality
enc = trellis.encoder_ss(f,0) # initial state = 0
- mod = gr.chunks_to_symbols_sf(constellation,dimensionality)
+ mod = digital.chunks_to_symbols_sf(constellation,dimensionality)
# CHANNEL
- add = gr.add_ff()
- noise = gr.noise_source_f(gr.GR_GAUSSIAN,math.sqrt(N0/2),seed)
+ add = blocks.add_ff()
+ noise = analog.noise_source_f(analog.GR_GAUSSIAN,math.sqrt(N0/2),seed)
# RX
diff --git a/gr-trellis/src/examples/python/test_tcm_combined.py b/gr-trellis/examples/python/test_tcm_combined.py
index d98e36e27d..a0cd58c6df 100755
--- a/gr-trellis/src/examples/python/test_tcm_combined.py
+++ b/gr-trellis/examples/python/test_tcm_combined.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
from gnuradio import gr
-from gnuradio import trellis, digital
+from gnuradio import trellis, digital, blocks
from gnuradio import eng_notation
import math
import sys
@@ -9,6 +9,11 @@ import fsm_utils
from gnuradio.eng_option import eng_option
from optparse import OptionParser
+try:
+ from gnuradio import analog
+except ImportError:
+ sys.stderr.write("Error: Program requires gr-analog.\n")
+ sys.exit(1)
def run_test (f,Kb,bitspersymbol,K,dimensionality,constellation,N0,seed):
tb = gr.top_block ()
@@ -18,12 +23,12 @@ def run_test (f,Kb,bitspersymbol,K,dimensionality,constellation,N0,seed):
src_head = gr.head (gr.sizeof_short,Kb/16) # packet size in shorts
s2fsmi = gr.packed_to_unpacked_ss(bitspersymbol,gr.GR_MSB_FIRST) # unpack shorts to symbols compatible with the FSM input cardinality
enc = trellis.encoder_ss(f,0) # initial state = 0
- mod = gr.chunks_to_symbols_sf(constellation,dimensionality)
+ mod = digital.chunks_to_symbols_sf(constellation,dimensionality)
# CHANNEL
- add = gr.add_ff()
- noise = gr.noise_source_f(gr.GR_GAUSSIAN,math.sqrt(N0/2),seed)
+ add = blocks.add_ff()
+ noise = analog.noise_source_f(analog.GR_GAUSSIAN,math.sqrt(N0/2),seed)
# RX
diff --git a/gr-trellis/src/examples/python/test_tcm_parallel.py b/gr-trellis/examples/python/test_tcm_parallel.py
index 0372351aad..0bd6f739c1 100755
--- a/gr-trellis/src/examples/python/test_tcm_parallel.py
+++ b/gr-trellis/examples/python/test_tcm_parallel.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
from gnuradio import gr
-from gnuradio import trellis, digital
+from gnuradio import trellis, digital, blocks
from gnuradio import eng_notation
import math
import sys
@@ -9,6 +9,11 @@ import fsm_utils
from gnuradio.eng_option import eng_option
from optparse import OptionParser
+try:
+ from gnuradio import analog
+except ImportError:
+ sys.stderr.write("Error: Program requires gr-analog.\n")
+ sys.exit(1)
def run_test (f,Kb,bitspersymbol,K,dimensionality,constellation,N0,seed,P):
tb = gr.top_block ()
@@ -17,21 +22,21 @@ def run_test (f,Kb,bitspersymbol,K,dimensionality,constellation,N0,seed,P):
src = gr.lfsr_32k_source_s()
src_head = gr.head (gr.sizeof_short,Kb/16*P) # packet size in shorts
s2fsmi=gr.packed_to_unpacked_ss(bitspersymbol,gr.GR_MSB_FIRST) # unpack shorts to symbols compatible with the FSM input cardinality
- s2p = gr.stream_to_streams(gr.sizeof_short,P) # serial to parallel
+ s2p = blocks.stream_to_streams(gr.sizeof_short,P) # serial to parallel
enc = trellis.encoder_ss(f,0) # initiali state = 0
- mod = gr.chunks_to_symbols_sf(constellation,dimensionality)
+ mod = digital.chunks_to_symbols_sf(constellation,dimensionality)
# CHANNEL
add=[]
noise=[]
for i in range(P):
- add.append(gr.add_ff())
- noise.append(gr.noise_source_f(gr.GR_GAUSSIAN,math.sqrt(N0/2),seed))
+ add.append(blocks.add_ff())
+ noise.append(analog.noise_source_f(analog.GR_GAUSSIAN,math.sqrt(N0/2),seed))
# RX
metrics = trellis.metrics_f(f.O(),dimensionality,constellation,digital.TRELLIS_EUCLIDEAN) # data preprocessing to generate metrics for Viterbi
va = trellis.viterbi_s(f,K,0,-1) # Put -1 if the Initial/Final states are not set.
- p2s = gr.streams_to_stream(gr.sizeof_short,P) # parallel to serial
+ p2s = block.streams_to_stream(gr.sizeof_short,P) # parallel to serial
fsmi2s=gr.unpacked_to_packed_ss(bitspersymbol,gr.GR_MSB_FIRST) # pack FSM input symbols to shorts
dst = gr.check_lfsr_32k_s()
diff --git a/gr-trellis/src/examples/python/test_turbo_equalization.py b/gr-trellis/examples/python/test_turbo_equalization.py
index 18bfb022a9..b0889bdcef 100755
--- a/gr-trellis/src/examples/python/test_turbo_equalization.py
+++ b/gr-trellis/examples/python/test_turbo_equalization.py
@@ -1,16 +1,21 @@
#!/usr/bin/env python
from gnuradio import gr
-from gnuradio import trellis, digital
+from gnuradio import trellis, digital, blocks
from gnuradio import eng_notation
import math
import sys
import fsm_utils
+try:
+ from gnuradio import analog
+except ImportError:
+ sys.stderr.write("Error: Program requires gr-analog.\n")
+ sys.exit(1)
def make_rx(tb,fo,fi,dimensionality,tot_constellation,K,interleaver,IT,Es,N0,type):
metrics_in = trellis.metrics_f(fi.O(),dimensionality,tot_constellation,digital.TRELLIS_EUCLIDEAN) # data preprocessing to generate metrics for innner SISO
- scale = gr.multiply_const_ff(1.0/N0)
+ scale = blocks.multiply_const_ff(1.0/N0)
gnd = gr.vector_source_f([0],True);
inter=[]
@@ -59,11 +64,11 @@ def run_test (fo,fi,interleaver,Kb,bitspersymbol,K,dimensionality,tot_constellat
inter = trellis.permutation(interleaver.K(),interleaver.INTER(),1,gr.sizeof_short)
enc_in = trellis.encoder_ss(fi,0) # initial state = 0
# essentially here we implement the combination of modulation and channel as a memoryless modulation (the memory induced by the channel is hidden in the innner FSM)
- mod = gr.chunks_to_symbols_sf(tot_constellation,dimensionality)
+ mod = digital.chunks_to_symbols_sf(tot_constellation,dimensionality)
# CHANNEL
- add = gr.add_ff()
- noise = gr.noise_source_f(gr.GR_GAUSSIAN,math.sqrt(N0/2),seed)
+ add = blocks.add_ff()
+ noise = analog.noise_source_f(analog.GR_GAUSSIAN,math.sqrt(N0/2),seed)
# RX
(head,tail) = make_rx(tb,fo,fi,dimensionality,tot_constellation,K,interleaver,IT,Es,N0,trellis.TRELLIS_MIN_SUM)
diff --git a/gr-trellis/src/examples/python/test_turbo_equalization1.py b/gr-trellis/examples/python/test_turbo_equalization1.py
index 17ad430235..ae7e3e374b 100755
--- a/gr-trellis/src/examples/python/test_turbo_equalization1.py
+++ b/gr-trellis/examples/python/test_turbo_equalization1.py
@@ -1,16 +1,22 @@
#!/usr/bin/env python
from gnuradio import gr
-from gnuradio import trellis, digital
+from gnuradio import trellis, digital, filter, blocks
from gnuradio import eng_notation
import math
import sys
import random
import fsm_utils
+try:
+ from gnuradio import analog
+except ImportError:
+ sys.stderr.write("Error: Program requires gr-analog.\n")
+ sys.exit(1)
+
def make_rx(tb,fo,fi,dimensionality,tot_constellation,K,interleaver,IT,Es,N0,type):
metrics_in = trellis.metrics_f(fi.O(),dimensionality,tot_constellation,digital.TRELLIS_EUCLIDEAN) # data preprocessing to generate metrics for innner SISO
- scale = gr.multiply_const_ff(1.0/N0)
+ scale = blocks.multiply_const_ff(1.0/N0)
gnd = gr.vector_source_f([0],True);
inter=[]
@@ -61,12 +67,12 @@ def run_test (fo,fi,interleaver,Kb,bitspersymbol,K,channel,modulation,dimensiona
src = gr.vector_source_s(packet,False)
enc_out = trellis.encoder_ss(fo,0) # initial state = 0
inter = trellis.permutation(interleaver.K(),interleaver.INTER(),1,gr.sizeof_short)
- mod = gr.chunks_to_symbols_sf(modulation[1],modulation[0])
+ mod = digital.chunks_to_symbols_sf(modulation[1],modulation[0])
# CHANNEL
- isi = gr.fir_filter_fff(1,channel)
- add = gr.add_ff()
- noise = gr.noise_source_f(gr.GR_GAUSSIAN,math.sqrt(N0/2),seed)
+ isi = filter.fir_filter_fff(1,channel)
+ add = blocks.add_ff()
+ noise = analog.noise_source_f(analog.GR_GAUSSIAN,math.sqrt(N0/2),seed)
# RX
(head,tail) = make_rx(tb,fo,fi,dimensionality,tot_constellation,K,interleaver,IT,Es,N0,trellis.TRELLIS_MIN_SUM)
diff --git a/gr-trellis/src/examples/python/test_turbo_equalization2.py b/gr-trellis/examples/python/test_turbo_equalization2.py
index 5a6c77e9d4..eed5675fe5 100755
--- a/gr-trellis/src/examples/python/test_turbo_equalization2.py
+++ b/gr-trellis/examples/python/test_turbo_equalization2.py
@@ -1,15 +1,21 @@
#!/usr/bin/env python
from gnuradio import gr
-from gnuradio import trellis, digital
+from gnuradio import trellis, digital, filter, blocks
from gnuradio import eng_notation
import math
import sys
import random
import fsm_utils
+try:
+ from gnuradio import analog
+except ImportError:
+ sys.stderr.write("Error: Program requires gr-analog.\n")
+ sys.exit(1)
+
def make_rx(tb,fo,fi,dimensionality,tot_constellation,K,interleaver,IT,Es,N0,type):
- scale = gr.multiply_const_ff(math.sqrt(1.0/N0))
+ scale = blocks.multiply_const_ff(math.sqrt(1.0/N0))
gnd = gr.vector_source_f([0],True);
inter=[]
@@ -59,12 +65,12 @@ def run_test (fo,fi,interleaver,Kb,bitspersymbol,K,channel,modulation,dimensiona
src = gr.vector_source_s(packet,False)
enc_out = trellis.encoder_ss(fo,0) # initial state = 0
inter = trellis.permutation(interleaver.K(),interleaver.INTER(),1,gr.sizeof_short)
- mod = gr.chunks_to_symbols_sf(modulation[1],modulation[0])
+ mod = digital.chunks_to_symbols_sf(modulation[1],modulation[0])
# CHANNEL
- isi = gr.fir_filter_fff(1,channel)
- add = gr.add_ff()
- noise = gr.noise_source_f(gr.GR_GAUSSIAN,math.sqrt(N0/2),seed)
+ isi = filter.fir_filter_fff(1,channel)
+ add = blocks.add_ff()
+ noise = analog.noise_source_f(analog.GR_GAUSSIAN,math.sqrt(N0/2),seed)
# RX
(head,tail) = make_rx(tb,fo,fi,dimensionality,tot_constellation,K,interleaver,IT,Es,N0,trellis.TRELLIS_MIN_SUM)
diff --git a/gr-trellis/src/examples/python/test_viterbi_equalization.py b/gr-trellis/examples/python/test_viterbi_equalization.py
index 9f3f7e3911..21236d2870 100755
--- a/gr-trellis/src/examples/python/test_viterbi_equalization.py
+++ b/gr-trellis/examples/python/test_viterbi_equalization.py
@@ -1,12 +1,18 @@
#!/usr/bin/env python
from gnuradio import gr
-from gnuradio import trellis, digital
+from gnuradio import trellis, digital, blocks
from gnuradio import eng_notation
import math
import sys
import fsm_utils
+try:
+ from gnuradio import analog
+except ImportError:
+ sys.stderr.write("Error: Program requires gr-analog.\n")
+ sys.exit(1)
+
def run_test (f,Kb,bitspersymbol,K,dimensionality,tot_constellation,N0,seed):
tb = gr.top_block ()
@@ -16,11 +22,11 @@ def run_test (f,Kb,bitspersymbol,K,dimensionality,tot_constellation,N0,seed):
s2fsmi = gr.packed_to_unpacked_ss(bitspersymbol,gr.GR_MSB_FIRST) # unpack shorts to symbols compatible with the FSM input cardinality
enc = trellis.encoder_ss(f,0) # initial state = 0
# essentially here we implement the combination of modulation and channel as a memoryless modulation (the memory induced by the channel is hidden in the FSM)
- mod = gr.chunks_to_symbols_sf(tot_constellation,dimensionality)
+ mod = digital.chunks_to_symbols_sf(tot_constellation,dimensionality)
# CHANNEL
- add = gr.add_ff()
- noise = gr.noise_source_f(gr.GR_GAUSSIAN,math.sqrt(N0/2),seed)
+ add = blocks.add_ff()
+ noise = analog.noise_source_f(analog.GR_GAUSSIAN,math.sqrt(N0/2),seed)
# RX
metrics = trellis.metrics_f(f.O(),dimensionality,tot_constellation,digital.TRELLIS_EUCLIDEAN) # data preprocessing to generate metrics for Viterbi
diff --git a/gr-trellis/src/examples/python/test_viterbi_equalization1.py b/gr-trellis/examples/python/test_viterbi_equalization1.py
index 90eb4790e5..df46046ae3 100755
--- a/gr-trellis/src/examples/python/test_viterbi_equalization1.py
+++ b/gr-trellis/examples/python/test_viterbi_equalization1.py
@@ -1,13 +1,19 @@
#!/usr/bin/env python
from gnuradio import gr
-from gnuradio import trellis, digital
+from gnuradio import trellis, digital, filter, blocks
from gnuradio import eng_notation
import math
import sys
import random
import fsm_utils
+try:
+ from gnuradio import analog
+except ImportError:
+ sys.stderr.write("Error: Program requires gr-analog.\n")
+ sys.exit(1)
+
def run_test (f,Kb,bitspersymbol,K,channel,modulation,dimensionality,tot_constellation,N0,seed):
tb = gr.top_block ()
L = len(channel)
@@ -22,12 +28,12 @@ def run_test (f,Kb,bitspersymbol,K,channel,modulation,dimensionality,tot_constel
packet[i] = 0
packet[len(packet)-i-1] = 0
src = gr.vector_source_s(packet,False)
- mod = gr.chunks_to_symbols_sf(modulation[1],modulation[0])
+ mod = digital.chunks_to_symbols_sf(modulation[1],modulation[0])
# CHANNEL
- isi = gr.fir_filter_fff(1,channel)
- add = gr.add_ff()
- noise = gr.noise_source_f(gr.GR_GAUSSIAN,math.sqrt(N0/2),seed)
+ isi = filter.fir_filter_fff(1,channel)
+ add = blockss.add_ff()
+ noise = analog.noise_source_f(analog.GR_GAUSSIAN,math.sqrt(N0/2),seed)
# RX
skip = gr.skiphead(gr.sizeof_float, L) # skip the first L samples since you know they are coming from the L zero symbols
diff --git a/gr-trellis/include/trellis/CMakeLists.txt b/gr-trellis/include/trellis/CMakeLists.txt
new file mode 100644
index 0000000000..6abb93a6f4
--- /dev/null
+++ b/gr-trellis/include/trellis/CMakeLists.txt
@@ -0,0 +1,102 @@
+# Copyright 2012 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.
+
+########################################################################
+# generate helper scripts to expand templated files
+########################################################################
+include(GrPython)
+
+file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/generate_helper.py "
+#!${PYTHON_EXECUTABLE}
+
+import sys, os, re
+sys.path.append('${GR_CORE_PYTHONPATH}')
+os.environ['srcdir'] = '${CMAKE_CURRENT_SOURCE_DIR}'
+os.chdir('${CMAKE_CURRENT_BINARY_DIR}')
+
+if __name__ == '__main__':
+ import build_utils
+ root, inp = sys.argv[1:3]
+ for sig in sys.argv[3:]:
+ name = re.sub ('X+', sig, root)
+ d = build_utils.standard_dict2(name, sig, 'trellis')
+ build_utils.expand_template(d, inp)
+
+")
+
+macro(expand_h root)
+ #make a list of all the generated files
+ unset(expanded_files_h)
+ foreach(sig ${ARGN})
+ string(REGEX REPLACE "X+" ${sig} name ${root})
+ list(APPEND expanded_files_h ${CMAKE_CURRENT_BINARY_DIR}/${name}.h)
+ endforeach(sig)
+
+ #create a command to generate the files
+ add_custom_command(
+ OUTPUT ${expanded_files_h}
+ DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${root}.h.t
+ COMMAND ${PYTHON_EXECUTABLE} ${PYTHON_DASH_B}
+ ${CMAKE_CURRENT_BINARY_DIR}/generate_helper.py
+ ${root} ${root}.h.t ${ARGN}
+ )
+
+ #install rules for the generated h files
+ list(APPEND generated_includes ${expanded_files_h})
+endmacro(expand_h)
+
+########################################################################
+# Invoke macro to generate various sources
+#######################################################################
+expand_h(encoder_XX bb bs bi ss si ii)
+expand_h(sccc_encoder_XX bb bs bi ss si ii)
+expand_h(pccc_encoder_XX bb bs bi ss si ii)
+expand_h(metrics_X s i f c)
+expand_h(viterbi_X b s i)
+expand_h(viterbi_combined_XX sb ss si ib is ii fb fs fi cb cs ci)
+expand_h(sccc_decoder_X b s i)
+expand_h(sccc_decoder_combined_XX fb fs fi cb cs ci)
+expand_h(pccc_decoder_X b s i)
+expand_h(pccc_decoder_combined_XX fb fs fi cb cs ci)
+
+add_custom_target(trellis_generated_includes DEPENDS
+ ${generated_includes}
+)
+
+########################################################################
+# Install header files
+########################################################################
+install(FILES
+ ${generated_includes}
+ api.h
+ base.h
+ calc_metric.h
+ constellation_metrics_cf.h
+ core_algorithms.h
+ fsm.h
+ interleaver.h
+ permutation.h
+ quicksort_index.h
+ siso_type.h
+ siso_combined_f.h
+ siso_f.h
+ DESTINATION ${GR_INCLUDE_DIR}/gnuradio/trellis
+ COMPONENT "trellis_devel"
+)
+
diff --git a/gr-trellis/src/lib/trellis_api.h b/gr-trellis/include/trellis/api.h
index c09b340d6d..c09b340d6d 100644
--- a/gr-trellis/src/lib/trellis_api.h
+++ b/gr-trellis/include/trellis/api.h
diff --git a/gr-trellis/src/lib/base.h b/gr-trellis/include/trellis/base.h
index aa407cbec1..c69500d0df 100644
--- a/gr-trellis/src/lib/base.h
+++ b/gr-trellis/include/trellis/base.h
@@ -1,6 +1,6 @@
/* -*- c++ -*- */
/*
- * Copyright 2002 Free Software Foundation, Inc.
+ * Copyright 2002,2012 Free Software Foundation, Inc.
*
* This file is part of GNU Radio
*
@@ -25,14 +25,19 @@
#include <vector>
-/*!
- * \brief change base
- */
+namespace gr {
+ namespace trellis {
+
+ /*!
+ * \brief change base
+ */
+ bool dec2base(unsigned int num, int base, std::vector<int> &s);
+ bool dec2bases(unsigned int num, const std::vector<int> &bases, std::vector<int> &s);
+ unsigned int base2dec(const std::vector<int> &s, int base);
+ unsigned int bases2dec(const std::vector<int> &s, const std::vector<int> &bases);
-bool dec2base(unsigned int num, int base, std::vector<int> &s);
-bool dec2bases(unsigned int num, const std::vector<int> &bases, std::vector<int> &s);
-unsigned int base2dec(const std::vector<int> &s, int base);
-unsigned int bases2dec(const std::vector<int> &s, const std::vector<int> &bases);
+ } /* namespace trellis */
+} /* namespace gr */
-#endif
+#endif /* INCLUDED_TRELLIS_BASE_H */
diff --git a/gr-trellis/include/trellis/calc_metric.h b/gr-trellis/include/trellis/calc_metric.h
new file mode 100644
index 0000000000..b39267dc84
--- /dev/null
+++ b/gr-trellis/include/trellis/calc_metric.h
@@ -0,0 +1,54 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004,2012 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.
+ */
+
+#ifndef INCLUDED_CALC_METRIC_H
+#define INCLUDED_CALC_METRIC_H
+
+#include <vector>
+#include <gr_complex.h>
+#include <digital/metric_type.h>
+
+namespace gr {
+ namespace trellis {
+
+ template <class T>
+ void calc_metric(int O, int D, const std::vector<T> &TABLE, const T *input,
+ float *metric, digital::trellis_metric_type_t type);
+
+ /*
+ void calc_metric(int O, int D, const std::vector<short> &TABLE, const short *input,
+ float *metric, digital::trellis_metric_type_t type);
+
+ void calc_metric(int O, int D, const std::vector<int> &TABLE, const int *input,
+ float *metric, digital::trellis_metric_type_t type);
+
+ void calc_metric(int O, int D, const std::vector<float> &TABLE, const float *input,
+ float *metric, digital::trellis_metric_type_t type);
+ */
+
+ void calc_metric(int O, int D, const std::vector<gr_complex> &TABLE, const gr_complex *input,
+ float *metric, digital::trellis_metric_type_t type);
+
+ } /* namespace trellis */
+} /* namespace gr */
+
+#endif /* INCLUDED_CALC_METRIC_H */
diff --git a/gr-trellis/include/trellis/constellation_metrics_cf.h b/gr-trellis/include/trellis/constellation_metrics_cf.h
new file mode 100644
index 0000000000..2dca6f7b5b
--- /dev/null
+++ b/gr-trellis/include/trellis/constellation_metrics_cf.h
@@ -0,0 +1,51 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004,2010-2012 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.
+ */
+
+#ifndef INCLUDED_TRELLIS_CONSTELLATION_METRICS_CF_H
+#define INCLUDED_TRELLIS_CONSTELLATION_METRICS_CF_H
+
+#include <trellis/api.h>
+#include <gr_block.h>
+#include <digital/constellation.h>
+#include <digital/metric_type.h>
+
+namespace gr {
+ namespace trellis {
+
+ /*!
+ * \brief Evaluate metrics for use by the Viterbi algorithm.
+ * \ingroup coding_blk
+ */
+ class TRELLIS_API constellation_metrics_cf : virtual public gr_block
+ {
+ public:
+ // gr::trellis::constellation_metrics_cf::sptr
+ typedef boost::shared_ptr<constellation_metrics_cf> sptr;
+
+ static sptr make(digital::constellation_sptr constellation,
+ digital::trellis_metric_type_t TYPE);
+ };
+
+ } /* namespace trellis */
+} /* namespace gr */
+
+#endif /* INCLUDED_TRELLIS_CONSTELLATION_METRICS_CF_H */
diff --git a/gr-trellis/include/trellis/core_algorithms.h b/gr-trellis/include/trellis/core_algorithms.h
new file mode 100644
index 0000000000..2292845629
--- /dev/null
+++ b/gr-trellis/include/trellis/core_algorithms.h
@@ -0,0 +1,124 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004,2012 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.
+ */
+
+#ifndef INCLUDED_CORE_ALGORITHMS_H
+#define INCLUDED_CORE_ALGORITHMS_H
+
+#include <cmath>
+#include <vector>
+#include <digital/metric_type.h>
+#include <trellis/fsm.h>
+#include <trellis/interleaver.h>
+
+namespace gr {
+ namespace trellis {
+
+ float min(float a, float b);
+ float min_star(float a, float b);
+
+ template <class T>
+ void viterbi_algorithm(int I, int S, int O,
+ const std::vector<int> &NS,
+ const std::vector<int> &OS,
+ const std::vector< std::vector<int> > &PS,
+ const std::vector< std::vector<int> > &PI,
+ int K,
+ int S0,int SK,
+ const float *in, T *out);
+
+ template <class Ti, class To>
+ void viterbi_algorithm_combined(int I, int S, int O,
+ const std::vector<int> &NS,
+ const std::vector<int> &OS,
+ const std::vector< std::vector<int> > &PS,
+ const std::vector< std::vector<int> > &PI,
+ int K,
+ int S0,int SK,
+ int D,
+ const std::vector<Ti> &TABLE,
+ digital::trellis_metric_type_t TYPE,
+ const Ti *in, To *out);
+
+ void siso_algorithm(int I, int S, int O,
+ const std::vector<int> &NS,
+ const std::vector<int> &OS,
+ const std::vector< std::vector<int> > &PS,
+ const std::vector< std::vector<int> > &PI,
+ int K,
+ int S0,int SK,
+ bool POSTI, bool POSTO,
+ float (*p2mymin)(float,float),
+ const float *priori, const float *prioro, float *post);
+
+ template <class T>
+ void siso_algorithm_combined(int I, int S, int O,
+ const std::vector<int> &NS,
+ const std::vector<int> &OS,
+ const std::vector< std::vector<int> > &PS,
+ const std::vector< std::vector<int> > &PI,
+ int K,
+ int S0,int SK,
+ bool POSTI, bool POSTO,
+ float (*p2mymin)(float,float),
+ int D,
+ const std::vector<T> &TABLE,
+ digital::trellis_metric_type_t TYPE,
+ const float *priori, const T *observations, float *post);
+
+ template<class T>
+ void sccc_decoder(const fsm &FSMo, int STo0, int SToK,
+ const fsm &FSMi, int STi0, int STiK,
+ const interleaver &INTERLEAVER, int blocklength, int iterations,
+ float (*p2mymin)(float,float),
+ const float *iprioro, T *data);
+
+ template<class Ti, class To>
+ void sccc_decoder_combined(const fsm &FSMo, int STo0, int SToK,
+ const fsm &FSMi, int STi0, int STiK,
+ const interleaver &INTERLEAVER, int blocklength, int iterations,
+ float (*p2mymin)(float,float),
+ int D, const std::vector<Ti> &TABLE,
+ digital::trellis_metric_type_t METRIC_TYPE,
+ float scaling,
+ const Ti *observations, To *data);
+
+ template<class T>
+ void pccc_decoder(const fsm &FSM1, int ST10, int ST1K,
+ const fsm &FSM2, int ST20, int ST2K,
+ const interleaver &INTERLEAVER, int blocklength, int iterations,
+ float (*p2mymin)(float,float),
+ const float *cprioro, T *data);
+
+ template<class Ti, class To>
+ void pccc_decoder_combined(const fsm &FSM1, int ST10, int ST1K,
+ const fsm &FSM2, int ST20, int ST2K,
+ const interleaver &INTERLEAVER, int blocklength, int iterations,
+ float (*p2mymin)(float,float),
+ int D, const std::vector<Ti> &TABLE,
+ digital::trellis_metric_type_t METRIC_TYPE,
+ float scaling,
+ const Ti *observations, To *data);
+
+ } /* namespace trellis */
+} /* namespace gr */
+
+#endif /* INCLUDED_CORE_ALGORITHMS_H */
diff --git a/gr-trellis/src/lib/trellis_encoder_XX.h.t b/gr-trellis/include/trellis/encoder_XX.h.t
index 7c4250a929..c10b283f87 100644
--- a/gr-trellis/src/lib/trellis_encoder_XX.h.t
+++ b/gr-trellis/include/trellis/encoder_XX.h.t
@@ -1,6 +1,6 @@
/* -*- c++ -*- */
/*
- * Copyright 2004 Free Software Foundation, Inc.
+ * Copyright 2004,2012 Free Software Foundation, Inc.
*
* This file is part of GNU Radio
*
@@ -25,34 +25,30 @@
#ifndef @GUARD_NAME@
#define @GUARD_NAME@
-#include <trellis_api.h>
-#include "fsm.h"
+#include <trellis/api.h>
+#include <trellis/fsm.h>
#include <gr_sync_block.h>
-class @NAME@;
-typedef boost::shared_ptr<@NAME@> @SPTR_NAME@;
+namespace gr {
+ namespace trellis {
-TRELLIS_API @SPTR_NAME@ trellis_make_@BASE_NAME@ (const fsm &FSM, int ST);
+ /*!
+ * \brief Convolutional encoder.
+ * \ingroup coding_blk
+ */
+ class TRELLIS_API @NAME@ : virtual public gr_sync_block
+ {
+ public:
+ // gr::trellis::@BASE_NAME@::sptr
+ typedef boost::shared_ptr<@BASE_NAME@> sptr;
-/*!
- * \brief Convolutional encoder.
- * \ingroup coding_blk
- */
-class TRELLIS_API @NAME@ : public gr_sync_block
-{
-private:
- friend TRELLIS_API @SPTR_NAME@ trellis_make_@BASE_NAME@ (const fsm &FSM, int ST);
- fsm d_FSM;
- int d_ST;
- @NAME@ (const fsm &FSM, int ST);
-
-public:
- fsm FSM () const { return d_FSM; }
- int ST () const { return d_ST; }
-
- int work (int noutput_items,
- gr_vector_const_void_star &input_items,
- gr_vector_void_star &output_items);
-};
-
-#endif
+ static sptr make(const fsm &FSM, int ST);
+
+ virtual fsm FSM() const = 0;
+ virtual int ST() const = 0;
+ };
+
+ } /* namespace trellis */
+} /* namespace gr */
+
+#endif /* @GUARD_NAME@ */
diff --git a/gr-trellis/include/trellis/fsm.h b/gr-trellis/include/trellis/fsm.h
new file mode 100644
index 0000000000..a69925c1c7
--- /dev/null
+++ b/gr-trellis/include/trellis/fsm.h
@@ -0,0 +1,191 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2002,2011-2012 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.
+ */
+
+#ifndef INCLUDED_TRELLIS_FSM_H
+#define INCLUDED_TRELLIS_FSM_H
+
+#include <trellis/api.h>
+#include <vector>
+#include <iosfwd>
+
+namespace gr {
+ namespace trellis {
+
+ /*!
+ * \brief Finite State Machine Specification class.
+ *
+ * An instance of this class represents a finite state machine
+ * specification (FSMS) rather than the FSM itself. It particular
+ * the state of the FSM is not stored within an instance of this
+ * class.
+ */
+ class TRELLIS_API fsm
+ {
+ private:
+ // Input alphabet cardinality.
+ int d_I;
+
+ // Number of states.
+ int d_S;
+
+ // Output alphabet cardinality.
+ int d_O;
+
+ // NS means Next State.
+ // next_state = d_NS[current_state * d_I + input_symbol]
+ std::vector<int> d_NS;
+
+ // OS means Output Symbol.
+ // output_symbol = d_OS[current_state * d_I + input_symbol]
+ std::vector<int> d_OS;
+
+ // PS means Previous State.
+ std::vector< std::vector<int> > d_PS;
+
+ // PI means Previous Input Symbol.
+ // d_PS[current_state][k] and d_PI[current_state][k], is a pair of the form
+ // (previous_state, previous_input_symbol) that could have produced the
+ // current state.
+ std::vector< std::vector<int> > d_PI;
+
+ // TM means Termination matrix.
+ // d_TMl[s*d_S+es] is the shortest number of steps to get from state s to
+ // state es.
+ std::vector<int> d_TMl;
+
+ // d_TMi[s*d_S+es] is the input symbol required to set off on the shortest
+ // path from state s to es.
+ std::vector<int> d_TMi;
+ void generate_PS_PI ();
+ void generate_TM ();
+ bool find_es(int es);
+
+ public:
+ /*!
+ * \brief Constructor to create an uninitialized FSMS.
+ */
+ fsm();
+
+ /*!
+ * \brief Constructor to copy an FSMS.
+ */
+ fsm(const fsm &FSM);
+
+ /*!
+ * \brief Constructor to to create an FSMS.
+ *
+ * \param I The number of possible input symbols.
+ * \param S The number of possible FSM states.
+ * \param O The number of possible output symbols.
+ * \param NS A mapping from (current state, input symbol) to next state.
+ * next_state = NS[current_state * I + input_symbol]
+ * \param OS A mapping from (current state, input symbol) to output symbol.
+ * output_symbol = OS[current_state * I + input_symbol]
+ *
+ */
+ fsm(int I, int S, int O, const std::vector<int> &NS, const std::vector<int> &OS);
+
+ /*!
+ * \brief Constructor to create an FSMS from file contents.
+ *
+ * \param name filename
+ *
+ */
+ fsm(const char *name);
+
+ /*!
+ * \brief Creates an FSMS from the generator matrix of a (n, k) binary convolutional code.
+ *
+ * \param k ???
+ * \param n ???
+ * \param G ???
+ *
+ */
+ fsm(int k, int n, const std::vector<int> &G);
+
+ /*!
+ * \brief Creates an FSMS describing ISI.
+ *
+ * \param mod_size modulation size
+ * \param ch_length channel length
+ *
+ */
+ fsm(int mod_size, int ch_length);
+
+ /*!
+ * \brief Creates an FSMS describing the trellis for a CPM.
+ *
+ * \param P ???? h=K/P (relatively prime)
+ * \param M alphabet size
+ * \param L pulse duration
+ *
+ * This FSM is based on the paper by B. Rimoldi
+ * "A decomposition approach to CPM", IEEE Trans. Info Theory, March 1988
+ * See also my own notes at http://www.eecs.umich.edu/~anastas/docs/cpm.pdf
+ */
+ fsm(int P, int M, int L);
+
+ /*!
+ * \brief Creates an FSMS describing the joint trellis of two FSMs.
+ *
+ * \param FSM1 first FSMS
+ * \param FSM2 second FSMS
+ */
+ fsm(const fsm &FSM1, const fsm &FSM2);
+
+ /*!
+ * \brief Creates an FSMS representing n stages through the originial FSM (AKA radix-n FSM).
+ *
+ * \param FSM Original FSMs
+ * \param n Number of stages.
+ */
+ fsm(const fsm &FSM, int n);
+ int I() const { return d_I; }
+ int S() const { return d_S; }
+ int O() const { return d_O; }
+ const std::vector<int> & NS() const { return d_NS; }
+ const std::vector<int> & OS() const { return d_OS; }
+ const std::vector< std::vector<int> > & PS() const { return d_PS; }
+ const std::vector< std::vector<int> > & PI() const { return d_PI; }
+ const std::vector<int> & TMi() const { return d_TMi; }
+ const std::vector<int> & TMl() const { return d_TMl; }
+
+ /*!
+ * \brief Creates an svg image of the trellis representation.
+ *
+ * \param filename filename
+ * \param number_stages ????
+ */
+ void write_trellis_svg(std::string filename ,int number_stages);
+
+ /*!
+ * \brief Write the FSMS to a file.
+ *
+ * \param filename filename
+ */
+ void write_fsm_txt(std::string filename);
+ };
+
+ } /* namespace trellis */
+} /* namespace gr */
+
+#endif /* INCLUDED_TRELLIS_FSM_H */
diff --git a/gr-trellis/src/lib/interleaver.h b/gr-trellis/include/trellis/interleaver.h
index fbd378d621..7465f17986 100644
--- a/gr-trellis/src/lib/interleaver.h
+++ b/gr-trellis/include/trellis/interleaver.h
@@ -1,6 +1,6 @@
/* -*- c++ -*- */
/*
- * Copyright 2002 Free Software Foundation, Inc.
+ * Copyright 2002,2012 Free Software Foundation, Inc.
*
* This file is part of GNU Radio
*
@@ -23,27 +23,35 @@
#ifndef INCLUDED_TRELLIS_INTERLEAVER_H
#define INCLUDED_TRELLIS_INTERLEAVER_H
-#include <trellis_api.h>
+#include <trellis/api.h>
#include <vector>
-/*!
- * \brief INTERLEAVER class
- */
-class TRELLIS_API interleaver {
-private:
- int d_K;
- std::vector<int> d_INTER;
- std::vector<int> d_DEINTER;
-public:
- interleaver();
- interleaver(const interleaver & INTERLEAVER);
- interleaver(int K, const std::vector<int> & INTER);
- interleaver(const char *name);
- interleaver(int K, int seed);
- int K () const { return d_K; }
- const std::vector<int> & INTER () const { return d_INTER; }
- const std::vector<int> & DEINTER () const { return d_DEINTER; }
- void write_interleaver_txt(std::string filename);
-};
+namespace gr {
+ namespace trellis {
+
+ /*!
+ * \brief INTERLEAVER class
+ */
+ class TRELLIS_API interleaver
+ {
+ private:
+ int d_K;
+ std::vector<int> d_INTER;
+ std::vector<int> d_DEINTER;
+
+ public:
+ interleaver();
+ interleaver(const interleaver & INTERLEAVER);
+ interleaver(int K, const std::vector<int> & INTER);
+ interleaver(const char *name);
+ interleaver(int K, int seed);
+ int K () const { return d_K; }
+ const std::vector<int> & INTER() const { return d_INTER; }
+ const std::vector<int> & DEINTER() const { return d_DEINTER; }
+ void write_interleaver_txt(std::string filename);
+ };
+
+ } /* namespace trellis */
+} /* namespace gr */
-#endif
+#endif /* INCLUDED_TRELLIS_INTERLEAVER_H */
diff --git a/gr-trellis/include/trellis/metrics_X.h.t b/gr-trellis/include/trellis/metrics_X.h.t
new file mode 100644
index 0000000000..5605130c24
--- /dev/null
+++ b/gr-trellis/include/trellis/metrics_X.h.t
@@ -0,0 +1,58 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004,2012 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.
+ */
+
+// @WARNING@
+
+#ifndef @GUARD_NAME@
+#define @GUARD_NAME@
+
+#include <trellis/api.h>
+#include <trellis/calc_metric.h>
+#include <gr_block.h>
+
+namespace gr {
+ namespace trellis {
+
+ /*!
+ * \brief Evaluate metrics for use by the Viterbi algorithm.
+ * \ingroup coding_blk
+ */
+ class TRELLIS_API @NAME@ : virtual public gr_block
+ {
+ public:
+ // gr::trellis::@BASE_NAME@::sptr
+ typedef boost::shared_ptr<@BASE_NAME@> sptr;
+
+ static sptr make(int O, int D, const std::vector<@I_TYPE@> &TABLE,
+ digital::trellis_metric_type_t TYPE);
+
+ virtual int O() const = 0;
+ virtual int D() const = 0;
+ virtual digital::trellis_metric_type_t TYPE() const = 0;
+ virtual std::vector<@I_TYPE@> TABLE() const = 0;
+ virtual void set_TABLE(const std::vector<@I_TYPE@> &table) = 0;
+ };
+
+ } /* namespace trellis */
+} /* namespace gr */
+
+#endif /* @GUARD_NAME@ */
diff --git a/gr-trellis/include/trellis/pccc_decoder_X.h.t b/gr-trellis/include/trellis/pccc_decoder_X.h.t
new file mode 100644
index 0000000000..4ab1c088a5
--- /dev/null
+++ b/gr-trellis/include/trellis/pccc_decoder_X.h.t
@@ -0,0 +1,69 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004,2012 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.
+ */
+
+// @WARNING@
+
+#ifndef @GUARD_NAME@
+#define @GUARD_NAME@
+
+#include <trellis/api.h>
+#include <trellis/fsm.h>
+#include <trellis/interleaver.h>
+#include <trellis/siso_type.h>
+#include <gr_block.h>
+#include <vector>
+
+namespace gr {
+ namespace trellis {
+
+ /*!
+ * \ingroup coding_blk
+ */
+ class TRELLIS_API @NAME@ : virtual public gr_block
+ {
+ public:
+ // gr::trellis::@BASE_NAME@::sptr
+ typedef boost::shared_ptr<@BASE_NAME@> sptr;
+
+ static sptr make(const fsm &FSM1, int ST10, int ST1K,
+ const fsm &FSM2, int ST20, int ST2K,
+ const interleaver &INTERLEAVER,
+ int blocklength,
+ int repetitions,
+ siso_type_t SISO_TYPE);
+
+ virtual fsm FSM1() const = 0;
+ virtual fsm FSM2() const = 0;
+ virtual int ST10() const = 0;
+ virtual int ST1K() const = 0;
+ virtual int ST20() const = 0;
+ virtual int ST2K() const = 0;
+ virtual interleaver INTERLEAVER() const = 0;
+ virtual int blocklength() const = 0;
+ virtual int repetitions() const = 0;
+ virtual siso_type_t SISO_TYPE() const = 0;
+ };
+
+ } /* namespace trellis */
+} /* namespace gr */
+
+#endif /* @GUARD_NAME@ */
diff --git a/gr-trellis/include/trellis/pccc_decoder_combined_XX.h.t b/gr-trellis/include/trellis/pccc_decoder_combined_XX.h.t
new file mode 100644
index 0000000000..1ea53329c4
--- /dev/null
+++ b/gr-trellis/include/trellis/pccc_decoder_combined_XX.h.t
@@ -0,0 +1,79 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004 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.
+ */
+
+// @WARNING@
+
+#ifndef @GUARD_NAME@
+#define @GUARD_NAME@
+
+#include <trellis/api.h>
+#include <trellis/fsm.h>
+#include <trellis/interleaver.h>
+#include <trellis/calc_metric.h>
+#include <trellis/siso_type.h>
+#include <gr_block.h>
+#include <vector>
+
+namespace gr {
+ namespace trellis {
+
+ /*!
+ * \ingroup coding_blk
+ */
+ class TRELLIS_API @NAME@ : virtual public gr_block
+ {
+ public:
+ // gr::trellis::@BASE_NAME@::sptr
+ typedef boost::shared_ptr<@BASE_NAME@> sptr;
+
+ static sptr make(const fsm &FSMo, int STo0, int SToK,
+ const fsm &FSMi, int STi0, int STiK,
+ const interleaver &INTERLEAVER,
+ int blocklength,
+ int repetitions,
+ siso_type_t SISO_TYPE,
+ int D,
+ const std::vector<@I_TYPE@> &TABLE,
+ digital::trellis_metric_type_t METRIC_TYPE,
+ float scaling);
+
+ virtual fsm FSM1() const = 0;
+ virtual fsm FSM2() const = 0;
+ virtual int ST10() const = 0;
+ virtual int ST1K() const = 0;
+ virtual int ST20() const = 0;
+ virtual int ST2K() const = 0;
+ virtual interleaver INTERLEAVER() const = 0;
+ virtual int blocklength() const = 0;
+ virtual int repetitions() const = 0;
+ virtual int D() const = 0;
+ virtual std::vector<@I_TYPE@> TABLE() const = 0;
+ virtual digital::trellis_metric_type_t METRIC_TYPE() const = 0;
+ virtual siso_type_t SISO_TYPE() const = 0;
+ virtual float scaling() const = 0;
+ virtual void set_scaling(float scaling) = 0;
+ };
+
+ } /* namespace trellis */
+} /* namespace gr */
+
+#endif /* @GUARD_NAME@ */
diff --git a/gr-trellis/include/trellis/pccc_encoder_XX.h.t b/gr-trellis/include/trellis/pccc_encoder_XX.h.t
new file mode 100644
index 0000000000..103301eecd
--- /dev/null
+++ b/gr-trellis/include/trellis/pccc_encoder_XX.h.t
@@ -0,0 +1,63 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004,2012 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.
+ */
+
+// @WARNING@
+
+#ifndef @GUARD_NAME@
+#define @GUARD_NAME@
+
+#include <trellis/api.h>
+#include <trellis/fsm.h>
+#include <trellis/interleaver.h>
+#include <gr_sync_block.h>
+#include <vector>
+
+namespace gr {
+ namespace trellis {
+
+ /*!
+ * \brief SCCC encoder.
+ * \ingroup coding_blk
+ */
+ class TRELLIS_API @NAME@ : virtual public gr_sync_block
+ {
+ public:
+ // gr::trellis::@BASE_NAME@::sptr
+ typedef boost::shared_ptr<@BASE_NAME@> sptr;
+
+ static sptr make(const fsm &FSM1, int ST1,
+ const fsm &FSM2, int ST2,
+ const interleaver &INTERLEAVER,
+ int blocklength);
+
+ virtual fsm FSM1 () const = 0;
+ virtual int ST1 () const = 0;
+ virtual fsm FSM2 () const = 0;
+ virtual int ST2 () const = 0;
+ virtual interleaver INTERLEAVER () const = 0;
+ virtual int blocklength () const = 0;
+ };
+
+ } /* namespace trellis */
+} /* namespace gr */
+
+#endif /* @GUARD_NAME@ */
diff --git a/gr-trellis/include/trellis/permutation.h b/gr-trellis/include/trellis/permutation.h
new file mode 100644
index 0000000000..adfe44a576
--- /dev/null
+++ b/gr-trellis/include/trellis/permutation.h
@@ -0,0 +1,55 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004,2012 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.
+ */
+
+#ifndef INCLUDED_TRELLIS_PERMUTATION_H
+#define INCLUDED_TRELLIS_PERMUTATION_H
+
+#include <trellis/api.h>
+#include <vector>
+#include <gr_sync_block.h>
+
+namespace gr {
+ namespace trellis {
+
+ /*!
+ * \brief Permutation.
+ * \ingroup coding_blk
+ */
+ class TRELLIS_API permutation : virtual public gr_sync_block
+ {
+ public:
+ // gr::trellis::permutation::sptr
+ typedef boost::shared_ptr<permutation> sptr;
+
+ static sptr make(int K, const std::vector<int> &TABLE,
+ int SYMS_PER_BLOCK, size_t NBYTES);
+
+ virtual int K() const = 0;
+ virtual const std::vector<int> & TABLE() const = 0;
+ virtual int SYMS_PER_BLOCK() const = 0;
+ virtual size_t BYTES_PER_SYMBOL() const = 0;
+ };
+
+ } /* namespace trellis */
+} /* namespace gr */
+
+#endif /* INCLUDED_TRELLIS_PERMUTATION_H */
diff --git a/gr-trellis/src/lib/quicksort_index.h b/gr-trellis/include/trellis/quicksort_index.h
index 9583955db9..402962172a 100644
--- a/gr-trellis/src/lib/quicksort_index.h
+++ b/gr-trellis/include/trellis/quicksort_index.h
@@ -1,6 +1,6 @@
/* -*- c++ -*- */
/*
- * Copyright 2004,2007 Free Software Foundation, Inc.
+ * Copyright 2004,2007,2012 Free Software Foundation, Inc.
*
* This file is part of GNU Radio
*
@@ -25,10 +25,17 @@
#include <vector>
-template <class T>
-void SWAP (T & a, T & b);
+namespace gr {
+ namespace trellis {
-template <class T>
-void quicksort_index (std::vector<T> & p, std::vector<int> & index, int left, int right);
+ template <class T>
+ void SWAP(T &a, T &b);
-#endif
+ template <class T>
+ void quicksort_index(std::vector<T> &p, std::vector<int> &index,
+ int left, int right);
+
+ } /* namespace trellis */
+} /* namespace gr */
+
+#endif /* INCLUDED_QUICKSORT_INDEX_H */
diff --git a/gr-trellis/include/trellis/sccc_decoder_X.h.t b/gr-trellis/include/trellis/sccc_decoder_X.h.t
new file mode 100644
index 0000000000..f2faa97e26
--- /dev/null
+++ b/gr-trellis/include/trellis/sccc_decoder_X.h.t
@@ -0,0 +1,69 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004,2012 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.
+ */
+
+// @WARNING@
+
+#ifndef @GUARD_NAME@
+#define @GUARD_NAME@
+
+#include <trellis/api.h>
+#include <trellis/fsm.h>
+#include <trellis/interleaver.h>
+#include <trellis/siso_type.h>
+#include <gr_block.h>
+#include <vector>
+
+namespace gr {
+ namespace trellis {
+
+ /*!
+ * \ingroup coding_blk
+ */
+ class TRELLIS_API @NAME@ : virtual public gr_block
+ {
+ public:
+ // gr::trellis::@BASE_NAME@::sptr
+ typedef boost::shared_ptr<@BASE_NAME@> sptr;
+
+ static sptr make(const fsm &FSMo, int STo0, int SToK,
+ const fsm &FSMi, int STi0, int STiK,
+ const interleaver &INTERLEAVER,
+ int blocklength,
+ int repetitions,
+ siso_type_t SISO_TYPE);
+
+ virtual fsm FSMo() const = 0;
+ virtual fsm FSMi() const = 0;
+ virtual int STo0() const = 0;
+ virtual int SToK() const = 0;
+ virtual int STi0() const = 0;
+ virtual int STiK() const = 0;
+ virtual interleaver INTERLEAVER() const = 0;
+ virtual int blocklength() const = 0;
+ virtual int repetitions() const = 0;
+ virtual siso_type_t SISO_TYPE() const = 0;
+ };
+
+ } /* namespace trellis */
+} /* namespace gr */
+
+#endif /* @GUARD_NAME@ */
diff --git a/gr-trellis/include/trellis/sccc_decoder_combined_XX.h.t b/gr-trellis/include/trellis/sccc_decoder_combined_XX.h.t
new file mode 100644
index 0000000000..fbc3d8d668
--- /dev/null
+++ b/gr-trellis/include/trellis/sccc_decoder_combined_XX.h.t
@@ -0,0 +1,79 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004,2012 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.
+ */
+
+// @WARNING@
+
+#ifndef @GUARD_NAME@
+#define @GUARD_NAME@
+
+#include <trellis/api.h>
+#include <trellis/fsm.h>
+#include <trellis/interleaver.h>
+#include <trellis/calc_metric.h>
+#include <trellis/siso_type.h>
+#include <gr_block.h>
+#include <vector>
+
+namespace gr {
+ namespace trellis {
+
+ /*!
+ * \ingroup coding_blk
+ */
+ class TRELLIS_API @NAME@ : virtual public gr_block
+ {
+ public:
+ // gr::trellis::@BASE_NAME@::sptr
+ typedef boost::shared_ptr<@BASE_NAME@> sptr;
+
+ static sptr make(const fsm &FSMo, int STo0, int SToK,
+ const fsm &FSMi, int STi0, int STiK,
+ const interleaver &INTERLEAVER,
+ int blocklength,
+ int repetitions,
+ siso_type_t SISO_TYPE,
+ int D,
+ const std::vector<@I_TYPE@> &TABLE,
+ digital::trellis_metric_type_t METRIC_TYPE,
+ float scaling);
+
+ virtual fsm FSMo() const = 0;
+ virtual fsm FSMi() const = 0;
+ virtual int STo0() const = 0;
+ virtual int SToK() const = 0;
+ virtual int STi0() const = 0;
+ virtual int STiK() const = 0;
+ virtual interleaver INTERLEAVER() const = 0;
+ virtual int blocklength() const = 0;
+ virtual int repetitions() const = 0;
+ virtual int D() const = 0;
+ virtual std::vector<@I_TYPE@> TABLE() const = 0;
+ virtual digital::trellis_metric_type_t METRIC_TYPE() const = 0;
+ virtual siso_type_t SISO_TYPE() const = 0;
+ virtual float scaling() const = 0;
+ virtual void set_scaling(float scaling) = 0;
+ };
+
+ } /* namespace trellis */
+} /* namespace gr */
+
+#endif /* @GUARD_NAME@ */
diff --git a/gr-trellis/include/trellis/sccc_encoder_XX.h.t b/gr-trellis/include/trellis/sccc_encoder_XX.h.t
new file mode 100644
index 0000000000..7702d06faf
--- /dev/null
+++ b/gr-trellis/include/trellis/sccc_encoder_XX.h.t
@@ -0,0 +1,63 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004,2012 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.
+ */
+
+// @WARNING@
+
+#ifndef @GUARD_NAME@
+#define @GUARD_NAME@
+
+#include <trellis/api.h>
+#include <trellis/fsm.h>
+#include <trellis/interleaver.h>
+#include <gr_sync_block.h>
+#include <vector>
+
+namespace gr {
+ namespace trellis {
+
+ /*!
+ * \brief SCCC encoder.
+ * \ingroup coding_blk
+ */
+ class TRELLIS_API @NAME@ : virtual public gr_sync_block
+ {
+ public:
+ // gr::trellis::@BASE_NAME@::sptr
+ typedef boost::shared_ptr<@BASE_NAME@> sptr;
+
+ static sptr make(const fsm &FSMo, int STo,
+ const fsm &FSMi, int STi,
+ const interleaver &INTERLEAVER,
+ int blocklength);
+
+ virtual fsm FSMo() const = 0;
+ virtual int STo() const = 0;
+ virtual fsm FSMi() const = 0;
+ virtual int STi() const = 0;
+ virtual interleaver INTERLEAVER() const = 0;
+ virtual int blocklength() const = 0;
+ };
+
+ } /* namespace trellis */
+} /* namespace gr */
+
+#endif /* @GUARD_NAME@ */
diff --git a/gr-trellis/include/trellis/siso_combined_f.h b/gr-trellis/include/trellis/siso_combined_f.h
new file mode 100644
index 0000000000..c67a296885
--- /dev/null
+++ b/gr-trellis/include/trellis/siso_combined_f.h
@@ -0,0 +1,68 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004,2012 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.
+ */
+
+#ifndef INCLUDED_TRELLIS_SISO_COMBINED_F_H
+#define INCLUDED_TRELLIS_SISO_COMBINED_F_H
+
+#include <trellis/api.h>
+#include <trellis/fsm.h>
+#include <trellis/siso_type.h>
+#include <trellis/calc_metric.h>
+#include <trellis/core_algorithms.h>
+#include <gr_block.h>
+
+namespace gr {
+ namespace trellis {
+
+ /*!
+ * \ingroup coding_blk
+ */
+ class TRELLIS_API siso_combined_f : virtual public gr_block
+ {
+ public:
+ // gr::trellis::siso_combined_f::sptr
+ typedef boost::shared_ptr<siso_combined_f> sptr;
+
+ static sptr make(const fsm &FSM, int K,
+ int S0, int SK,
+ bool POSTI, bool POSTO,
+ siso_type_t d_SISO_TYPE,
+ int D,
+ const std::vector<float> &TABLE,
+ digital::trellis_metric_type_t TYPE);
+
+ virtual fsm FSM() const = 0;
+ virtual int K() const = 0;
+ virtual int S0() const = 0;
+ virtual int SK() const = 0;
+ virtual bool POSTI() const = 0;
+ virtual bool POSTO() const = 0;
+ virtual siso_type_t SISO_TYPE() const = 0;
+ virtual int D() const = 0;
+ virtual std::vector<float> TABLE() const = 0;
+ virtual digital::trellis_metric_type_t TYPE() const = 0;
+ };
+
+ } /* namespace trellis */
+} /* namespace gr */
+
+#endif /* INCLUDED_TRELLIS_SISO_COMBINED_F_H */
diff --git a/gr-trellis/include/trellis/siso_f.h b/gr-trellis/include/trellis/siso_f.h
new file mode 100644
index 0000000000..da35e14a0b
--- /dev/null
+++ b/gr-trellis/include/trellis/siso_f.h
@@ -0,0 +1,61 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004,2012 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.
+ */
+
+#ifndef INCLUDED_TRELLIS_SISO_F_H
+#define INCLUDED_TRELLIS_SISO_F_H
+
+#include <trellis/api.h>
+#include <trellis/fsm.h>
+#include <trellis/siso_type.h>
+#include <trellis/core_algorithms.h>
+#include <gr_block.h>
+
+namespace gr {
+ namespace trellis {
+
+ /*!
+ * \ingroup coding_blk
+ */
+ class TRELLIS_API siso_f : virtual public gr_block
+ {
+ public:
+ // gr::trellis::siso_f::sptr
+ typedef boost::shared_ptr<siso_f> sptr;
+
+ static sptr make(const fsm &FSM, int K,
+ int S0, int SK,
+ bool POSTI, bool POSTO,
+ siso_type_t d_SISO_TYPE);
+
+ virtual fsm FSM() const = 0;
+ virtual int K() const = 0;
+ virtual int S0() const = 0;
+ virtual int SK() const = 0;
+ virtual bool POSTI() const = 0;
+ virtual bool POSTO() const = 0;
+ virtual siso_type_t SISO_TYPE() const = 0;
+ };
+
+ } /* namespace trellis */
+} /* namespace gr */
+
+#endif /* INCLUDED_TRELLIS_SISO_F_H */
diff --git a/gr-trellis/src/lib/siso_type.h b/gr-trellis/include/trellis/siso_type.h
index 3a7163d02a..9167381164 100644
--- a/gr-trellis/src/lib/siso_type.h
+++ b/gr-trellis/include/trellis/siso_type.h
@@ -1,6 +1,6 @@
/* -*- c++ -*- */
/*
- * Copyright 2004 Free Software Foundation, Inc.
+ * Copyright 2004,2012 Free Software Foundation, Inc.
*
* This file is part of GNU Radio
*
@@ -23,9 +23,15 @@
#ifndef INCLUDED_TRELLIS_SISO_TYPE_H
#define INCLUDED_TRELLIS_SISO_TYPE_H
-typedef enum {
- TRELLIS_MIN_SUM = 200, TRELLIS_SUM_PRODUCT
-} trellis_siso_type_t;
+namespace gr {
+ namespace trellis {
-#endif
+ typedef enum {
+ TRELLIS_MIN_SUM = 200,
+ TRELLIS_SUM_PRODUCT
+ } siso_type_t;
+
+ } /* namespace trellis */
+} /* namespace gr */
+#endif /* INCLUDED_TRELLIS_SISO_TYPE_H */
diff --git a/gr-trellis/src/lib/trellis_metrics_X.i.t b/gr-trellis/include/trellis/viterbi_X.h.t
index 50aa7a7673..6931eb37e5 100644
--- a/gr-trellis/src/lib/trellis_metrics_X.i.t
+++ b/gr-trellis/include/trellis/viterbi_X.h.t
@@ -1,6 +1,6 @@
/* -*- c++ -*- */
/*
- * Copyright 2004 Free Software Foundation, Inc.
+ * Copyright 2004,2012 Free Software Foundation, Inc.
*
* This file is part of GNU Radio
*
@@ -22,19 +22,36 @@
// @WARNING@
-GR_SWIG_BLOCK_MAGIC(trellis,@BASE_NAME@);
+#ifndef @GUARD_NAME@
+#define @GUARD_NAME@
-@SPTR_NAME@ trellis_make_@BASE_NAME@ (int O, int D, const std::vector<@I_TYPE@> &TABLE, trellis_metric_type_t TYPE);
+#include <trellis/api.h>
+#include <trellis/fsm.h>
+#include <trellis/core_algorithms.h>
+#include <gr_block.h>
-class @NAME@ : public gr_block
-{
-private:
- @NAME@ (int O, int D, const std::vector<@I_TYPE@> &TABLE, trellis_metric_type_t TYPE);
+namespace gr {
+ namespace trellis {
-public:
- int O () const { return d_O; }
- int D () const { return d_D; }
- trellis_metric_type_t TYPE () const { return d_TYPE; }
- void set_TABLE (const std::vector<@I_TYPE@> &table);
- std::vector<@I_TYPE@> TABLE () const { return d_TABLE; }
-};
+ /*!
+ * \ingroup coding_blk
+ */
+ class TRELLIS_API @NAME@ : virtual public gr_block
+ {
+ public:
+ // gr::trellis::@BASE_NAME@::sptr
+ typedef boost::shared_ptr<@BASE_NAME@> sptr;
+
+ static sptr make(const fsm &FSM, int K,
+ int S0, int SK);
+
+ virtual fsm FSM() const = 0;
+ virtual int K() const = 0;
+ virtual int S0() const = 0;
+ virtual int SK() const = 0;
+ };
+
+ } /* namespace trellis */
+} /* namespace gr */
+
+#endif /* @GUARD_NAME@ */
diff --git a/gr-trellis/include/trellis/viterbi_combined_XX.h.t b/gr-trellis/include/trellis/viterbi_combined_XX.h.t
new file mode 100644
index 0000000000..77fc5a5a60
--- /dev/null
+++ b/gr-trellis/include/trellis/viterbi_combined_XX.h.t
@@ -0,0 +1,64 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004,2012 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.
+ */
+
+// @WARNING@
+
+#ifndef @GUARD_NAME@
+#define @GUARD_NAME@
+
+#include <trellis/api.h>
+#include <trellis/fsm.h>
+#include <trellis/calc_metric.h>
+#include <trellis/core_algorithms.h>
+#include <gr_block.h>
+
+namespace gr {
+ namespace trellis {
+
+ /*!
+ * \ingroup coding_blk
+ */
+ class TRELLIS_API @NAME@ : virtual public gr_block
+ {
+ public:
+ // gr::trellis::@BASE_NAME@::sptr
+ typedef boost::shared_ptr<@BASE_NAME@> sptr;
+
+ static sptr make(const fsm &FSM, int K,
+ int S0, int SK, int D,
+ const std::vector<@I_TYPE@> &TABLE,
+ digital::trellis_metric_type_t TYPE);
+
+ virtual fsm FSM() const = 0;
+ virtual int K() const = 0;
+ virtual int S0() const = 0;
+ virtual int SK() const = 0;
+ virtual int D() const = 0;
+ virtual std::vector<@I_TYPE@> TABLE() const = 0;
+ virtual digital::trellis_metric_type_t TYPE() const = 0;
+ virtual void set_TABLE (const std::vector<@I_TYPE@> &table) = 0;
+ };
+
+ } /* namespace trellis */
+} /* namespace gr */
+
+#endif /* @GUARD_NAME@ */
diff --git a/gr-trellis/lib/CMakeLists.txt b/gr-trellis/lib/CMakeLists.txt
new file mode 100644
index 0000000000..82d2a41426
--- /dev/null
+++ b/gr-trellis/lib/CMakeLists.txt
@@ -0,0 +1,141 @@
+# Copyright 2012 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.
+
+########################################################################
+# Setup the include and linker paths
+########################################################################
+include_directories(
+ ${CMAKE_CURRENT_BINARY_DIR}/../include
+ ${GR_TRELLIS_INCLUDE_DIRS}
+ ${GR_DIGITAL_INCLUDE_DIRS}
+ ${GNURADIO_CORE_INCLUDE_DIRS}
+ ${GRUEL_INCLUDE_DIRS}
+ ${Boost_INCLUDE_DIRS}
+)
+
+link_directories(${Boost_LIBRARY_DIRS})
+
+if(ENABLE_GR_CTRLPORT)
+ ADD_DEFINITIONS(-DGR_CTRLPORT)
+ include_directories(${ICE_INCLUDE_DIR})
+endif(ENABLE_GR_CTRLPORT)
+
+#######################################################################
+# generate the python helper script which calls into the build utils
+########################################################################
+include(GrPython)
+
+file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/generate_helper.py "
+#!${PYTHON_EXECUTABLE}
+
+import sys, os, re
+sys.path.append('${GR_CORE_PYTHONPATH}')
+os.environ['srcdir'] = '${CMAKE_CURRENT_SOURCE_DIR}'
+os.chdir('${CMAKE_CURRENT_BINARY_DIR}')
+
+if __name__ == '__main__':
+ import build_utils
+ root, inp = sys.argv[1:3]
+ for sig in sys.argv[3:]:
+ name = re.sub ('X+', sig, root)
+ d = build_utils.standard_impl_dict2(name, sig, 'trellis')
+ build_utils.expand_template(d, inp)
+")
+
+macro(expand_cc root)
+ #make a list of all the generated files
+ unset(expanded_files_cc)
+ unset(expanded_files_h)
+ foreach(sig ${ARGN})
+ string(REGEX REPLACE "X+" ${sig} name ${root})
+ list(APPEND expanded_files_cc ${CMAKE_CURRENT_BINARY_DIR}/${name}.cc)
+ list(APPEND expanded_files_h ${CMAKE_CURRENT_BINARY_DIR}/${name}.h)
+ endforeach(sig)
+
+ #create a command to generate the source files
+ add_custom_command(
+ OUTPUT ${expanded_files_cc}
+ DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${root}.cc.t
+ COMMAND ${PYTHON_EXECUTABLE} ${PYTHON_DASH_B}
+ ${CMAKE_CURRENT_BINARY_DIR}/generate_helper.py
+ ${root} ${root}.cc.t ${ARGN}
+ )
+
+ #create a command to generate the header file
+ add_custom_command(
+ OUTPUT ${expanded_files_h}
+ DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${root}.h.t
+ COMMAND ${PYTHON_EXECUTABLE} ${PYTHON_DASH_B}
+ ${CMAKE_CURRENT_BINARY_DIR}/generate_helper.py
+ ${root} ${root}.h.t ${ARGN}
+ )
+
+ #make source files depends on headers to force generation
+ set_source_files_properties(${expanded_files_cc}
+ PROPERTIES OBJECT_DEPENDS "${expanded_files_h}"
+ )
+
+ #install rules for the generated cc files
+ list(APPEND generated_sources ${expanded_files_cc})
+ list(APPEND generated_headers ${expanded_files_h})
+endmacro(expand_cc)
+
+########################################################################
+# Invoke macro to generate various sources
+########################################################################
+expand_cc(encoder_XX_impl bb bs bi ss si ii)
+expand_cc(sccc_encoder_XX_impl bb bs bi ss si ii)
+expand_cc(pccc_encoder_XX_impl bb bs bi ss si ii)
+expand_cc(metrics_X_impl s i f c)
+expand_cc(viterbi_X_impl b s i)
+expand_cc(viterbi_combined_XX_impl sb ss si ib is ii fb fs fi cb cs ci)
+expand_cc(sccc_decoder_X_impl b s i)
+expand_cc(sccc_decoder_combined_XX_impl fb fs fi cb cs ci)
+expand_cc(pccc_decoder_X_impl b s i)
+expand_cc(pccc_decoder_combined_XX_impl fb fs fi cb cs ci)
+
+########################################################################
+# Setup library
+########################################################################
+list(APPEND trellis_sources
+ ${generated_sources}
+ base.cc
+ calc_metric.cc
+ core_algorithms.cc
+ fsm.cc
+ interleaver.cc
+ quicksort_index.cc
+ constellation_metrics_cf_impl.cc
+ permutation_impl.cc
+ siso_f_impl.cc
+ siso_combined_f_impl.cc
+)
+
+list(APPEND trellis_libs
+ gnuradio-core
+ gnuradio-digital
+ ${Boost_LIBRARIES}
+)
+
+add_library(gnuradio-trellis SHARED ${trellis_sources})
+target_link_libraries(gnuradio-trellis ${trellis_libs})
+GR_LIBRARY_FOO(gnuradio-trellis RUNTIME_COMPONENT "trellis_runtime" DEVEL_COMPONENT "trellis_devel")
+add_dependencies(gnuradio-trellis
+ trellis_generated_includes trellis_generated_swigs
+ gnuradio-core gnuradio-digital)
diff --git a/gr-trellis/lib/base.cc b/gr-trellis/lib/base.cc
new file mode 100644
index 0000000000..e9d0141e70
--- /dev/null
+++ b/gr-trellis/lib/base.cc
@@ -0,0 +1,86 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2002,2012 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.
+ */
+
+#include <cstdio>
+#include <stdexcept>
+#include <cmath>
+#include <trellis/base.h>
+
+namespace gr {
+ namespace trellis {
+
+ bool
+ dec2base(unsigned int num, int base, std::vector<int> &s)
+ {
+ int l = s.size();
+ unsigned int n=num;
+ for(int i=0;i<l;i++) {
+ s[l-i-1] = n % base; //MSB first
+ n /= base;
+ }
+ if(n!=0) {
+ printf("Number %d requires more than %d digits.",num,l);
+ return false;
+ }
+ else
+ return true;
+ }
+
+ unsigned int
+ base2dec(const std::vector<int> &s, int base)
+ {
+ int l = s.size();
+ unsigned int num=0;
+ for(int i=0;i<l;i++)
+ num=num*base+s[i];
+ return num;
+ }
+
+ bool
+ dec2bases(unsigned int num, const std::vector<int> &bases, std::vector<int> &s)
+ {
+ int l = s.size();
+ unsigned int n=num;
+ for(int i=0;i<l;i++) {
+ s[l-i-1] = n % bases[l-i-1];
+ n /= bases[l-i-1];
+ }
+ if(n!=0) {
+ printf("Number %d requires more than %d digits.",num,l);
+ return false;
+ }
+ else
+ return true;
+ }
+
+ unsigned int
+ bases2dec(const std::vector<int> &s, const std::vector<int> &bases)
+ {
+ int l = s.size();
+ unsigned int num=0;
+ for(int i=0;i<l;i++)
+ num = num * bases[i] + s[i];
+ return num;
+ }
+
+ } /* namespace trellis */
+} /* namespace gr */
diff --git a/gr-trellis/lib/calc_metric.cc b/gr-trellis/lib/calc_metric.cc
new file mode 100644
index 0000000000..3c474e30fe
--- /dev/null
+++ b/gr-trellis/lib/calc_metric.cc
@@ -0,0 +1,251 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004,2012 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.
+ */
+
+#include <float.h>
+#include <stdexcept>
+#include <trellis/calc_metric.h>
+
+namespace gr {
+ namespace trellis {
+
+ template <class T>
+ void calc_metric(int O, int D, const std::vector<T> &TABLE, const T *input,
+ float *metric, digital::trellis_metric_type_t type)
+ {
+ float minm = FLT_MAX;
+ int minmi = 0;
+
+ switch(type) {
+ case digital::TRELLIS_EUCLIDEAN:
+ for(int o = 0; o < O; o++) {
+ metric[o] = 0.0;
+ for(int m = 0; m < D; m++) {
+ T s = input[m]-TABLE[o*D+m];
+ //gr_complex sc(1.0*s,0);
+ //metric[o] += (sc*conj(sc)).real();
+ metric[o] += s * s;
+ }
+ }
+ break;
+ case digital::TRELLIS_HARD_SYMBOL:
+ for(int o = 0; o < O; o++) {
+ metric[o] = 0.0;
+ for(int m = 0; m < D; m++) {
+ T s = input[m]-TABLE[o*D+m];
+ //gr_complex sc(1.0*s,0);
+ //metric[o] + =(sc*conj(sc)).real();
+ metric[o] += s * s;
+ }
+ if(metric[o] < minm) {
+ minm = metric[o];
+ minmi = o;
+ }
+ }
+ for(int o = 0; o < O; o++) {
+ metric[o] = (o == minmi ? 0.0 : 1.0);
+ }
+ break;
+ case digital::TRELLIS_HARD_BIT:
+ throw std::runtime_error("calc_metric: Invalid metric type (not yet implemented).");
+ break;
+ default:
+ throw std::runtime_error("calc_metric: Invalid metric type.");
+ }
+ }
+
+ template
+ void calc_metric<short>(int O, int D, const std::vector<short> &TABLE, const short *input,
+ float *metric, digital::trellis_metric_type_t type);
+
+ template
+ void calc_metric<int>(int O, int D, const std::vector<int> &TABLE, const int *input,
+ float *metric, digital::trellis_metric_type_t type);
+
+ template
+ void calc_metric<float>(int O, int D, const std::vector<float> &TABLE, const float *input,
+ float *metric, digital::trellis_metric_type_t type);
+
+ void calc_metric(int O, int D, const std::vector<short> &TABLE, const short *input,
+ float *metric, digital::trellis_metric_type_t type)
+ {
+ float minm = FLT_MAX;
+ int minmi = 0;
+
+ switch(type) {
+ case digital::TRELLIS_EUCLIDEAN:
+ for(int o = 0; o < O; o++) {
+ metric[o] = 0.0;
+ for(int m = 0; m < D; m++) {
+ float s = input[m]-TABLE[o*D+m];
+ metric[o] += s*s;
+ }
+ }
+ break;
+ case digital::TRELLIS_HARD_SYMBOL:
+ for(int o = 0; o < O; o++) {
+ metric[o] = 0.0;
+ for(int m = 0; m < D; m++) {
+ float s = input[m]-TABLE[o*D+m];
+ metric[o] += s*s;
+ }
+ if(metric[o] < minm) {
+ minm = metric[o];
+ minmi = o;
+ }
+ }
+ for(int o = 0; o < O; o++) {
+ metric[o] = (o == minmi ? 0.0 : 1.0);
+ }
+ break;
+ case digital::TRELLIS_HARD_BIT:
+ throw std::runtime_error("calc_metric: Invalid metric type (not yet implemented).");
+ break;
+ default:
+ throw std::runtime_error("calc_metric: Invalid metric type.");
+ }
+ }
+
+ /*
+ void calc_metric(int O, int D, const std::vector<int> &TABLE, const int *input,
+ float *metric, digital::trellis_metric_type_t type)
+ {
+ float minm = FLT_MAX;
+ int minmi = 0;
+
+ switch(type){
+ case digital::TRELLIS_EUCLIDEAN:
+ for(int o=0;o<O;o++) {
+ metric[o]=0.0;
+ for(int m=0;m<D;m++) {
+ float s=input[m]-TABLE[o*D+m];
+ metric[o]+=s*s;
+ }
+ }
+ break;
+ case digital::TRELLIS_HARD_SYMBOL:
+ for(int o=0;o<O;o++) {
+ metric[o]=0.0;
+ for(int m=0;m<D;m++) {
+ float s=input[m]-TABLE[o*D+m];
+ metric[o]+=s*s;
+ }
+ if(metric[o]<minm) {
+ minm=metric[o];
+ minmi=o;
+ }
+ }
+ for(int o=0;o<O;o++) {
+ metric[o] = (o==minmi?0.0:1.0);
+ }
+ break;
+ case digital::TRELLIS_HARD_BIT:
+ throw std::runtime_error("calc_metric: Invalid metric type (not yet implemented).");
+ break;
+ default:
+ throw std::runtime_error("calc_metric: Invalid metric type.");
+ }
+ }
+
+ void calc_metric(int O, int D, const std::vector<float> &TABLE, const float *input,
+ float *metric, digital::trellis_metric_type_t type)
+ {
+ float minm = FLT_MAX;
+ int minmi = 0;
+
+ switch(type) {
+ case digital::TRELLIS_EUCLIDEAN:
+ for(int o=0;o<O;o++) {
+ metric[o]=0.0;
+ for(int m=0;m<D;m++) {
+ float s=input[m]-TABLE[o*D+m];
+ metric[o]+=s*s;
+ }
+ }
+ break;
+ case digital::TRELLIS_HARD_SYMBOL:
+ for(int o=0;o<O;o++) {
+ metric[o]=0.0;
+ for(int m=0;m<D;m++) {
+ float s=input[m]-TABLE[o*D+m];
+ metric[o]+=s*s;
+ }
+ if(metric[o]<minm) {
+ minm=metric[o];
+ minmi=o;
+ }
+ }
+ for(int o=0;o<O;o++) {
+ metric[o] = (o==minmi?0.0:1.0);
+ }
+ break;
+ case digital::TRELLIS_HARD_BIT:
+ throw std::runtime_error("calc_metric: Invalid metric type (not yet implemented).");
+ break;
+ default:
+ throw std::runtime_error("calc_metric: Invalid metric type.");
+ }
+ }
+*/
+
+ void calc_metric(int O, int D, const std::vector<gr_complex> &TABLE, const gr_complex *input,
+ float *metric, digital::trellis_metric_type_t type)
+ {
+ float minm = FLT_MAX;
+ int minmi = 0;
+
+ switch(type) {
+ case digital::TRELLIS_EUCLIDEAN:
+ for(int o = 0; o < O; o++) {
+ metric[o] = 0.0;
+ for(int m = 0; m < D; m++) {
+ gr_complex s = input[m]-TABLE[o*D+m];
+ metric[o] += s.real()*s.real()+s.imag()*s.imag();
+ }
+ }
+ break;
+ case digital::TRELLIS_HARD_SYMBOL:
+ for(int o = 0; o < O; o++) {
+ metric[o] = 0.0;
+ for(int m = 0; m < D; m++) {
+ gr_complex s = input[m]-TABLE[o*D+m];
+ metric[o] += s.real()*s.real()+s.imag()*s.imag();
+ }
+ if(metric[o] < minm) {
+ minm = metric[o];
+ minmi = o;
+ }
+ }
+ for(int o = 0; o < O; o++) {
+ metric[o] = (o == minmi ? 0.0 : 1.0);
+ }
+ break;
+ case digital::TRELLIS_HARD_BIT:
+ throw std::runtime_error("calc_metric: Invalid metric type (not yet implemented).");
+ break;
+ default:
+ throw std::runtime_error("calc_metric: Invalid metric type.");
+ }
+ }
+
+ } /* namespace trellis */
+} /* namespace gr */
+
diff --git a/gr-trellis/lib/constellation_metrics_cf_impl.cc b/gr-trellis/lib/constellation_metrics_cf_impl.cc
new file mode 100644
index 0000000000..18d3095802
--- /dev/null
+++ b/gr-trellis/lib/constellation_metrics_cf_impl.cc
@@ -0,0 +1,96 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004,2010-2012 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "constellation_metrics_cf_impl.h"
+#include <gr_io_signature.h>
+#include <assert.h>
+#include <stdexcept>
+#include <iostream>
+
+namespace gr {
+ namespace trellis {
+
+ constellation_metrics_cf::sptr
+ constellation_metrics_cf::make(digital::constellation_sptr constellation,
+ digital::trellis_metric_type_t TYPE)
+ {
+ return gnuradio::get_initial_sptr
+ (new constellation_metrics_cf_impl(constellation, TYPE));
+ }
+
+ constellation_metrics_cf_impl::constellation_metrics_cf_impl(digital::constellation_sptr constellation,
+ digital::trellis_metric_type_t TYPE)
+ : gr_block("constellation_metrics_cf",
+ gr_make_io_signature(1, -1, sizeof(gr_complex)),
+ gr_make_io_signature(1, -1, sizeof(float))),
+ d_constellation(constellation),
+ d_TYPE(TYPE),
+ d_O(constellation->arity()),
+ d_D(constellation->dimensionality())
+ {
+ set_relative_rate(1.0 * d_O / ((double) d_D));
+ set_output_multiple((int)d_O);
+ }
+
+ constellation_metrics_cf_impl::~constellation_metrics_cf_impl()
+ {
+ }
+
+ void
+ constellation_metrics_cf_impl::forecast(int noutput_items,
+ gr_vector_int &ninput_items_required)
+ {
+ assert(noutput_items % d_O == 0);
+
+ unsigned int input_required = d_D * noutput_items / d_O;
+ unsigned int ninputs = ninput_items_required.size();
+ for(unsigned int i = 0; i < ninputs; i++)
+ ninput_items_required[i] = input_required;
+ }
+
+ int
+ constellation_metrics_cf_impl::general_work(int noutput_items,
+ gr_vector_int &ninput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items)
+ {
+ unsigned int nstreams = input_items.size();
+
+ for(unsigned int m=0;m<nstreams;m++) {
+ const gr_complex *in = (gr_complex*)input_items[m];
+ float *out = (float*)output_items[m];
+
+ for(unsigned int i = 0; i < noutput_items / d_O ; i++) {
+ d_constellation->calc_metric(&(in[i*d_D]), &(out[i*d_O]), d_TYPE);
+ }
+ }
+
+ consume_each(d_D * noutput_items / d_O);
+ return noutput_items;
+ }
+
+ } /* namespace trellis */
+} /* namespace gr */
diff --git a/gr-trellis/lib/constellation_metrics_cf_impl.h b/gr-trellis/lib/constellation_metrics_cf_impl.h
new file mode 100644
index 0000000000..52018c4baa
--- /dev/null
+++ b/gr-trellis/lib/constellation_metrics_cf_impl.h
@@ -0,0 +1,57 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004,2010-2012 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.
+ */
+
+#ifndef INCLUDED_TRELLIS_CONSTELLATION_METRICS_CF_IMPL_H
+#define INCLUDED_TRELLIS_CONSTELLATION_METRICS_CF_IMPL_H
+
+#include <trellis/api.h>
+#include <trellis/constellation_metrics_cf.h>
+
+namespace gr {
+ namespace trellis {
+
+ class constellation_metrics_cf_impl : public constellation_metrics_cf
+ {
+ private:
+ digital::constellation_sptr d_constellation;
+ digital::trellis_metric_type_t d_TYPE;
+ unsigned int d_O;
+ unsigned int d_D;
+
+ public:
+ constellation_metrics_cf_impl(digital::constellation_sptr constellation,
+ digital::trellis_metric_type_t TYPE);
+ ~constellation_metrics_cf_impl();
+
+ void forecast(int noutput_items,
+ gr_vector_int &ninput_items_required);
+
+ int general_work(int noutput_items,
+ gr_vector_int &ninput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items);
+ };
+
+ } /* namespace trellis */
+} /* namespace gr */
+
+#endif /* INCLUDED_TRELLIS_CONSTELLATION_METRICS_CF_IMPL_H */
diff --git a/gr-trellis/lib/core_algorithms.cc b/gr-trellis/lib/core_algorithms.cc
new file mode 100644
index 0000000000..a704e5f9a6
--- /dev/null
+++ b/gr-trellis/lib/core_algorithms.cc
@@ -0,0 +1,1324 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004,2012 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.
+ */
+
+#include <cstring>
+#include <stdexcept>
+#include <iostream>
+#include <trellis/core_algorithms.h>
+#include <trellis/calc_metric.h>
+
+namespace gr {
+ namespace trellis {
+
+ static const float INF = 1.0e9;
+
+ float
+ min(float a, float b)
+ {
+ return a <= b ? a : b;
+ }
+
+ float
+ min_star(float a, float b)
+ {
+ return (a <= b ? a : b)-log(1+exp(a <= b ? a-b : b-a));
+ }
+
+ template <class T> void
+ viterbi_algorithm(int I, int S, int O,
+ const std::vector<int> &NS,
+ const std::vector<int> &OS,
+ const std::vector< std::vector<int> > &PS,
+ const std::vector< std::vector<int> > &PI,
+ int K,
+ int S0,int SK,
+ const float *in, T *out)//,
+ //std::vector<int> &trace)
+ {
+ std::vector<int> trace(S*K);
+ std::vector<float> alpha(S*2);
+ int alphai;
+ float norm,mm,minm;
+ int minmi;
+ int st;
+
+ if(S0<0) { // initial state not specified
+ for(int i=0;i<S;i++) alpha[0*S+i]=0;
+ }
+ else {
+ for(int i=0;i<S;i++) alpha[0*S+i]=INF;
+ alpha[0*S+S0]=0.0;
+ }
+
+ alphai=0;
+ for(int k=0;k<K;k++) {
+ norm=INF;
+ for(int j=0;j<S;j++) { // for each next state do ACS
+ minm=INF;
+ minmi=0;
+ for(unsigned int i=0;i<PS[j].size();i++) {
+ //int i0 = j*I+i;
+ if((mm=alpha[alphai*S+PS[j][i]]+in[k*O+OS[PS[j][i]*I+PI[j][i]]])<minm)
+ minm=mm,minmi=i;
+ }
+ trace[k*S+j]=minmi;
+ alpha[((alphai+1)%2)*S+j]=minm;
+ if(minm<norm) norm=minm;
+ }
+ for(int j=0;j<S;j++)
+ alpha[((alphai+1)%2)*S+j]-=norm; // normalize total metrics so they do not explode
+ alphai=(alphai+1)%2;
+ }
+
+ if(SK<0) { // final state not specified
+ minm=INF;
+ minmi=0;
+ for(int i=0;i<S;i++)
+ if((mm=alpha[alphai*S+i])<minm) minm=mm,minmi=i;
+ st=minmi;
+ }
+ else {
+ st=SK;
+ }
+
+ for(int k=K-1;k>=0;k--) { // traceback
+ int i0=trace[k*S+st];
+ out[k]= (T) PI[st][i0];
+ st=PS[st][i0];
+ }
+ }
+
+ template void
+ viterbi_algorithm<unsigned char>(int I, int S, int O,
+ const std::vector<int> &NS,
+ const std::vector<int> &OS,
+ const std::vector< std::vector<int> > &PS,
+ const std::vector< std::vector<int> > &PI,
+ int K,
+ int S0,int SK,
+ const float *in, unsigned char *out);
+
+ template void
+ viterbi_algorithm<short>(int I, int S, int O,
+ const std::vector<int> &NS,
+ const std::vector<int> &OS,
+ const std::vector< std::vector<int> > &PS,
+ const std::vector< std::vector<int> > &PI,
+ int K,
+ int S0,int SK,
+ const float *in, short *out);
+
+ template void
+ viterbi_algorithm<int>(int I, int S, int O,
+ const std::vector<int> &NS,
+ const std::vector<int> &OS,
+ const std::vector< std::vector<int> > &PS,
+ const std::vector< std::vector<int> > &PI,
+ int K,
+ int S0,int SK,
+ const float *in, int *out);
+
+ //==============================================
+
+ template <class Ti, class To> void
+ viterbi_algorithm_combined(int I, int S, int O,
+ const std::vector<int> &NS,
+ const std::vector<int> &OS,
+ const std::vector< std::vector<int> > &PS,
+ const std::vector< std::vector<int> > &PI,
+ int K,
+ int S0,int SK,
+ int D,
+ const std::vector<Ti> &TABLE,
+ digital::trellis_metric_type_t TYPE,
+ const Ti *in, To *out)
+ {
+ std::vector<int> trace(S*K);
+ std::vector<float> alpha(S*2);
+ float *metric = new float[O];
+ int alphai;
+ float norm,mm,minm;
+ int minmi;
+ int st;
+
+ if(S0<0) { // initial state not specified
+ for(int i=0;i<S;i++) alpha[0*S+i]=0;
+ }
+ else {
+ for(int i=0;i<S;i++) alpha[0*S+i]=INF;
+ alpha[0*S+S0]=0.0;
+ }
+
+ alphai=0;
+ for(int k=0;k<K;k++) {
+ calc_metric(O, D, TABLE, &(in[k*D]), metric,TYPE); // calc metrics
+ norm=INF;
+ for(int j=0;j<S;j++) { // for each next state do ACS
+ minm=INF;
+ minmi=0;
+ for(unsigned int i=0;i<PS[j].size();i++) {
+ //int i0 = j*I+i;
+ if((mm=alpha[alphai*S+PS[j][i]]+metric[OS[PS[j][i]*I+PI[j][i]]])<minm)
+ minm=mm,minmi=i;
+ }
+ trace[k*S+j]=minmi;
+ alpha[((alphai+1)%2)*S+j]=minm;
+ if(minm<norm) norm=minm;
+ }
+ for(int j=0;j<S;j++)
+ alpha[((alphai+1)%2)*S+j]-=norm; // normalize total metrics so they do not explode
+ alphai=(alphai+1)%2;
+ }
+
+ if(SK<0) { // final state not specified
+ minm=INF;
+ minmi=0;
+ for(int i=0;i<S;i++)
+ if((mm=alpha[alphai*S+i])<minm) minm=mm,minmi=i;
+ st=minmi;
+ }
+ else {
+ st=SK;
+ }
+
+ for(int k=K-1;k>=0;k--) { // traceback
+ int i0=trace[k*S+st];
+ out[k]= (To) PI[st][i0];
+ st=PS[st][i0];
+ }
+
+ delete [] metric;
+ }
+
+ // Ti = s i f c
+ // To = b s i
+
+ //---------------
+
+ template void
+ viterbi_algorithm_combined<short,unsigned char>(int I, int S, int O,
+ const std::vector<int> &NS,
+ const std::vector<int> &OS,
+ const std::vector< std::vector<int> > &PS,
+ const std::vector< std::vector<int> > &PI,
+ int K,
+ int S0,int SK,
+ int D,
+ const std::vector<short> &TABLE,
+ digital::trellis_metric_type_t TYPE,
+ const short *in, unsigned char *out);
+
+ template void
+ viterbi_algorithm_combined<int,unsigned char>(int I, int S, int O,
+ const std::vector<int> &NS,
+ const std::vector<int> &OS,
+ const std::vector< std::vector<int> > &PS,
+ const std::vector< std::vector<int> > &PI,
+ int K,
+ int S0,int SK,
+ int D,
+ const std::vector<int> &TABLE,
+ digital::trellis_metric_type_t TYPE,
+ const int *in, unsigned char *out);
+
+ template void
+ viterbi_algorithm_combined<float,unsigned char>(int I, int S, int O,
+ const std::vector<int> &NS,
+ const std::vector<int> &OS,
+ const std::vector< std::vector<int> > &PS,
+ const std::vector< std::vector<int> > &PI,
+ int K,
+ int S0,int SK,
+ int D,
+ const std::vector<float> &TABLE,
+ digital::trellis_metric_type_t TYPE,
+ const float *in, unsigned char *out);
+
+ template void
+ viterbi_algorithm_combined<gr_complex,unsigned char>(int I, int S, int O,
+ const std::vector<int> &NS,
+ const std::vector<int> &OS,
+ const std::vector< std::vector<int> > &PS,
+ const std::vector< std::vector<int> > &PI,
+ int K,
+ int S0,int SK,
+ int D,
+ const std::vector<gr_complex> &TABLE,
+ digital::trellis_metric_type_t TYPE,
+ const gr_complex *in, unsigned char *out);
+
+ //---------------
+
+ template void
+ viterbi_algorithm_combined<short,short>(int I, int S, int O,
+ const std::vector<int> &NS,
+ const std::vector<int> &OS,
+ const std::vector< std::vector<int> > &PS,
+ const std::vector< std::vector<int> > &PI,
+ int K,
+ int S0,int SK,
+ int D,
+ const std::vector<short> &TABLE,
+ digital::trellis_metric_type_t TYPE,
+ const short *in, short *out);
+
+ template void
+ viterbi_algorithm_combined<int,short>(int I, int S, int O,
+ const std::vector<int> &NS,
+ const std::vector<int> &OS,
+ const std::vector< std::vector<int> > &PS,
+ const std::vector< std::vector<int> > &PI,
+ int K,
+ int S0,int SK,
+ int D,
+ const std::vector<int> &TABLE,
+ digital::trellis_metric_type_t TYPE,
+ const int *in, short *out);
+
+ template void
+ viterbi_algorithm_combined<float,short>(int I, int S, int O,
+ const std::vector<int> &NS,
+ const std::vector<int> &OS,
+ const std::vector< std::vector<int> > &PS,
+ const std::vector< std::vector<int> > &PI,
+ int K,
+ int S0,int SK,
+ int D,
+ const std::vector<float> &TABLE,
+ digital::trellis_metric_type_t TYPE,
+ const float *in, short *out);
+
+ template void
+ viterbi_algorithm_combined<gr_complex,short>(int I, int S, int O,
+ const std::vector<int> &NS,
+ const std::vector<int> &OS,
+ const std::vector< std::vector<int> > &PS,
+ const std::vector< std::vector<int> > &PI,
+ int K,
+ int S0,int SK,
+ int D,
+ const std::vector<gr_complex> &TABLE,
+ digital::trellis_metric_type_t TYPE,
+ const gr_complex *in, short *out);
+
+ //--------------
+
+ template void
+ viterbi_algorithm_combined<short,int>(int I, int S, int O,
+ const std::vector<int> &NS,
+ const std::vector<int> &OS,
+ const std::vector< std::vector<int> > &PS,
+ const std::vector< std::vector<int> > &PI,
+ int K,
+ int S0,int SK,
+ int D,
+ const std::vector<short> &TABLE,
+ digital::trellis_metric_type_t TYPE,
+ const short *in, int *out);
+
+ template void
+ viterbi_algorithm_combined<int,int>(int I, int S, int O,
+ const std::vector<int> &NS,
+ const std::vector<int> &OS,
+ const std::vector< std::vector<int> > &PS,
+ const std::vector< std::vector<int> > &PI,
+ int K,
+ int S0,int SK,
+ int D,
+ const std::vector<int> &TABLE,
+ digital::trellis_metric_type_t TYPE,
+ const int *in, int *out);
+
+ template void
+ viterbi_algorithm_combined<float,int>(int I, int S, int O,
+ const std::vector<int> &NS,
+ const std::vector<int> &OS,
+ const std::vector< std::vector<int> > &PS,
+ const std::vector< std::vector<int> > &PI,
+ int K,
+ int S0,int SK,
+ int D,
+ const std::vector<float> &TABLE,
+ digital::trellis_metric_type_t TYPE,
+ const float *in, int *out);
+
+ template void
+ viterbi_algorithm_combined<gr_complex,int>(int I, int S, int O,
+ const std::vector<int> &NS,
+ const std::vector<int> &OS,
+ const std::vector< std::vector<int> > &PS,
+ const std::vector< std::vector<int> > &PI,
+ int K,
+ int S0,int SK,
+ int D,
+ const std::vector<gr_complex> &TABLE,
+ digital::trellis_metric_type_t TYPE,
+ const gr_complex *in, int *out);
+
+ //===============================================
+
+ void
+ siso_algorithm(int I, int S, int O,
+ const std::vector<int> &NS,
+ const std::vector<int> &OS,
+ const std::vector< std::vector<int> > &PS,
+ const std::vector< std::vector<int> > &PI,
+ int K,
+ int S0,int SK,
+ bool POSTI, bool POSTO,
+ float (*p2mymin)(float,float),
+ const float *priori, const float *prioro, float *post//,
+ //std::vector<float> &alpha,
+ //std::vector<float> &beta
+ )
+ {
+ float norm,mm,minm;
+ std::vector<float> alpha(S*(K+1));
+ std::vector<float> beta(S*(K+1));
+
+ if(S0<0) { // initial state not specified
+ for(int i=0;i<S;i++) alpha[0*S+i]=0;
+ }
+ else {
+ for(int i=0;i<S;i++) alpha[0*S+i]=INF;
+ alpha[0*S+S0]=0.0;
+ }
+
+ for(int k=0;k<K;k++) { // forward recursion
+ norm=INF;
+ for(int j=0;j<S;j++) {
+ minm=INF;
+ for(unsigned int i=0;i<PS[j].size();i++) {
+ //int i0 = j*I+i;
+ mm=alpha[k*S+PS[j][i]]+priori[k*I+PI[j][i]]+prioro[k*O+OS[PS[j][i]*I+PI[j][i]]];
+ minm=(*p2mymin)(minm,mm);
+ }
+ alpha[(k+1)*S+j]=minm;
+ if(minm<norm) norm=minm;
+ }
+ for(int j=0;j<S;j++)
+ alpha[(k+1)*S+j]-=norm; // normalize total metrics so they do not explode
+ }
+
+ if(SK<0) { // final state not specified
+ for(int i=0;i<S;i++) beta[K*S+i]=0;
+ }
+ else {
+ for(int i=0;i<S;i++) beta[K*S+i]=INF;
+ beta[K*S+SK]=0.0;
+ }
+
+ for(int k=K-1;k>=0;k--) { // backward recursion
+ norm=INF;
+ for(int j=0;j<S;j++) {
+ minm=INF;
+ for(int i=0;i<I;i++) {
+ int i0 = j*I+i;
+ mm=beta[(k+1)*S+NS[i0]]+priori[k*I+i]+prioro[k*O+OS[i0]];
+ minm=(*p2mymin)(minm,mm);
+ }
+ beta[k*S+j]=minm;
+ if(minm<norm) norm=minm;
+ }
+ for(int j=0;j<S;j++)
+ beta[k*S+j]-=norm; // normalize total metrics so they do not explode
+ }
+
+ if(POSTI && POSTO)
+ {
+ for(int k=0;k<K;k++) { // input combining
+ norm=INF;
+ for(int i=0;i<I;i++) {
+ minm=INF;
+ for(int j=0;j<S;j++) {
+ mm=alpha[k*S+j]+prioro[k*O+OS[j*I+i]]+beta[(k+1)*S+NS[j*I+i]];
+ minm=(*p2mymin)(minm,mm);
+ }
+ post[k*(I+O)+i]=minm;
+ if(minm<norm) norm=minm;
+ }
+ for(int i=0;i<I;i++)
+ post[k*(I+O)+i]-=norm; // normalize metrics
+ }
+
+ for(int k=0;k<K;k++) { // output combining
+ norm=INF;
+ for(int n=0;n<O;n++) {
+ minm=INF;
+ for(int j=0;j<S;j++) {
+ for(int i=0;i<I;i++) {
+ mm= (n==OS[j*I+i] ? alpha[k*S+j]+priori[k*I+i]+beta[(k+1)*S+NS[j*I+i]] : INF);
+ minm=(*p2mymin)(minm,mm);
+ }
+ }
+ post[k*(I+O)+I+n]=minm;
+ if(minm<norm) norm=minm;
+ }
+ for(int n=0;n<O;n++)
+ post[k*(I+O)+I+n]-=norm; // normalize metrics
+ }
+ }
+ else if(POSTI)
+ {
+ for(int k=0;k<K;k++) { // input combining
+ norm=INF;
+ for(int i=0;i<I;i++) {
+ minm=INF;
+ for(int j=0;j<S;j++) {
+ mm=alpha[k*S+j]+prioro[k*O+OS[j*I+i]]+beta[(k+1)*S+NS[j*I+i]];
+ minm=(*p2mymin)(minm,mm);
+ }
+ post[k*I+i]=minm;
+ if(minm<norm) norm=minm;
+ }
+ for(int i=0;i<I;i++)
+ post[k*I+i]-=norm; // normalize metrics
+ }
+ }
+ else if(POSTO)
+ {
+ for(int k=0;k<K;k++) { // output combining
+ norm=INF;
+ for(int n=0;n<O;n++) {
+ minm=INF;
+ for(int j=0;j<S;j++) {
+ for(int i=0;i<I;i++) {
+ mm= (n==OS[j*I+i] ? alpha[k*S+j]+priori[k*I+i]+beta[(k+1)*S+NS[j*I+i]] : INF);
+ minm=(*p2mymin)(minm,mm);
+ }
+ }
+ post[k*O+n]=minm;
+ if(minm<norm) norm=minm;
+ }
+ for(int n=0;n<O;n++)
+ post[k*O+n]-=norm; // normalize metrics
+ }
+ }
+ else
+ throw std::runtime_error("Not both POSTI and POSTO can be false.");
+ }
+
+ //===========================================================
+
+ template <class T> void
+ siso_algorithm_combined(int I, int S, int O,
+ const std::vector<int> &NS,
+ const std::vector<int> &OS,
+ const std::vector< std::vector<int> > &PS,
+ const std::vector< std::vector<int> > &PI,
+ int K,
+ int S0,int SK,
+ bool POSTI, bool POSTO,
+ float (*p2mymin)(float,float),
+ int D,
+ const std::vector<T> &TABLE,
+ digital::trellis_metric_type_t TYPE,
+ const float *priori, const T *observations, float *post)
+ {
+ float norm,mm,minm;
+ std::vector<float> alpha(S*(K+1));
+ std::vector<float> beta(S*(K+1));
+ float *prioro = new float[O*K];
+
+ if(S0<0) { // initial state not specified
+ for(int i=0;i<S;i++) alpha[0*S+i]=0;
+ }
+ else {
+ for(int i=0;i<S;i++) alpha[0*S+i]=INF;
+ alpha[0*S+S0]=0.0;
+ }
+
+ for(int k=0;k<K;k++) { // forward recursion
+ calc_metric(O, D, TABLE, &(observations[k*D]), &(prioro[k*O]),TYPE); // calc metrics
+ norm=INF;
+ for(int j=0;j<S;j++) {
+ minm=INF;
+ for(unsigned int i=0;i<PS[j].size();i++) {
+ //int i0 = j*I+i;
+ mm=alpha[k*S+PS[j][i]]+priori[k*I+PI[j][i]]+prioro[k*O+OS[PS[j][i]*I+PI[j][i]]];
+ minm=(*p2mymin)(minm,mm);
+ }
+ alpha[(k+1)*S+j]=minm;
+ if(minm<norm) norm=minm;
+ }
+ for(int j=0;j<S;j++)
+ alpha[(k+1)*S+j]-=norm; // normalize total metrics so they do not explode
+ }
+
+ if(SK<0) { // final state not specified
+ for(int i=0;i<S;i++) beta[K*S+i]=0;
+ }
+ else {
+ for(int i=0;i<S;i++) beta[K*S+i]=INF;
+ beta[K*S+SK]=0.0;
+ }
+
+ for(int k=K-1;k>=0;k--) { // backward recursion
+ norm=INF;
+ for(int j=0;j<S;j++) {
+ minm=INF;
+ for(int i=0;i<I;i++) {
+ int i0 = j*I+i;
+ mm=beta[(k+1)*S+NS[i0]]+priori[k*I+i]+prioro[k*O+OS[i0]];
+ minm=(*p2mymin)(minm,mm);
+ }
+ beta[k*S+j]=minm;
+ if(minm<norm) norm=minm;
+ }
+ for(int j=0;j<S;j++)
+ beta[k*S+j]-=norm; // normalize total metrics so they do not explode
+ }
+
+ if(POSTI && POSTO)
+ {
+ for(int k=0;k<K;k++) { // input combining
+ norm=INF;
+ for(int i=0;i<I;i++) {
+ minm=INF;
+ for(int j=0;j<S;j++) {
+ mm=alpha[k*S+j]+prioro[k*O+OS[j*I+i]]+beta[(k+1)*S+NS[j*I+i]];
+ minm=(*p2mymin)(minm,mm);
+ }
+ post[k*(I+O)+i]=minm;
+ if(minm<norm) norm=minm;
+ }
+ for(int i=0;i<I;i++)
+ post[k*(I+O)+i]-=norm; // normalize metrics
+ }
+
+ for(int k=0;k<K;k++) { // output combining
+ norm=INF;
+ for(int n=0;n<O;n++) {
+ minm=INF;
+ for(int j=0;j<S;j++) {
+ for(int i=0;i<I;i++) {
+ mm= (n==OS[j*I+i] ? alpha[k*S+j]+priori[k*I+i]+beta[(k+1)*S+NS[j*I+i]] : INF);
+ minm=(*p2mymin)(minm,mm);
+ }
+ }
+ post[k*(I+O)+I+n]=minm;
+ if(minm<norm) norm=minm;
+ }
+ for(int n=0;n<O;n++)
+ post[k*(I+O)+I+n]-=norm; // normalize metrics
+ }
+ }
+ else if(POSTI)
+ {
+ for(int k=0;k<K;k++) { // input combining
+ norm=INF;
+ for(int i=0;i<I;i++) {
+ minm=INF;
+ for(int j=0;j<S;j++) {
+ mm=alpha[k*S+j]+prioro[k*O+OS[j*I+i]]+beta[(k+1)*S+NS[j*I+i]];
+ minm=(*p2mymin)(minm,mm);
+ }
+ post[k*I+i]=minm;
+ if(minm<norm) norm=minm;
+ }
+ for(int i=0;i<I;i++)
+ post[k*I+i]-=norm; // normalize metrics
+ }
+ }
+ else if(POSTO) {
+ for(int k=0;k<K;k++) { // output combining
+ norm=INF;
+ for(int n=0;n<O;n++) {
+ minm=INF;
+ for(int j=0;j<S;j++) {
+ for(int i=0;i<I;i++) {
+ mm= (n==OS[j*I+i] ? alpha[k*S+j]+priori[k*I+i]+beta[(k+1)*S+NS[j*I+i]] : INF);
+ minm=(*p2mymin)(minm,mm);
+ }
+ }
+ post[k*O+n]=minm;
+ if(minm<norm) norm=minm;
+ }
+ for(int n=0;n<O;n++)
+ post[k*O+n]-=norm; // normalize metrics
+ }
+ }
+ else
+ throw std::runtime_error ("Not both POSTI and POSTO can be false.");
+
+ delete [] prioro;
+ }
+
+ //---------
+
+ template void
+ siso_algorithm_combined<short>(int I, int S, int O,
+ const std::vector<int> &NS,
+ const std::vector<int> &OS,
+ const std::vector< std::vector<int> > &PS,
+ const std::vector< std::vector<int> > &PI,
+ int K,
+ int S0,int SK,
+ bool POSTI, bool POSTO,
+ float (*p2mymin)(float,float),
+ int D,
+ const std::vector<short> &TABLE,
+ digital::trellis_metric_type_t TYPE,
+ const float *priori, const short *observations, float *post);
+
+ template void
+ siso_algorithm_combined<int>(int I, int S, int O,
+ const std::vector<int> &NS,
+ const std::vector<int> &OS,
+ const std::vector< std::vector<int> > &PS,
+ const std::vector< std::vector<int> > &PI,
+ int K,
+ int S0,int SK,
+ bool POSTI, bool POSTO,
+ float (*p2mymin)(float,float),
+ int D,
+ const std::vector<int> &TABLE,
+ digital::trellis_metric_type_t TYPE,
+ const float *priori, const int *observations, float *post);
+
+ template void
+ siso_algorithm_combined<float>(int I, int S, int O,
+ const std::vector<int> &NS,
+ const std::vector<int> &OS,
+ const std::vector< std::vector<int> > &PS,
+ const std::vector< std::vector<int> > &PI,
+ int K,
+ int S0,int SK,
+ bool POSTI, bool POSTO,
+ float (*p2mymin)(float,float),
+ int D,
+ const std::vector<float> &TABLE,
+ digital::trellis_metric_type_t TYPE,
+ const float *priori, const float *observations, float *post);
+
+ template void
+ siso_algorithm_combined<gr_complex>(int I, int S, int O,
+ const std::vector<int> &NS,
+ const std::vector<int> &OS,
+ const std::vector< std::vector<int> > &PS,
+ const std::vector< std::vector<int> > &PI,
+ int K,
+ int S0,int SK,
+ bool POSTI, bool POSTO,
+ float (*p2mymin)(float,float),
+ int D,
+ const std::vector<gr_complex> &TABLE,
+ digital::trellis_metric_type_t TYPE,
+ const float *priori, const gr_complex *observations, float *post);
+
+ //=========================================================
+
+ template<class Ti, class To> void
+ sccc_decoder_combined(const fsm &FSMo, int STo0, int SToK,
+ const fsm &FSMi, int STi0, int STiK,
+ const interleaver &INTERLEAVER, int blocklength, int iterations,
+ float (*p2mymin)(float,float),
+ int D, const std::vector<Ti> &TABLE,
+ digital::trellis_metric_type_t METRIC_TYPE,
+ float scaling,
+ const Ti *observations, To *data)
+ {
+ //allocate space for priori, prioro and posti of inner FSM
+ std::vector<float> ipriori(blocklength*FSMi.I(),0.0);
+ std::vector<float> iprioro(blocklength*FSMi.O());
+ std::vector<float> iposti(blocklength*FSMi.I());
+
+ //allocate space for priori, prioro and posto of outer FSM
+ std::vector<float> opriori(blocklength*FSMo.I(),0.0);
+ std::vector<float> oprioro(blocklength*FSMo.O());
+ std::vector<float> oposti(blocklength*FSMo.I());
+ std::vector<float> oposto(blocklength*FSMo.O());
+
+ // turn observations to neg-log-priors
+ for(int k=0;k<blocklength;k++) {
+ calc_metric(FSMi.O(), D, TABLE, &(observations[k*D]), &(iprioro[k*FSMi.O()]),METRIC_TYPE);
+ iprioro[k*FSMi.O()] *= scaling;
+ }
+
+ for(int rep=0;rep<iterations;rep++) {
+ // run inner SISO
+ siso_algorithm(FSMi.I(),FSMi.S(),FSMi.O(),
+ FSMi.NS(), FSMi.OS(), FSMi.PS(), FSMi.PI(),
+ blocklength,
+ STi0,STiK,
+ true, false,
+ p2mymin,
+ &(ipriori[0]), &(iprioro[0]), &(iposti[0]));
+
+ //interleave soft info inner -> outer
+ for(int k=0;k<blocklength;k++) {
+ int ki = INTERLEAVER.DEINTER()[k];
+ //for(int i=0;i<FSMi.I();i++) {
+ //oprioro[k*FSMi.I()+i]=iposti[ki*FSMi.I()+i];
+ //}
+ memcpy(&(oprioro[k*FSMi.I()]),&(iposti[ki*FSMi.I()]),FSMi.I()*sizeof(float));
+ }
+
+ // run outer SISO
+
+ if(rep<iterations-1) { // do not produce posti
+ siso_algorithm(FSMo.I(),FSMo.S(),FSMo.O(),
+ FSMo.NS(), FSMo.OS(), FSMo.PS(), FSMo.PI(),
+ blocklength,
+ STo0,SToK,
+ false, true,
+ p2mymin,
+ &(opriori[0]), &(oprioro[0]), &(oposto[0]));
+
+ //interleave soft info outer --> inner
+ for(int k=0;k<blocklength;k++) {
+ int ki = INTERLEAVER.DEINTER()[k];
+ //for(int i=0;i<FSMi.I();i++) {
+ //ipriori[ki*FSMi.I()+i]=oposto[k*FSMi.I()+i];
+ //}
+ memcpy(&(ipriori[ki*FSMi.I()]),&(oposto[k*FSMi.I()]),FSMi.I()*sizeof(float));
+ }
+ }
+ else // produce posti but not posto
+
+ siso_algorithm(FSMo.I(),FSMo.S(),FSMo.O(),
+ FSMo.NS(), FSMo.OS(), FSMo.PS(), FSMo.PI(),
+ blocklength,
+ STo0,SToK,
+ true, false,
+ p2mymin,
+ &(opriori[0]), &(oprioro[0]), &(oposti[0]));
+
+ /*
+ viterbi_algorithm(FSMo.I(),FSMo.S(),FSMo.O(),
+ FSMo.NS(), FSMo.OS(), FSMo.PS(), FSMo.PI(),
+ blocklength,
+ STo0,SToK,
+ &(oprioro[0]), data
+ );
+ */
+ }
+
+ // generate hard decisions
+ for(int k=0;k<blocklength;k++) {
+ float min=INF;
+ int mini=0;
+ for(int i=0;i<FSMo.I();i++) {
+ if(oposti[k*FSMo.I()+i]<min) {
+ min=oposti[k*FSMo.I()+i];
+ mini=i;
+ }
+ }
+ data[k]=(To)mini;
+ }
+ }
+
+ //-------
+
+ template void
+ sccc_decoder_combined<float,unsigned char>(const fsm &FSMo, int STo0, int SToK,
+ const fsm &FSMi, int STi0, int STiK,
+ const interleaver &INTERLEAVER, int blocklength,
+ int iterations,
+ float (*p2mymin)(float,float),
+ int D, const std::vector<float> &TABLE,
+ digital::trellis_metric_type_t METRIC_TYPE,
+ float scaling,
+ const float *observations, unsigned char *data);
+
+ template void
+ sccc_decoder_combined<float,short>(const fsm &FSMo, int STo0, int SToK,
+ const fsm &FSMi, int STi0, int STiK,
+ const interleaver &INTERLEAVER, int blocklength,
+ int iterations,
+ float (*p2mymin)(float,float),
+ int D, const std::vector<float> &TABLE,
+ digital::trellis_metric_type_t METRIC_TYPE,
+ float scaling,
+ const float *observations, short *data);
+
+ template void
+ sccc_decoder_combined<float,int>(const fsm &FSMo, int STo0, int SToK,
+ const fsm &FSMi, int STi0, int STiK,
+ const interleaver &INTERLEAVER, int blocklength,
+ int iterations,
+ float (*p2mymin)(float,float),
+ int D, const std::vector<float> &TABLE,
+ digital::trellis_metric_type_t METRIC_TYPE,
+ float scaling,
+ const float *observations, int *data);
+
+ template void
+ sccc_decoder_combined<gr_complex,unsigned char>(const fsm &FSMo, int STo0, int SToK,
+ const fsm &FSMi, int STi0, int STiK,
+ const interleaver &INTERLEAVER, int blocklength,
+ int iterations,
+ float (*p2mymin)(float,float),
+ int D, const std::vector<gr_complex> &TABLE,
+ digital::trellis_metric_type_t METRIC_TYPE,
+ float scaling,
+ const gr_complex *observations, unsigned char *data
+ );
+
+ template void
+ sccc_decoder_combined<gr_complex,short>(const fsm &FSMo, int STo0, int SToK,
+ const fsm &FSMi, int STi0, int STiK,
+ const interleaver &INTERLEAVER, int blocklength,
+ int iterations,
+ float (*p2mymin)(float,float),
+ int D, const std::vector<gr_complex> &TABLE,
+ digital::trellis_metric_type_t METRIC_TYPE,
+ float scaling,
+ const gr_complex *observations, short *data);
+
+ template void
+ sccc_decoder_combined<gr_complex,int>(const fsm &FSMo, int STo0, int SToK,
+ const fsm &FSMi, int STi0, int STiK,
+ const interleaver &INTERLEAVER, int blocklength,
+ int iterations,
+ float (*p2mymin)(float,float),
+ int D, const std::vector<gr_complex> &TABLE,
+ digital::trellis_metric_type_t METRIC_TYPE,
+ float scaling,
+ const gr_complex *observations, int *data);
+
+ //=========================================================
+
+ template<class T> void
+ sccc_decoder(const fsm &FSMo, int STo0, int SToK,
+ const fsm &FSMi, int STi0, int STiK,
+ const interleaver &INTERLEAVER, int blocklength, int iterations,
+ float (*p2mymin)(float,float),
+ const float *iprioro, T *data)
+ {
+ //allocate space for priori, and posti of inner FSM
+ std::vector<float> ipriori(blocklength*FSMi.I(),0.0);
+ std::vector<float> iposti(blocklength*FSMi.I());
+
+ //allocate space for priori, prioro and posto of outer FSM
+ std::vector<float> opriori(blocklength*FSMo.I(),0.0);
+ std::vector<float> oprioro(blocklength*FSMo.O());
+ std::vector<float> oposti(blocklength*FSMo.I());
+ std::vector<float> oposto(blocklength*FSMo.O());
+
+ for(int rep=0;rep<iterations;rep++) {
+ // run inner SISO
+ siso_algorithm(FSMi.I(),FSMi.S(),FSMi.O(),
+ FSMi.NS(), FSMi.OS(), FSMi.PS(), FSMi.PI(),
+ blocklength,
+ STi0,STiK,
+ true, false,
+ p2mymin,
+ &(ipriori[0]), &(iprioro[0]), &(iposti[0]));
+
+ //interleave soft info inner -> outer
+ for(int k=0;k<blocklength;k++) {
+ int ki = INTERLEAVER.DEINTER()[k];
+ //for(int i=0;i<FSMi.I();i++) {
+ //oprioro[k*FSMi.I()+i]=iposti[ki*FSMi.I()+i];
+ //}
+ memcpy(&(oprioro[k*FSMi.I()]),&(iposti[ki*FSMi.I()]),FSMi.I()*sizeof(float));
+ }
+
+ // run outer SISO
+
+ if(rep<iterations-1) { // do not produce posti
+ siso_algorithm(FSMo.I(),FSMo.S(),FSMo.O(),
+ FSMo.NS(), FSMo.OS(), FSMo.PS(), FSMo.PI(),
+ blocklength,
+ STo0,SToK,
+ false, true,
+ p2mymin,
+ &(opriori[0]), &(oprioro[0]), &(oposto[0]));
+
+ //interleave soft info outer --> inner
+ for(int k=0;k<blocklength;k++) {
+ int ki = INTERLEAVER.DEINTER()[k];
+ //for(int i=0;i<FSMi.I();i++) {
+ //ipriori[ki*FSMi.I()+i]=oposto[k*FSMi.I()+i];
+ //}
+ memcpy(&(ipriori[ki*FSMi.I()]),&(oposto[k*FSMi.I()]),FSMi.I()*sizeof(float));
+ }
+ }
+ else {// produce posti but not posto
+ siso_algorithm(FSMo.I(),FSMo.S(),FSMo.O(),
+ FSMo.NS(), FSMo.OS(), FSMo.PS(), FSMo.PI(),
+ blocklength,
+ STo0,SToK,
+ true, false,
+ p2mymin,
+ &(opriori[0]), &(oprioro[0]), &(oposti[0]));
+
+ /*
+ viterbi_algorithm(FSMo.I(),FSMo.S(),FSMo.O(),
+ FSMo.NS(), FSMo.OS(), FSMo.PS(), FSMo.PI(),
+ blocklength,
+ STo0,SToK,
+ &(oprioro[0]), data);
+ */
+ }
+ } // end iterations
+
+ // generate hard decisions
+ for(int k=0;k<blocklength;k++) {
+ float min=INF;
+ int mini=0;
+ for(int i=0;i<FSMo.I();i++) {
+ if(oposti[k*FSMo.I()+i]<min) {
+ min=oposti[k*FSMo.I()+i];
+ mini=i;
+ }
+ }
+ data[k]=(T)mini;
+ }
+ }
+
+ //-------
+
+ template void
+ sccc_decoder<unsigned char>(const fsm &FSMo, int STo0, int SToK,
+ const fsm &FSMi, int STi0, int STiK,
+ const interleaver &INTERLEAVER, int blocklength,
+ int iterations,
+ float (*p2mymin)(float,float),
+ const float *iprioro, unsigned char *data);
+
+ template void
+ sccc_decoder<short>(const fsm &FSMo, int STo0, int SToK,
+ const fsm &FSMi, int STi0, int STiK,
+ const interleaver &INTERLEAVER, int blocklength,
+ int iterations,
+ float (*p2mymin)(float,float),
+ const float *iprioro, short *data);
+
+ template void
+ sccc_decoder<int>(const fsm &FSMo, int STo0, int SToK,
+ const fsm &FSMi, int STi0, int STiK,
+ const interleaver &INTERLEAVER, int blocklength,
+ int iterations,
+ float (*p2mymin)(float,float),
+ const float *iprioro, int *data);
+
+ //====================================================
+
+ template<class T> void
+ pccc_decoder(const fsm &FSM1, int ST10, int ST1K,
+ const fsm &FSM2, int ST20, int ST2K,
+ const interleaver &INTERLEAVER, int blocklength,
+ int iterations,
+ float (*p2mymin)(float,float),
+ const float *cprioro, T *data)
+ {
+ //allocate space for priori, prioro and posti of FSM1
+ std::vector<float> priori1(blocklength*FSM1.I(),0.0);
+ std::vector<float> prioro1(blocklength*FSM1.O());
+ std::vector<float> posti1(blocklength*FSM1.I());
+
+ //allocate space for priori, prioro and posti of FSM2
+ std::vector<float> priori2(blocklength*FSM2.I(),0.0);
+ std::vector<float> prioro2(blocklength*FSM2.O());
+ std::vector<float> posti2(blocklength*FSM2.I());
+
+ //generate prioro1,2 (metrics are not updated per iteration: this is not the best you can do...)
+ for(int k=0;k<blocklength;k++) {
+ //std::cout << k << std::endl;
+ for(int i=0;i<FSM1.O();i++) {
+ float x=cprioro[k*FSM1.O()*FSM2.O()+i*FSM1.O()+0];
+ for(int j=1;j<FSM2.O();j++)
+ x = (*p2mymin)(x,cprioro[k*FSM1.O()*FSM2.O()+i*FSM1.O()+j]);
+ prioro1[k*FSM1.O()+i]=x;
+ //std::cout << prioro1[k*FSM1.O()+i] << ", ";
+ }
+ //std::cout << std::endl;
+ for(int i=0;i<FSM2.O();i++) {
+ float x=cprioro[k*FSM1.O()*FSM2.O()+0*FSM1.O()+i];
+ for(int j=1;j<FSM1.O();j++)
+ x = (*p2mymin)(x,cprioro[k*FSM1.O()*FSM2.O()+j*FSM1.O()+i]);
+ prioro2[k*FSM2.O()+i]=x;
+ }
+ }
+
+ for(int rep=0;rep<iterations;rep++) {
+ // run SISO 1
+ siso_algorithm(FSM1.I(),FSM1.S(),FSM1.O(),
+ FSM1.NS(), FSM1.OS(), FSM1.PS(), FSM1.PI(),
+ blocklength,
+ ST10,ST1K,
+ true, false,
+ p2mymin,
+ &(priori1[0]), &(prioro1[0]), &(posti1[0]));
+
+ //for(int k=0;k<blocklength;k++){
+ //for(int i=0;i<FSM1.I();i++)
+ //std::cout << posti1[k*FSM1.I()+i] << ", ";
+ //std::cout << std::endl;
+ //}
+
+ //interleave soft info 1 -> 2
+ for(int k=0;k<blocklength;k++) {
+ int ki = INTERLEAVER.INTER()[k];
+ //for(int i=0;i<FSMi.I();i++) {
+ //oprioro[k*FSMi.I()+i]=iposti[ki*FSMi.I()+i];
+ //}
+ memcpy(&(priori2[k*FSM2.I()]),&(posti1[ki*FSM1.I()]),FSM1.I()*sizeof(float));
+ }
+
+ // run SISO 2
+ siso_algorithm(FSM2.I(),FSM2.S(),FSM2.O(),
+ FSM2.NS(), FSM2.OS(), FSM2.PS(), FSM2.PI(),
+ blocklength,
+ ST20,ST2K,
+ true, false,
+ p2mymin,
+ &(priori2[0]), &(prioro2[0]), &(posti2[0]));
+
+ //interleave soft info 2 --> 1
+ for(int k=0;k<blocklength;k++) {
+ int ki = INTERLEAVER.INTER()[k];
+ //for(int i=0;i<FSMi.I();i++) {
+ //ipriori[ki*FSMi.I()+i]=oposto[k*FSMi.I()+i];
+ //}
+ memcpy(&(priori1[ki*FSM1.I()]),&(posti2[k*FSM2.I()]),FSM1.I()*sizeof(float));
+ }
+ } // end iterations
+
+ // generate hard decisions
+ for(int k=0;k<blocklength;k++) {
+ for(int i=0;i<FSM1.I();i++)
+ posti1[k*FSM1.I()+i] = (*p2mymin)(priori1[k*FSM1.I()+i],posti1[k*FSM1.I()+i]);
+ float min=INF;
+ int mini=0;
+ for(int i=0;i<FSM1.I();i++) {
+ if(posti1[k*FSM1.I()+i]<min) {
+ min=posti1[k*FSM1.I()+i];
+ mini=i;
+ }
+ }
+ data[k]=(T)mini;
+ //std::cout << data[k] << ", "<< std::endl;
+ }
+ //std::cout << std::endl;
+ }
+
+ //----------------
+
+ template void
+ pccc_decoder<unsigned char>(const fsm &FSM1, int ST10, int ST1K,
+ const fsm &FSM2, int ST20, int ST2K,
+ const interleaver &INTERLEAVER, int blocklength,
+ int iterations,
+ float (*p2mymin)(float,float),
+ const float *cprioro, unsigned char *data);
+
+ template void
+ pccc_decoder<short>(const fsm &FSM1, int ST10, int ST1K,
+ const fsm &FSM2, int ST20, int ST2K,
+ const interleaver &INTERLEAVER, int blocklength,
+ int iterations,
+ float (*p2mymin)(float,float),
+ const float *cprioro, short *data);
+
+ template void
+ pccc_decoder<int>(const fsm &FSM1, int ST10, int ST1K,
+ const fsm &FSM2, int ST20, int ST2K,
+ const interleaver &INTERLEAVER, int blocklength,
+ int iterations,
+ float (*p2mymin)(float,float),
+ const float *cprioro, int *data);
+
+ //----------------
+
+ template<class Ti, class To> void
+ pccc_decoder_combined(const fsm &FSM1, int ST10, int ST1K,
+ const fsm &FSM2, int ST20, int ST2K,
+ const interleaver &INTERLEAVER, int blocklength,
+ int iterations,
+ float (*p2mymin)(float,float),
+ int D, const std::vector<Ti> &TABLE,
+ digital::trellis_metric_type_t METRIC_TYPE,
+ float scaling,
+ const Ti *observations, To *data)
+ {
+ //allocate space for cprioro
+ std::vector<float> cprioro(blocklength*FSM1.O()*FSM2.O(),0.0);
+
+ //allocate space for priori, prioro and posti of FSM1
+ std::vector<float> priori1(blocklength*FSM1.I(),0.0);
+ std::vector<float> prioro1(blocklength*FSM1.O());
+ std::vector<float> posti1(blocklength*FSM1.I());
+
+ //allocate space for priori, prioro and posti of FSM2
+ std::vector<float> priori2(blocklength*FSM2.I(),0.0);
+ std::vector<float> prioro2(blocklength*FSM2.O());
+ std::vector<float> posti2(blocklength*FSM2.I());
+
+ // turn observations to neg-log-priors for cprioiro
+ int O=FSM1.O()*FSM2.O();
+ for(int k=0;k<blocklength;k++) {
+ calc_metric(O, D, TABLE, &(observations[k*D]), &(cprioro[k*O]),METRIC_TYPE);
+ cprioro[k*O] *= scaling;
+ }
+
+ //generate prioro1,2 (metrics are not updated per iteration: this is not the best you can do...)
+ for(int k=0;k<blocklength;k++) {
+ //std::cout << k << std::endl;
+ for(int i=0;i<FSM1.O();i++) {
+ float x=cprioro[k*FSM1.O()*FSM2.O()+i*FSM1.O()+0];
+ for(int j=1;j<FSM2.O();j++)
+ x = (*p2mymin)(x,cprioro[k*FSM1.O()*FSM2.O()+i*FSM1.O()+j]);
+ prioro1[k*FSM1.O()+i]=x;
+ //std::cout << prioro1[k*FSM1.O()+i] << ", ";
+ }
+ //std::cout << std::endl;
+ for(int i=0;i<FSM2.O();i++) {
+ float x=cprioro[k*FSM1.O()*FSM2.O()+0*FSM1.O()+i];
+ for(int j=1;j<FSM1.O();j++)
+ x = (*p2mymin)(x,cprioro[k*FSM1.O()*FSM2.O()+j*FSM1.O()+i]);
+ prioro2[k*FSM2.O()+i]=x;
+ }
+ }
+
+ for(int rep=0;rep<iterations;rep++) {
+ // run SISO 1
+ siso_algorithm(FSM1.I(),FSM1.S(),FSM1.O(),
+ FSM1.NS(), FSM1.OS(), FSM1.PS(), FSM1.PI(),
+ blocklength,
+ ST10,ST1K,
+ true, false,
+ p2mymin,
+ &(priori1[0]), &(prioro1[0]), &(posti1[0]));
+
+ //for(int k=0;k<blocklength;k++){
+ //for(int i=0;i<FSM1.I();i++)
+ //std::cout << posti1[k*FSM1.I()+i] << ", ";
+ //std::cout << std::endl;
+ //}
+
+ //interleave soft info 1 -> 2
+ for(int k=0;k<blocklength;k++) {
+ int ki = INTERLEAVER.INTER()[k];
+ //for(int i=0;i<FSMi.I();i++) {
+ //oprioro[k*FSMi.I()+i]=iposti[ki*FSMi.I()+i];
+ //}
+ memcpy(&(priori2[k*FSM2.I()]),&(posti1[ki*FSM1.I()]),FSM1.I()*sizeof(float));
+ }
+
+ // run SISO 2
+ siso_algorithm(FSM2.I(),FSM2.S(),FSM2.O(),
+ FSM2.NS(), FSM2.OS(), FSM2.PS(), FSM2.PI(),
+ blocklength,
+ ST20,ST2K,
+ true, false,
+ p2mymin,
+ &(priori2[0]), &(prioro2[0]), &(posti2[0]));
+
+ //interleave soft info 2 --> 1
+ for(int k=0;k<blocklength;k++) {
+ int ki = INTERLEAVER.INTER()[k];
+ //for(int i=0;i<FSMi.I();i++) {
+ //ipriori[ki*FSMi.I()+i]=oposto[k*FSMi.I()+i];
+ //}
+ memcpy(&(priori1[ki*FSM1.I()]),&(posti2[k*FSM2.I()]),FSM1.I()*sizeof(float));
+ }
+ } // end iterations
+
+ // generate hard decisions
+ for(int k=0;k<blocklength;k++) {
+ for(int i=0;i<FSM1.I();i++)
+ posti1[k*FSM1.I()+i] = (*p2mymin)(priori1[k*FSM1.I()+i],posti1[k*FSM1.I()+i]);
+ float min=INF;
+ int mini=0;
+ for(int i=0;i<FSM1.I();i++) {
+ if(posti1[k*FSM1.I()+i]<min) {
+ min=posti1[k*FSM1.I()+i];
+ mini=i;
+ }
+ }
+ data[k]=(To)mini;
+ //std::cout << data[k] << ", "<< std::endl;
+ }
+ //std::cout << std::endl;
+ }
+
+ template void
+ pccc_decoder_combined(const fsm &FSM1, int ST10, int ST1K,
+ const fsm &FSM2, int ST20, int ST2K,
+ const interleaver &INTERLEAVER, int blocklength,
+ int iterations,
+ float (*p2mymin)(float,float),
+ int D, const std::vector<float> &TABLE,
+ digital::trellis_metric_type_t METRIC_TYPE,
+ float scaling,
+ const float *observations, unsigned char *data);
+
+ template void
+ pccc_decoder_combined(const fsm &FSM1, int ST10, int ST1K,
+ const fsm &FSM2, int ST20, int ST2K,
+ const interleaver &INTERLEAVER, int blocklength,
+ int iterations,
+ float (*p2mymin)(float,float),
+ int D, const std::vector<float> &TABLE,
+ digital::trellis_metric_type_t METRIC_TYPE,
+ float scaling,
+ const float *observations, short *data);
+
+ template void
+ pccc_decoder_combined(const fsm &FSM1, int ST10, int ST1K,
+ const fsm &FSM2, int ST20, int ST2K,
+ const interleaver &INTERLEAVER, int blocklength,
+ int iterations,
+ float (*p2mymin)(float,float),
+ int D, const std::vector<float> &TABLE,
+ digital::trellis_metric_type_t METRIC_TYPE,
+ float scaling,
+ const float *observations, int *data);
+
+ template void
+ pccc_decoder_combined(const fsm &FSM1, int ST10, int ST1K,
+ const fsm &FSM2, int ST20, int ST2K,
+ const interleaver &INTERLEAVER, int blocklength,
+ int iterations,
+ float (*p2mymin)(float,float),
+ int D, const std::vector<gr_complex> &TABLE,
+ digital::trellis_metric_type_t METRIC_TYPE,
+ float scaling,
+ const gr_complex *observations, unsigned char *data);
+
+ template void
+ pccc_decoder_combined(const fsm &FSM1, int ST10, int ST1K,
+ const fsm &FSM2, int ST20, int ST2K,
+ const interleaver &INTERLEAVER, int blocklength,
+ int iterations,
+ float (*p2mymin)(float,float),
+ int D, const std::vector<gr_complex> &TABLE,
+ digital::trellis_metric_type_t METRIC_TYPE,
+ float scaling,
+ const gr_complex *observations, short *data);
+
+ template void
+ pccc_decoder_combined(const fsm &FSM1, int ST10, int ST1K,
+ const fsm &FSM2, int ST20, int ST2K,
+ const interleaver &INTERLEAVER, int blocklength,
+ int iterations,
+ float (*p2mymin)(float,float),
+ int D, const std::vector<gr_complex> &TABLE,
+ digital::trellis_metric_type_t METRIC_TYPE,
+ float scaling,
+ const gr_complex *observations, int *data);
+
+ } /* namespace trellis */
+} /* namespace gr */
diff --git a/gr-trellis/lib/encoder_XX_impl.cc.t b/gr-trellis/lib/encoder_XX_impl.cc.t
new file mode 100644
index 0000000000..fdda593d45
--- /dev/null
+++ b/gr-trellis/lib/encoder_XX_impl.cc.t
@@ -0,0 +1,82 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004,2010,2012 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.
+ */
+
+// @WARNING@
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "@NAME@.h"
+#include <gr_io_signature.h>
+#include <iostream>
+
+namespace gr {
+ namespace trellis {
+
+ @BASE_NAME@::sptr
+ @BASE_NAME@::make(const fsm &FSM, int ST)
+ {
+ return gnuradio::get_initial_sptr
+ (new @IMPL_NAME@(FSM,ST));
+ }
+
+ @IMPL_NAME@::@IMPL_NAME@(const fsm &FSM, int ST)
+ : gr_sync_block("@BASE_NAME@",
+ gr_make_io_signature(1, -1, sizeof(@I_TYPE@)),
+ gr_make_io_signature(1, -1, sizeof(@O_TYPE@))),
+ d_FSM(FSM),
+ d_ST(ST)
+ {
+ }
+
+ @IMPL_NAME@::~@IMPL_NAME@()
+ {
+ }
+
+ int
+ @IMPL_NAME@::work(int noutput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items)
+ {
+ int ST_tmp = 0;
+ int nstreams = input_items.size();
+
+ for(int m=0;m<nstreams;m++) {
+ const @I_TYPE@ *in = (const @I_TYPE@*)input_items[m];
+ @O_TYPE@ *out = (@O_TYPE@ *) output_items[m];
+ ST_tmp = d_ST;
+
+ // per stream processing
+ for(int i = 0; i < noutput_items; i++) {
+ out[i] = (@O_TYPE@)d_FSM.OS()[ST_tmp*d_FSM.I()+in[i]]; // direction of time?
+ ST_tmp = (int)d_FSM.NS()[ST_tmp*d_FSM.I()+in[i]];
+ }
+ // end per stream processing
+ }
+ d_ST = ST_tmp;
+
+ return noutput_items;
+ }
+
+ } /* namespace trellis */
+} /* namespace gr */
diff --git a/gr-trellis/src/lib/trellis_viterbi_X.i.t b/gr-trellis/lib/encoder_XX_impl.h.t
index 063f4a1b39..949f1182de 100644
--- a/gr-trellis/src/lib/trellis_viterbi_X.i.t
+++ b/gr-trellis/lib/encoder_XX_impl.h.t
@@ -1,6 +1,6 @@
/* -*- c++ -*- */
/*
- * Copyright 2004 Free Software Foundation, Inc.
+ * Copyright 2004,2012 Free Software Foundation, Inc.
*
* This file is part of GNU Radio
*
@@ -22,28 +22,33 @@
// @WARNING@
-GR_SWIG_BLOCK_MAGIC(trellis,@BASE_NAME@);
-
-@SPTR_NAME@ trellis_make_@BASE_NAME@ (
- const fsm &FSM,
- int K,
- int S0,
- int SK);
-
-
-class @NAME@ : public gr_block
-{
-private:
- @NAME@ (
- const fsm &FSM,
- int K,
- int S0,
- int SK);
-
-public:
- fsm FSM () const { return d_FSM; }
- int K () const { return d_K; }
- int S0 () const { return d_S0; }
- int SK () const { return d_SK; }
- //std::vector<short> trace () const { return d_trace; }
-};
+#ifndef @GUARD_NAME@
+#define @GUARD_NAME@
+
+#include <trellis/@BASE_NAME@.h>
+
+namespace gr {
+ namespace trellis {
+
+ class @IMPL_NAME@ : public @BASE_NAME@
+ {
+ private:
+ fsm d_FSM;
+ int d_ST;
+
+ public:
+ @IMPL_NAME@(const fsm &FSM, int ST);
+ ~@IMPL_NAME@();
+
+ fsm FSM() const { return d_FSM; }
+ int ST() const { return d_ST; }
+
+ int work(int noutput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items);
+ };
+
+ } /* namespace trellis */
+} /* namespace gr */
+
+#endif /* @GUARD_NAME@ */
diff --git a/gr-trellis/lib/fsm.cc b/gr-trellis/lib/fsm.cc
new file mode 100644
index 0000000000..16efcd10f2
--- /dev/null
+++ b/gr-trellis/lib/fsm.cc
@@ -0,0 +1,521 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2002,2012 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.
+ */
+
+#include <cstdio>
+#include <string>
+#include <iostream>
+#include <fstream>
+#include <stdexcept>
+#include <cmath>
+#include <stdlib.h>
+#include <trellis/base.h>
+#include <trellis/fsm.h>
+
+namespace gr {
+ namespace trellis {
+
+ fsm::fsm()
+ {
+ d_I=0;
+ d_S=0;
+ d_O=0;
+ d_NS.resize(0);
+ d_OS.resize(0);
+ d_PS.resize(0);
+ d_PI.resize(0);
+ d_TMi.resize(0);
+ d_TMl.resize(0);
+ }
+
+ fsm::fsm(const fsm &FSM)
+ {
+ d_I=FSM.I();
+ d_S=FSM.S();
+ d_O=FSM.O();
+ d_NS=FSM.NS();
+ d_OS=FSM.OS();
+ d_PS=FSM.PS(); // is this going to make a deep copy?
+ d_PI=FSM.PI();
+ d_TMi=FSM.TMi();
+ d_TMl=FSM.TMl();
+ }
+
+ fsm::fsm(int I, int S, int O, const std::vector<int> &NS, const std::vector<int> &OS)
+ {
+ d_I=I;
+ d_S=S;
+ d_O=O;
+ d_NS=NS;
+ d_OS=OS;
+
+ generate_PS_PI();
+ generate_TM();
+ }
+
+ //######################################################################
+ //# Read an FSM specification from a file.
+ //# Format (hopefully will become more flexible in the future...):
+ //# I S O (in the first line)
+ //# blank line
+ //# Next state matrix (S lines, each with I integers separated by spaces)
+ //# blank line
+ //# output symbol matrix (S lines, each with I integers separated by spaces)
+ //# optional comments
+ //######################################################################
+ fsm::fsm(const char *name)
+ {
+ FILE *fsmfile;
+
+ if((fsmfile=fopen(name,"r"))==NULL)
+ throw std::runtime_error ("fsm::fsm(const char *name): file open error\n");
+ //printf("file open error in fsm()\n");
+
+ if(fscanf(fsmfile,"%d %d %d\n",&d_I,&d_S,&d_O) == EOF) {
+ if(ferror(fsmfile) != 0)
+ throw std::runtime_error ("fsm::fsm(const char *name): file read error\n");
+ }
+
+ d_NS.resize(d_I*d_S);
+ d_OS.resize(d_I*d_S);
+
+ for(int i=0;i<d_S;i++) {
+ for(int j=0;j<d_I;j++) {
+ if(fscanf(fsmfile,"%d",&(d_NS[i*d_I+j])) == EOF) {
+ if(ferror(fsmfile) != 0)
+ throw std::runtime_error ("fsm::fsm(const char *name): file read error\n");
+ }
+ }
+ }
+ for(int i=0;i<d_S;i++) {
+ for(int j=0;j<d_I;j++) {
+ if(fscanf(fsmfile,"%d",&(d_OS[i*d_I+j])) == EOF) {
+ if(ferror(fsmfile) != 0)
+ throw std::runtime_error ("fsm::fsm(const char *name): file read error\n");
+ }
+ }
+ }
+
+ fclose(fsmfile);
+
+ generate_PS_PI();
+ generate_TM();
+ }
+
+ //######################################################################
+ //# Automatically generate the FSM from the generator matrix
+ //# of a (n,k) binary convolutional code
+ //######################################################################
+ fsm::fsm(int k, int n, const std::vector<int> &G)
+ {
+ // calculate maximum memory requirements for each input stream
+ std::vector<int> max_mem_x(k,-1);
+ int max_mem = -1;
+ for(int i=0;i<k;i++) {
+ for(int j=0;j<n;j++) {
+ int mem = -1;
+ if(G[i*n+j]!=0)
+ mem=(int)(log(double(G[i*n+j]))/log(2.0));
+ if(mem>max_mem_x[i])
+ max_mem_x[i]=mem;
+ if(mem>max_mem)
+ max_mem=mem;
+ }
+ }
+
+ //printf("max_mem_x\n");
+ //for(int j=0;j<max_mem_x.size();j++) printf("%d ",max_mem_x[j]); printf("\n");
+
+ // calculate total memory requirements to set S
+ int sum_max_mem = 0;
+ for(int i=0;i<k;i++)
+ sum_max_mem += max_mem_x[i];
+
+ //printf("sum_max_mem = %d\n",sum_max_mem);
+
+ d_I=1<<k;
+ d_S=1<<sum_max_mem;
+ d_O=1<<n;
+
+ // binary representation of the G matrix
+ std::vector<std::vector<int> > Gb(k*n);
+ for(int j=0;j<k*n;j++) {
+ Gb[j].resize(max_mem+1);
+ dec2base(G[j],2,Gb[j]);
+ //printf("Gb\n");
+ //for(int m=0;m<Gb[j].size();m++) printf("%d ",Gb[j][m]); printf("\n");
+ }
+
+ // alphabet size of each shift register
+ std::vector<int> bases_x(k);
+ for(int j=0;j<k ;j++)
+ bases_x[j] = 1 << max_mem_x[j];
+ //printf("bases_x\n");
+ //for(int j=0;j<max_mem_x.size();j++) printf("%d ",max_mem_x[j]); printf("\n");
+
+ d_NS.resize(d_I*d_S);
+ d_OS.resize(d_I*d_S);
+
+ std::vector<int> sx(k);
+ std::vector<int> nsx(k);
+ std::vector<int> tx(k);
+ std::vector<std::vector<int> > tb(k);
+ for(int j=0;j<k;j++)
+ tb[j].resize(max_mem+1);
+ std::vector<int> inb(k);
+ std::vector<int> outb(n);
+
+ for(int s=0;s<d_S;s++) {
+ dec2bases(s,bases_x,sx); // split s into k values, each representing one of the k shift registers
+ //printf("state = %d \nstates = ",s);
+ //for(int j=0;j<sx.size();j++) printf("%d ",sx[j]); printf("\n");
+ for(int i=0;i<d_I;i++) {
+ dec2base(i,2,inb); // input in binary
+ //printf("input = %d \ninputs = ",i);
+ //for(int j=0;j<inb.size();j++) printf("%d ",inb[j]); printf("\n");
+
+ // evaluate next state
+ for(int j=0;j<k;j++)
+ nsx[j] = (inb[j]*bases_x[j]+sx[j])/2; // next state (for each shift register) MSB first
+ d_NS[s*d_I+i]=bases2dec(nsx,bases_x); // collect all values into the new state
+
+ // evaluate transitions
+ for(int j=0;j<k;j++)
+ tx[j] = inb[j]*bases_x[j]+sx[j]; // transition (for each shift register)MSB first
+ for(int j=0;j<k;j++) {
+ dec2base(tx[j],2,tb[j]); // transition in binary
+ //printf("transition = %d \ntransitions = ",tx[j]);
+ //for(int m=0;m<tb[j].size();m++) printf("%d ",tb[j][m]); printf("\n");
+ }
+
+ // evaluate outputs
+ for(int nn=0;nn<n;nn++) {
+ outb[nn] = 0;
+ for(int j=0;j<k;j++) {
+ for(int m=0;m<max_mem+1;m++)
+ outb[nn] = (outb[nn] + Gb[j*n+nn][m]*tb[j][m]) % 2; // careful: polynomial 1+D ir represented as 110, not as 011
+ //printf("output %d equals %d\n",nn,outb[nn]);
+ }
+ }
+ d_OS[s*d_I+i] = base2dec(outb,2);
+ }
+ }
+
+ generate_PS_PI();
+ generate_TM();
+ }
+
+ //######################################################################
+ //# Automatically generate an FSM specification describing the
+ //# ISI for a channel
+ //# of length ch_length and a modulation of size mod_size
+ //######################################################################
+ fsm::fsm(int mod_size, int ch_length)
+ {
+ d_I=mod_size;
+ d_S=(int) (pow(1.0*d_I,1.0*ch_length-1)+0.5);
+ d_O=d_S*d_I;
+
+ d_NS.resize(d_I*d_S);
+ d_OS.resize(d_I*d_S);
+
+ for(int s=0;s<d_S;s++) {
+ for(int i=0;i<d_I;i++) {
+ int t=i*d_S+s;
+ d_NS[s*d_I+i] = t/d_I;
+ d_OS[s*d_I+i] = t;
+ }
+ }
+
+ generate_PS_PI();
+ generate_TM();
+ }
+
+ //######################################################################
+ //# Automatically generate an FSM specification describing the
+ //# the trellis for a CPM with h=K/P (relatively prime),
+ //# alphabet size M, and frequency pulse duration L symbols
+ //#
+ //# This FSM is based on the paper by B. Rimoldi
+ //# "A decomposition approach to CPM", IEEE Trans. Info Theory, March 1988
+ //# See also my own notes at http://www.eecs.umich.edu/~anastas/docs/cpm.pdf
+ //######################################################################
+ fsm::fsm(int P, int M, int L)
+ {
+ d_I=M;
+ d_S=(int)(pow(1.0*M,1.0*L-1)+0.5)*P;
+ d_O=(int)(pow(1.0*M,1.0*L)+0.5)*P;
+
+ d_NS.resize(d_I*d_S);
+ d_OS.resize(d_I*d_S);
+ int nv;
+ for(int s=0;s<d_S;s++) {
+ for(int i=0;i<d_I;i++) {
+ int s1=s/P;
+ int v=s%P;
+ int ns1= (i*(int)(pow(1.0*M,1.0*(L-1))+0.5)+s1)/M;
+ if (L==1)
+ nv=(i+v)%P;
+ else
+ nv=(s1%M+v)%P;
+ d_NS[s*d_I+i] = ns1*P+nv;
+ d_OS[s*d_I+i] = i*d_S+s;
+ }
+ }
+
+ generate_PS_PI();
+ generate_TM();
+ }
+
+ //######################################################################
+ //# Automatically generate an FSM specification describing the
+ //# the joint trellis of fsm1 and fsm2
+ //######################################################################
+ fsm::fsm(const fsm &FSM1, const fsm &FSM2)
+ {
+ d_I=FSM1.I()*FSM2.I();
+ d_S=FSM1.S()*FSM2.S();
+ d_O=FSM1.O()*FSM2.O();
+
+ d_NS.resize(d_I*d_S);
+ d_OS.resize(d_I*d_S);
+
+ for(int s=0;s<d_S;s++) {
+ for(int i=0;i<d_I;i++) {
+ int s1=s/FSM2.S();
+ int s2=s%FSM2.S();
+ int i1=i/FSM2.I();
+ int i2=i%FSM2.I();
+ d_NS[s*d_I+i] = FSM1.NS()[s1 * FSM1.I() + i1] * FSM2.S() + FSM2.NS()[s2 * FSM2.I() + i2];
+ d_OS[s*d_I+i] = FSM1.OS()[s1 * FSM1.I() + i1] * FSM2.O() + FSM2.OS()[s2 * FSM2.I() + i2];
+ }
+ }
+
+ generate_PS_PI();
+ generate_TM();
+ }
+
+ //######################################################################
+ //# Generate a new FSM representing n stages through the original FSM
+ //# AKA radix-n FSM
+ //######################################################################
+ fsm::fsm(const fsm &FSM, int n)
+ {
+ d_I=(int) (pow(1.0*FSM.I(),1.0*n)+0.5);
+ d_S=FSM.S();
+ d_O=(int) (pow(1.0*FSM.O(),1.0*n)+0.5);
+
+ d_NS.resize(d_I*d_S);
+ d_OS.resize(d_I*d_S);
+
+ for(int s=0;s<d_S;s++ ) {
+ for(int i=0;i<d_I;i++ ) {
+ std::vector<int> ii(n);
+ dec2base(i,FSM.I(),ii);
+ std::vector<int> oo(n);
+ int ns=s;
+ for(int k=0;k<n;k++) {
+ oo[k]=FSM.OS()[ns*FSM.I()+ii[k]];
+ ns=FSM.NS()[ns*FSM.I()+ii[k]];
+ }
+ d_NS[s*d_I+i]=ns;
+ d_OS[s*d_I+i]=base2dec(oo,FSM.O());
+ }
+ }
+
+ generate_PS_PI();
+ generate_TM();
+ }
+
+ //######################################################################
+ //# generate the PS and PI tables for later use
+ //######################################################################
+ void
+ fsm::generate_PS_PI()
+ {
+ d_PS.resize(d_S);
+ d_PI.resize(d_S);
+
+ for(int i=0;i<d_S;i++) {
+ d_PS[i].resize(d_I*d_S); // max possible size
+ d_PI[i].resize(d_I*d_S);
+ int j=0;
+ for(int ii=0;ii<d_S;ii++) for(int jj=0;jj<d_I;jj++) {
+ if(d_NS[ii*d_I+jj]!=i) continue;
+ d_PS[i][j]=ii;
+ d_PI[i][j]=jj;
+ j++;
+ }
+ d_PS[i].resize(j);
+ d_PI[i].resize(j);
+ }
+ }
+
+ //######################################################################
+ //# generate the termination matrices TMl and TMi for later use
+ //######################################################################
+ void
+ fsm::generate_TM()
+ {
+ d_TMi.resize(d_S*d_S);
+ d_TMl.resize(d_S*d_S);
+
+ for(int i=0;i<d_S*d_S;i++) {
+ d_TMi[i] = -1; // no meaning
+ d_TMl[i] = d_S; //infinity: you need at most S-1 steps
+ if (i/d_S == i%d_S)
+ d_TMl[i] = 0;
+ }
+
+ for(int s=0;s<d_S;s++) {
+ bool done = false;
+ int attempts = 0;
+ while (done == false && attempts < d_S-1) {
+ done = find_es(s);
+ attempts ++;
+ }
+ if (done == false && d_S > 1) {
+ //throw std::runtime_error ("fsm::generate_TM(): FSM appears to be disconnected\n");
+ printf("fsm::generate_TM(): FSM appears to be disconnected\n");
+ printf("state %d cannot be reached from all other states\n",s);
+ }
+ }
+ }
+
+ // find a path from any state to the ending state "es"
+ bool
+ fsm::find_es(int es)
+ {
+ bool done = true;
+ for(int s=0;s<d_S;s++) {
+ if(d_TMl[s*d_S+es] < d_S)
+ continue;
+ int minl=d_S;
+ int mini=-1;
+ for(int i=0;i<d_I;i++) {
+ if( 1 + d_TMl[d_NS[s*d_I+i]*d_S+es] < minl) {
+ minl = 1 + d_TMl[d_NS[s*d_I+i]*d_S+es];
+ mini = i;
+ }
+ }
+ if (mini != -1) {
+ d_TMl[s*d_S+es]=minl;
+ d_TMi[s*d_S+es]=mini;
+ }
+ else
+ done = false;
+ }
+ return done;
+ }
+
+ //######################################################################
+ //# generate trellis representation of FSM as an SVG file
+ //######################################################################
+ void
+ fsm::write_trellis_svg(std::string filename, int number_stages)
+ {
+ std::ofstream trellis_fname (filename.c_str());
+ if(!trellis_fname) {
+ std::cout << "file not found " << std::endl ; exit(-1);
+ }
+ const int TRELLIS_Y_OFFSET = 30;
+ const int TRELLIS_X_OFFSET = 20;
+ const int STAGE_LABEL_Y_OFFSET = 25;
+ const int STAGE_LABEL_X_OFFSET = 20;
+ const int STATE_LABEL_Y_OFFSET = 30;
+ const int STATE_LABEL_X_OFFSET = 5;
+ const int STAGE_STATE_OFFSETS = 10;
+ // std::cout << "################## BEGIN SVG TRELLIS PIC #####################" << std::endl;
+ trellis_fname << "<svg viewBox = \"0 0 200 200\" version = \"1.1\">" << std::endl;
+
+ for(int stage_num = 0;stage_num < number_stages;stage_num ++) {
+ // draw states
+ for(int state_num = 0;state_num < d_S ; state_num ++ ) {
+ trellis_fname << "<circle cx = \"" << stage_num * STAGE_STATE_OFFSETS + TRELLIS_X_OFFSET <<
+ "\" cy = \"" << state_num * STAGE_STATE_OFFSETS + TRELLIS_Y_OFFSET << "\" r = \"1\"/>" << std::endl;
+ //draw branches
+ if(stage_num != number_stages-1) {
+ for(int branch_num = 0;branch_num < d_I; branch_num++) {
+ trellis_fname << "<line x1 =\"" << STAGE_STATE_OFFSETS * stage_num+ TRELLIS_X_OFFSET << "\" ";
+ trellis_fname << "y1 =\"" << state_num * STAGE_STATE_OFFSETS + TRELLIS_Y_OFFSET<< "\" ";
+ trellis_fname << "x2 =\"" << STAGE_STATE_OFFSETS *stage_num + STAGE_STATE_OFFSETS+ TRELLIS_X_OFFSET << "\" ";
+ trellis_fname << "y2 =\"" << d_NS[d_I * state_num + branch_num] * STAGE_STATE_OFFSETS + TRELLIS_Y_OFFSET << "\" ";
+ trellis_fname << " stroke-dasharray = \"3," << branch_num << "\" ";
+ trellis_fname << " stroke = \"black\" stroke-width = \"0.3\"/>" << std::endl;
+ }
+ }
+ }
+ }
+ // label the stages
+ trellis_fname << "<g font-size = \"4\" font= \"times\" fill = \"black\">" << std::endl;
+ for(int stage_num = 0;stage_num < number_stages ;stage_num ++) {
+ trellis_fname << "<text x = \"" << stage_num * STAGE_STATE_OFFSETS + STAGE_LABEL_X_OFFSET <<
+ "\" y = \"" << STAGE_LABEL_Y_OFFSET << "\" >" << std::endl;
+ trellis_fname << stage_num << std::endl;
+ trellis_fname << "</text>" << std::endl;
+ }
+ trellis_fname << "</g>" << std::endl;
+
+ // label the states
+ trellis_fname << "<g font-size = \"4\" font= \"times\" fill = \"black\">" << std::endl;
+ for(int state_num = 0;state_num < d_S ; state_num ++) {
+ trellis_fname << "<text y = \"" << state_num * STAGE_STATE_OFFSETS + STATE_LABEL_Y_OFFSET <<
+ "\" x = \"" << STATE_LABEL_X_OFFSET << "\" >" << std::endl;
+ trellis_fname << state_num << std::endl;
+ trellis_fname << "</text>" << std::endl;
+ }
+ trellis_fname << "</g>" << std::endl;
+
+ trellis_fname << "</svg>" << std::endl;
+ // std::cout << "################## END SVG TRELLIS PIC ##################### " << std::endl;
+ trellis_fname.close();
+ }
+
+ //######################################################################
+ //# Write trellis specification to a text file,
+ //# in the same format used when reading FSM files
+ //######################################################################
+ void
+ fsm::write_fsm_txt(std::string filename)
+ {
+ std::ofstream trellis_fname (filename.c_str());
+ if(!trellis_fname) {
+ std::cout << "file not found " << std::endl ; exit(-1);
+ }
+ trellis_fname << d_I << ' ' << d_S << ' ' << d_O << std::endl;
+ trellis_fname << std::endl;
+ for(int i=0;i<d_S;i++) {
+ for(int j=0;j<d_I;j++)
+ trellis_fname << d_NS[i*d_I+j] << ' ';
+ trellis_fname << std::endl;
+ }
+ trellis_fname << std::endl;
+ for(int i=0;i<d_S;i++) {
+ for(int j=0;j<d_I;j++)
+ trellis_fname << d_OS[i*d_I+j] << ' ';
+ trellis_fname << std::endl;
+ }
+ trellis_fname << std::endl;
+ trellis_fname.close();
+ }
+
+ } /* namespace trellis */
+} /* namespace gr */
diff --git a/gr-trellis/lib/interleaver.cc b/gr-trellis/lib/interleaver.cc
new file mode 100644
index 0000000000..27248a6d43
--- /dev/null
+++ b/gr-trellis/lib/interleaver.cc
@@ -0,0 +1,147 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2002,2012 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.
+ */
+
+#include <cstdlib>
+#include <cstdio>
+#include <iostream>
+#include <string>
+#include <fstream>
+#include <stdexcept>
+#include <cmath>
+#include <trellis/quicksort_index.h>
+#include <trellis/interleaver.h>
+
+namespace gr {
+ namespace trellis {
+
+ interleaver::interleaver()
+ {
+ d_K=0;
+ d_INTER.resize(0);
+ d_DEINTER.resize(0);
+ }
+
+ interleaver::interleaver(const interleaver &INTERLEAVER)
+ {
+ d_K=INTERLEAVER.K();
+ d_INTER=INTERLEAVER.INTER();
+ d_DEINTER=INTERLEAVER.DEINTER();
+ }
+
+ interleaver::interleaver(int K, const std::vector<int> &INTER)
+ {
+ d_K=K;
+ d_INTER=INTER;
+ d_DEINTER.resize(d_K);
+
+ // generate DEINTER table
+ for(int i=0;i<d_K;i++) {
+ d_DEINTER[d_INTER[i]]=i;
+ }
+ }
+
+ //######################################################################
+ //# Read an INTERLEAVER specification from a file.
+ //# Format (hopefully will become more flexible in the future...):
+ //# K
+ //# blank line
+ //# list of space separated K integers from 0 to K-1 in appropriate order
+ //# optional comments
+ //######################################################################
+ interleaver::interleaver(const char *name)
+ {
+ FILE *interleaverfile;
+
+ if((interleaverfile=fopen(name,"r")) == NULL)
+ throw std::runtime_error ("file open error in interleaver()");
+ //printf("file open error in interleaver()\n");
+
+ if(fscanf(interleaverfile,"%d\n",&d_K) == EOF) {
+ if(ferror(interleaverfile) != 0)
+ throw std::runtime_error ("interleaver::interleaver(const char *name): file read error\n");
+ }
+
+ d_INTER.resize(d_K);
+ d_DEINTER.resize(d_K);
+
+ for(int i=0;i<d_K;i++) {
+ if(fscanf(interleaverfile,"%d",&(d_INTER[i])) == EOF) {
+ if(ferror(interleaverfile) != 0)
+ throw std::runtime_error("interleaver::interleaver(const char *name): file read error\n");
+ }
+ }
+
+ // generate DEINTER table
+ for(int i=0;i<d_K;i++) {
+ d_DEINTER[d_INTER[i]]=i;
+ }
+ }
+
+ //######################################################################
+ //# Generate a random interleaver
+ //######################################################################
+ interleaver::interleaver(int K, int seed)
+ {
+ d_K=K;
+ d_INTER.resize(d_K);
+ d_DEINTER.resize(d_K);
+
+ if(seed>=0)
+ srand((unsigned int)seed);
+ std::vector<int> tmp(d_K);
+ for(int i=0;i<d_K;i++) {
+ d_INTER[i]=i;
+ tmp[i] = rand();
+ }
+ quicksort_index <int> (tmp,d_INTER,0,d_K-1);
+
+ // generate DEINTER table
+ for(int i=0;i<d_K;i++) {
+ d_DEINTER[d_INTER[i]]=i;
+ }
+ }
+
+ //######################################################################
+ //# Write an INTERLEAVER specification to a file.
+ //# Format
+ //# K
+ //# blank line
+ //# list of space separated K integers from 0 to K-1 in appropriate order
+ //# optional comments
+ //######################################################################
+ void
+ interleaver::write_interleaver_txt(std::string filename)
+ {
+ std::ofstream interleaver_fname (filename.c_str());
+ if(!interleaver_fname) {
+ std::cout << "file not found " << std::endl ; exit(-1);
+ }
+ interleaver_fname << d_K << std::endl;
+ interleaver_fname << std::endl;
+ for(int i=0;i<d_K;i++)
+ interleaver_fname << d_INTER[i] << ' ';
+ interleaver_fname << std::endl;
+ interleaver_fname.close();
+ }
+
+ } /* namespace trellis */
+} /* namespace gr */
diff --git a/gr-trellis/lib/metrics_X_impl.cc.t b/gr-trellis/lib/metrics_X_impl.cc.t
new file mode 100644
index 0000000000..c74051c53e
--- /dev/null
+++ b/gr-trellis/lib/metrics_X_impl.cc.t
@@ -0,0 +1,98 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004,2010,2012 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.
+ */
+
+// @WARNING@
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "@NAME@.h"
+#include <gr_io_signature.h>
+#include <assert.h>
+#include <stdexcept>
+#include <iostream>
+
+namespace gr {
+ namespace trellis {
+
+ @BASE_NAME@::sptr
+ @BASE_NAME@::make(int O, int D, const std::vector<@I_TYPE@> &TABLE,
+ digital::trellis_metric_type_t TYPE)
+ {
+ return gnuradio::get_initial_sptr
+ (new @IMPL_NAME@(O,D,TABLE,TYPE));
+ }
+
+ @IMPL_NAME@::@IMPL_NAME@(int O, int D, const std::vector<@I_TYPE@> &TABLE,
+ digital::trellis_metric_type_t TYPE)
+ : gr_block("@BASE_NAME@",
+ gr_make_io_signature(1, -1, sizeof (@I_TYPE@)),
+ gr_make_io_signature(1, -1, sizeof (float))),
+ d_O(O), d_D(D), d_TYPE(TYPE), d_TABLE(TABLE)
+ {
+ set_relative_rate (1.0 * d_O / ((double) d_D));
+ set_output_multiple ((int)d_O);
+ }
+
+ @IMPL_NAME@::~@IMPL_NAME@()
+ {
+ }
+
+ void
+ @IMPL_NAME@::set_TABLE(const std::vector<@I_TYPE@> &table)
+ {
+ d_TABLE = table;
+ }
+
+ void
+ @IMPL_NAME@::forecast(int noutput_items, gr_vector_int &ninput_items_required)
+ {
+ int input_required = d_D * noutput_items / d_O;
+ unsigned ninputs = ninput_items_required.size();
+ for(unsigned int i = 0; i < ninputs; i++)
+ ninput_items_required[i] = input_required;
+ }
+
+ int
+ @IMPL_NAME@::general_work(int noutput_items,
+ gr_vector_int &ninput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items)
+ {
+ int nstreams = input_items.size();
+
+ for(int m = 0; m < nstreams; m++) {
+ const @I_TYPE@ *in = (@I_TYPE@*)input_items[m];
+ float *out = (float*)output_items[m];
+
+ for(int i = 0; i < noutput_items / d_O ; i++) {
+ calc_metric(d_O, d_D, d_TABLE,&(in[i*d_D]), &(out[i*d_O]), d_TYPE);
+ }
+ }
+
+ consume_each(d_D * noutput_items / d_O);
+ return noutput_items;
+ }
+
+ } /* namespace trellis */
+} /* namespace gr */
diff --git a/gr-trellis/lib/metrics_X_impl.h.t b/gr-trellis/lib/metrics_X_impl.h.t
new file mode 100644
index 0000000000..0f52a8bc40
--- /dev/null
+++ b/gr-trellis/lib/metrics_X_impl.h.t
@@ -0,0 +1,64 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004,2012 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.
+ */
+
+// @WARNING@
+
+#ifndef @GUARD_NAME@
+#define @GUARD_NAME@
+
+#include <trellis/@BASE_NAME@.h>
+
+namespace gr {
+ namespace trellis {
+
+ class @IMPL_NAME@ : public @BASE_NAME@
+ {
+ private:
+ int d_O;
+ int d_D;
+ digital::trellis_metric_type_t d_TYPE;
+ std::vector<@I_TYPE@> d_TABLE;
+
+ public:
+ @IMPL_NAME@(int O, int D, const std::vector<@I_TYPE@> &TABLE,
+ digital::trellis_metric_type_t TYPE);
+ ~@IMPL_NAME@();
+
+ int O() const { return d_O; }
+ int D() const { return d_D; }
+ digital::trellis_metric_type_t TYPE() const { return d_TYPE; }
+ std::vector<@I_TYPE@> TABLE() const { return d_TABLE; }
+ void set_TABLE(const std::vector<@I_TYPE@> &table);
+
+ void forecast(int noutput_items,
+ gr_vector_int &ninput_items_required);
+
+ int general_work(int noutput_items,
+ gr_vector_int &ninput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items);
+ };
+
+ } /* namespace trellis */
+} /* namespace gr */
+
+#endif /* @GUARD_NAME@ */
diff --git a/gr-trellis/lib/pccc_decoder_X_impl.cc.t b/gr-trellis/lib/pccc_decoder_X_impl.cc.t
new file mode 100644
index 0000000000..9bf85bc614
--- /dev/null
+++ b/gr-trellis/lib/pccc_decoder_X_impl.cc.t
@@ -0,0 +1,120 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004,2010,2012 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.
+ */
+
+// @WARNING@
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "@NAME@.h"
+#include <gr_io_signature.h>
+#include <iostream>
+#include <trellis/core_algorithms.h>
+
+namespace gr {
+ namespace trellis {
+
+ static const float INF = 1.0e9;
+
+ @BASE_NAME@::sptr
+ @BASE_NAME@::make(const fsm &FSM1, int ST10, int ST1K,
+ const fsm &FSM2, int ST20, int ST2K,
+ const interleaver &INTERLEAVER,
+ int blocklength,
+ int repetitions,
+ siso_type_t SISO_TYPE)
+ {
+ return gnuradio::get_initial_sptr
+ (new @IMPL_NAME@(FSM1, ST10, ST1K,
+ FSM2, ST20, ST2K,
+ INTERLEAVER,
+ blocklength,
+ repetitions,
+ SISO_TYPE));
+ }
+
+ @IMPL_NAME@::@IMPL_NAME@(const fsm &FSM1, int ST10, int ST1K,
+ const fsm &FSM2, int ST20, int ST2K,
+ const interleaver &INTERLEAVER,
+ int blocklength,
+ int repetitions,
+ siso_type_t SISO_TYPE)
+ : gr_block("@BASE_NAME@",
+ gr_make_io_signature(1, 1, sizeof(float)),
+ gr_make_io_signature(1, 1, sizeof(@O_TYPE@))),
+ d_FSM1(FSM1), d_ST10(ST10), d_ST1K(ST1K),
+ d_FSM2(FSM2), d_ST20(ST20), d_ST2K(ST2K),
+ d_INTERLEAVER(INTERLEAVER),
+ d_blocklength(blocklength),
+ d_repetitions(repetitions),
+ d_SISO_TYPE(SISO_TYPE)
+ {
+ set_relative_rate (1.0 / ((double) d_FSM1.O() * d_FSM2.O()));
+ set_output_multiple (d_blocklength);
+ }
+
+ @IMPL_NAME@::~@IMPL_NAME@()
+ {
+ }
+
+ void
+ @IMPL_NAME@::forecast(int noutput_items,
+ gr_vector_int &ninput_items_required)
+ {
+ int input_required = d_FSM1.O() * d_FSM2.O() * noutput_items;
+ ninput_items_required[0] = input_required;
+ }
+
+ //===========================================================
+
+ int
+ @IMPL_NAME@::general_work(int noutput_items,
+ gr_vector_int &ninput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items)
+ {
+ int nblocks = noutput_items / d_blocklength;
+
+ float (*p2min)(float, float) = NULL;
+ if(d_SISO_TYPE == TRELLIS_MIN_SUM)
+ p2min = &min;
+ else if(d_SISO_TYPE == TRELLIS_SUM_PRODUCT)
+ p2min = &min_star;
+
+ const float *in = (const float *) input_items[0];
+ @O_TYPE@ *out = (@O_TYPE@ *) output_items[0];
+ for(int n=0;n<nblocks;n++) {
+ pccc_decoder(d_FSM1, d_ST10, d_ST1K,
+ d_FSM2, d_ST20, d_ST2K,
+ d_INTERLEAVER, d_blocklength, d_repetitions,
+ p2min,
+ &(in[n*d_blocklength*d_FSM1.O()*d_FSM2.O()]),
+ &(out[n*d_blocklength]));
+ }
+
+ consume_each(d_FSM1.O() * d_FSM2.O() * noutput_items);
+ return noutput_items;
+ }
+
+ } /* namespace trellis */
+} /* namespace gr */
diff --git a/gr-trellis/lib/pccc_decoder_X_impl.h.t b/gr-trellis/lib/pccc_decoder_X_impl.h.t
new file mode 100644
index 0000000000..9b61e34fde
--- /dev/null
+++ b/gr-trellis/lib/pccc_decoder_X_impl.h.t
@@ -0,0 +1,80 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004,2012 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.
+ */
+
+// @WARNING@
+
+#ifndef @GUARD_NAME@
+#define @GUARD_NAME@
+
+#include <trellis/@BASE_NAME@.h>
+
+namespace gr {
+ namespace trellis {
+
+ class @IMPL_NAME@ : public @BASE_NAME@
+ {
+ private:
+ fsm d_FSM1;
+ int d_ST10;
+ int d_ST1K;
+ fsm d_FSM2;
+ int d_ST20;
+ int d_ST2K;
+ interleaver d_INTERLEAVER;
+ int d_blocklength;
+ int d_repetitions;
+ siso_type_t d_SISO_TYPE;
+ std::vector<float> d_buffer;
+
+ public:
+ @IMPL_NAME@(const fsm &FSM1, int ST10, int ST1K,
+ const fsm &FSM2, int ST20, int ST2K,
+ const interleaver &INTERLEAVER,
+ int blocklength,
+ int repetitions,
+ siso_type_t SISO_TYPE);
+ ~@IMPL_NAME@();
+
+ fsm FSM1() const { return d_FSM1; }
+ fsm FSM2() const { return d_FSM2; }
+ int ST10() const { return d_ST10; }
+ int ST1K() const { return d_ST1K; }
+ int ST20() const { return d_ST20; }
+ int ST2K() const { return d_ST2K; }
+ interleaver INTERLEAVER() const { return d_INTERLEAVER; }
+ int blocklength() const { return d_blocklength; }
+ int repetitions() const { return d_repetitions; }
+ siso_type_t SISO_TYPE() const { return d_SISO_TYPE; }
+
+ void forecast(int noutput_items,
+ gr_vector_int &ninput_items_required);
+
+ int general_work(int noutput_items,
+ gr_vector_int &ninput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items);
+ };
+
+ } /* namespace trellis */
+} /* namespace gr */
+
+#endif /* @GUARD_NAME@ */
diff --git a/gr-trellis/lib/pccc_decoder_combined_XX_impl.cc.t b/gr-trellis/lib/pccc_decoder_combined_XX_impl.cc.t
new file mode 100644
index 0000000000..21a5c0b3ae
--- /dev/null
+++ b/gr-trellis/lib/pccc_decoder_combined_XX_impl.cc.t
@@ -0,0 +1,139 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004,2010,2012 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.
+ */
+
+// @WARNING@
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "@NAME@.h"
+#include <gr_io_signature.h>
+#include <iostream>
+#include <trellis/core_algorithms.h>
+
+namespace gr {
+ namespace trellis {
+
+ static const float INF = 1.0e9;
+
+ @BASE_NAME@::sptr
+ @BASE_NAME@::make(const fsm &FSMo, int STo0, int SToK,
+ const fsm &FSMi, int STi0, int STiK,
+ const interleaver &INTERLEAVER,
+ int blocklength,
+ int repetitions,
+ siso_type_t SISO_TYPE,
+ int D,
+ const std::vector<@I_TYPE@> &TABLE,
+ digital::trellis_metric_type_t METRIC_TYPE,
+ float scaling)
+ {
+ return gnuradio::get_initial_sptr
+ (new @NAME@(FSMo, STo0, SToK, FSMi, STi0, STiK,
+ INTERLEAVER, blocklength, repetitions,
+ SISO_TYPE, D, TABLE,METRIC_TYPE, scaling));
+ }
+
+ @IMPL_NAME@::@IMPL_NAME@(const fsm &FSMo, int STo0, int SToK,
+ const fsm &FSMi, int STi0, int STiK,
+ const interleaver &INTERLEAVER,
+ int blocklength,
+ int repetitions,
+ siso_type_t SISO_TYPE,
+ int D,
+ const std::vector<@I_TYPE@> &TABLE,
+ digital::trellis_metric_type_t METRIC_TYPE,
+ float scaling)
+ : gr_block("@BASE_NAME@",
+ gr_make_io_signature(1, 1, sizeof(@I_TYPE@)),
+ gr_make_io_signature(1, 1, sizeof(@O_TYPE@))),
+ d_FSMo(FSMo), d_STo0(STo0), d_SToK(SToK),
+ d_FSMi(FSMi), d_STi0(STi0), d_STiK(STiK),
+ d_INTERLEAVER(INTERLEAVER),
+ d_blocklength(blocklength),
+ d_repetitions(repetitions),
+ d_SISO_TYPE(SISO_TYPE),
+ d_D(D),
+ d_TABLE(TABLE),
+ d_METRIC_TYPE(METRIC_TYPE),
+ d_scaling(scaling)
+ {
+ assert(d_FSMo.I() == d_FSMi.I());
+ set_relative_rate (1.0 / ((double) d_D));
+ set_output_multiple (d_blocklength);
+ }
+
+ @IMPL_NAME@::~@IMPL_NAME@()
+ {
+ }
+
+ void
+ @IMPL_NAME@::set_scaling(float scaling)
+ {
+ d_scaling = scaling;
+ }
+
+ void
+ @IMPL_NAME@::forecast(int noutput_items,
+ gr_vector_int &ninput_items_required)
+ {
+ int input_required = d_D * noutput_items;
+ ninput_items_required[0] = input_required;
+ }
+
+ //===========================================================
+
+ int
+ @IMPL_NAME@::general_work(int noutput_items,
+ gr_vector_int &ninput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items)
+ {
+ int nblocks = noutput_items / d_blocklength;
+
+ float (*p2min)(float, float) = NULL;
+ if(d_SISO_TYPE == TRELLIS_MIN_SUM)
+ p2min = &min;
+ else if(d_SISO_TYPE == TRELLIS_SUM_PRODUCT)
+ p2min = &min_star;
+
+ const @I_TYPE@ *in = (const @I_TYPE@ *) input_items[0];
+ @O_TYPE@ *out = (@O_TYPE@ *) output_items[0];
+ for (int n=0;n<nblocks;n++) {
+ pccc_decoder_combined(d_FSMo, d_STo0, d_SToK,
+ d_FSMi, d_STi0, d_STiK,
+ d_INTERLEAVER, d_blocklength, d_repetitions,
+ p2min,
+ d_D,d_TABLE,
+ d_METRIC_TYPE,
+ d_scaling,
+ &(in[n*d_blocklength*d_D]),
+ &(out[n*d_blocklength]));
+ }
+
+ consume_each(d_D * noutput_items);
+ return noutput_items;
+ }
+
+ } /* namespace trellis */
+} /* namespace gr */
diff --git a/gr-trellis/lib/pccc_decoder_combined_XX_impl.h.t b/gr-trellis/lib/pccc_decoder_combined_XX_impl.h.t
new file mode 100644
index 0000000000..4c3655f40d
--- /dev/null
+++ b/gr-trellis/lib/pccc_decoder_combined_XX_impl.h.t
@@ -0,0 +1,93 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004,2012 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.
+ */
+
+// @WARNING@
+
+#ifndef @GUARD_NAME@
+#define @GUARD_NAME@
+
+#include <trellis/@BASE_NAME@.h>
+
+namespace gr {
+ namespace trellis {
+
+ class @IMPL_NAME@ : public @BASE_NAME@
+ {
+ private:
+ fsm d_FSMo;
+ int d_STo0;
+ int d_SToK;
+ fsm d_FSMi;
+ int d_STi0;
+ int d_STiK;
+ interleaver d_INTERLEAVER;
+ int d_blocklength;
+ int d_repetitions;
+ siso_type_t d_SISO_TYPE;
+ int d_D;
+ std::vector<@I_TYPE@> d_TABLE;
+ digital::trellis_metric_type_t d_METRIC_TYPE;
+ float d_scaling;
+ std::vector<float> d_buffer;
+
+ public:
+ @IMPL_NAME@(const fsm &FSMo, int STo0, int SToK,
+ const fsm &FSMi, int STi0, int STiK,
+ const interleaver &INTERLEAVER,
+ int blocklength,
+ int repetitions,
+ siso_type_t SISO_TYPE,
+ int D,
+ const std::vector<@I_TYPE@> &TABLE,
+ digital::trellis_metric_type_t METRIC_TYPE,
+ float scaling);
+ ~@IMPL_NAME@();
+
+ fsm FSM1() const { return d_FSMo; }
+ fsm FSM2() const { return d_FSMi; }
+ int ST10() const { return d_STo0; }
+ int ST1K() const { return d_SToK; }
+ int ST20() const { return d_STi0; }
+ int ST2K() const { return d_STiK; }
+ interleaver INTERLEAVER() const { return d_INTERLEAVER; }
+ int blocklength() const { return d_blocklength; }
+ int repetitions() const { return d_repetitions; }
+ int D() const { return d_D; }
+ std::vector<@I_TYPE@> TABLE() const { return d_TABLE; }
+ digital::trellis_metric_type_t METRIC_TYPE() const { return d_METRIC_TYPE; }
+ siso_type_t SISO_TYPE() const { return d_SISO_TYPE; }
+ float scaling() const { return d_scaling; }
+ void set_scaling(float scaling);
+
+ void forecast(int noutput_items,
+ gr_vector_int &ninput_items_required);
+
+ int general_work(int noutput_items,
+ gr_vector_int &ninput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items);
+ };
+
+ } /* namespace trellis */
+} /* namespace gr */
+
+#endif /* @GUARD_NAME@ */
diff --git a/gr-trellis/lib/pccc_encoder_XX_impl.cc.t b/gr-trellis/lib/pccc_encoder_XX_impl.cc.t
new file mode 100644
index 0000000000..4e804729a2
--- /dev/null
+++ b/gr-trellis/lib/pccc_encoder_XX_impl.cc.t
@@ -0,0 +1,91 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004,2010,2012 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.
+ */
+
+// @WARNING@
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "@NAME@.h"
+#include <gr_io_signature.h>
+#include <iostream>
+
+namespace gr {
+ namespace trellis {
+
+ @BASE_NAME@::sptr
+ @BASE_NAME@::make(const fsm &FSM1, int ST1,
+ const fsm &FSM2, int ST2,
+ const interleaver &INTERLEAVER,
+ int blocklength)
+ {
+ return gnuradio::get_initial_sptr
+ (new @IMPL_NAME@(FSM1, ST1, FSM2, ST2, INTERLEAVER, blocklength));
+ }
+
+ @IMPL_NAME@::@IMPL_NAME@(const fsm &FSM1, int ST1,
+ const fsm &FSM2, int ST2,
+ const interleaver &INTERLEAVER,
+ int blocklength)
+ : gr_sync_block("@BASE_NAME@",
+ gr_make_io_signature(1, 1, sizeof(@I_TYPE@)),
+ gr_make_io_signature(1, 1, sizeof(@O_TYPE@))),
+ d_FSM1(FSM1), d_ST1(ST1),
+ d_FSM2(FSM2), d_ST2(ST2),
+ d_INTERLEAVER(INTERLEAVER),
+ d_blocklength(blocklength)
+ {
+ assert(d_FSM1.I() == d_FSM2.I());
+ set_output_multiple(d_blocklength);
+ d_buffer.resize(d_blocklength);
+ }
+
+ @IMPL_NAME@::~@IMPL_NAME@()
+ {
+ }
+
+ int
+ @NAME@::work(int noutput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items)
+ {
+ for(int b = 0 ; b<noutput_items/d_blocklength; b++) {
+ const @I_TYPE@ *in = (const @I_TYPE@*)input_items[0]+b*d_blocklength;
+ @O_TYPE@ *out = (@O_TYPE@*)output_items[0]+b*d_blocklength;
+
+ int ST1_tmp = d_ST1;
+ int ST2_tmp = d_ST2;
+ for(int i = 0; i < d_blocklength; i++) {
+ int k = d_INTERLEAVER.INTER()[i];
+ int o1 = d_FSM1.OS()[ST1_tmp*d_FSM1.I()+in[i]];
+ ST1_tmp = (int) d_FSM1.NS()[ST1_tmp*d_FSM1.I()+in[i]];
+ int o2 = d_FSM2.OS()[ST2_tmp*d_FSM2.I()+in[k]];
+ ST2_tmp = (int) d_FSM2.NS()[ST2_tmp*d_FSM2.I()+in[k]];
+ out[i] = (@O_TYPE@) (o1*d_FSM1.O() + o2);
+ }
+ }
+ return noutput_items;
+ }
+
+ } /* namespace trellis */
+} /* namespace gr */
diff --git a/gr-trellis/lib/pccc_encoder_XX_impl.h.t b/gr-trellis/lib/pccc_encoder_XX_impl.h.t
new file mode 100644
index 0000000000..1eed3702be
--- /dev/null
+++ b/gr-trellis/lib/pccc_encoder_XX_impl.h.t
@@ -0,0 +1,66 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004 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.
+ */
+
+// @WARNING@
+
+#ifndef @GUARD_NAME@
+#define @GUARD_NAME@
+
+#include <trellis/@BASE_NAME@.h>
+
+namespace gr {
+ namespace trellis {
+
+ class @IMPL_NAME@ : public @BASE_NAME@
+ {
+ private:
+ fsm d_FSM1;
+ int d_ST1;
+ fsm d_FSM2;
+ int d_ST2;
+ interleaver d_INTERLEAVER;
+ int d_blocklength;
+ std::vector<int> d_buffer;
+
+ public:
+ @IMPL_NAME@(const fsm &FSM1, int ST1,
+ const fsm &FSM2, int ST2,
+ const interleaver &INTERLEAVER,
+ int blocklength);
+ ~@IMPL_NAME@();
+
+ fsm FSM1() const { return d_FSM1; }
+ int ST1() const { return d_ST1; }
+ fsm FSM2() const { return d_FSM2; }
+ int ST2() const { return d_ST2; }
+ interleaver INTERLEAVER() const { return d_INTERLEAVER; }
+ int blocklength() const { return d_blocklength; }
+
+ int work(int noutput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items);
+ };
+
+ } /* namespace trellis */
+} /* namespace gr */
+
+#endif /* @GUARD_NAME@ */
diff --git a/gr-trellis/lib/permutation_impl.cc b/gr-trellis/lib/permutation_impl.cc
new file mode 100644
index 0000000000..da82e46832
--- /dev/null
+++ b/gr-trellis/lib/permutation_impl.cc
@@ -0,0 +1,90 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004,2010,2012 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "permutation_impl.h"
+#include <gr_io_signature.h>
+#include <iostream>
+#include <string.h>
+
+namespace gr {
+ namespace trellis {
+
+ permutation::sptr
+ permutation::make(int K, const std::vector<int> &TABLE,
+ int SYMS_PER_BLOCK, size_t BYTES_PER_SYMBOL)
+ {
+ return gnuradio::get_initial_sptr
+ (new permutation_impl(K,TABLE,SYMS_PER_BLOCK,BYTES_PER_SYMBOL));
+ }
+
+ permutation_impl::permutation_impl(int K, const std::vector<int> &TABLE,
+ int SYMS_PER_BLOCK, size_t BYTES_PER_SYMBOL)
+ : gr_sync_block("permutation",
+ gr_make_io_signature(1, -1, BYTES_PER_SYMBOL),
+ gr_make_io_signature(1, -1, BYTES_PER_SYMBOL)),
+ d_K(K), d_TABLE(TABLE),
+ d_SYMS_PER_BLOCK(SYMS_PER_BLOCK),
+ d_BYTES_PER_SYMBOL(BYTES_PER_SYMBOL)
+ {
+ set_output_multiple(d_K*SYMS_PER_BLOCK);
+ //std::cout << d_K << "\n";
+ }
+
+ permutation_impl::~permutation_impl()
+ {
+ }
+
+ int
+ permutation_impl::work(int noutput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items)
+ {
+ int nstreams = input_items.size();
+
+ for(int m=0;m<nstreams;m++) {
+ const char *in = (const char *) input_items[m];
+ char *out = (char *) output_items[m];
+
+ // per stream processing
+ for(int i = 0; i < noutput_items/d_SYMS_PER_BLOCK; i++) {
+ // Index i refers to blocks.
+ // Begining of packet (in blocks)
+ int i0 = d_K*(i/d_K);
+ // position of block within packet (in blocks)
+ int j0 = i%d_K;
+ // new position of block within packet (in blocks)
+ int k0 = d_TABLE[j0];
+ memcpy(&(out[i*d_SYMS_PER_BLOCK*d_BYTES_PER_SYMBOL]),
+ &(in[(i0+k0)*d_SYMS_PER_BLOCK*d_BYTES_PER_SYMBOL]),
+ d_BYTES_PER_SYMBOL*d_SYMS_PER_BLOCK);
+ }
+ // end per stream processing
+ }
+ return noutput_items;
+ }
+
+ } /* namespace trellis */
+} /* namespace gr */
diff --git a/gr-trellis/lib/permutation_impl.h b/gr-trellis/lib/permutation_impl.h
new file mode 100644
index 0000000000..6e3ca2b2d7
--- /dev/null
+++ b/gr-trellis/lib/permutation_impl.h
@@ -0,0 +1,58 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004,2012 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.
+ */
+
+#ifndef INCLUDED_TRELLIS_PERMUTATION_IMPL_H
+#define INCLUDED_TRELLIS_PERMUTATION_IMPL_H
+
+#include <trellis/api.h>
+#include <trellis/permutation.h>
+
+namespace gr {
+ namespace trellis {
+
+ class permutation_impl : public permutation
+ {
+ private:
+ int d_K;
+ std::vector<int> d_TABLE;
+ int d_SYMS_PER_BLOCK;
+ size_t d_BYTES_PER_SYMBOL;
+
+ public:
+ permutation_impl(int K, const std::vector<int> &TABLE,
+ int SYMS_PER_BLOCK, size_t NBYTES);
+ ~permutation_impl();
+
+ int K() const { return d_K; }
+ const std::vector<int> & TABLE() const { return d_TABLE; }
+ int SYMS_PER_BLOCK() const { return d_SYMS_PER_BLOCK; }
+ size_t BYTES_PER_SYMBOL() const { return d_BYTES_PER_SYMBOL; }
+
+ int work(int noutput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items);
+ };
+
+ } /* namespace trellis */
+} /* namespace gr */
+
+#endif /* INCLUDED_TRELLIS_PERMUTATION_IMPL_H */
diff --git a/gr-trellis/lib/quicksort_index.cc b/gr-trellis/lib/quicksort_index.cc
new file mode 100644
index 0000000000..02cd8a9134
--- /dev/null
+++ b/gr-trellis/lib/quicksort_index.cc
@@ -0,0 +1,70 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004,2012 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.
+ */
+
+#include <trellis/quicksort_index.h>
+
+namespace gr {
+ namespace trellis {
+
+ template <class T> void
+ SWAP(T & a, T & b)
+ {
+ T temp = a;
+ a = b;
+ b = temp;
+ }
+
+ template <class T> void
+ quicksort_index (std::vector<T> & p, std::vector<int> & index,
+ int left, int right)
+ {
+ if(left < right) {
+ int i = left;
+ int j = right + 1;
+ T pivot = p[left];
+ do {
+ do
+ i++;
+ while ((p[i] < pivot) && (i < right));
+ do
+ j--;
+ while ((p[j] > pivot) && (j > left));
+ if (i < j) {
+ SWAP <T> (p[i],p[j]);
+ SWAP <int> (index[i],index[j]);
+ }
+ } while (i < j);
+ SWAP <T> (p[left], p[j]);
+ SWAP <int> (index[left], index[j]);
+ quicksort_index <T> (p,index, left, j-1);
+ quicksort_index <T> (p,index, j+1, right);
+ }
+ }
+
+ // instantiate an <int> version of the quicksort_index
+ //template <int> void SWAP (int & a, int & b);
+ template void
+ quicksort_index<int>(std::vector<int> & p, std::vector<int> & index,
+ int left, int right);
+
+ } /* namespace trellis */
+} /* namespace gr */
diff --git a/gr-trellis/lib/sccc_decoder_X_impl.cc.t b/gr-trellis/lib/sccc_decoder_X_impl.cc.t
new file mode 100644
index 0000000000..6eef46518d
--- /dev/null
+++ b/gr-trellis/lib/sccc_decoder_X_impl.cc.t
@@ -0,0 +1,118 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004,2010,2012 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.
+ */
+
+// @WARNING@
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "@NAME@.h"
+#include <gr_io_signature.h>
+#include <iostream>
+#include <trellis/core_algorithms.h>
+
+namespace gr {
+ namespace trellis {
+
+ static const float INF = 1.0e9;
+
+ @BASE_NAME@::sptr
+ @BASE_NAME@::make(const fsm &FSMo, int STo0, int SToK,
+ const fsm &FSMi, int STi0, int STiK,
+ const interleaver &INTERLEAVER,
+ int blocklength,
+ int repetitions,
+ siso_type_t SISO_TYPE)
+ {
+ return gnuradio::get_initial_sptr
+ (new @IMPL_NAME@(FSMo, STo0, SToK, FSMi, STi0, STiK,
+ INTERLEAVER, blocklength, repetitions,
+ SISO_TYPE));
+ }
+
+ @IMPL_NAME@::@IMPL_NAME@(const fsm &FSMo, int STo0, int SToK,
+ const fsm &FSMi, int STi0, int STiK,
+ const interleaver &INTERLEAVER,
+ int blocklength,
+ int repetitions,
+ siso_type_t SISO_TYPE)
+ : gr_block("@BASE_NAME@",
+ gr_make_io_signature(1, 1, sizeof(float)),
+ gr_make_io_signature(1, 1, sizeof(@O_TYPE@))),
+ d_FSMo(FSMo), d_STo0(STo0), d_SToK(SToK),
+ d_FSMi(FSMi), d_STi0(STi0), d_STiK(STiK),
+ d_INTERLEAVER(INTERLEAVER),
+ d_blocklength(blocklength),
+ d_repetitions(repetitions),
+ d_SISO_TYPE(SISO_TYPE)
+ {
+ set_relative_rate(1.0 / ((double) d_FSMi.O()));
+ set_output_multiple(d_blocklength);
+ }
+
+ @IMPL_NAME@::~@IMPL_NAME@()
+ {
+ }
+
+ void
+ @IMPL_NAME@::forecast(int noutput_items,
+ gr_vector_int &ninput_items_required)
+ {
+ int input_required = d_FSMi.O() * noutput_items ;
+ ninput_items_required[0] = input_required;
+ }
+
+ //===========================================================
+
+ int
+ @IMPL_NAME@::general_work(int noutput_items,
+ gr_vector_int &ninput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items)
+ {
+ int nblocks = noutput_items / d_blocklength;
+ float (*p2min)(float, float) = NULL;
+
+ if(d_SISO_TYPE == TRELLIS_MIN_SUM)
+ p2min = &min;
+ else if(d_SISO_TYPE == TRELLIS_SUM_PRODUCT)
+ p2min = &min_star;
+
+ const float *in = (const float*)input_items[0];
+ @O_TYPE@ *out = (@O_TYPE@*)output_items[0];
+
+ for(int n = 0; n < nblocks; n++) {
+ sccc_decoder(d_FSMo, d_STo0, d_SToK,
+ d_FSMi, d_STi0, d_STiK,
+ d_INTERLEAVER, d_blocklength, d_repetitions,
+ p2min,
+ &(in[n*d_blocklength*d_FSMi.O()]),
+ &(out[n*d_blocklength]));
+ }
+
+ consume_each(d_FSMi.O() * noutput_items );
+ return noutput_items;
+ }
+
+ } /* namespace trellis */
+} /* namespace gr */
diff --git a/gr-trellis/lib/sccc_decoder_X_impl.h.t b/gr-trellis/lib/sccc_decoder_X_impl.h.t
new file mode 100644
index 0000000000..31f4edc4b8
--- /dev/null
+++ b/gr-trellis/lib/sccc_decoder_X_impl.h.t
@@ -0,0 +1,80 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004,2012 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.
+ */
+
+// @WARNING@
+
+#ifndef @GUARD_NAME@
+#define @GUARD_NAME@
+
+#include <trellis/@BASE_NAME@.h>
+
+namespace gr {
+ namespace trellis {
+
+ class @IMPL_NAME@ : public @BASE_NAME@
+ {
+ private:
+ fsm d_FSMo;
+ int d_STo0;
+ int d_SToK;
+ fsm d_FSMi;
+ int d_STi0;
+ int d_STiK;
+ interleaver d_INTERLEAVER;
+ int d_blocklength;
+ int d_repetitions;
+ siso_type_t d_SISO_TYPE;
+ std::vector<float> d_buffer;
+
+ public:
+ @IMPL_NAME@(const fsm &FSMo, int STo0, int SToK,
+ const fsm &FSMi, int STi0, int STiK,
+ const interleaver &INTERLEAVER,
+ int blocklength,
+ int repetitions,
+ siso_type_t SISO_TYPE);
+ ~@IMPL_NAME@();
+
+ fsm FSMo() const { return d_FSMo; }
+ fsm FSMi() const { return d_FSMi; }
+ int STo0() const { return d_STo0; }
+ int SToK() const { return d_SToK; }
+ int STi0() const { return d_STi0; }
+ int STiK() const { return d_STiK; }
+ interleaver INTERLEAVER() const { return d_INTERLEAVER; }
+ int blocklength() const { return d_blocklength; }
+ int repetitions() const { return d_repetitions; }
+ siso_type_t SISO_TYPE() const { return d_SISO_TYPE; }
+
+ void forecast(int noutput_items,
+ gr_vector_int &ninput_items_required);
+
+ int general_work(int noutput_items,
+ gr_vector_int &ninput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items);
+ };
+
+ } /* namespace trellis */
+} /* namespace gr */
+
+#endif /* @GUARD_NAME@ */
diff --git a/gr-trellis/lib/sccc_decoder_combined_XX_impl.cc.t b/gr-trellis/lib/sccc_decoder_combined_XX_impl.cc.t
new file mode 100644
index 0000000000..717f2c8e49
--- /dev/null
+++ b/gr-trellis/lib/sccc_decoder_combined_XX_impl.cc.t
@@ -0,0 +1,139 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004,2010,2012 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.
+ */
+
+// @WARNING@
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "@NAME@.h"
+#include <gr_io_signature.h>
+#include <iostream>
+#include <trellis/core_algorithms.h>
+
+namespace gr {
+ namespace trellis {
+
+ static const float INF = 1.0e9;
+
+ @BASE_NAME@::sptr
+ @BASE_NAME@::make(const fsm &FSMo, int STo0, int SToK,
+ const fsm &FSMi, int STi0, int STiK,
+ const interleaver &INTERLEAVER,
+ int blocklength,
+ int repetitions,
+ siso_type_t SISO_TYPE,
+ int D,
+ const std::vector<@I_TYPE@> &TABLE,
+ digital::trellis_metric_type_t METRIC_TYPE,
+ float scaling)
+ {
+ return gnuradio::get_initial_sptr
+ (new @IMPL_NAME@(FSMo, STo0, SToK, FSMi, STi0, STiK,
+ INTERLEAVER, blocklength, repetitions,
+ SISO_TYPE, D, TABLE,METRIC_TYPE, scaling));
+ }
+
+ @IMPL_NAME@::@IMPL_NAME@(const fsm &FSMo, int STo0, int SToK,
+ const fsm &FSMi, int STi0, int STiK,
+ const interleaver &INTERLEAVER,
+ int blocklength,
+ int repetitions,
+ siso_type_t SISO_TYPE,
+ int D,
+ const std::vector<@I_TYPE@> &TABLE,
+ digital::trellis_metric_type_t METRIC_TYPE,
+ float scaling)
+ : gr_block("@BASE_NAME@",
+ gr_make_io_signature(1, 1, sizeof(@I_TYPE@)),
+ gr_make_io_signature(1, 1, sizeof(@O_TYPE@))),
+ d_FSMo(FSMo), d_STo0(STo0), d_SToK(SToK),
+ d_FSMi(FSMi), d_STi0(STi0), d_STiK(STiK),
+ d_INTERLEAVER(INTERLEAVER),
+ d_blocklength(blocklength),
+ d_repetitions(repetitions),
+ d_SISO_TYPE(SISO_TYPE),
+ d_D(D),
+ d_TABLE(TABLE),
+ d_METRIC_TYPE(METRIC_TYPE),
+ d_scaling(scaling)
+ {
+ set_relative_rate(1.0 / ((double) d_D));
+ set_output_multiple(d_blocklength);
+ }
+
+ @IMPL_NAME@::~@IMPL_NAME@()
+ {
+ }
+
+ void
+ @IMPL_NAME@::set_scaling(float scaling)
+ {
+ d_scaling = scaling;
+ }
+
+ void
+ @IMPL_NAME@::forecast(int noutput_items,
+ gr_vector_int &ninput_items_required)
+ {
+ int input_required = d_D * noutput_items ;
+ ninput_items_required[0] = input_required;
+ }
+
+ //===========================================================
+
+ int
+ @IMPL_NAME@::general_work(int noutput_items,
+ gr_vector_int &ninput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items)
+ {
+ int nblocks = noutput_items / d_blocklength;
+ float (*p2min)(float, float) = NULL;
+
+ if(d_SISO_TYPE == TRELLIS_MIN_SUM)
+ p2min = &min;
+ else if(d_SISO_TYPE == TRELLIS_SUM_PRODUCT)
+ p2min = &min_star;
+
+ const @I_TYPE@ *in = (const @I_TYPE@*)input_items[0];
+ @O_TYPE@ *out = (@O_TYPE@*)output_items[0];
+
+ for(int n = 0; n < nblocks; n++) {
+ sccc_decoder_combined(d_FSMo, d_STo0, d_SToK,
+ d_FSMi, d_STi0, d_STiK,
+ d_INTERLEAVER, d_blocklength, d_repetitions,
+ p2min,
+ d_D,d_TABLE,
+ d_METRIC_TYPE,
+ d_scaling,
+ &(in[n*d_blocklength*d_D]),
+ &(out[n*d_blocklength]));
+ }
+
+ consume_each(d_D * noutput_items);
+ return noutput_items;
+ }
+
+ } /* namespace trellis */
+} /* namespace gr */
diff --git a/gr-trellis/lib/sccc_decoder_combined_XX_impl.h.t b/gr-trellis/lib/sccc_decoder_combined_XX_impl.h.t
new file mode 100644
index 0000000000..f3dbd1b4bb
--- /dev/null
+++ b/gr-trellis/lib/sccc_decoder_combined_XX_impl.h.t
@@ -0,0 +1,93 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004,2012 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.
+ */
+
+// @WARNING@
+
+#ifndef @GUARD_NAME@
+#define @GUARD_NAME@
+
+#include <trellis/@BASE_NAME@.h>
+
+namespace gr {
+ namespace trellis {
+
+ class @IMPL_NAME@ : public @BASE_NAME@
+ {
+ private:
+ fsm d_FSMo;
+ int d_STo0;
+ int d_SToK;
+ fsm d_FSMi;
+ int d_STi0;
+ int d_STiK;
+ interleaver d_INTERLEAVER;
+ int d_blocklength;
+ int d_repetitions;
+ siso_type_t d_SISO_TYPE;
+ int d_D;
+ std::vector<@I_TYPE@> d_TABLE;
+ digital::trellis_metric_type_t d_METRIC_TYPE;
+ float d_scaling;
+ std::vector<float> d_buffer;
+
+ public:
+ @IMPL_NAME@(const fsm &FSMo, int STo0, int SToK,
+ const fsm &FSMi, int STi0, int STiK,
+ const interleaver &INTERLEAVER,
+ int blocklength,
+ int repetitions,
+ siso_type_t SISO_TYPE,
+ int D,
+ const std::vector<@I_TYPE@> &TABLE,
+ digital::trellis_metric_type_t METRIC_TYPE,
+ float scaling);
+ ~@IMPL_NAME@();
+
+ fsm FSMo() const { return d_FSMo; }
+ fsm FSMi() const { return d_FSMi; }
+ int STo0() const { return d_STo0; }
+ int SToK() const { return d_SToK; }
+ int STi0() const { return d_STi0; }
+ int STiK() const { return d_STiK; }
+ interleaver INTERLEAVER() const { return d_INTERLEAVER; }
+ int blocklength() const { return d_blocklength; }
+ int repetitions() const { return d_repetitions; }
+ int D() const { return d_D; }
+ std::vector<@I_TYPE@> TABLE() const { return d_TABLE; }
+ digital::trellis_metric_type_t METRIC_TYPE() const { return d_METRIC_TYPE; }
+ siso_type_t SISO_TYPE() const { return d_SISO_TYPE; }
+ float scaling() const { return d_scaling; }
+ void set_scaling(float scaling);
+
+ void forecast(int noutput_items,
+ gr_vector_int &ninput_items_required);
+
+ int general_work(int noutput_items,
+ gr_vector_int &ninput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items);
+ };
+
+ } /* namespace trellis */
+} /* namespace gr */
+
+#endif /* @GUARD_NAME@ */
diff --git a/gr-trellis/lib/sccc_encoder_XX_impl.cc.t b/gr-trellis/lib/sccc_encoder_XX_impl.cc.t
new file mode 100644
index 0000000000..390e65c4f3
--- /dev/null
+++ b/gr-trellis/lib/sccc_encoder_XX_impl.cc.t
@@ -0,0 +1,93 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004,2010,2012 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.
+ */
+
+// @WARNING@
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "@NAME@.h"
+#include <gr_io_signature.h>
+#include <iostream>
+
+namespace gr {
+ namespace trellis {
+
+ @BASE_NAME@::sptr
+ @BASE_NAME@::make(const fsm &FSMo, int STo,
+ const fsm &FSMi, int STi,
+ const interleaver &INTERLEAVER,
+ int blocklength)
+ {
+ return gnuradio::get_initial_sptr
+ (new @IMPL_NAME@(FSMo, STo, FSMi, STi, INTERLEAVER, blocklength));
+ }
+
+ @IMPL_NAME@::@IMPL_NAME@(const fsm &FSMo, int STo,
+ const fsm &FSMi, int STi,
+ const interleaver &INTERLEAVER,
+ int blocklength)
+ : gr_sync_block("@BASE_NAME@",
+ gr_make_io_signature(1, 1, sizeof(@I_TYPE@)),
+ gr_make_io_signature(1, 1, sizeof(@O_TYPE@))),
+ d_FSMo(FSMo), d_STo(STo),
+ d_FSMi(FSMi), d_STi(STi),
+ d_INTERLEAVER(INTERLEAVER),
+ d_blocklength(blocklength)
+ {
+ set_output_multiple(d_blocklength);
+ d_buffer.resize(d_blocklength);
+ }
+
+ @IMPL_NAME@::~@IMPL_NAME@()
+ {
+ }
+
+ int
+ @IMPL_NAME@::work(int noutput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items)
+ {
+ for(int b = 0; b < noutput_items/d_blocklength; b++) {
+ const @I_TYPE@ *in = (const @I_TYPE@*)input_items[0]+b*d_blocklength;
+ @O_TYPE@ *out = (@O_TYPE@*)output_items[0]+b*d_blocklength;
+
+ int STo_tmp = d_STo;
+ for(int i = 0; i < d_blocklength; i++) {
+ d_buffer[i] = d_FSMo.OS()[STo_tmp*d_FSMo.I()+in[i]];
+ STo_tmp = (int) d_FSMo.NS()[STo_tmp*d_FSMo.I()+in[i]];
+ }
+
+ int STi_tmp = d_STi;
+ for(int i = 0; i < d_blocklength; i++) {
+ int k = d_INTERLEAVER.INTER()[i];
+ out[i] = (@O_TYPE@) d_FSMi.OS()[STi_tmp*d_FSMi.I()+d_buffer[k]];
+ STi_tmp = (int) d_FSMi.NS()[STi_tmp*d_FSMi.I()+d_buffer[k]];
+ }
+ }
+ return noutput_items;
+ }
+
+ } /* namespace trellis */
+} /* namespace gr */
+
diff --git a/gr-trellis/lib/sccc_encoder_XX_impl.h.t b/gr-trellis/lib/sccc_encoder_XX_impl.h.t
new file mode 100644
index 0000000000..a3e582b5a0
--- /dev/null
+++ b/gr-trellis/lib/sccc_encoder_XX_impl.h.t
@@ -0,0 +1,66 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004,2012 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.
+ */
+
+// @WARNING@
+
+#ifndef @GUARD_NAME@
+#define @GUARD_NAME@
+
+#include <trellis/@BASE_NAME@.h>
+
+namespace gr {
+ namespace trellis {
+
+ class @IMPL_NAME@ : public @BASE_NAME@
+ {
+ private:
+ fsm d_FSMo;
+ int d_STo;
+ fsm d_FSMi;
+ int d_STi;
+ interleaver d_INTERLEAVER;
+ int d_blocklength;
+ std::vector<int> d_buffer;
+
+ public:
+ @IMPL_NAME@(const fsm &FSMo, int STo,
+ const fsm &FSMi, int STi,
+ const interleaver &INTERLEAVER,
+ int blocklength);
+ ~@IMPL_NAME@();
+
+ fsm FSMo() const { return d_FSMo; }
+ int STo() const { return d_STo; }
+ fsm FSMi() const { return d_FSMi; }
+ int STi() const { return d_STi; }
+ interleaver INTERLEAVER() const { return d_INTERLEAVER; }
+ int blocklength() const { return d_blocklength; }
+
+ int work(int noutput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items);
+ };
+
+ } /* namespace trellis */
+} /* namespace gr */
+
+#endif /* @GUARD_NAME@ */
diff --git a/gr-trellis/lib/siso_combined_f_impl.cc b/gr-trellis/lib/siso_combined_f_impl.cc
new file mode 100644
index 0000000000..7514d46747
--- /dev/null
+++ b/gr-trellis/lib/siso_combined_f_impl.cc
@@ -0,0 +1,180 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004,2010,2012 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "siso_combined_f_impl.h"
+#include <gr_io_signature.h>
+#include <stdexcept>
+#include <assert.h>
+#include <iostream>
+
+namespace gr {
+ namespace trellis {
+
+ static const float INF = 1.0e9;
+
+ siso_combined_f::sptr
+ siso_combined_f::make(const fsm &FSM, int K,
+ int S0, int SK,
+ bool POSTI, bool POSTO,
+ siso_type_t SISO_TYPE,
+ int D, const std::vector<float> &TABLE,
+ digital::trellis_metric_type_t TYPE)
+ {
+ return gnuradio::get_initial_sptr
+ (new siso_combined_f_impl(FSM, K, S0, SK, POSTI, POSTO,
+ SISO_TYPE, D, TABLE, TYPE));
+ }
+
+ siso_combined_f_impl::siso_combined_f_impl(const fsm &FSM, int K,
+ int S0, int SK,
+ bool POSTI, bool POSTO,
+ siso_type_t SISO_TYPE,
+ int D, const std::vector<float> &TABLE,
+ digital::trellis_metric_type_t TYPE)
+ : gr_block("siso_combined_f",
+ gr_make_io_signature(1, -1, sizeof(float)),
+ gr_make_io_signature(1, -1, sizeof(float))),
+ d_FSM(FSM), d_K(K), d_S0(S0), d_SK(SK),
+ d_POSTI(POSTI), d_POSTO(POSTO),
+ d_SISO_TYPE(SISO_TYPE),
+ d_D(D), d_TABLE(TABLE), d_TYPE(TYPE)//,
+ //d_alpha(FSM.S()*(K+1)),
+ //d_beta(FSM.S()*(K+1))
+ {
+ int multiple;
+ if(d_POSTI && d_POSTO)
+ multiple = d_FSM.I()+d_FSM.O();
+ else if(d_POSTI)
+ multiple = d_FSM.I();
+ else if(d_POSTO)
+ multiple = d_FSM.O();
+ else
+ throw std::runtime_error ("Not both POSTI and POSTO can be false.");
+
+ //printf("constructor: Multiple = %d\n",multiple);
+ set_output_multiple(d_K*multiple);
+
+ //what is the meaning of relative rate for a block with 2 inputs?
+ //set_relative_rate ( multiple / ((double) d_FSM.I()) );
+ // it turns out that the above gives problems in the scheduler, so
+ // let's try (assumption O>I)
+ //set_relative_rate ( multiple / ((double) d_FSM.O()) );
+ // I am tempted to automate like this
+ if(d_FSM.I() <= d_D)
+ set_relative_rate(multiple / ((double)d_D));
+ else
+ set_relative_rate(multiple / ((double)d_FSM.I()));
+ }
+
+ siso_combined_f_impl::~siso_combined_f_impl()
+ {
+ }
+
+ void
+ siso_combined_f_impl::forecast(int noutput_items,
+ gr_vector_int &ninput_items_required)
+ {
+ int multiple;
+ if(d_POSTI && d_POSTO)
+ multiple = d_FSM.I()+d_FSM.O();
+ else if(d_POSTI)
+ multiple = d_FSM.I();
+ else if(d_POSTO)
+ multiple = d_FSM.O();
+ else
+ throw std::runtime_error ("Not both POSTI and POSTO can be false.");
+
+ //printf("forecast: Multiple = %d\n",multiple);
+ int input_required1 = d_FSM.I() * (noutput_items/multiple) ;
+ int input_required2 = d_D * (noutput_items/multiple) ;
+ //printf("forecast: Output requirements: %d\n",noutput_items);
+ //printf("forecast: Input requirements: %d %d\n",input_required1,input_required2);
+ unsigned ninputs = ninput_items_required.size();
+
+ for(unsigned int i = 0; i < ninputs/2; i++) {
+ ninput_items_required[2*i] = input_required1;
+ ninput_items_required[2*i+1] = input_required2;
+ }
+ }
+
+ int
+ siso_combined_f_impl::general_work(int noutput_items,
+ gr_vector_int &ninput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items)
+ {
+ int nstreams = output_items.size();
+ //printf("general_work:Streams: %d\n",nstreams);
+
+ int multiple;
+ if(d_POSTI && d_POSTO)
+ multiple = d_FSM.I()+d_FSM.O();
+ else if(d_POSTI)
+ multiple = d_FSM.I();
+ else if(d_POSTO)
+ multiple = d_FSM.O();
+ else
+ throw std::runtime_error("siso_combined_f_impl:: Not both POSTI and POSTO can be false.");
+
+ int nblocks = noutput_items / (d_K*multiple);
+ //printf("general_work:Blocks: %d\n",nblocks);
+ //for(int i=0;i<ninput_items.size();i++)
+ //printf("general_work:Input items available: %d\n",ninput_items[i]);
+
+ float (*p2min)(float, float) = NULL;
+ if(d_SISO_TYPE == TRELLIS_MIN_SUM)
+ p2min = &min;
+ else if(d_SISO_TYPE == TRELLIS_SUM_PRODUCT)
+ p2min = &min_star;
+
+ for(int m=0;m<nstreams;m++) {
+ const float *in1 = (const float*)input_items[2*m];
+ const float *in2 = (const float*)input_items[2*m+1];
+ float *out = (float *) output_items[m];
+ for(int n=0;n<nblocks;n++) {
+ siso_algorithm_combined(d_FSM.I(),d_FSM.S(),d_FSM.O(),
+ d_FSM.NS(),d_FSM.OS(),d_FSM.PS(),d_FSM.PI(),
+ d_K,d_S0,d_SK,
+ d_POSTI,d_POSTO,
+ p2min,
+ d_D,d_TABLE,d_TYPE,
+ &(in1[n*d_K*d_FSM.I()]),&(in2[n*d_K*d_D]),
+ &(out[n*d_K*multiple])//,
+ //d_alpha,d_beta
+ );
+ }
+ }
+
+ for(unsigned int i = 0; i < input_items.size()/2; i++) {
+ consume(2*i,d_FSM.I() * noutput_items / multiple );
+ consume(2*i+1,d_D * noutput_items / multiple );
+ }
+
+ return noutput_items;
+ }
+
+ } /* namespace trellis */
+} /* namespace gr */
diff --git a/gr-trellis/lib/siso_combined_f_impl.h b/gr-trellis/lib/siso_combined_f_impl.h
new file mode 100644
index 0000000000..27cef5e334
--- /dev/null
+++ b/gr-trellis/lib/siso_combined_f_impl.h
@@ -0,0 +1,79 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004,2012 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.
+ */
+
+#ifndef INCLUDED_TRELLIS_SISO_COMBINED_F_IMPL_H
+#define INCLUDED_TRELLIS_SISO_COMBINED_F_IMPL_H
+
+#include <trellis/siso_combined_f.h>
+
+namespace gr {
+ namespace trellis {
+
+ class siso_combined_f_impl : public siso_combined_f
+ {
+ private:
+ fsm d_FSM;
+ int d_K;
+ int d_S0;
+ int d_SK;
+ bool d_POSTI;
+ bool d_POSTO;
+ siso_type_t d_SISO_TYPE;
+ int d_D;
+ std::vector<float> d_TABLE;
+ digital::trellis_metric_type_t d_TYPE;
+ //std::vector<float> d_alpha;
+ //std::vector<float> d_beta;
+
+ public:
+ siso_combined_f_impl(const fsm &FSM, int K,
+ int S0, int SK,
+ bool POSTI, bool POSTO,
+ siso_type_t d_SISO_TYPE,
+ int D, const std::vector<float> &TABLE,
+ digital::trellis_metric_type_t TYPE);
+ ~siso_combined_f_impl();
+
+ fsm FSM() const { return d_FSM; }
+ int K() const { return d_K; }
+ int S0() const { return d_S0; }
+ int SK() const { return d_SK; }
+ bool POSTI() const { return d_POSTI; }
+ bool POSTO() const { return d_POSTO; }
+ siso_type_t SISO_TYPE() const { return d_SISO_TYPE; }
+ int D() const { return d_D; }
+ std::vector<float> TABLE() const { return d_TABLE; }
+ digital::trellis_metric_type_t TYPE() const { return d_TYPE; }
+
+ void forecast(int noutput_items,
+ gr_vector_int &ninput_items_required);
+
+ int general_work(int noutput_items,
+ gr_vector_int &ninput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items);
+ };
+
+ } /* namespace trellis */
+} /* namespace gr */
+
+#endif /* INCLUDED_TRELLIS_SISO_COMBINED_F_IMPL_H */
diff --git a/gr-trellis/lib/siso_f_impl.cc b/gr-trellis/lib/siso_f_impl.cc
new file mode 100644
index 0000000000..b0484f6f37
--- /dev/null
+++ b/gr-trellis/lib/siso_f_impl.cc
@@ -0,0 +1,171 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004,2010,2012 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "siso_f_impl.h"
+#include <gr_io_signature.h>
+#include <stdexcept>
+#include <assert.h>
+#include <iostream>
+
+namespace gr {
+ namespace trellis {
+
+ static const float INF = 1.0e9;
+
+ siso_f::sptr
+ siso_f::make(const fsm &FSM, int K,
+ int S0, int SK,
+ bool POSTI, bool POSTO,
+ siso_type_t SISO_TYPE)
+ {
+ return gnuradio::get_initial_sptr
+ (new siso_f_impl(FSM, K, S0, SK, POSTI, POSTO, SISO_TYPE));
+ }
+
+ siso_f_impl::siso_f_impl(const fsm &FSM, int K,
+ int S0, int SK,
+ bool POSTI, bool POSTO,
+ siso_type_t SISO_TYPE)
+ : gr_block("siso_f",
+ gr_make_io_signature(1, -1, sizeof(float)),
+ gr_make_io_signature(1, -1, sizeof(float))),
+ d_FSM(FSM), d_K(K),
+ d_S0(S0),d_SK(SK),
+ d_POSTI(POSTI), d_POSTO(POSTO),
+ d_SISO_TYPE(SISO_TYPE)//,
+ //d_alpha(FSM.S()*(K+1)),
+ //d_beta(FSM.S()*(K+1))
+ {
+ int multiple;
+ if(d_POSTI && d_POSTO)
+ multiple = d_FSM.I()+d_FSM.O();
+ else if(d_POSTI)
+ multiple = d_FSM.I();
+ else if(d_POSTO)
+ multiple = d_FSM.O();
+ else
+ throw std::runtime_error ("Not both POSTI and POSTO can be false.");
+
+ //printf("constructor: Multiple = %d\n",multiple);
+ set_output_multiple (d_K*multiple);
+
+ //what is the meaning of relative rate for a block with 2 inputs?
+ //set_relative_rate ( multiple / ((double) d_FSM.I()) );
+ // it turns out that the above gives problems in the scheduler, so
+ // let's try (assumption O>I)
+ //set_relative_rate ( multiple / ((double) d_FSM.O()) );
+ // I am tempted to automate like this
+ if(d_FSM.I() <= d_FSM.O())
+ set_relative_rate(multiple / ((double) d_FSM.O()));
+ else
+ set_relative_rate(multiple / ((double) d_FSM.I()));
+ }
+
+ siso_f_impl::~siso_f_impl()
+ {
+ }
+
+ void
+ siso_f_impl::forecast(int noutput_items, gr_vector_int &ninput_items_required)
+ {
+ int multiple;
+ if(d_POSTI && d_POSTO)
+ multiple = d_FSM.I()+d_FSM.O();
+ else if(d_POSTI)
+ multiple = d_FSM.I();
+ else if(d_POSTO)
+ multiple = d_FSM.O();
+ else
+ throw std::runtime_error ("Not both POSTI and POSTO can be false.");
+
+ //printf("forecast: Multiple = %d\n",multiple);
+ int input_required1 = d_FSM.I() * (noutput_items/multiple) ;
+ int input_required2 = d_FSM.O() * (noutput_items/multiple) ;
+ //printf("forecast: Output requirements: %d\n",noutput_items);
+ //printf("forecast: Input requirements: %d %d\n",input_required1,input_required2);
+ unsigned ninputs = ninput_items_required.size();
+ for(unsigned int i = 0; i < ninputs/2; i++) {
+ ninput_items_required[2*i] = input_required1;
+ ninput_items_required[2*i+1] = input_required2;
+ }
+ }
+
+ int
+ siso_f_impl::general_work(int noutput_items,
+ gr_vector_int &ninput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items)
+ {
+ int nstreams = output_items.size();
+ //printf("general_work:Streams: %d\n",nstreams);
+ int multiple;
+ if(d_POSTI && d_POSTO)
+ multiple = d_FSM.I()+d_FSM.O();
+ else if(d_POSTI)
+ multiple = d_FSM.I();
+ else if(d_POSTO)
+ multiple = d_FSM.O();
+ else
+ throw std::runtime_error("siso_f_impl: Not both POSTI and POSTO can be false.\n");
+
+ int nblocks = noutput_items / (d_K*multiple);
+ //printf("general_work:Blocks: %d\n",nblocks);
+ //for(int i=0;i<ninput_items.size();i++)
+ //printf("general_work:Input items available: %d\n",ninput_items[i]);
+
+ float (*p2min)(float, float) = NULL;
+ if(d_SISO_TYPE == TRELLIS_MIN_SUM)
+ p2min = &min;
+ else if(d_SISO_TYPE == TRELLIS_SUM_PRODUCT)
+ p2min = &min_star;
+
+ for(int m = 0; m < nstreams; m++) {
+ const float *in1 = (const float*)input_items[2*m];
+ const float *in2 = (const float*)input_items[2*m+1];
+ float *out = (float*)output_items[m];
+ for(int n = 0;n < nblocks; n++) {
+ siso_algorithm(d_FSM.I(),d_FSM.S(),d_FSM.O(),
+ d_FSM.NS(),d_FSM.OS(),d_FSM.PS(),d_FSM.PI(),
+ d_K,d_S0,d_SK,
+ d_POSTI,d_POSTO,
+ p2min,
+ &(in1[n*d_K*d_FSM.I()]),&(in2[n*d_K*d_FSM.O()]),
+ &(out[n*d_K*multiple])//,
+ //d_alpha,d_beta
+ );
+ }
+ }
+
+ for(unsigned int i = 0; i < input_items.size()/2; i++) {
+ consume(2*i,d_FSM.I() * noutput_items / multiple );
+ consume(2*i+1,d_FSM.O() * noutput_items / multiple );
+ }
+
+ return noutput_items;
+ }
+
+ } /* namespace trellis */
+} /* namespace gr */
diff --git a/gr-trellis/lib/siso_f_impl.h b/gr-trellis/lib/siso_f_impl.h
new file mode 100644
index 0000000000..40766b97fa
--- /dev/null
+++ b/gr-trellis/lib/siso_f_impl.h
@@ -0,0 +1,75 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004,2012 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.
+ */
+
+#ifndef INCLUDED_TRELLIS_SISO_F_IMPL_H
+#define INCLUDED_TRELLIS_SISO_F_IMPL_H
+
+#include <trellis/api.h>
+#include <trellis/fsm.h>
+#include <trellis/siso_type.h>
+#include <trellis/core_algorithms.h>
+#include <trellis/siso_f.h>
+
+namespace gr {
+ namespace trellis {
+
+ class siso_f_impl : public siso_f
+ {
+ private:
+ fsm d_FSM;
+ int d_K;
+ int d_S0;
+ int d_SK;
+ bool d_POSTI;
+ bool d_POSTO;
+ siso_type_t d_SISO_TYPE;
+ //std::vector<float> d_alpha;
+ //std::vector<float> d_beta;
+
+ public:
+ siso_f_impl(const fsm &FSM, int K,
+ int S0, int SK,
+ bool POSTI, bool POSTO,
+ siso_type_t d_SISO_TYPE);
+ ~siso_f_impl();
+
+ fsm FSM() const { return d_FSM; }
+ int K() const { return d_K; }
+ int S0() const { return d_S0; }
+ int SK() const { return d_SK; }
+ bool POSTI() const { return d_POSTI; }
+ bool POSTO() const { return d_POSTO; }
+ siso_type_t SISO_TYPE() const { return d_SISO_TYPE; }
+
+ void forecast(int noutput_items,
+ gr_vector_int &ninput_items_required);
+
+ int general_work (int noutput_items,
+ gr_vector_int &ninput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items);
+ };
+
+ } /* namespace trellis */
+} /* namespace gr */
+
+#endif /* INCLUDED_TRELLIS_SISO_F_IMPL_H */
diff --git a/gr-trellis/lib/viterbi_X_impl.cc.t b/gr-trellis/lib/viterbi_X_impl.cc.t
new file mode 100644
index 0000000000..5097cc2053
--- /dev/null
+++ b/gr-trellis/lib/viterbi_X_impl.cc.t
@@ -0,0 +1,99 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004,2010,2012 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.
+ */
+
+// @WARNING@
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "@NAME@.h"
+#include <gr_io_signature.h>
+#include <iostream>
+
+namespace gr {
+ namespace trellis {
+
+ static const float INF = 1.0e9;
+
+ @BASE_NAME@::sptr
+ @BASE_NAME@::make(const fsm &FSM, int K,
+ int S0, int SK)
+ {
+ return gnuradio::get_initial_sptr
+ (new @IMPL_NAME@(FSM, K, S0, SK));
+ }
+
+ @IMPL_NAME@::@IMPL_NAME@(const fsm &FSM, int K,
+ int S0, int SK)
+ : gr_block("@BASE_NAME@",
+ gr_make_io_signature(1, -1, sizeof(float)),
+ gr_make_io_signature(1, -1, sizeof(@TYPE@))),
+ d_FSM(FSM), d_K(K), d_S0(S0), d_SK(SK)//,
+ //d_trace(FSM.S()*K)
+ {
+ set_relative_rate(1.0 / ((double)d_FSM.O()));
+ set_output_multiple(d_K);
+ }
+
+ @IMPL_NAME@::~@IMPL_NAME@()
+ {
+ }
+
+ void
+ @IMPL_NAME@::forecast(int noutput_items,
+ gr_vector_int &ninput_items_required)
+ {
+ int input_required = d_FSM.O() * noutput_items;
+ unsigned ninputs = ninput_items_required.size();
+ for(unsigned int i = 0; i < ninputs; i++) {
+ ninput_items_required[i] = input_required;
+ }
+ }
+
+ int
+ @IMPL_NAME@::general_work(int noutput_items,
+ gr_vector_int &ninput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items)
+ {
+ int nstreams = input_items.size();
+ int nblocks = noutput_items / d_K;
+
+ for(int m = 0; m < nstreams; m++) {
+ const float *in = (const float*)input_items[m];
+ @TYPE@ *out = (@TYPE@*)output_items[m];
+
+ for(int n = 0; n < nblocks; n++) {
+ viterbi_algorithm(d_FSM.I(), d_FSM.S(), d_FSM.O(),
+ d_FSM.NS(), d_FSM.OS(), d_FSM.PS(),
+ d_FSM.PI(), d_K,d_S0, d_SK,
+ &(in[n*d_K*d_FSM.O()]), &(out[n*d_K]));
+ }
+ }
+
+ consume_each(d_FSM.O() * noutput_items);
+ return noutput_items;
+ }
+
+ } /* namespace trellis */
+} /* namespace gr */
diff --git a/gr-trellis/lib/viterbi_X_impl.h.t b/gr-trellis/lib/viterbi_X_impl.h.t
new file mode 100644
index 0000000000..accaacc158
--- /dev/null
+++ b/gr-trellis/lib/viterbi_X_impl.h.t
@@ -0,0 +1,65 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004,2012 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.
+ */
+
+// @WARNING@
+
+#ifndef @GUARD_NAME@
+#define @GUARD_NAME@
+
+#include <trellis/@BASE_NAME@.h>
+
+namespace gr {
+ namespace trellis {
+
+ class @IMPL_NAME@ : public @BASE_NAME@
+ {
+ private:
+ fsm d_FSM;
+ int d_K;
+ int d_S0;
+ int d_SK;
+ //std::vector<int> d_trace;
+
+ public:
+ @IMPL_NAME@(const fsm &FSM, int K,
+ int S0, int SK);
+ ~@IMPL_NAME@();
+
+ fsm FSM() const { return d_FSM; }
+ int K() const { return d_K; }
+ int S0() const { return d_S0; }
+ int SK() const { return d_SK; }
+
+ //std::vector<int> trace () const { return d_trace; }
+
+ void forecast(int noutput_items,
+ gr_vector_int &ninput_items_required);
+ int general_work(int noutput_items,
+ gr_vector_int &ninput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items);
+ };
+
+ } /* namespace trellis */
+} /* namespace gr */
+
+#endif /* @GUARD_NAME@ */
diff --git a/gr-trellis/lib/viterbi_combined_XX_impl.cc.t b/gr-trellis/lib/viterbi_combined_XX_impl.cc.t
new file mode 100644
index 0000000000..95175bef95
--- /dev/null
+++ b/gr-trellis/lib/viterbi_combined_XX_impl.cc.t
@@ -0,0 +1,112 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004,2010,2012 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.
+ */
+
+// @WARNING@
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "@NAME@.h"
+#include <gr_io_signature.h>
+#include <iostream>
+
+namespace gr {
+ namespace trellis {
+
+ static const float INF = 1.0e9;
+
+ @BASE_NAME@::sptr
+ @BASE_NAME@::make(const fsm &FSM, int K,
+ int S0, int SK, int D,
+ const std::vector<@I_TYPE@> &TABLE,
+ digital::trellis_metric_type_t TYPE)
+ {
+ return gnuradio::get_initial_sptr
+ (new @NAME@(FSM, K, S0, SK, D, TABLE,TYPE));
+ }
+
+ @IMPL_NAME@::@IMPL_NAME@(const fsm &FSM, int K,
+ int S0, int SK, int D,
+ const std::vector<@I_TYPE@> &TABLE,
+ digital::trellis_metric_type_t TYPE)
+ : gr_block("@BASE_NAME@",
+ gr_make_io_signature(1, -1, sizeof(@I_TYPE@)),
+ gr_make_io_signature(1, -1, sizeof(@O_TYPE@))),
+ d_FSM(FSM), d_K(K), d_S0(S0), d_SK(SK), d_D(D),
+ d_TABLE(TABLE), d_TYPE(TYPE)//,
+ //d_trace(FSM.S()*K)
+ {
+ set_relative_rate(1.0 / ((double)d_D));
+ set_output_multiple(d_K);
+ }
+
+ @IMPL_NAME@::~@IMPL_NAME@()
+ {
+ }
+
+ void
+ @IMPL_NAME@::set_TABLE(const std::vector<@I_TYPE@> &table)
+ {
+ d_TABLE = table;
+ }
+
+ void
+ @IMPL_NAME@::forecast(int noutput_items,
+ gr_vector_int &ninput_items_required)
+ {
+ int input_required = d_D * noutput_items;
+ unsigned ninputs = ninput_items_required.size();
+ for(unsigned int i = 0; i < ninputs; i++) {
+ ninput_items_required[i] = input_required;
+ }
+ }
+
+ int
+ @IMPL_NAME@::general_work(int noutput_items,
+ gr_vector_int &ninput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items)
+ {
+ int nstreams = input_items.size();
+ int nblocks = noutput_items / d_K;
+
+ for(int m=0;m<nstreams;m++) {
+ const @I_TYPE@ *in = (const @I_TYPE@*)input_items[m];
+ @O_TYPE@ *out = (@O_TYPE@*)output_items[m];
+
+ for(int n=0;n<nblocks;n++) {
+ viterbi_algorithm_combined(d_FSM.I(), d_FSM.S(), d_FSM.O(),
+ d_FSM.NS(), d_FSM.OS(), d_FSM.PS(),
+ d_FSM.PI(), d_K,d_S0, d_SK, d_D,
+ d_TABLE, d_TYPE,
+ &(in[n*d_K*d_D]), &(out[n*d_K]));
+ }
+ }
+
+ consume_each(d_D * noutput_items);
+ return noutput_items;
+ }
+
+ } /* namespace trellis */
+} /* namespace gr */
+
diff --git a/gr-trellis/lib/viterbi_combined_XX_impl.h.t b/gr-trellis/lib/viterbi_combined_XX_impl.h.t
new file mode 100644
index 0000000000..df62001110
--- /dev/null
+++ b/gr-trellis/lib/viterbi_combined_XX_impl.h.t
@@ -0,0 +1,74 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004,2012 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.
+ */
+
+// @WARNING@
+
+#ifndef @GUARD_NAME@
+#define @GUARD_NAME@
+
+#include <trellis/@BASE_NAME@.h>
+
+namespace gr {
+ namespace trellis {
+
+ class @IMPL_NAME@ : public @BASE_NAME@
+ {
+ private:
+ fsm d_FSM;
+ int d_K;
+ int d_S0;
+ int d_SK;
+ int d_D;
+ std::vector<@I_TYPE@> d_TABLE;
+ digital::trellis_metric_type_t d_TYPE;
+ //std::vector<int> d_trace;
+
+ public:
+ @IMPL_NAME@(const fsm &FSM, int K,
+ int S0, int SK, int D,
+ const std::vector<@I_TYPE@> &TABLE,
+ digital::trellis_metric_type_t TYPE);
+ ~@IMPL_NAME@();
+
+ fsm FSM() const { return d_FSM; }
+ int K() const { return d_K; }
+ int S0() const { return d_S0; }
+ int SK() const { return d_SK; }
+ int D() const { return d_D; }
+ std::vector<@I_TYPE@> TABLE() const { return d_TABLE; }
+ digital::trellis_metric_type_t TYPE() const { return d_TYPE; }
+ //std::vector<int> trace() const { return d_trace; }
+ void set_TABLE(const std::vector<@I_TYPE@> &table);
+
+ void forecast(int noutput_items,
+ gr_vector_int &ninput_items_required);
+
+ int general_work(int noutput_items,
+ gr_vector_int &ninput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items);
+ };
+
+ } /* namespace trellis */
+} /* namespace gr */
+
+#endif /* @GUARD_NAME@ */
diff --git a/gr-trellis/src/python/CMakeLists.txt b/gr-trellis/python/CMakeLists.txt
index f8e4d95329..a166764fbe 100644
--- a/gr-trellis/src/python/CMakeLists.txt
+++ b/gr-trellis/python/CMakeLists.txt
@@ -18,17 +18,36 @@
# Boston, MA 02110-1301, USA.
########################################################################
+# Setup python install
+########################################################################
+include(GrPython)
+
+GR_PYTHON_INSTALL(
+ FILES
+ __init__.py
+ DESTINATION ${GR_PYTHON_DIR}/gnuradio/trellis
+ COMPONENT "trellis_python"
+)
+
+########################################################################
# Handle the unit tests
########################################################################
if(ENABLE_TESTING)
list(APPEND GR_TEST_PYTHON_DIRS
+ ${CMAKE_BINARY_DIR}/gr-trellis/python
+ ${CMAKE_BINARY_DIR}/gr-trellis/swig
+ ${CMAKE_BINARY_DIR}/gr-blocks/python
+ ${CMAKE_BINARY_DIR}/gr-blocks/swig
+ ${CMAKE_BINARY_DIR}/gr-filter/python
+ ${CMAKE_BINARY_DIR}/gr-filter/swig
+ ${CMAKE_BINARY_DIR}/gr-analog/python
+ ${CMAKE_BINARY_DIR}/gr-analog/swig
+ ${CMAKE_BINARY_DIR}/gr-digital/python
${CMAKE_BINARY_DIR}/gr-digital/swig
- ${CMAKE_BINARY_DIR}/gr-trellis/src/lib
)
-list(APPEND GR_TEST_TARGET_DEPS gnuradio-digital gnuradio-trellis)
+list(APPEND GR_TEST_TARGET_DEPS gnuradio-trellis gnuradio-digital gnuradio-analog gnuradio-filter)
-include(GrPython)
include(GrTest)
file(GLOB py_qa_test_files "qa_*.py")
foreach(py_qa_test_file ${py_qa_test_files})
diff --git a/gr-trellis/src/lib/generate_all.py b/gr-trellis/python/__init__.py
index 78e36270cc..a1792bc9b4 100644
--- a/gr-trellis/src/lib/generate_all.py
+++ b/gr-trellis/python/__init__.py
@@ -1,32 +1,27 @@
-#!/usr/bin/env python
-#
-# Copyright 2006,2007 Free Software Foundation, Inc.
-#
+# Copyright 2012 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.
-#
+#
-from build_utils import output_glue
+'''
+Blocks and utilities for trellis coding and related.
+'''
-import generate_trellis
+# The presence of this file turns this directory into a Python package
-def generate_all ():
- generate_trellis.generate ()
- output_glue ('trellis')
-
-if __name__ == '__main__':
- generate_all ()
+from trellis_swig import *
diff --git a/gr-trellis/src/python/awgn1o2_4.fsm b/gr-trellis/python/awgn1o2_4.fsm
index 9245c69ac1..9245c69ac1 100644
--- a/gr-trellis/src/python/awgn1o2_4.fsm
+++ b/gr-trellis/python/awgn1o2_4.fsm
diff --git a/gr-trellis/src/python/qa_trellis.py b/gr-trellis/python/qa_trellis.py
index fcc651ec6d..0e1ddc61b2 100755
--- a/gr-trellis/src/python/qa_trellis.py
+++ b/gr-trellis/python/qa_trellis.py
@@ -1,6 +1,6 @@
#!/usr/bin/env python
#
-# Copyright 2004,2010 Free Software Foundation, Inc.
+# Copyright 2004,2010,2012 Free Software Foundation, Inc.
#
# This file is part of GNU Radio
#
@@ -21,15 +21,14 @@
#
import math
+import os
+from gnuradio import gr, gr_unittest
-from gnuradio import gr, gr_unittest, blks2
-# It's pretty ugly that we can't import trellis from gnuradio in this test
-# but because it runs on the non-installed python code it's all a mess.
-import trellis
-
-import os
-import digital_swig
+import trellis_swig as trellis
+import digital_swig as digital
+import analog_swig as analog
+import blocks_swig as blocks
fsm_args = {"awgn1o2_4": (2, 4, 4,
(0, 2, 0, 2, 1, 3, 1, 3),
@@ -39,8 +38,8 @@ fsm_args = {"awgn1o2_4": (2, 4, 4,
"nothing": (2, 1, 2, (0, 0), (0, 1)),
}
-constells = {2: digital_swig.constellation_bpsk(),
- 4: digital_swig.constellation_qpsk(),
+constells = {2: digital.constellation_bpsk(),
+ 4: digital.constellation_qpsk(),
}
class test_trellis (gr_unittest.TestCase):
@@ -114,15 +113,15 @@ class trellis_tb(gr.top_block):
s2fsmi = gr.packed_to_unpacked_ss(bitspersymbol, gr.GR_MSB_FIRST)
# initial FSM state = 0
enc = trellis.encoder_ss(f, 0)
- mod = gr.chunks_to_symbols_sc(constellation.points(), 1)
+ mod = digital.chunks_to_symbols_sc(constellation.points(), 1)
# CHANNEL
- add = gr.add_cc()
- noise = gr.noise_source_c(gr.GR_GAUSSIAN,math.sqrt(N0/2),seed)
+ add = blocks.add_cc()
+ noise = analog.noise_source_c(analog.GR_GAUSSIAN,math.sqrt(N0/2),seed)
# RX
# data preprocessing to generate metrics for Viterbi
- metrics = trellis.constellation_metrics_cf(constellation.base(), digital_swig.TRELLIS_EUCLIDEAN)
+ metrics = trellis.constellation_metrics_cf(constellation.base(), digital.TRELLIS_EUCLIDEAN)
# Put -1 if the Initial/Final states are not set.
va = trellis.viterbi_s(f, K, 0, -1)
# pack FSM input symbols to shorts
diff --git a/gr-trellis/src/lib/CMakeLists.txt b/gr-trellis/src/lib/CMakeLists.txt
deleted file mode 100644
index e2abf0238f..0000000000
--- a/gr-trellis/src/lib/CMakeLists.txt
+++ /dev/null
@@ -1,226 +0,0 @@
-# Copyright 2011 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.
-
-include(GrPython)
-
-########################################################################
-# Setup the include and linker paths
-########################################################################
-include_directories(
- ${GR_TRELLIS_INCLUDE_DIRS}
- ${GR_DIGITAL_INCLUDE_DIRS}
- ${GNURADIO_CORE_INCLUDE_DIRS}
- ${GRUEL_INCLUDE_DIRS}
- ${Boost_INCLUDE_DIRS}
-)
-
-link_directories(${Boost_LIBRARY_DIRS})
-
-########################################################################
-# generate the python helper script which calls into the build utils
-########################################################################
-file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/generate_helper.py "
-#!${PYTHON_EXECUTABLE}
-
-import sys, os, re
-sys.path.append('${GR_CORE_PYTHONPATH}')
-sys.path.append('${CMAKE_CURRENT_SOURCE_DIR}')
-os.environ['srcdir'] = '${CMAKE_CURRENT_SOURCE_DIR}'
-os.chdir('${CMAKE_CURRENT_BINARY_DIR}')
-
-if __name__ == '__main__':
- import build_utils, generate_trellis
- root, inp = sys.argv[1:3]
- for sig in sys.argv[3:]:
- name = re.sub ('X+', sig, root)
- d = generate_trellis.standard_dict(name, sig)
- build_utils.expand_template(d, inp)
-
-")
-
-########################################################################
-# generation helper macro to generate various files from template
-########################################################################
-macro(expand_h_cc_i root)
-
- foreach(ext h cc i)
- #make a list of all the generated files
- unset(expanded_files_${ext})
- foreach(sig ${ARGN})
- string(REGEX REPLACE "X+" ${sig} name ${root})
- list(APPEND expanded_files_${ext} ${CMAKE_CURRENT_BINARY_DIR}/${name}.${ext})
- endforeach(sig)
-
- #create a command to generate the files
- add_custom_command(
- OUTPUT ${expanded_files_${ext}}
- DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${root}.${ext}.t
- COMMAND ${PYTHON_EXECUTABLE} ${PYTHON_DASH_B}
- ${CMAKE_CURRENT_BINARY_DIR}/generate_helper.py
- ${root} ${root}.${ext}.t ${ARGN}
- )
- endforeach(ext)
-
- #make source files depends on headers to force generation
- set_source_files_properties(${expanded_files_cc}
- PROPERTIES OBJECT_DEPENDS "${expanded_files_h}"
- )
-
- #install rules for the generated cc, h, and i files
- list(APPEND generated_trellis_sources ${expanded_files_cc})
- list(APPEND generated_trellis_includes ${expanded_files_h})
- list(APPEND generated_trellis_swigs ${expanded_files_i})
-
-endmacro(expand_h_cc_i)
-
-########################################################################
-# Invoke macro to generate various sources
-########################################################################
-expand_h_cc_i(trellis_encoder_XX bb bs bi ss si ii)
-expand_h_cc_i(trellis_sccc_encoder_XX bb bs bi ss si ii)
-expand_h_cc_i(trellis_pccc_encoder_XX bb bs bi ss si ii)
-expand_h_cc_i(trellis_metrics_X s i f c)
-expand_h_cc_i(trellis_viterbi_X b s i)
-expand_h_cc_i(trellis_viterbi_combined_XX sb ss si ib is ii fb fs fi cb cs ci)
-expand_h_cc_i(trellis_sccc_decoder_X b s i)
-expand_h_cc_i(trellis_sccc_decoder_combined_XX fb fs fi cb cs ci)
-expand_h_cc_i(trellis_pccc_decoder_X b s i)
-expand_h_cc_i(trellis_pccc_decoder_combined_XX fb fs fi cb cs ci)
-
-########################################################################
-# Create the master trellis swig include files
-########################################################################
-set(generated_index ${CMAKE_CURRENT_BINARY_DIR}/trellis_generated.i.in)
-file(WRITE ${generated_index} "
-//
-// This file is machine generated. All edits will be overwritten
-//
-")
-
-file(APPEND ${generated_index} "%{\n")
-foreach(swig_file ${generated_trellis_swigs})
- get_filename_component(name ${swig_file} NAME_WE)
- file(APPEND ${generated_index} "#include<${name}.h>\n")
-endforeach(swig_file)
-file(APPEND ${generated_index} "%}\n")
-
-foreach(swig_file ${generated_trellis_swigs})
- get_filename_component(name ${swig_file} NAME)
- file(APPEND ${generated_index} "%include<${name}>\n")
-endforeach(swig_file)
-
-execute_process(
- COMMAND ${CMAKE_COMMAND} -E copy_if_different
- ${generated_index} ${CMAKE_CURRENT_BINARY_DIR}/trellis_generated.i
-)
-
-########################################################################
-# Setup library
-########################################################################
-list(APPEND gr_trellis_sources
- fsm.cc
- quicksort_index.cc
- base.cc
- interleaver.cc
- calc_metric.cc
- core_algorithms.cc
- trellis_permutation.cc
- trellis_siso_f.cc
- trellis_siso_combined_f.cc
- trellis_constellation_metrics_cf.cc
- ${generated_trellis_sources}
-)
-
-list(APPEND trellis_libs
- gnuradio-core
- ${Boost_LIBRARIES}
-)
-
-add_library(gnuradio-trellis SHARED ${gr_trellis_sources})
-target_link_libraries(gnuradio-trellis ${trellis_libs})
-GR_LIBRARY_FOO(gnuradio-trellis RUNTIME_COMPONENT "trellis_runtime" DEVEL_COMPONENT "trellis_devel")
-
-########################################################################
-# Handle the generated sources + a few non-generated ones
-########################################################################
-install(FILES
- ${generated_trellis_includes}
- trellis_api.h
- fsm.h
- quicksort_index.h
- base.h
- interleaver.h
- calc_metric.h
- core_algorithms.h
- trellis_permutation.h
- siso_type.h
- trellis_siso_f.h
- trellis_siso_combined_f.h
- trellis_constellation_metrics_cf.h
- DESTINATION ${GR_INCLUDE_DIR}/gnuradio
- COMPONENT "trellis_devel"
-)
-
-if(ENABLE_PYTHON)
- install(FILES
- trellis.i
- ${generated_trellis_swigs}
- fsm.i
- interleaver.i
- trellis_permutation.i
- trellis_siso_f.i
- trellis_siso_combined_f.i
- trellis_constellation_metrics_cf.i
- ${CMAKE_CURRENT_BINARY_DIR}/trellis_generated.i
- ${CMAKE_CURRENT_BINARY_DIR}/trellis_swig_doc.i
- DESTINATION ${GR_INCLUDE_DIR}/gnuradio/swig
- COMPONENT "trellis_swig"
- )
-
-########################################################################
-# Setup swig generation
-########################################################################
-include(GrPython)
-include(GrSwig)
-
-set(GR_SWIG_SOURCE_DEPS
- ${generated_trellis_includes}
- ${generated_trellis_swigs}
-)
-set(GR_SWIG_INCLUDE_DIRS
- ${GR_TRELLIS_INCLUDE_DIRS}
- ${GR_DIGITAL_SWIG_INCLUDE_DIRS}
- ${GNURADIO_CORE_SWIG_INCLUDE_DIRS}
- ${GRUEL_INCLUDE_DIRS}
- ${Boost_INCLUDE_DIRS}
-)
-
-set(GR_SWIG_DOC_FILE ${CMAKE_CURRENT_BINARY_DIR}/trellis_swig_doc.i)
-set(GR_SWIG_DOC_DIRS ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR})
-
-set(GR_SWIG_LIBRARIES gnuradio-trellis)
-GR_SWIG_MAKE(trellis trellis.i)
-
-GR_SWIG_INSTALL(
- TARGETS trellis
- DESTINATION ${GR_PYTHON_DIR}/gnuradio
- COMPONENT "trellis_python"
-)
-
-endif(ENABLE_PYTHON)
diff --git a/gr-trellis/src/lib/Makefile.gen b/gr-trellis/src/lib/Makefile.gen
deleted file mode 100644
index b9b9afb1f7..0000000000
--- a/gr-trellis/src/lib/Makefile.gen
+++ /dev/null
@@ -1,174 +0,0 @@
-#
-# This file is machine generated. All edits will be overwritten
-#
-GENERATED_H = \
- trellis_encoder_bb.h \
- trellis_encoder_bi.h \
- trellis_encoder_bs.h \
- trellis_encoder_ii.h \
- trellis_encoder_si.h \
- trellis_encoder_ss.h \
- trellis_metrics_c.h \
- trellis_metrics_f.h \
- trellis_metrics_i.h \
- trellis_metrics_s.h \
- trellis_pccc_decoder_b.h \
- trellis_pccc_decoder_combined_cb.h \
- trellis_pccc_decoder_combined_ci.h \
- trellis_pccc_decoder_combined_cs.h \
- trellis_pccc_decoder_combined_fb.h \
- trellis_pccc_decoder_combined_fi.h \
- trellis_pccc_decoder_combined_fs.h \
- trellis_pccc_decoder_i.h \
- trellis_pccc_decoder_s.h \
- trellis_pccc_encoder_bb.h \
- trellis_pccc_encoder_bi.h \
- trellis_pccc_encoder_bs.h \
- trellis_pccc_encoder_ii.h \
- trellis_pccc_encoder_si.h \
- trellis_pccc_encoder_ss.h \
- trellis_sccc_decoder_b.h \
- trellis_sccc_decoder_combined_cb.h \
- trellis_sccc_decoder_combined_ci.h \
- trellis_sccc_decoder_combined_cs.h \
- trellis_sccc_decoder_combined_fb.h \
- trellis_sccc_decoder_combined_fi.h \
- trellis_sccc_decoder_combined_fs.h \
- trellis_sccc_decoder_i.h \
- trellis_sccc_decoder_s.h \
- trellis_sccc_encoder_bb.h \
- trellis_sccc_encoder_bi.h \
- trellis_sccc_encoder_bs.h \
- trellis_sccc_encoder_ii.h \
- trellis_sccc_encoder_si.h \
- trellis_sccc_encoder_ss.h \
- trellis_viterbi_b.h \
- trellis_viterbi_combined_cb.h \
- trellis_viterbi_combined_ci.h \
- trellis_viterbi_combined_cs.h \
- trellis_viterbi_combined_fb.h \
- trellis_viterbi_combined_fi.h \
- trellis_viterbi_combined_fs.h \
- trellis_viterbi_combined_ib.h \
- trellis_viterbi_combined_ii.h \
- trellis_viterbi_combined_is.h \
- trellis_viterbi_combined_sb.h \
- trellis_viterbi_combined_si.h \
- trellis_viterbi_combined_ss.h \
- trellis_viterbi_i.h \
- trellis_viterbi_s.h
-
-GENERATED_I = \
- trellis_encoder_bb.i \
- trellis_encoder_bi.i \
- trellis_encoder_bs.i \
- trellis_encoder_ii.i \
- trellis_encoder_si.i \
- trellis_encoder_ss.i \
- trellis_metrics_c.i \
- trellis_metrics_f.i \
- trellis_metrics_i.i \
- trellis_metrics_s.i \
- trellis_pccc_decoder_b.i \
- trellis_pccc_decoder_combined_cb.i \
- trellis_pccc_decoder_combined_ci.i \
- trellis_pccc_decoder_combined_cs.i \
- trellis_pccc_decoder_combined_fb.i \
- trellis_pccc_decoder_combined_fi.i \
- trellis_pccc_decoder_combined_fs.i \
- trellis_pccc_decoder_i.i \
- trellis_pccc_decoder_s.i \
- trellis_pccc_encoder_bb.i \
- trellis_pccc_encoder_bi.i \
- trellis_pccc_encoder_bs.i \
- trellis_pccc_encoder_ii.i \
- trellis_pccc_encoder_si.i \
- trellis_pccc_encoder_ss.i \
- trellis_sccc_decoder_b.i \
- trellis_sccc_decoder_combined_cb.i \
- trellis_sccc_decoder_combined_ci.i \
- trellis_sccc_decoder_combined_cs.i \
- trellis_sccc_decoder_combined_fb.i \
- trellis_sccc_decoder_combined_fi.i \
- trellis_sccc_decoder_combined_fs.i \
- trellis_sccc_decoder_i.i \
- trellis_sccc_decoder_s.i \
- trellis_sccc_encoder_bb.i \
- trellis_sccc_encoder_bi.i \
- trellis_sccc_encoder_bs.i \
- trellis_sccc_encoder_ii.i \
- trellis_sccc_encoder_si.i \
- trellis_sccc_encoder_ss.i \
- trellis_viterbi_b.i \
- trellis_viterbi_combined_cb.i \
- trellis_viterbi_combined_ci.i \
- trellis_viterbi_combined_cs.i \
- trellis_viterbi_combined_fb.i \
- trellis_viterbi_combined_fi.i \
- trellis_viterbi_combined_fs.i \
- trellis_viterbi_combined_ib.i \
- trellis_viterbi_combined_ii.i \
- trellis_viterbi_combined_is.i \
- trellis_viterbi_combined_sb.i \
- trellis_viterbi_combined_si.i \
- trellis_viterbi_combined_ss.i \
- trellis_viterbi_i.i \
- trellis_viterbi_s.i
-
-GENERATED_CC = \
- trellis_encoder_bb.cc \
- trellis_encoder_bi.cc \
- trellis_encoder_bs.cc \
- trellis_encoder_ii.cc \
- trellis_encoder_si.cc \
- trellis_encoder_ss.cc \
- trellis_metrics_c.cc \
- trellis_metrics_f.cc \
- trellis_metrics_i.cc \
- trellis_metrics_s.cc \
- trellis_pccc_decoder_b.cc \
- trellis_pccc_decoder_combined_cb.cc \
- trellis_pccc_decoder_combined_ci.cc \
- trellis_pccc_decoder_combined_cs.cc \
- trellis_pccc_decoder_combined_fb.cc \
- trellis_pccc_decoder_combined_fi.cc \
- trellis_pccc_decoder_combined_fs.cc \
- trellis_pccc_decoder_i.cc \
- trellis_pccc_decoder_s.cc \
- trellis_pccc_encoder_bb.cc \
- trellis_pccc_encoder_bi.cc \
- trellis_pccc_encoder_bs.cc \
- trellis_pccc_encoder_ii.cc \
- trellis_pccc_encoder_si.cc \
- trellis_pccc_encoder_ss.cc \
- trellis_sccc_decoder_b.cc \
- trellis_sccc_decoder_combined_cb.cc \
- trellis_sccc_decoder_combined_ci.cc \
- trellis_sccc_decoder_combined_cs.cc \
- trellis_sccc_decoder_combined_fb.cc \
- trellis_sccc_decoder_combined_fi.cc \
- trellis_sccc_decoder_combined_fs.cc \
- trellis_sccc_decoder_i.cc \
- trellis_sccc_decoder_s.cc \
- trellis_sccc_encoder_bb.cc \
- trellis_sccc_encoder_bi.cc \
- trellis_sccc_encoder_bs.cc \
- trellis_sccc_encoder_ii.cc \
- trellis_sccc_encoder_si.cc \
- trellis_sccc_encoder_ss.cc \
- trellis_viterbi_b.cc \
- trellis_viterbi_combined_cb.cc \
- trellis_viterbi_combined_ci.cc \
- trellis_viterbi_combined_cs.cc \
- trellis_viterbi_combined_fb.cc \
- trellis_viterbi_combined_fi.cc \
- trellis_viterbi_combined_fs.cc \
- trellis_viterbi_combined_ib.cc \
- trellis_viterbi_combined_ii.cc \
- trellis_viterbi_combined_is.cc \
- trellis_viterbi_combined_sb.cc \
- trellis_viterbi_combined_si.cc \
- trellis_viterbi_combined_ss.cc \
- trellis_viterbi_i.cc \
- trellis_viterbi_s.cc
-
diff --git a/gr-trellis/src/lib/base.cc b/gr-trellis/src/lib/base.cc
deleted file mode 100644
index 002c964cd5..0000000000
--- a/gr-trellis/src/lib/base.cc
+++ /dev/null
@@ -1,92 +0,0 @@
-/* -*- c++ -*- */
-/*
- * Copyright 2002 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.
- */
-
-#include <cstdio>
-#include <stdexcept>
-#include <cmath>
-#include "base.h"
-
-
-bool dec2base(unsigned int num, int base, std::vector<int> &s)
-{
- int l = s.size();
- unsigned int n=num;
- for(int i=0;i<l;i++) {
- s[l-i-1] = n % base; //MSB first
- n /= base;
- }
- if(n!=0) {
- printf("Number %d requires more than %d digits.",num,l);
- return false;
- }
- else
- return true;
-}
-
-
-unsigned int base2dec(const std::vector<int> &s, int base)
-{
- int l = s.size();
- unsigned int num=0;
- for(int i=0;i<l;i++)
- num=num*base+s[i];
- return num;
-}
-
-
-bool dec2bases(unsigned int num, const std::vector<int> &bases, std::vector<int> &s)
-{
- int l = s.size();
- unsigned int n=num;
- for(int i=0;i<l;i++) {
- s[l-i-1] = n % bases[l-i-1];
- n /= bases[l-i-1];
- }
- if(n!=0) {
- printf("Number %d requires more than %d digits.",num,l);
- return false;
- }
- else
- return true;
-}
-
-
-
-unsigned int bases2dec(const std::vector<int> &s, const std::vector<int> &bases)
-{
- int l = s.size();
- unsigned int num=0;
- for(int i=0;i<l;i++)
- num = num * bases[i] + s[i];
- return num;
-}
-
-
-
-
-
-
-
-
-
-
-
diff --git a/gr-trellis/src/lib/calc_metric.cc b/gr-trellis/src/lib/calc_metric.cc
deleted file mode 100644
index ce628209b4..0000000000
--- a/gr-trellis/src/lib/calc_metric.cc
+++ /dev/null
@@ -1,250 +0,0 @@
-/* -*- c++ -*- */
-/*
- * Copyright 2004 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.
- */
-
-#include <float.h>
-#include <stdexcept>
-#include "calc_metric.h"
-
-
-
-template <class T>
-void calc_metric(int O, int D, const std::vector<T> &TABLE, const T *in, float *metric, trellis_metric_type_t type)
-{
- float minm = FLT_MAX;
- int minmi = 0;
-
-
- switch (type){
- case TRELLIS_EUCLIDEAN:
- for(int o=0;o<O;o++) {
- metric[o]=0.0;
- for (int m=0;m<D;m++) {
- T s=in[m]-TABLE[o*D+m];
- //gr_complex sc(1.0*s,0);
- //metric[o]+=(sc*conj(sc)).real();
- metric[o]+= s * s;
- }
- }
- break;
- case TRELLIS_HARD_SYMBOL:
- for(int o=0;o<O;o++) {
- metric[o]=0.0;
- for (int m=0;m<D;m++) {
- T s=in[m]-TABLE[o*D+m];
- //gr_complex sc(1.0*s,0);
- //metric[o]+=(sc*conj(sc)).real();
- metric[o]+= s * s;
- }
- if(metric[o]<minm) {
- minm=metric[o];
- minmi=o;
- }
- }
- for(int o=0;o<O;o++) {
- metric[o] = (o==minmi?0.0:1.0);
- }
- break;
- case TRELLIS_HARD_BIT:
- throw std::runtime_error ("Invalid metric type (not yet implemented).");
- break;
- default:
- throw std::runtime_error ("Invalid metric type.");
- }
-}
-
-
-
-template
-void calc_metric<short>(int O, int D, const std::vector<short> &TABLE, const short *in, float *metric, trellis_metric_type_t type);
-
-template
-void calc_metric<int>(int O, int D, const std::vector<int> &TABLE, const int *in, float *metric, trellis_metric_type_t type);
-
-template
-void calc_metric<float>(int O, int D, const std::vector<float> &TABLE, const float *in, float *metric, trellis_metric_type_t type);
-
-
-/*
-void calc_metric(int O, int D, const std::vector<short> &TABLE, const short *in, float *metric, trellis_metric_type_t type)
-{
- float minm = FLT_MAX;
- int minmi = 0;
-
- switch (type){
- case TRELLIS_EUCLIDEAN:
- for(int o=0;o<O;o++) {
- metric[o]=0.0;
- for (int m=0;m<D;m++) {
- float s=in[m]-TABLE[o*D+m];
- metric[o]+=s*s;
- }
- }
- break;
- case TRELLIS_HARD_SYMBOL:
- for(int o=0;o<O;o++) {
- metric[o]=0.0;
- for (int m=0;m<D;m++) {
- float s=in[m]-TABLE[o*D+m];
- metric[o]+=s*s;
- }
- if(metric[o]<minm) {
- minm=metric[o];
- minmi=o;
- }
- }
- for(int o=0;o<O;o++) {
- metric[o] = (o==minmi?0.0:1.0);
- }
- break;
- case TRELLIS_HARD_BIT:
- throw std::runtime_error ("Invalid metric type (not yet implemented).");
- break;
- default:
- throw std::runtime_error ("Invalid metric type.");
- }
-}
-
-
-void calc_metric(int O, int D, const std::vector<int> &TABLE, const int *in, float *metric, trellis_metric_type_t type)
-{
- float minm = FLT_MAX;
- int minmi = 0;
-
- switch (type){
- case TRELLIS_EUCLIDEAN:
- for(int o=0;o<O;o++) {
- metric[o]=0.0;
- for (int m=0;m<D;m++) {
- float s=in[m]-TABLE[o*D+m];
- metric[o]+=s*s;
- }
- }
- break;
- case TRELLIS_HARD_SYMBOL:
- for(int o=0;o<O;o++) {
- metric[o]=0.0;
- for (int m=0;m<D;m++) {
- float s=in[m]-TABLE[o*D+m];
- metric[o]+=s*s;
- }
- if(metric[o]<minm) {
- minm=metric[o];
- minmi=o;
- }
- }
- for(int o=0;o<O;o++) {
- metric[o] = (o==minmi?0.0:1.0);
- }
- break;
- case TRELLIS_HARD_BIT:
- throw std::runtime_error ("Invalid metric type (not yet implemented).");
- break;
- default:
- throw std::runtime_error ("Invalid metric type.");
- }
-}
-
-
-
-void calc_metric(int O, int D, const std::vector<float> &TABLE, const float *in, float *metric, trellis_metric_type_t type)
-{
- float minm = FLT_MAX;
- int minmi = 0;
-
- switch (type){
- case TRELLIS_EUCLIDEAN:
- for(int o=0;o<O;o++) {
- metric[o]=0.0;
- for (int m=0;m<D;m++) {
- float s=in[m]-TABLE[o*D+m];
- metric[o]+=s*s;
- }
- }
- break;
- case TRELLIS_HARD_SYMBOL:
- for(int o=0;o<O;o++) {
- metric[o]=0.0;
- for (int m=0;m<D;m++) {
- float s=in[m]-TABLE[o*D+m];
- metric[o]+=s*s;
- }
- if(metric[o]<minm) {
- minm=metric[o];
- minmi=o;
- }
- }
- for(int o=0;o<O;o++) {
- metric[o] = (o==minmi?0.0:1.0);
- }
- break;
- case TRELLIS_HARD_BIT:
- throw std::runtime_error ("Invalid metric type (not yet implemented).");
- break;
- default:
- throw std::runtime_error ("Invalid metric type.");
- }
-}
-*/
-
-
-
-
-
-void calc_metric(int O, int D, const std::vector<gr_complex> &TABLE, const gr_complex *in, float *metric, trellis_metric_type_t type)
-{
- float minm = FLT_MAX;
- int minmi = 0;
-
-
- switch (type){
- case TRELLIS_EUCLIDEAN:
- for(int o=0;o<O;o++) {
- metric[o]=0.0;
- for (int m=0;m<D;m++) {
- gr_complex s=in[m]-TABLE[o*D+m];
- metric[o]+=s.real()*s.real()+s.imag()*s.imag();
- }
- }
- break;
- case TRELLIS_HARD_SYMBOL:
- for(int o=0;o<O;o++) {
- metric[o]=0.0;
- for (int m=0;m<D;m++) {
- gr_complex s=in[m]-TABLE[o*D+m];
- metric[o]+=s.real()*s.real()+s.imag()*s.imag();
- }
- if(metric[o]<minm) {
- minm=metric[o];
- minmi=o;
- }
- }
- for(int o=0;o<O;o++) {
- metric[o] = (o==minmi?0.0:1.0);
- }
- break;
- case TRELLIS_HARD_BIT:
- throw std::runtime_error ("Invalid metric type (not yet implemented).");
- break;
- default:
- throw std::runtime_error ("Invalid metric type.");
- }
-}
diff --git a/gr-trellis/src/lib/calc_metric.h b/gr-trellis/src/lib/calc_metric.h
deleted file mode 100644
index 7cad6160aa..0000000000
--- a/gr-trellis/src/lib/calc_metric.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/* -*- c++ -*- */
-/*
- * Copyright 2004 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.
- */
-
-#ifndef INCLUDED_CALC_METRIC_H
-#define INCLUDED_CALC_METRIC_H
-
-#include <vector>
-#include <gr_complex.h>
-#include <digital_metric_type.h>
-
-
-template <class T>
-void calc_metric(int O, int D, const std::vector<T> &TABLE, const T *in, float *metric, trellis_metric_type_t type);
-
-/*
-void calc_metric(int O, int D, const std::vector<short> &TABLE, const short *in, float *metric, trellis_metric_type_t type);
-
-void calc_metric(int O, int D, const std::vector<int> &TABLE, const int *in, float *metric, trellis_metric_type_t type);
-
-void calc_metric(int O, int D, const std::vector<float> &TABLE, const float *in, float *metric, trellis_metric_type_t type);
-*/
-
-void calc_metric(int O, int D, const std::vector<gr_complex> &TABLE, const gr_complex *in, float *metric, trellis_metric_type_t type);
-
-
-
-#endif
diff --git a/gr-trellis/src/lib/core_algorithms.cc b/gr-trellis/src/lib/core_algorithms.cc
deleted file mode 100644
index 3ed912c08a..0000000000
--- a/gr-trellis/src/lib/core_algorithms.cc
+++ /dev/null
@@ -1,1437 +0,0 @@
-/* -*- c++ -*- */
-/*
- * Copyright 2004 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.
- */
-
-#include <cstring>
-#include <stdexcept>
-//#include <cstdio>
-#include <iostream>
-#include "core_algorithms.h"
-#include "calc_metric.h"
-
-static const float INF = 1.0e9;
-
-float min(float a, float b)
-{
- return a <= b ? a : b;
-}
-
-float min_star(float a, float b)
-{
- return (a <= b ? a : b)-log(1+exp(a <= b ? a-b : b-a));
-}
-
-
-
-
-template <class T>
-void viterbi_algorithm(int I, int S, int O,
- const std::vector<int> &NS,
- const std::vector<int> &OS,
- const std::vector< std::vector<int> > &PS,
- const std::vector< std::vector<int> > &PI,
- int K,
- int S0,int SK,
- const float *in, T *out)//,
- //std::vector<int> &trace)
-{
- std::vector<int> trace(S*K);
- std::vector<float> alpha(S*2);
- int alphai;
- float norm,mm,minm;
- int minmi;
- int st;
-
-
- if(S0<0) { // initial state not specified
- for(int i=0;i<S;i++) alpha[0*S+i]=0;
- }
- else {
- for(int i=0;i<S;i++) alpha[0*S+i]=INF;
- alpha[0*S+S0]=0.0;
- }
-
- alphai=0;
- for(int k=0;k<K;k++) {
- norm=INF;
- for(int j=0;j<S;j++) { // for each next state do ACS
- minm=INF;
- minmi=0;
- for(unsigned int i=0;i<PS[j].size();i++) {
- //int i0 = j*I+i;
- if((mm=alpha[alphai*S+PS[j][i]]+in[k*O+OS[PS[j][i]*I+PI[j][i]]])<minm)
- minm=mm,minmi=i;
- }
- trace[k*S+j]=minmi;
- alpha[((alphai+1)%2)*S+j]=minm;
- if(minm<norm) norm=minm;
- }
- for(int j=0;j<S;j++)
- alpha[((alphai+1)%2)*S+j]-=norm; // normalize total metrics so they do not explode
- alphai=(alphai+1)%2;
- }
-
- if(SK<0) { // final state not specified
- minm=INF;
- minmi=0;
- for(int i=0;i<S;i++)
- if((mm=alpha[alphai*S+i])<minm) minm=mm,minmi=i;
- st=minmi;
- }
- else {
- st=SK;
- }
-
- for(int k=K-1;k>=0;k--) { // traceback
- int i0=trace[k*S+st];
- out[k]= (T) PI[st][i0];
- st=PS[st][i0];
- }
-
-}
-
-
-template
-void viterbi_algorithm<unsigned char>(int I, int S, int O,
- const std::vector<int> &NS,
- const std::vector<int> &OS,
- const std::vector< std::vector<int> > &PS,
- const std::vector< std::vector<int> > &PI,
- int K,
- int S0,int SK,
- const float *in, unsigned char *out);
-
-
-template
-void viterbi_algorithm<short>(int I, int S, int O,
- const std::vector<int> &NS,
- const std::vector<int> &OS,
- const std::vector< std::vector<int> > &PS,
- const std::vector< std::vector<int> > &PI,
- int K,
- int S0,int SK,
- const float *in, short *out);
-
-template
-void viterbi_algorithm<int>(int I, int S, int O,
- const std::vector<int> &NS,
- const std::vector<int> &OS,
- const std::vector< std::vector<int> > &PS,
- const std::vector< std::vector<int> > &PI,
- int K,
- int S0,int SK,
- const float *in, int *out);
-
-
-
-//==============================================
-
-template <class Ti, class To>
-void viterbi_algorithm_combined(int I, int S, int O,
- const std::vector<int> &NS,
- const std::vector<int> &OS,
- const std::vector< std::vector<int> > &PS,
- const std::vector< std::vector<int> > &PI,
- int K,
- int S0,int SK,
- int D,
- const std::vector<Ti> &TABLE,
- trellis_metric_type_t TYPE,
- const Ti *in, To *out
-)
-{
- std::vector<int> trace(S*K);
- std::vector<float> alpha(S*2);
- float *metric = new float[O];
- int alphai;
- float norm,mm,minm;
- int minmi;
- int st;
-
- if(S0<0) { // initial state not specified
- for(int i=0;i<S;i++) alpha[0*S+i]=0;
- }
- else {
- for(int i=0;i<S;i++) alpha[0*S+i]=INF;
- alpha[0*S+S0]=0.0;
- }
-
- alphai=0;
- for(int k=0;k<K;k++) {
- calc_metric(O, D, TABLE, &(in[k*D]), metric,TYPE); // calc metrics
- norm=INF;
- for(int j=0;j<S;j++) { // for each next state do ACS
- minm=INF;
- minmi=0;
- for(unsigned int i=0;i<PS[j].size();i++) {
- //int i0 = j*I+i;
- if((mm=alpha[alphai*S+PS[j][i]]+metric[OS[PS[j][i]*I+PI[j][i]]])<minm)
- minm=mm,minmi=i;
- }
- trace[k*S+j]=minmi;
- alpha[((alphai+1)%2)*S+j]=minm;
- if(minm<norm) norm=minm;
- }
- for(int j=0;j<S;j++)
- alpha[((alphai+1)%2)*S+j]-=norm; // normalize total metrics so they do not explode
- alphai=(alphai+1)%2;
- }
-
- if(SK<0) { // final state not specified
- minm=INF;
- minmi=0;
- for(int i=0;i<S;i++)
- if((mm=alpha[alphai*S+i])<minm) minm=mm,minmi=i;
- st=minmi;
- }
- else {
- st=SK;
- }
-
- for(int k=K-1;k>=0;k--) { // traceback
- int i0=trace[k*S+st];
- out[k]= (To) PI[st][i0];
- st=PS[st][i0];
- }
-
- delete [] metric;
-
-}
-
-// Ti = s i f c
-// To = b s i
-
-//---------------
-
-template
-void viterbi_algorithm_combined<short,unsigned char>(int I, int S, int O,
- const std::vector<int> &NS,
- const std::vector<int> &OS,
- const std::vector< std::vector<int> > &PS,
- const std::vector< std::vector<int> > &PI,
- int K,
- int S0,int SK,
- int D,
- const std::vector<short> &TABLE,
- trellis_metric_type_t TYPE,
- const short *in, unsigned char *out
-);
-
-template
-void viterbi_algorithm_combined<int,unsigned char>(int I, int S, int O,
- const std::vector<int> &NS,
- const std::vector<int> &OS,
- const std::vector< std::vector<int> > &PS,
- const std::vector< std::vector<int> > &PI,
- int K,
- int S0,int SK,
- int D,
- const std::vector<int> &TABLE,
- trellis_metric_type_t TYPE,
- const int *in, unsigned char *out
-);
-
-template
-void viterbi_algorithm_combined<float,unsigned char>(int I, int S, int O,
- const std::vector<int> &NS,
- const std::vector<int> &OS,
- const std::vector< std::vector<int> > &PS,
- const std::vector< std::vector<int> > &PI,
- int K,
- int S0,int SK,
- int D,
- const std::vector<float> &TABLE,
- trellis_metric_type_t TYPE,
- const float *in, unsigned char *out
-);
-
-template
-void viterbi_algorithm_combined<gr_complex,unsigned char>(int I, int S, int O,
- const std::vector<int> &NS,
- const std::vector<int> &OS,
- const std::vector< std::vector<int> > &PS,
- const std::vector< std::vector<int> > &PI,
- int K,
- int S0,int SK,
- int D,
- const std::vector<gr_complex> &TABLE,
- trellis_metric_type_t TYPE,
- const gr_complex *in, unsigned char *out
-);
-
-//---------------
-
-template
-void viterbi_algorithm_combined<short,short>(int I, int S, int O,
- const std::vector<int> &NS,
- const std::vector<int> &OS,
- const std::vector< std::vector<int> > &PS,
- const std::vector< std::vector<int> > &PI,
- int K,
- int S0,int SK,
- int D,
- const std::vector<short> &TABLE,
- trellis_metric_type_t TYPE,
- const short *in, short *out
-);
-
-template
-void viterbi_algorithm_combined<int,short>(int I, int S, int O,
- const std::vector<int> &NS,
- const std::vector<int> &OS,
- const std::vector< std::vector<int> > &PS,
- const std::vector< std::vector<int> > &PI,
- int K,
- int S0,int SK,
- int D,
- const std::vector<int> &TABLE,
- trellis_metric_type_t TYPE,
- const int *in, short *out
-);
-
-template
-void viterbi_algorithm_combined<float,short>(int I, int S, int O,
- const std::vector<int> &NS,
- const std::vector<int> &OS,
- const std::vector< std::vector<int> > &PS,
- const std::vector< std::vector<int> > &PI,
- int K,
- int S0,int SK,
- int D,
- const std::vector<float> &TABLE,
- trellis_metric_type_t TYPE,
- const float *in, short *out
-);
-
-template
-void viterbi_algorithm_combined<gr_complex,short>(int I, int S, int O,
- const std::vector<int> &NS,
- const std::vector<int> &OS,
- const std::vector< std::vector<int> > &PS,
- const std::vector< std::vector<int> > &PI,
- int K,
- int S0,int SK,
- int D,
- const std::vector<gr_complex> &TABLE,
- trellis_metric_type_t TYPE,
- const gr_complex *in, short *out
-);
-
-//--------------
-
-template
-void viterbi_algorithm_combined<short,int>(int I, int S, int O,
- const std::vector<int> &NS,
- const std::vector<int> &OS,
- const std::vector< std::vector<int> > &PS,
- const std::vector< std::vector<int> > &PI,
- int K,
- int S0,int SK,
- int D,
- const std::vector<short> &TABLE,
- trellis_metric_type_t TYPE,
- const short *in, int *out
-);
-
-template
-void viterbi_algorithm_combined<int,int>(int I, int S, int O,
- const std::vector<int> &NS,
- const std::vector<int> &OS,
- const std::vector< std::vector<int> > &PS,
- const std::vector< std::vector<int> > &PI,
- int K,
- int S0,int SK,
- int D,
- const std::vector<int> &TABLE,
- trellis_metric_type_t TYPE,
- const int *in, int *out
-);
-
-template
-void viterbi_algorithm_combined<float,int>(int I, int S, int O,
- const std::vector<int> &NS,
- const std::vector<int> &OS,
- const std::vector< std::vector<int> > &PS,
- const std::vector< std::vector<int> > &PI,
- int K,
- int S0,int SK,
- int D,
- const std::vector<float> &TABLE,
- trellis_metric_type_t TYPE,
- const float *in, int *out
-);
-
-template
-void viterbi_algorithm_combined<gr_complex,int>(int I, int S, int O,
- const std::vector<int> &NS,
- const std::vector<int> &OS,
- const std::vector< std::vector<int> > &PS,
- const std::vector< std::vector<int> > &PI,
- int K,
- int S0,int SK,
- int D,
- const std::vector<gr_complex> &TABLE,
- trellis_metric_type_t TYPE,
- const gr_complex *in, int *out
-);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-//===============================================
-
-
-void siso_algorithm(int I, int S, int O,
- const std::vector<int> &NS,
- const std::vector<int> &OS,
- const std::vector< std::vector<int> > &PS,
- const std::vector< std::vector<int> > &PI,
- int K,
- int S0,int SK,
- bool POSTI, bool POSTO,
- float (*p2mymin)(float,float),
- const float *priori, const float *prioro, float *post//,
- //std::vector<float> &alpha,
- //std::vector<float> &beta
- )
-{
- float norm,mm,minm;
- std::vector<float> alpha(S*(K+1));
- std::vector<float> beta(S*(K+1));
-
-
- if(S0<0) { // initial state not specified
- for(int i=0;i<S;i++) alpha[0*S+i]=0;
- }
- else {
- for(int i=0;i<S;i++) alpha[0*S+i]=INF;
- alpha[0*S+S0]=0.0;
- }
-
- for(int k=0;k<K;k++) { // forward recursion
- norm=INF;
- for(int j=0;j<S;j++) {
- minm=INF;
- for(unsigned int i=0;i<PS[j].size();i++) {
- //int i0 = j*I+i;
- mm=alpha[k*S+PS[j][i]]+priori[k*I+PI[j][i]]+prioro[k*O+OS[PS[j][i]*I+PI[j][i]]];
- minm=(*p2mymin)(minm,mm);
- }
- alpha[(k+1)*S+j]=minm;
- if(minm<norm) norm=minm;
- }
- for(int j=0;j<S;j++)
- alpha[(k+1)*S+j]-=norm; // normalize total metrics so they do not explode
- }
-
- if(SK<0) { // final state not specified
- for(int i=0;i<S;i++) beta[K*S+i]=0;
- }
- else {
- for(int i=0;i<S;i++) beta[K*S+i]=INF;
- beta[K*S+SK]=0.0;
- }
-
- for(int k=K-1;k>=0;k--) { // backward recursion
- norm=INF;
- for(int j=0;j<S;j++) {
- minm=INF;
- for(int i=0;i<I;i++) {
- int i0 = j*I+i;
- mm=beta[(k+1)*S+NS[i0]]+priori[k*I+i]+prioro[k*O+OS[i0]];
- minm=(*p2mymin)(minm,mm);
- }
- beta[k*S+j]=minm;
- if(minm<norm) norm=minm;
- }
- for(int j=0;j<S;j++)
- beta[k*S+j]-=norm; // normalize total metrics so they do not explode
- }
-
-
-if (POSTI && POSTO)
-{
- for(int k=0;k<K;k++) { // input combining
- norm=INF;
- for(int i=0;i<I;i++) {
- minm=INF;
- for(int j=0;j<S;j++) {
- mm=alpha[k*S+j]+prioro[k*O+OS[j*I+i]]+beta[(k+1)*S+NS[j*I+i]];
- minm=(*p2mymin)(minm,mm);
- }
- post[k*(I+O)+i]=minm;
- if(minm<norm) norm=minm;
- }
- for(int i=0;i<I;i++)
- post[k*(I+O)+i]-=norm; // normalize metrics
- }
-
-
- for(int k=0;k<K;k++) { // output combining
- norm=INF;
- for(int n=0;n<O;n++) {
- minm=INF;
- for(int j=0;j<S;j++) {
- for(int i=0;i<I;i++) {
- mm= (n==OS[j*I+i] ? alpha[k*S+j]+priori[k*I+i]+beta[(k+1)*S+NS[j*I+i]] : INF);
- minm=(*p2mymin)(minm,mm);
- }
- }
- post[k*(I+O)+I+n]=minm;
- if(minm<norm) norm=minm;
- }
- for(int n=0;n<O;n++)
- post[k*(I+O)+I+n]-=norm; // normalize metrics
- }
-}
-else if(POSTI)
-{
- for(int k=0;k<K;k++) { // input combining
- norm=INF;
- for(int i=0;i<I;i++) {
- minm=INF;
- for(int j=0;j<S;j++) {
- mm=alpha[k*S+j]+prioro[k*O+OS[j*I+i]]+beta[(k+1)*S+NS[j*I+i]];
- minm=(*p2mymin)(minm,mm);
- }
- post[k*I+i]=minm;
- if(minm<norm) norm=minm;
- }
- for(int i=0;i<I;i++)
- post[k*I+i]-=norm; // normalize metrics
- }
-}
-else if(POSTO)
-{
- for(int k=0;k<K;k++) { // output combining
- norm=INF;
- for(int n=0;n<O;n++) {
- minm=INF;
- for(int j=0;j<S;j++) {
- for(int i=0;i<I;i++) {
- mm= (n==OS[j*I+i] ? alpha[k*S+j]+priori[k*I+i]+beta[(k+1)*S+NS[j*I+i]] : INF);
- minm=(*p2mymin)(minm,mm);
- }
- }
- post[k*O+n]=minm;
- if(minm<norm) norm=minm;
- }
- for(int n=0;n<O;n++)
- post[k*O+n]-=norm; // normalize metrics
- }
-}
-else
- throw std::runtime_error ("Not both POSTI and POSTO can be false.");
-
-}
-
-
-//===========================================================
-
-template <class T>
-void siso_algorithm_combined(int I, int S, int O,
- const std::vector<int> &NS,
- const std::vector<int> &OS,
- const std::vector< std::vector<int> > &PS,
- const std::vector< std::vector<int> > &PI,
- int K,
- int S0,int SK,
- bool POSTI, bool POSTO,
- float (*p2mymin)(float,float),
- int D,
- const std::vector<T> &TABLE,
- trellis_metric_type_t TYPE,
- const float *priori, const T *observations, float *post
-)
-{
- float norm,mm,minm;
- std::vector<float> alpha(S*(K+1));
- std::vector<float> beta(S*(K+1));
- float *prioro = new float[O*K];
-
-
- if(S0<0) { // initial state not specified
- for(int i=0;i<S;i++) alpha[0*S+i]=0;
- }
- else {
- for(int i=0;i<S;i++) alpha[0*S+i]=INF;
- alpha[0*S+S0]=0.0;
- }
-
- for(int k=0;k<K;k++) { // forward recursion
- calc_metric(O, D, TABLE, &(observations[k*D]), &(prioro[k*O]),TYPE); // calc metrics
- norm=INF;
- for(int j=0;j<S;j++) {
- minm=INF;
- for(unsigned int i=0;i<PS[j].size();i++) {
- //int i0 = j*I+i;
- mm=alpha[k*S+PS[j][i]]+priori[k*I+PI[j][i]]+prioro[k*O+OS[PS[j][i]*I+PI[j][i]]];
- minm=(*p2mymin)(minm,mm);
- }
- alpha[(k+1)*S+j]=minm;
- if(minm<norm) norm=minm;
- }
- for(int j=0;j<S;j++)
- alpha[(k+1)*S+j]-=norm; // normalize total metrics so they do not explode
- }
-
- if(SK<0) { // final state not specified
- for(int i=0;i<S;i++) beta[K*S+i]=0;
- }
- else {
- for(int i=0;i<S;i++) beta[K*S+i]=INF;
- beta[K*S+SK]=0.0;
- }
-
- for(int k=K-1;k>=0;k--) { // backward recursion
- norm=INF;
- for(int j=0;j<S;j++) {
- minm=INF;
- for(int i=0;i<I;i++) {
- int i0 = j*I+i;
- mm=beta[(k+1)*S+NS[i0]]+priori[k*I+i]+prioro[k*O+OS[i0]];
- minm=(*p2mymin)(minm,mm);
- }
- beta[k*S+j]=minm;
- if(minm<norm) norm=minm;
- }
- for(int j=0;j<S;j++)
- beta[k*S+j]-=norm; // normalize total metrics so they do not explode
- }
-
-
- if (POSTI && POSTO)
- {
- for(int k=0;k<K;k++) { // input combining
- norm=INF;
- for(int i=0;i<I;i++) {
- minm=INF;
- for(int j=0;j<S;j++) {
- mm=alpha[k*S+j]+prioro[k*O+OS[j*I+i]]+beta[(k+1)*S+NS[j*I+i]];
- minm=(*p2mymin)(minm,mm);
- }
- post[k*(I+O)+i]=minm;
- if(minm<norm) norm=minm;
- }
- for(int i=0;i<I;i++)
- post[k*(I+O)+i]-=norm; // normalize metrics
- }
-
-
- for(int k=0;k<K;k++) { // output combining
- norm=INF;
- for(int n=0;n<O;n++) {
- minm=INF;
- for(int j=0;j<S;j++) {
- for(int i=0;i<I;i++) {
- mm= (n==OS[j*I+i] ? alpha[k*S+j]+priori[k*I+i]+beta[(k+1)*S+NS[j*I+i]] : INF);
- minm=(*p2mymin)(minm,mm);
- }
- }
- post[k*(I+O)+I+n]=minm;
- if(minm<norm) norm=minm;
- }
- for(int n=0;n<O;n++)
- post[k*(I+O)+I+n]-=norm; // normalize metrics
- }
- }
- else if(POSTI)
- {
- for(int k=0;k<K;k++) { // input combining
- norm=INF;
- for(int i=0;i<I;i++) {
- minm=INF;
- for(int j=0;j<S;j++) {
- mm=alpha[k*S+j]+prioro[k*O+OS[j*I+i]]+beta[(k+1)*S+NS[j*I+i]];
- minm=(*p2mymin)(minm,mm);
- }
- post[k*I+i]=minm;
- if(minm<norm) norm=minm;
- }
- for(int i=0;i<I;i++)
- post[k*I+i]-=norm; // normalize metrics
- }
- }
- else if(POSTO)
- {
- for(int k=0;k<K;k++) { // output combining
- norm=INF;
- for(int n=0;n<O;n++) {
- minm=INF;
- for(int j=0;j<S;j++) {
- for(int i=0;i<I;i++) {
- mm= (n==OS[j*I+i] ? alpha[k*S+j]+priori[k*I+i]+beta[(k+1)*S+NS[j*I+i]] : INF);
- minm=(*p2mymin)(minm,mm);
- }
- }
- post[k*O+n]=minm;
- if(minm<norm) norm=minm;
- }
- for(int n=0;n<O;n++)
- post[k*O+n]-=norm; // normalize metrics
- }
- }
- else
- throw std::runtime_error ("Not both POSTI and POSTO can be false.");
-
- delete [] prioro;
-
-}
-
-//---------
-
-template
-void siso_algorithm_combined<short>(int I, int S, int O,
- const std::vector<int> &NS,
- const std::vector<int> &OS,
- const std::vector< std::vector<int> > &PS,
- const std::vector< std::vector<int> > &PI,
- int K,
- int S0,int SK,
- bool POSTI, bool POSTO,
- float (*p2mymin)(float,float),
- int D,
- const std::vector<short> &TABLE,
- trellis_metric_type_t TYPE,
- const float *priori, const short *observations, float *post
-);
-
-template
-void siso_algorithm_combined<int>(int I, int S, int O,
- const std::vector<int> &NS,
- const std::vector<int> &OS,
- const std::vector< std::vector<int> > &PS,
- const std::vector< std::vector<int> > &PI,
- int K,
- int S0,int SK,
- bool POSTI, bool POSTO,
- float (*p2mymin)(float,float),
- int D,
- const std::vector<int> &TABLE,
- trellis_metric_type_t TYPE,
- const float *priori, const int *observations, float *post
-);
-
-template
-void siso_algorithm_combined<float>(int I, int S, int O,
- const std::vector<int> &NS,
- const std::vector<int> &OS,
- const std::vector< std::vector<int> > &PS,
- const std::vector< std::vector<int> > &PI,
- int K,
- int S0,int SK,
- bool POSTI, bool POSTO,
- float (*p2mymin)(float,float),
- int D,
- const std::vector<float> &TABLE,
- trellis_metric_type_t TYPE,
- const float *priori, const float *observations, float *post
-);
-
-template
-void siso_algorithm_combined<gr_complex>(int I, int S, int O,
- const std::vector<int> &NS,
- const std::vector<int> &OS,
- const std::vector< std::vector<int> > &PS,
- const std::vector< std::vector<int> > &PI,
- int K,
- int S0,int SK,
- bool POSTI, bool POSTO,
- float (*p2mymin)(float,float),
- int D,
- const std::vector<gr_complex> &TABLE,
- trellis_metric_type_t TYPE,
- const float *priori, const gr_complex *observations, float *post
-);
-
-//=========================================================
-
-template<class Ti, class To>
-void sccc_decoder_combined(
- const fsm &FSMo, int STo0, int SToK,
- const fsm &FSMi, int STi0, int STiK,
- const interleaver &INTERLEAVER, int blocklength, int iterations,
- float (*p2mymin)(float,float),
- int D, const std::vector<Ti> &TABLE,
- trellis_metric_type_t METRIC_TYPE,
- float scaling,
- const Ti *observations, To *data
-)
-{
-
-//allocate space for priori, prioro and posti of inner FSM
-std::vector<float> ipriori(blocklength*FSMi.I(),0.0);
-std::vector<float> iprioro(blocklength*FSMi.O());
-std::vector<float> iposti(blocklength*FSMi.I());
-
-//allocate space for priori, prioro and posto of outer FSM
-std::vector<float> opriori(blocklength*FSMo.I(),0.0);
-std::vector<float> oprioro(blocklength*FSMo.O());
-std::vector<float> oposti(blocklength*FSMo.I());
-std::vector<float> oposto(blocklength*FSMo.O());
-
-// turn observations to neg-log-priors
-for(int k=0;k<blocklength;k++) {
- calc_metric(FSMi.O(), D, TABLE, &(observations[k*D]), &(iprioro[k*FSMi.O()]),METRIC_TYPE);
- iprioro[k*FSMi.O()] *= scaling;
-}
-
-for(int rep=0;rep<iterations;rep++) {
- // run inner SISO
- siso_algorithm(FSMi.I(),FSMi.S(),FSMi.O(),
- FSMi.NS(), FSMi.OS(), FSMi.PS(), FSMi.PI(),
- blocklength,
- STi0,STiK,
- true, false,
- p2mymin,
- &(ipriori[0]), &(iprioro[0]), &(iposti[0])
- );
-
- //interleave soft info inner -> outer
- for(int k=0;k<blocklength;k++) {
- int ki = INTERLEAVER.DEINTER()[k];
- //for(int i=0;i<FSMi.I();i++) {
- //oprioro[k*FSMi.I()+i]=iposti[ki*FSMi.I()+i];
- //}
- memcpy(&(oprioro[k*FSMi.I()]),&(iposti[ki*FSMi.I()]),FSMi.I()*sizeof(float));
- }
-
- // run outer SISO
-
- if(rep<iterations-1) { // do not produce posti
- siso_algorithm(FSMo.I(),FSMo.S(),FSMo.O(),
- FSMo.NS(), FSMo.OS(), FSMo.PS(), FSMo.PI(),
- blocklength,
- STo0,SToK,
- false, true,
- p2mymin,
- &(opriori[0]), &(oprioro[0]), &(oposto[0])
- );
-
- //interleave soft info outer --> inner
- for(int k=0;k<blocklength;k++) {
- int ki = INTERLEAVER.DEINTER()[k];
- //for(int i=0;i<FSMi.I();i++) {
- //ipriori[ki*FSMi.I()+i]=oposto[k*FSMi.I()+i];
- //}
- memcpy(&(ipriori[ki*FSMi.I()]),&(oposto[k*FSMi.I()]),FSMi.I()*sizeof(float));
- }
- }
- else // produce posti but not posto
-
- siso_algorithm(FSMo.I(),FSMo.S(),FSMo.O(),
- FSMo.NS(), FSMo.OS(), FSMo.PS(), FSMo.PI(),
- blocklength,
- STo0,SToK,
- true, false,
- p2mymin,
- &(opriori[0]), &(oprioro[0]), &(oposti[0])
- );
-
- /*
- viterbi_algorithm(FSMo.I(),FSMo.S(),FSMo.O(),
- FSMo.NS(), FSMo.OS(), FSMo.PS(), FSMo.PI(),
- blocklength,
- STo0,SToK,
- &(oprioro[0]), data
- );
- */
-
-}
-
-
-// generate hard decisions
-for(int k=0;k<blocklength;k++) {
- float min=INF;
- int mini=0;
- for(int i=0;i<FSMo.I();i++) {
- if(oposti[k*FSMo.I()+i]<min) {
- min=oposti[k*FSMo.I()+i];
- mini=i;
- }
- }
- data[k]=(To)mini;
-}
-
-
-
-}
-
-//-------
-
-template
-void sccc_decoder_combined<float,unsigned char>(
- const fsm &FSMo, int STo0, int SToK,
- const fsm &FSMi, int STi0, int STiK,
- const interleaver &INTERLEAVER, int blocklength, int iterations,
- float (*p2mymin)(float,float),
- int D, const std::vector<float> &TABLE,
- trellis_metric_type_t METRIC_TYPE,
- float scaling,
- const float *observations, unsigned char *data
-);
-
-template
-void sccc_decoder_combined<float,short>(
- const fsm &FSMo, int STo0, int SToK,
- const fsm &FSMi, int STi0, int STiK,
- const interleaver &INTERLEAVER, int blocklength, int iterations,
- float (*p2mymin)(float,float),
- int D, const std::vector<float> &TABLE,
- trellis_metric_type_t METRIC_TYPE,
- float scaling,
- const float *observations, short *data
-);
-
-template
-void sccc_decoder_combined<float,int>(
- const fsm &FSMo, int STo0, int SToK,
- const fsm &FSMi, int STi0, int STiK,
- const interleaver &INTERLEAVER, int blocklength, int iterations,
- float (*p2mymin)(float,float),
- int D, const std::vector<float> &TABLE,
- trellis_metric_type_t METRIC_TYPE,
- float scaling,
- const float *observations, int *data
-);
-
-template
-void sccc_decoder_combined<gr_complex,unsigned char>(
- const fsm &FSMo, int STo0, int SToK,
- const fsm &FSMi, int STi0, int STiK,
- const interleaver &INTERLEAVER, int blocklength, int iterations,
- float (*p2mymin)(float,float),
- int D, const std::vector<gr_complex> &TABLE,
- trellis_metric_type_t METRIC_TYPE,
- float scaling,
- const gr_complex *observations, unsigned char *data
-);
-
-template
-void sccc_decoder_combined<gr_complex,short>(
- const fsm &FSMo, int STo0, int SToK,
- const fsm &FSMi, int STi0, int STiK,
- const interleaver &INTERLEAVER, int blocklength, int iterations,
- float (*p2mymin)(float,float),
- int D, const std::vector<gr_complex> &TABLE,
- trellis_metric_type_t METRIC_TYPE,
- float scaling,
- const gr_complex *observations, short *data
-);
-
-template
-void sccc_decoder_combined<gr_complex,int>(
- const fsm &FSMo, int STo0, int SToK,
- const fsm &FSMi, int STi0, int STiK,
- const interleaver &INTERLEAVER, int blocklength, int iterations,
- float (*p2mymin)(float,float),
- int D, const std::vector<gr_complex> &TABLE,
- trellis_metric_type_t METRIC_TYPE,
- float scaling,
- const gr_complex *observations, int *data
-);
-
-
-
-//=========================================================
-
-template<class T>
-void sccc_decoder(
- const fsm &FSMo, int STo0, int SToK,
- const fsm &FSMi, int STi0, int STiK,
- const interleaver &INTERLEAVER, int blocklength, int iterations,
- float (*p2mymin)(float,float),
- const float *iprioro, T *data
-)
-{
- //allocate space for priori, and posti of inner FSM
- std::vector<float> ipriori(blocklength*FSMi.I(),0.0);
- std::vector<float> iposti(blocklength*FSMi.I());
-
- //allocate space for priori, prioro and posto of outer FSM
- std::vector<float> opriori(blocklength*FSMo.I(),0.0);
- std::vector<float> oprioro(blocklength*FSMo.O());
- std::vector<float> oposti(blocklength*FSMo.I());
- std::vector<float> oposto(blocklength*FSMo.O());
-
- for(int rep=0;rep<iterations;rep++) {
- // run inner SISO
- siso_algorithm(FSMi.I(),FSMi.S(),FSMi.O(),
- FSMi.NS(), FSMi.OS(), FSMi.PS(), FSMi.PI(),
- blocklength,
- STi0,STiK,
- true, false,
- p2mymin,
- &(ipriori[0]), &(iprioro[0]), &(iposti[0])
- );
-
- //interleave soft info inner -> outer
- for(int k=0;k<blocklength;k++) {
- int ki = INTERLEAVER.DEINTER()[k];
- //for(int i=0;i<FSMi.I();i++) {
- //oprioro[k*FSMi.I()+i]=iposti[ki*FSMi.I()+i];
- //}
- memcpy(&(oprioro[k*FSMi.I()]),&(iposti[ki*FSMi.I()]),FSMi.I()*sizeof(float));
- }
-
- // run outer SISO
-
- if(rep<iterations-1) { // do not produce posti
- siso_algorithm(FSMo.I(),FSMo.S(),FSMo.O(),
- FSMo.NS(), FSMo.OS(), FSMo.PS(), FSMo.PI(),
- blocklength,
- STo0,SToK,
- false, true,
- p2mymin,
- &(opriori[0]), &(oprioro[0]), &(oposto[0])
- );
-
- //interleave soft info outer --> inner
- for(int k=0;k<blocklength;k++) {
- int ki = INTERLEAVER.DEINTER()[k];
- //for(int i=0;i<FSMi.I();i++) {
- //ipriori[ki*FSMi.I()+i]=oposto[k*FSMi.I()+i];
- //}
- memcpy(&(ipriori[ki*FSMi.I()]),&(oposto[k*FSMi.I()]),FSMi.I()*sizeof(float));
- }
- }
- else {// produce posti but not posto
-
- siso_algorithm(FSMo.I(),FSMo.S(),FSMo.O(),
- FSMo.NS(), FSMo.OS(), FSMo.PS(), FSMo.PI(),
- blocklength,
- STo0,SToK,
- true, false,
- p2mymin,
- &(opriori[0]), &(oprioro[0]), &(oposti[0])
- );
-
- /*
- viterbi_algorithm(FSMo.I(),FSMo.S(),FSMo.O(),
- FSMo.NS(), FSMo.OS(), FSMo.PS(), FSMo.PI(),
- blocklength,
- STo0,SToK,
- &(oprioro[0]), data
- );
- */
- }
-
- } // end iterations
-
- // generate hard decisions
- for(int k=0;k<blocklength;k++) {
- float min=INF;
- int mini=0;
- for(int i=0;i<FSMo.I();i++) {
- if(oposti[k*FSMo.I()+i]<min) {
- min=oposti[k*FSMo.I()+i];
- mini=i;
- }
- }
- data[k]=(T)mini;
- }
-
-
-
-}
-
-//-------
-
-template
-void sccc_decoder<unsigned char>(
- const fsm &FSMo, int STo0, int SToK,
- const fsm &FSMi, int STi0, int STiK,
- const interleaver &INTERLEAVER, int blocklength, int iterations,
- float (*p2mymin)(float,float),
- const float *iprioro, unsigned char *data
-);
-
-template
-void sccc_decoder<short>(
- const fsm &FSMo, int STo0, int SToK,
- const fsm &FSMi, int STi0, int STiK,
- const interleaver &INTERLEAVER, int blocklength, int iterations,
- float (*p2mymin)(float,float),
- const float *iprioro, short *data
-);
-
-template
-void sccc_decoder<int>(
- const fsm &FSMo, int STo0, int SToK,
- const fsm &FSMi, int STi0, int STiK,
- const interleaver &INTERLEAVER, int blocklength, int iterations,
- float (*p2mymin)(float,float),
- const float *iprioro, int *data
-);
-
-
-//====================================================
-
-template<class T>
-void pccc_decoder(
- const fsm &FSM1, int ST10, int ST1K,
- const fsm &FSM2, int ST20, int ST2K,
- const interleaver &INTERLEAVER, int blocklength, int iterations,
- float (*p2mymin)(float,float),
- const float *cprioro, T *data
-)
-{
-
- //allocate space for priori, prioro and posti of FSM1
- std::vector<float> priori1(blocklength*FSM1.I(),0.0);
- std::vector<float> prioro1(blocklength*FSM1.O());
- std::vector<float> posti1(blocklength*FSM1.I());
-
- //allocate space for priori, prioro and posti of FSM2
- std::vector<float> priori2(blocklength*FSM2.I(),0.0);
- std::vector<float> prioro2(blocklength*FSM2.O());
- std::vector<float> posti2(blocklength*FSM2.I());
-
- //generate prioro1,2 (metrics are not updated per iteration: this is not the best you can do...)
- for (int k=0;k<blocklength;k++) {
- //std::cout << k << std::endl;
- for(int i=0;i<FSM1.O();i++) {
- float x=cprioro[k*FSM1.O()*FSM2.O()+i*FSM1.O()+0];
- for(int j=1;j<FSM2.O();j++)
- x = (*p2mymin)(x,cprioro[k*FSM1.O()*FSM2.O()+i*FSM1.O()+j]);
- prioro1[k*FSM1.O()+i]=x;
- //std::cout << prioro1[k*FSM1.O()+i] << ", ";
- }
- //std::cout << std::endl;
- for(int i=0;i<FSM2.O();i++) {
- float x=cprioro[k*FSM1.O()*FSM2.O()+0*FSM1.O()+i];
- for(int j=1;j<FSM1.O();j++)
- x = (*p2mymin)(x,cprioro[k*FSM1.O()*FSM2.O()+j*FSM1.O()+i]);
- prioro2[k*FSM2.O()+i]=x;
- }
- }
-
- for(int rep=0;rep<iterations;rep++) {
- // run SISO 1
- siso_algorithm(FSM1.I(),FSM1.S(),FSM1.O(),
- FSM1.NS(), FSM1.OS(), FSM1.PS(), FSM1.PI(),
- blocklength,
- ST10,ST1K,
- true, false,
- p2mymin,
- &(priori1[0]), &(prioro1[0]), &(posti1[0])
- );
-
- //for(int k=0;k<blocklength;k++){
- //for(int i=0;i<FSM1.I();i++)
- //std::cout << posti1[k*FSM1.I()+i] << ", ";
- //std::cout << std::endl;
- //}
-
- //interleave soft info 1 -> 2
- for(int k=0;k<blocklength;k++) {
- int ki = INTERLEAVER.INTER()[k];
- //for(int i=0;i<FSMi.I();i++) {
- //oprioro[k*FSMi.I()+i]=iposti[ki*FSMi.I()+i];
- //}
- memcpy(&(priori2[k*FSM2.I()]),&(posti1[ki*FSM1.I()]),FSM1.I()*sizeof(float));
- }
-
- // run SISO 2
- siso_algorithm(FSM2.I(),FSM2.S(),FSM2.O(),
- FSM2.NS(), FSM2.OS(), FSM2.PS(), FSM2.PI(),
- blocklength,
- ST20,ST2K,
- true, false,
- p2mymin,
- &(priori2[0]), &(prioro2[0]), &(posti2[0])
- );
-
- //interleave soft info 2 --> 1
- for(int k=0;k<blocklength;k++) {
- int ki = INTERLEAVER.INTER()[k];
- //for(int i=0;i<FSMi.I();i++) {
- //ipriori[ki*FSMi.I()+i]=oposto[k*FSMi.I()+i];
- //}
- memcpy(&(priori1[ki*FSM1.I()]),&(posti2[k*FSM2.I()]),FSM1.I()*sizeof(float));
- }
-
- } // end iterations
-
- // generate hard decisions
- for(int k=0;k<blocklength;k++) {
- for(int i=0;i<FSM1.I();i++)
- posti1[k*FSM1.I()+i] = (*p2mymin)(priori1[k*FSM1.I()+i],posti1[k*FSM1.I()+i]);
- float min=INF;
- int mini=0;
- for(int i=0;i<FSM1.I();i++) {
- if(posti1[k*FSM1.I()+i]<min) {
- min=posti1[k*FSM1.I()+i];
- mini=i;
- }
- }
- data[k]=(T)mini;
- //std::cout << data[k] << ", "<< std::endl;
- }
- //std::cout << std::endl;
-
-}
-
-//----------------
-
-template
-void pccc_decoder<unsigned char>(
- const fsm &FSM1, int ST10, int ST1K,
- const fsm &FSM2, int ST20, int ST2K,
- const interleaver &INTERLEAVER, int blocklength, int iterations,
- float (*p2mymin)(float,float),
- const float *cprioro, unsigned char *data
-);
-
-template
-void pccc_decoder<short>(
- const fsm &FSM1, int ST10, int ST1K,
- const fsm &FSM2, int ST20, int ST2K,
- const interleaver &INTERLEAVER, int blocklength, int iterations,
- float (*p2mymin)(float,float),
- const float *cprioro, short *data
-);
-
-template
-void pccc_decoder<int>(
- const fsm &FSM1, int ST10, int ST1K,
- const fsm &FSM2, int ST20, int ST2K,
- const interleaver &INTERLEAVER, int blocklength, int iterations,
- float (*p2mymin)(float,float),
- const float *cprioro, int *data
-);
-
-
-
-//----------------
-
-
-template<class Ti, class To>
-void pccc_decoder_combined(
- const fsm &FSM1, int ST10, int ST1K,
- const fsm &FSM2, int ST20, int ST2K,
- const interleaver &INTERLEAVER, int blocklength, int iterations,
- float (*p2mymin)(float,float),
- int D, const std::vector<Ti> &TABLE,
- trellis_metric_type_t METRIC_TYPE,
- float scaling,
- const Ti *observations, To *data
-)
-{
-
- //allocate space for cprioro
- std::vector<float> cprioro(blocklength*FSM1.O()*FSM2.O(),0.0);
-
- //allocate space for priori, prioro and posti of FSM1
- std::vector<float> priori1(blocklength*FSM1.I(),0.0);
- std::vector<float> prioro1(blocklength*FSM1.O());
- std::vector<float> posti1(blocklength*FSM1.I());
-
- //allocate space for priori, prioro and posti of FSM2
- std::vector<float> priori2(blocklength*FSM2.I(),0.0);
- std::vector<float> prioro2(blocklength*FSM2.O());
- std::vector<float> posti2(blocklength*FSM2.I());
-
- // turn observations to neg-log-priors for cprioiro
- int O=FSM1.O()*FSM2.O();
- for(int k=0;k<blocklength;k++) {
- calc_metric(O, D, TABLE, &(observations[k*D]), &(cprioro[k*O]),METRIC_TYPE);
- cprioro[k*O] *= scaling;
- }
-
- //generate prioro1,2 (metrics are not updated per iteration: this is not the best you can do...)
- for (int k=0;k<blocklength;k++) {
- //std::cout << k << std::endl;
- for(int i=0;i<FSM1.O();i++) {
- float x=cprioro[k*FSM1.O()*FSM2.O()+i*FSM1.O()+0];
- for(int j=1;j<FSM2.O();j++)
- x = (*p2mymin)(x,cprioro[k*FSM1.O()*FSM2.O()+i*FSM1.O()+j]);
- prioro1[k*FSM1.O()+i]=x;
- //std::cout << prioro1[k*FSM1.O()+i] << ", ";
- }
- //std::cout << std::endl;
- for(int i=0;i<FSM2.O();i++) {
- float x=cprioro[k*FSM1.O()*FSM2.O()+0*FSM1.O()+i];
- for(int j=1;j<FSM1.O();j++)
- x = (*p2mymin)(x,cprioro[k*FSM1.O()*FSM2.O()+j*FSM1.O()+i]);
- prioro2[k*FSM2.O()+i]=x;
- }
- }
-
- for(int rep=0;rep<iterations;rep++) {
- // run SISO 1
- siso_algorithm(FSM1.I(),FSM1.S(),FSM1.O(),
- FSM1.NS(), FSM1.OS(), FSM1.PS(), FSM1.PI(),
- blocklength,
- ST10,ST1K,
- true, false,
- p2mymin,
- &(priori1[0]), &(prioro1[0]), &(posti1[0])
- );
-
- //for(int k=0;k<blocklength;k++){
- //for(int i=0;i<FSM1.I();i++)
- //std::cout << posti1[k*FSM1.I()+i] << ", ";
- //std::cout << std::endl;
- //}
-
- //interleave soft info 1 -> 2
- for(int k=0;k<blocklength;k++) {
- int ki = INTERLEAVER.INTER()[k];
- //for(int i=0;i<FSMi.I();i++) {
- //oprioro[k*FSMi.I()+i]=iposti[ki*FSMi.I()+i];
- //}
- memcpy(&(priori2[k*FSM2.I()]),&(posti1[ki*FSM1.I()]),FSM1.I()*sizeof(float));
- }
-
- // run SISO 2
- siso_algorithm(FSM2.I(),FSM2.S(),FSM2.O(),
- FSM2.NS(), FSM2.OS(), FSM2.PS(), FSM2.PI(),
- blocklength,
- ST20,ST2K,
- true, false,
- p2mymin,
- &(priori2[0]), &(prioro2[0]), &(posti2[0])
- );
-
- //interleave soft info 2 --> 1
- for(int k=0;k<blocklength;k++) {
- int ki = INTERLEAVER.INTER()[k];
- //for(int i=0;i<FSMi.I();i++) {
- //ipriori[ki*FSMi.I()+i]=oposto[k*FSMi.I()+i];
- //}
- memcpy(&(priori1[ki*FSM1.I()]),&(posti2[k*FSM2.I()]),FSM1.I()*sizeof(float));
- }
-
- } // end iterations
-
- // generate hard decisions
- for(int k=0;k<blocklength;k++) {
- for(int i=0;i<FSM1.I();i++)
- posti1[k*FSM1.I()+i] = (*p2mymin)(priori1[k*FSM1.I()+i],posti1[k*FSM1.I()+i]);
- float min=INF;
- int mini=0;
- for(int i=0;i<FSM1.I();i++) {
- if(posti1[k*FSM1.I()+i]<min) {
- min=posti1[k*FSM1.I()+i];
- mini=i;
- }
- }
- data[k]=(To)mini;
- //std::cout << data[k] << ", "<< std::endl;
- }
- //std::cout << std::endl;
-
-}
-
-
-template
-void pccc_decoder_combined(
- const fsm &FSM1, int ST10, int ST1K,
- const fsm &FSM2, int ST20, int ST2K,
- const interleaver &INTERLEAVER, int blocklength, int iterations,
- float (*p2mymin)(float,float),
- int D, const std::vector<float> &TABLE,
- trellis_metric_type_t METRIC_TYPE,
- float scaling,
- const float *observations, unsigned char *data
-);
-
-
-template
-void pccc_decoder_combined(
- const fsm &FSM1, int ST10, int ST1K,
- const fsm &FSM2, int ST20, int ST2K,
- const interleaver &INTERLEAVER, int blocklength, int iterations,
- float (*p2mymin)(float,float),
- int D, const std::vector<float> &TABLE,
- trellis_metric_type_t METRIC_TYPE,
- float scaling,
- const float *observations, short *data
-);
-
-
-template
-void pccc_decoder_combined(
- const fsm &FSM1, int ST10, int ST1K,
- const fsm &FSM2, int ST20, int ST2K,
- const interleaver &INTERLEAVER, int blocklength, int iterations,
- float (*p2mymin)(float,float),
- int D, const std::vector<float> &TABLE,
- trellis_metric_type_t METRIC_TYPE,
- float scaling,
- const float *observations, int *data
-);
-
-
-template
-void pccc_decoder_combined(
- const fsm &FSM1, int ST10, int ST1K,
- const fsm &FSM2, int ST20, int ST2K,
- const interleaver &INTERLEAVER, int blocklength, int iterations,
- float (*p2mymin)(float,float),
- int D, const std::vector<gr_complex> &TABLE,
- trellis_metric_type_t METRIC_TYPE,
- float scaling,
- const gr_complex *observations, unsigned char *data
-);
-
-
-template
-void pccc_decoder_combined(
- const fsm &FSM1, int ST10, int ST1K,
- const fsm &FSM2, int ST20, int ST2K,
- const interleaver &INTERLEAVER, int blocklength, int iterations,
- float (*p2mymin)(float,float),
- int D, const std::vector<gr_complex> &TABLE,
- trellis_metric_type_t METRIC_TYPE,
- float scaling,
- const gr_complex *observations, short *data
-);
-
-
-template
-void pccc_decoder_combined(
- const fsm &FSM1, int ST10, int ST1K,
- const fsm &FSM2, int ST20, int ST2K,
- const interleaver &INTERLEAVER, int blocklength, int iterations,
- float (*p2mymin)(float,float),
- int D, const std::vector<gr_complex> &TABLE,
- trellis_metric_type_t METRIC_TYPE,
- float scaling,
- const gr_complex *observations, int *data
-);
diff --git a/gr-trellis/src/lib/core_algorithms.h b/gr-trellis/src/lib/core_algorithms.h
deleted file mode 100644
index a8765225bf..0000000000
--- a/gr-trellis/src/lib/core_algorithms.h
+++ /dev/null
@@ -1,140 +0,0 @@
-/* -*- c++ -*- */
-/*
- * Copyright 2004 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.
- */
-
-#ifndef INCLUDED_CORE_ALGORITHMS_H
-#define INCLUDED_CORE_ALGORITHMS_H
-
-#include <cmath>
-#include <vector>
-//#include <gr_complex.h>
-#include "digital_metric_type.h"
-#include "fsm.h"
-#include "interleaver.h"
-
-
-float min(float a, float b);
-float min_star(float a, float b);
-
-template <class T>
-void viterbi_algorithm(int I, int S, int O,
- const std::vector<int> &NS,
- const std::vector<int> &OS,
- const std::vector< std::vector<int> > &PS,
- const std::vector< std::vector<int> > &PI,
- int K,
- int S0,int SK,
- const float *in, T *out
-);
-
-template <class Ti, class To>
-void viterbi_algorithm_combined(int I, int S, int O,
- const std::vector<int> &NS,
- const std::vector<int> &OS,
- const std::vector< std::vector<int> > &PS,
- const std::vector< std::vector<int> > &PI,
- int K,
- int S0,int SK,
- int D,
- const std::vector<Ti> &TABLE,
- trellis_metric_type_t TYPE,
- const Ti *in, To *out
-);
-
-
-
-void siso_algorithm(int I, int S, int O,
- const std::vector<int> &NS,
- const std::vector<int> &OS,
- const std::vector< std::vector<int> > &PS,
- const std::vector< std::vector<int> > &PI,
- int K,
- int S0,int SK,
- bool POSTI, bool POSTO,
- float (*p2mymin)(float,float),
- const float *priori, const float *prioro, float *post
-);
-
-
-template <class T>
-void siso_algorithm_combined(int I, int S, int O,
- const std::vector<int> &NS,
- const std::vector<int> &OS,
- const std::vector< std::vector<int> > &PS,
- const std::vector< std::vector<int> > &PI,
- int K,
- int S0,int SK,
- bool POSTI, bool POSTO,
- float (*p2mymin)(float,float),
- int D,
- const std::vector<T> &TABLE,
- trellis_metric_type_t TYPE,
- const float *priori, const T *observations, float *post
-);
-
-
-template<class T>
-void sccc_decoder(
- const fsm &FSMo, int STo0, int SToK,
- const fsm &FSMi, int STi0, int STiK,
- const interleaver &INTERLEAVER, int blocklength, int iterations,
- float (*p2mymin)(float,float),
- const float *iprioro, T *data
-);
-
-
-template<class Ti, class To>
-void sccc_decoder_combined(
- const fsm &FSMo, int STo0, int SToK,
- const fsm &FSMi, int STi0, int STiK,
- const interleaver &INTERLEAVER, int blocklength, int iterations,
- float (*p2mymin)(float,float),
- int D, const std::vector<Ti> &TABLE,
- trellis_metric_type_t METRIC_TYPE,
- float scaling,
- const Ti *observations, To *data
-);
-
-template<class T>
-void pccc_decoder(
- const fsm &FSM1, int ST10, int ST1K,
- const fsm &FSM2, int ST20, int ST2K,
- const interleaver &INTERLEAVER, int blocklength, int iterations,
- float (*p2mymin)(float,float),
- const float *cprioro, T *data
-);
-
-template<class Ti, class To>
-void pccc_decoder_combined(
- const fsm &FSM1, int ST10, int ST1K,
- const fsm &FSM2, int ST20, int ST2K,
- const interleaver &INTERLEAVER, int blocklength, int iterations,
- float (*p2mymin)(float,float),
- int D, const std::vector<Ti> &TABLE,
- trellis_metric_type_t METRIC_TYPE,
- float scaling,
- const Ti *observations, To *data
-);
-
-
-
-
-#endif
diff --git a/gr-trellis/src/lib/fsm.cc b/gr-trellis/src/lib/fsm.cc
deleted file mode 100644
index fb2b4d2c9f..0000000000
--- a/gr-trellis/src/lib/fsm.cc
+++ /dev/null
@@ -1,548 +0,0 @@
-/* -*- c++ -*- */
-/*
- * Copyright 2002 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.
- */
-
-#include <cstdio>
-#include <string>
-#include <iostream>
-#include <fstream>
-#include <stdexcept>
-#include <cmath>
-#include <stdlib.h>
-#include "base.h"
-#include "fsm.h"
-
-
-fsm::fsm()
-{
- d_I=0;
- d_S=0;
- d_O=0;
- d_NS.resize(0);
- d_OS.resize(0);
- d_PS.resize(0);
- d_PI.resize(0);
- d_TMi.resize(0);
- d_TMl.resize(0);
-}
-
-fsm::fsm(const fsm &FSM)
-{
- d_I=FSM.I();
- d_S=FSM.S();
- d_O=FSM.O();
- d_NS=FSM.NS();
- d_OS=FSM.OS();
- d_PS=FSM.PS(); // is this going to make a deep copy?
- d_PI=FSM.PI();
- d_TMi=FSM.TMi();
- d_TMl=FSM.TMl();
-}
-
-fsm::fsm(int I, int S, int O, const std::vector<int> &NS, const std::vector<int> &OS)
-{
- d_I=I;
- d_S=S;
- d_O=O;
- d_NS=NS;
- d_OS=OS;
-
- generate_PS_PI();
- generate_TM();
-}
-
-//######################################################################
-//# Read an FSM specification from a file.
-//# Format (hopefully will become more flexible in the future...):
-//# I S O (in the first line)
-//# blank line
-//# Next state matrix (S lines, each with I integers separated by spaces)
-//# blank line
-//# output symbol matrix (S lines, each with I integers separated by spaces)
-//# optional comments
-//######################################################################
-fsm::fsm(const char *name)
-{
- FILE *fsmfile;
-
- if((fsmfile=fopen(name,"r"))==NULL)
- throw std::runtime_error ("fsm::fsm(const char *name): file open error\n");
- //printf("file open error in fsm()\n");
-
- if(fscanf(fsmfile,"%d %d %d\n",&d_I,&d_S,&d_O) == EOF) {
- if(ferror(fsmfile) != 0)
- throw std::runtime_error ("fsm::fsm(const char *name): file read error\n");
- }
-
- d_NS.resize(d_I*d_S);
- d_OS.resize(d_I*d_S);
-
- for(int i=0;i<d_S;i++) {
- for(int j=0;j<d_I;j++) {
- if(fscanf(fsmfile,"%d",&(d_NS[i*d_I+j])) == EOF) {
- if(ferror(fsmfile) != 0)
- throw std::runtime_error ("fsm::fsm(const char *name): file read error\n");
- }
- }
- }
- for(int i=0;i<d_S;i++) {
- for(int j=0;j<d_I;j++) {
- if(fscanf(fsmfile,"%d",&(d_OS[i*d_I+j])) == EOF) {
- if(ferror(fsmfile) != 0)
- throw std::runtime_error ("fsm::fsm(const char *name): file read error\n");
- }
- }
- }
-
- fclose(fsmfile);
-
- generate_PS_PI();
- generate_TM();
-}
-
-
-
-//######################################################################
-//# Automatically generate the FSM from the generator matrix
-//# of a (n,k) binary convolutional code
-//######################################################################
-fsm::fsm(int k, int n, const std::vector<int> &G)
-{
-
- // calculate maximum memory requirements for each input stream
- std::vector<int> max_mem_x(k,-1);
- int max_mem = -1;
- for(int i=0;i<k;i++) {
- for(int j=0;j<n;j++) {
- int mem = -1;
- if(G[i*n+j]!=0)
- mem=(int)(log(double(G[i*n+j]))/log(2.0));
- if(mem>max_mem_x[i])
- max_mem_x[i]=mem;
- if(mem>max_mem)
- max_mem=mem;
- }
- }
-
-//printf("max_mem_x\n");
-//for(int j=0;j<max_mem_x.size();j++) printf("%d ",max_mem_x[j]); printf("\n");
-
- // calculate total memory requirements to set S
- int sum_max_mem = 0;
- for(int i=0;i<k;i++)
- sum_max_mem += max_mem_x[i];
-
-//printf("sum_max_mem = %d\n",sum_max_mem);
-
- d_I=1<<k;
- d_S=1<<sum_max_mem;
- d_O=1<<n;
-
- // binary representation of the G matrix
- std::vector<std::vector<int> > Gb(k*n);
- for(int j=0;j<k*n;j++) {
- Gb[j].resize(max_mem+1);
- dec2base(G[j],2,Gb[j]);
-//printf("Gb\n");
-//for(int m=0;m<Gb[j].size();m++) printf("%d ",Gb[j][m]); printf("\n");
- }
-
- // alphabet size of each shift register
- std::vector<int> bases_x(k);
- for(int j=0;j<k ;j++)
- bases_x[j] = 1 << max_mem_x[j];
-//printf("bases_x\n");
-//for(int j=0;j<max_mem_x.size();j++) printf("%d ",max_mem_x[j]); printf("\n");
-
- d_NS.resize(d_I*d_S);
- d_OS.resize(d_I*d_S);
-
- std::vector<int> sx(k);
- std::vector<int> nsx(k);
- std::vector<int> tx(k);
- std::vector<std::vector<int> > tb(k);
- for(int j=0;j<k;j++)
- tb[j].resize(max_mem+1);
- std::vector<int> inb(k);
- std::vector<int> outb(n);
-
-
- for(int s=0;s<d_S;s++) {
- dec2bases(s,bases_x,sx); // split s into k values, each representing one of the k shift registers
-//printf("state = %d \nstates = ",s);
-//for(int j=0;j<sx.size();j++) printf("%d ",sx[j]); printf("\n");
- for(int i=0;i<d_I;i++) {
- dec2base(i,2,inb); // input in binary
-//printf("input = %d \ninputs = ",i);
-//for(int j=0;j<inb.size();j++) printf("%d ",inb[j]); printf("\n");
-
- // evaluate next state
- for(int j=0;j<k;j++)
- nsx[j] = (inb[j]*bases_x[j]+sx[j])/2; // next state (for each shift register) MSB first
- d_NS[s*d_I+i]=bases2dec(nsx,bases_x); // collect all values into the new state
-
- // evaluate transitions
- for(int j=0;j<k;j++)
- tx[j] = inb[j]*bases_x[j]+sx[j]; // transition (for each shift register)MSB first
- for(int j=0;j<k;j++) {
- dec2base(tx[j],2,tb[j]); // transition in binary
-//printf("transition = %d \ntransitions = ",tx[j]);
-//for(int m=0;m<tb[j].size();m++) printf("%d ",tb[j][m]); printf("\n");
- }
-
- // evaluate outputs
- for(int nn=0;nn<n;nn++) {
- outb[nn] = 0;
- for(int j=0;j<k;j++) {
- for(int m=0;m<max_mem+1;m++)
- outb[nn] = (outb[nn] + Gb[j*n+nn][m]*tb[j][m]) % 2; // careful: polynomial 1+D ir represented as 110, not as 011
-//printf("output %d equals %d\n",nn,outb[nn]);
- }
- }
- d_OS[s*d_I+i] = base2dec(outb,2);
- }
- }
-
- generate_PS_PI();
- generate_TM();
-}
-
-
-
-
-//######################################################################
-//# Automatically generate an FSM specification describing the
-//# ISI for a channel
-//# of length ch_length and a modulation of size mod_size
-//######################################################################
-fsm::fsm(int mod_size, int ch_length)
-{
- d_I=mod_size;
- d_S=(int) (pow(1.0*d_I,1.0*ch_length-1)+0.5);
- d_O=d_S*d_I;
-
- d_NS.resize(d_I*d_S);
- d_OS.resize(d_I*d_S);
-
- for(int s=0;s<d_S;s++) {
- for(int i=0;i<d_I;i++) {
- int t=i*d_S+s;
- d_NS[s*d_I+i] = t/d_I;
- d_OS[s*d_I+i] = t;
- }
- }
-
- generate_PS_PI();
- generate_TM();
-}
-
-
-
-
-//######################################################################
-//# Automatically generate an FSM specification describing the
-//# the trellis for a CPM with h=K/P (relatively prime),
-//# alphabet size M, and frequency pulse duration L symbols
-//#
-//# This FSM is based on the paper by B. Rimoldi
-//# "A decomposition approach to CPM", IEEE Trans. Info Theory, March 1988
-//# See also my own notes at http://www.eecs.umich.edu/~anastas/docs/cpm.pdf
-//######################################################################
-fsm::fsm(int P, int M, int L)
-{
- d_I=M;
- d_S=(int)(pow(1.0*M,1.0*L-1)+0.5)*P;
- d_O=(int)(pow(1.0*M,1.0*L)+0.5)*P;
-
- d_NS.resize(d_I*d_S);
- d_OS.resize(d_I*d_S);
- int nv;
- for(int s=0;s<d_S;s++) {
- for(int i=0;i<d_I;i++) {
- int s1=s/P;
- int v=s%P;
- int ns1= (i*(int)(pow(1.0*M,1.0*(L-1))+0.5)+s1)/M;
- if (L==1)
- nv=(i+v)%P;
- else
- nv=(s1%M+v)%P;
- d_NS[s*d_I+i] = ns1*P+nv;
- d_OS[s*d_I+i] = i*d_S+s;
- }
- }
-
- generate_PS_PI();
- generate_TM();
-}
-
-
-
-
-
-
-
-
-
-
-//######################################################################
-//# Automatically generate an FSM specification describing the
-//# the joint trellis of fsm1 and fsm2
-//######################################################################
-fsm::fsm(const fsm &FSM1, const fsm &FSM2)
-{
- d_I=FSM1.I()*FSM2.I();
- d_S=FSM1.S()*FSM2.S();
- d_O=FSM1.O()*FSM2.O();
-
- d_NS.resize(d_I*d_S);
- d_OS.resize(d_I*d_S);
-
- for(int s=0;s<d_S;s++) {
- for(int i=0;i<d_I;i++) {
- int s1=s/FSM2.S();
- int s2=s%FSM2.S();
- int i1=i/FSM2.I();
- int i2=i%FSM2.I();
- d_NS[s*d_I+i] = FSM1.NS()[s1 * FSM1.I() + i1] * FSM2.S() + FSM2.NS()[s2 * FSM2.I() + i2];
- d_OS[s*d_I+i] = FSM1.OS()[s1 * FSM1.I() + i1] * FSM2.O() + FSM2.OS()[s2 * FSM2.I() + i2];
- }
- }
-
- generate_PS_PI();
- generate_TM();
-}
-
-
-
-
-//######################################################################
-//# Generate a new FSM representing n stages through the original FSM
-//# AKA radix-n FSM
-//######################################################################
-fsm::fsm(const fsm &FSM, int n)
-{
- d_I=(int) (pow(1.0*FSM.I(),1.0*n)+0.5);
- d_S=FSM.S();
- d_O=(int) (pow(1.0*FSM.O(),1.0*n)+0.5);
-
- d_NS.resize(d_I*d_S);
- d_OS.resize(d_I*d_S);
-
- for(int s=0;s<d_S;s++ ) {
- for(int i=0;i<d_I;i++ ) {
- std::vector<int> ii(n);
- dec2base(i,FSM.I(),ii);
- std::vector<int> oo(n);
- int ns=s;
- for(int k=0;k<n;k++) {
- oo[k]=FSM.OS()[ns*FSM.I()+ii[k]];
- ns=FSM.NS()[ns*FSM.I()+ii[k]];
- }
- d_NS[s*d_I+i]=ns;
- d_OS[s*d_I+i]=base2dec(oo,FSM.O());
- }
- }
-
- generate_PS_PI();
- generate_TM();
-}
-
-
-
-
-
-
-
-
-
-//######################################################################
-//# generate the PS and PI tables for later use
-//######################################################################
-void fsm::generate_PS_PI()
-{
- d_PS.resize(d_S);
- d_PI.resize(d_S);
-
- for(int i=0;i<d_S;i++) {
- d_PS[i].resize(d_I*d_S); // max possible size
- d_PI[i].resize(d_I*d_S);
- int j=0;
- for(int ii=0;ii<d_S;ii++) for(int jj=0;jj<d_I;jj++) {
- if(d_NS[ii*d_I+jj]!=i) continue;
- d_PS[i][j]=ii;
- d_PI[i][j]=jj;
- j++;
- }
- d_PS[i].resize(j);
- d_PI[i].resize(j);
- }
-}
-
-
-//######################################################################
-//# generate the termination matrices TMl and TMi for later use
-//######################################################################
-void fsm::generate_TM()
-{
- d_TMi.resize(d_S*d_S);
- d_TMl.resize(d_S*d_S);
-
- for(int i=0;i<d_S*d_S;i++) {
- d_TMi[i] = -1; // no meaning
- d_TMl[i] = d_S; //infinity: you need at most S-1 steps
- if (i/d_S == i%d_S)
- d_TMl[i] = 0;
- }
-
- for(int s=0;s<d_S;s++) {
- bool done = false;
- int attempts = 0;
- while (done == false && attempts < d_S-1) {
- done = find_es(s);
- attempts ++;
- }
- if (done == false && d_S > 1) {
- //throw std::runtime_error ("fsm::generate_TM(): FSM appears to be disconnected\n");
- printf("fsm::generate_TM(): FSM appears to be disconnected\n");
- printf("state %d cannot be reached from all other states\n",s);
- }
- }
-}
-
-
-// find a path from any state to the ending state "es"
-bool fsm::find_es(int es)
-{
- bool done = true;
- for(int s=0;s<d_S;s++) {
- if(d_TMl[s*d_S+es] < d_S)
- continue;
- int minl=d_S;
- int mini=-1;
- for(int i=0;i<d_I;i++) {
- if( 1 + d_TMl[d_NS[s*d_I+i]*d_S+es] < minl) {
- minl = 1 + d_TMl[d_NS[s*d_I+i]*d_S+es];
- mini = i;
- }
- }
- if (mini != -1) {
- d_TMl[s*d_S+es]=minl;
- d_TMi[s*d_S+es]=mini;
- }
- else
- done = false;
- }
- return done;
-}
-
-
-
-
-
-//######################################################################
-//# generate trellis representation of FSM as an SVG file
-//######################################################################
-void fsm::write_trellis_svg( std::string filename ,int number_stages)
-{
- std::ofstream trellis_fname (filename.c_str());
- if (!trellis_fname) {std::cout << "file not found " << std::endl ; exit(-1);}
- const int TRELLIS_Y_OFFSET = 30;
- const int TRELLIS_X_OFFSET = 20;
- const int STAGE_LABEL_Y_OFFSET = 25;
- const int STAGE_LABEL_X_OFFSET = 20;
- const int STATE_LABEL_Y_OFFSET = 30;
- const int STATE_LABEL_X_OFFSET = 5;
- const int STAGE_STATE_OFFSETS = 10;
-// std::cout << "################## BEGIN SVG TRELLIS PIC #####################" << std::endl;
- trellis_fname << "<svg viewBox = \"0 0 200 200\" version = \"1.1\">" << std::endl;
-
- for( int stage_num = 0;stage_num < number_stages;stage_num ++){
- // draw states
- for ( int state_num = 0;state_num < d_S ; state_num ++ ) {
- trellis_fname << "<circle cx = \"" << stage_num * STAGE_STATE_OFFSETS + TRELLIS_X_OFFSET <<
- "\" cy = \"" << state_num * STAGE_STATE_OFFSETS + TRELLIS_Y_OFFSET << "\" r = \"1\"/>" << std::endl;
- //draw branches
- if(stage_num != number_stages-1){
- for( int branch_num = 0;branch_num < d_I; branch_num++){
- trellis_fname << "<line x1 =\"" << STAGE_STATE_OFFSETS * stage_num+ TRELLIS_X_OFFSET << "\" ";
- trellis_fname << "y1 =\"" << state_num * STAGE_STATE_OFFSETS + TRELLIS_Y_OFFSET<< "\" ";
- trellis_fname << "x2 =\"" << STAGE_STATE_OFFSETS *stage_num + STAGE_STATE_OFFSETS+ TRELLIS_X_OFFSET << "\" ";
- trellis_fname << "y2 =\"" << d_NS[d_I * state_num + branch_num] * STAGE_STATE_OFFSETS + TRELLIS_Y_OFFSET << "\" ";
- trellis_fname << " stroke-dasharray = \"3," << branch_num << "\" ";
- trellis_fname << " stroke = \"black\" stroke-width = \"0.3\"/>" << std::endl;
- }
- }
- }
- }
- // label the stages
- trellis_fname << "<g font-size = \"4\" font= \"times\" fill = \"black\">" << std::endl;
- for( int stage_num = 0;stage_num < number_stages ;stage_num ++){
- trellis_fname << "<text x = \"" << stage_num * STAGE_STATE_OFFSETS + STAGE_LABEL_X_OFFSET <<
- "\" y = \"" << STAGE_LABEL_Y_OFFSET << "\" >" << std::endl;
- trellis_fname << stage_num << std::endl;
- trellis_fname << "</text>" << std::endl;
- }
- trellis_fname << "</g>" << std::endl;
-
- // label the states
- trellis_fname << "<g font-size = \"4\" font= \"times\" fill = \"black\">" << std::endl;
- for( int state_num = 0;state_num < d_S ; state_num ++){
- trellis_fname << "<text y = \"" << state_num * STAGE_STATE_OFFSETS + STATE_LABEL_Y_OFFSET <<
- "\" x = \"" << STATE_LABEL_X_OFFSET << "\" >" << std::endl;
- trellis_fname << state_num << std::endl;
- trellis_fname << "</text>" << std::endl;
- }
- trellis_fname << "</g>" << std::endl;
-
-
- trellis_fname << "</svg>" << std::endl;
-// std::cout << "################## END SVG TRELLIS PIC ##################### " << std::endl;
- trellis_fname.close();
-}
-
-
-
-
-
-
-//######################################################################
-//# Write trellis specification to a text file,
-//# in the same format used when reading FSM files
-//######################################################################
-void fsm::write_fsm_txt(std::string filename)
-{
- std::ofstream trellis_fname (filename.c_str());
- if (!trellis_fname) {std::cout << "file not found " << std::endl ; exit(-1);}
- trellis_fname << d_I << ' ' << d_S << ' ' << d_O << std::endl;
- trellis_fname << std::endl;
- for(int i=0;i<d_S;i++) {
- for(int j=0;j<d_I;j++) trellis_fname << d_NS[i*d_I+j] << ' ';
- trellis_fname << std::endl;
- }
- trellis_fname << std::endl;
- for(int i=0;i<d_S;i++) {
- for(int j=0;j<d_I;j++) trellis_fname << d_OS[i*d_I+j] << ' ';
- trellis_fname << std::endl;
- }
- trellis_fname << std::endl;
- trellis_fname.close();
-}
-
diff --git a/gr-trellis/src/lib/fsm.h b/gr-trellis/src/lib/fsm.h
deleted file mode 100644
index 47e467898a..0000000000
--- a/gr-trellis/src/lib/fsm.h
+++ /dev/null
@@ -1,166 +0,0 @@
-/* -*- c++ -*- */
-/*
- * Copyright 2002,2011 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.
- */
-
-#ifndef INCLUDED_TRELLIS_FSM_H
-#define INCLUDED_TRELLIS_FSM_H
-
-#include <trellis_api.h>
-#include <vector>
-#include <iosfwd>
-
-/*!
- * \brief Finite State Machine Specification class.
- *
- * An instance of this class represents a finite state machine specification (FSMS)
- * rather than the FSM itself. It particular the state of the FSM
- * is not stored within an instance of this class.
- */
-class TRELLIS_API fsm {
-private:
- // Input alphabet cardinality.
- int d_I;
- // Number of states.
- int d_S;
- // Output alphabet cardinality.
- int d_O;
- // NS means Next State.
- // next_state = d_NS[current_state * d_I + input_symbol]
- std::vector<int> d_NS;
- // OS means Output Symbol.
- // output_symbol = d_OS[current_state * d_I + input_symbol]
- std::vector<int> d_OS;
- // PS means Previous State.
- std::vector< std::vector<int> > d_PS;
- // PI means Previous Input Symbol.
- // d_PS[current_state][k] and d_PI[current_state][k], is a pair of the form
- // (previous_state, previous_input_symbol) that could have produced the
- // current state.
- std::vector< std::vector<int> > d_PI;
- // TM means Termination matrix.
- // d_TMl[s*d_S+es] is the shortest number of steps to get from state s to
- // state es.
- std::vector<int> d_TMl;
- // d_TMi[s*d_S+es] is the input symbol required to set off on the shortest
- // path from state s to es.
- std::vector<int> d_TMi;
- void generate_PS_PI ();
- void generate_TM ();
- bool find_es(int es);
-public:
- /*!
- * \brief Constructor to create an uninitialized FSMS.
- */
- fsm();
- /*!
- * \brief Constructor to copy an FSMS.
- */
- fsm(const fsm &FSM);
- /*!
- * \brief Constructor to to create an FSMS.
- *
- * \param I The number of possible input symbols.
- * \param S The number of possible FSM states.
- * \param O The number of possible output symbols.
- * \param NS A mapping from (current state, input symbol) to next state.
- * next_state = NS[current_state * I + input_symbol]
- * \param OS A mapping from (current state, input symbol) to output symbol.
- * output_symbol = OS[current_state * I + input_symbol]
- *
- */
- fsm(int I, int S, int O, const std::vector<int> &NS, const std::vector<int> &OS);
- /*!
- * \brief Constructor to create an FSMS from file contents.
- *
- * \param name filename
- *
- */
- fsm(const char *name);
- /*!
- * \brief Creates an FSMS from the generator matrix of a (n, k) binary convolutional code.
- *
- * \param k ???
- * \param n ???
- * \param G ???
- *
- */
- fsm(int k, int n, const std::vector<int> &G);
- /*!
- * \brief Creates an FSMS describing ISI.
- *
- * \param mod_size modulation size
- * \param ch_length channel length
- *
- */
- fsm(int mod_size, int ch_length);
- /*!
- * \brief Creates an FSMS describing the trellis for a CPM.
- *
- * \param P ???? h=K/P (relatively prime)
- * \param M alphabet size
- * \param L pulse duration
- *
- * This FSM is based on the paper by B. Rimoldi
- * "A decomposition approach to CPM", IEEE Trans. Info Theory, March 1988
- * See also my own notes at http://www.eecs.umich.edu/~anastas/docs/cpm.pdf
- */
- fsm(int P, int M, int L);
- /*!
- * \brief Creates an FSMS describing the joint trellis of two FSMs.
- *
- * \param FSM1 first FSMS
- * \param FSM2 second FSMS
- */
- fsm(const fsm &FSM1, const fsm &FSM2);
- /*!
- * \brief Creates an FSMS representing n stages through the originial FSM (AKA radix-n FSM).
- *
- * \param FSM Original FSMs
- * \param n Number of stages.
- */
- fsm(const fsm &FSM, int n);
- int I () const { return d_I; }
- int S () const { return d_S; }
- int O () const { return d_O; }
- const std::vector<int> & NS () const { return d_NS; }
- const std::vector<int> & OS () const { return d_OS; }
- const std::vector< std::vector<int> > & PS () const { return d_PS; }
- const std::vector< std::vector<int> > & PI () const { return d_PI; }
- const std::vector<int> & TMi () const { return d_TMi; }
- const std::vector<int> & TMl () const { return d_TMl; }
- /*!
- * \brief Creates an svg image of the trellis representation.
- *
- * \param filename filename
- * \param number_stages ????
- *
- */
- void write_trellis_svg(std::string filename ,int number_stages);
- /*!
- * \brief Write the FSMS to a file.
- *
- * \param filename filename
- *
- */
- void write_fsm_txt(std::string filename);
-};
-
-#endif
diff --git a/gr-trellis/src/lib/fsm.i b/gr-trellis/src/lib/fsm.i
deleted file mode 100644
index 1e9c7ad8f5..0000000000
--- a/gr-trellis/src/lib/fsm.i
+++ /dev/null
@@ -1,59 +0,0 @@
-/* -*- c++ -*- */
-/*
- * Copyright 2002 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.
- */
-
-class fsm {
-private:
- int d_I;
- int d_S;
- int d_O;
- std::vector<int> d_NS;
- std::vector<int> d_OS;
- std::vector< std::vector<int> > d_PS;
- std::vector< std::vector<int> > d_PI;
- std::vector<int> d_TMi;
- std::vector<int> d_TMl;
- void generate_PS_PI ();
- void generate_TM ();
-public:
- fsm();
- fsm(const fsm &FSM);
- fsm(int I, int S, int O, const std::vector<int> &NS, const std::vector<int> &OS);
- fsm(const char *name);
- fsm(int k, int n, const std::vector<int> &G);
- fsm(int mod_size, int ch_length);
- fsm(int P, int M, int L);
- fsm(const fsm &FSM1, const fsm &FSM2);
- fsm(const fsm &FSM, int n);
- int I () const { return d_I; }
- int S () const { return d_S; }
- int O () const { return d_O; }
- const std::vector<int> & NS () const { return d_NS; }
- const std::vector<int> & OS () const { return d_OS; }
- // disable these accessors until we find out how to swig them
- //const std::vector< std::vector<int> > & PS () const { return d_PS; }
- //const std::vector< std::vector<int> > & PI () const { return d_PI; }
- const std::vector<int> & TMi () const { return d_TMi; }
- const std::vector<int> & TMl () const { return d_TMl; }
- void fsm::write_trellis_svg(std::string filename ,int number_stages);
- void fsm::write_fsm_txt(std::string filename);
-};
-
diff --git a/gr-trellis/src/lib/generate_trellis.py b/gr-trellis/src/lib/generate_trellis.py
deleted file mode 100644
index 60a81f77a8..0000000000
--- a/gr-trellis/src/lib/generate_trellis.py
+++ /dev/null
@@ -1,129 +0,0 @@
-#!/usr/bin/env python
-#
-# Copyright 2006,2007 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.
-#
-
-from build_utils import expand_template, copyright, open_and_log_name
-from build_utils_codes import *
-import re
-
-# regular blocks
-
-other_roots = [
- 'trellis_encoder_XX',
- 'trellis_sccc_encoder_XX',
- 'trellis_pccc_encoder_XX',
- 'trellis_metrics_X',
- 'trellis_viterbi_X',
- 'trellis_viterbi_combined_XX',
- 'trellis_sccc_decoder_X',
- 'trellis_sccc_decoder_combined_XX',
- 'trellis_pccc_decoder_X',
- 'trellis_pccc_decoder_combined_XX',
- ]
-
-other_signatures = (
- ['bb','bs','bi','ss','si','ii'],
- ['bb','bs','bi','ss','si','ii'],
- ['bb','bs','bi','ss','si','ii'],
- ['s','i','f','c'],
- ['b','s','i'],
- ['sb','ss','si','ib','is','ii','fb','fs','fi','cb','cs','ci'],
- ['b','s','i'],
- ['fb','fs','fi','cb','cs','ci'],
- ['b','s','i'],
- ['fb','fs','fi','cb','cs','ci'],
- )
-
-
-def is_byte (code3):
- if i_code (code3) == 'b' or o_code (code3) == 'b':
- return '1'
- else:
- return '0'
-
-
-def is_short (code3):
- if i_code (code3) == 's' or o_code (code3) == 's':
- return '1'
- else:
- return '0'
-
-
-def is_int (code3):
- if i_code (code3) == 'i' or o_code (code3) == 'i':
- return '1'
- else:
- return '0'
-
-
-def is_float (code3):
- if i_code (code3) == 'f' or o_code (code3) == 'f':
- return '1'
- else:
- return '0'
-
-
-def is_complex (code3):
- if i_code (code3) == 'c' or o_code (code3) == 'c':
- return '1'
- else:
- return '0'
-
-
-def standard_dict (name, code3):
- d = {}
- d['NAME'] = name
- d['GUARD_NAME'] = 'INCLUDED_%s_H' % name.upper ()
- d['BASE_NAME'] = re.sub ('^trellis_', '', name)
- d['SPTR_NAME'] = '%s_sptr' % name
- d['WARNING'] = 'WARNING: this file is machine generated. Edits will be over written'
- d['COPYRIGHT'] = copyright
- d['TYPE'] = i_type (code3)
- d['I_TYPE'] = i_type (code3)
- d['O_TYPE'] = o_type (code3)
- d['TAP_TYPE'] = tap_type (code3)
- d['IS_BYTE'] = is_byte (code3)
- d['IS_SHORT'] = is_short (code3)
- d['IS_INT'] = is_int (code3)
- d['IS_FLOAT'] = is_float (code3)
- d['IS_COMPLEX'] = is_complex (code3)
- return d
-
-
-def expand_h_cc_i (root, sig):
- # root looks like 'gr_vector_sink_X'
- name = re.sub ('X+', sig, root)
- d = standard_dict (name, sig)
- expand_template (d, root + '.h.t')
- expand_template (d, root + '.cc.t')
- expand_template (d, root + '.i.t')
-
-
-def generate ():
- i=0
- for r in other_roots :
- for s in other_signatures[i]:
- expand_h_cc_i (r, s)
- i=i+1
-
-
-if __name__ == '__main__':
- generate ()
diff --git a/gr-trellis/src/lib/interleaver.cc b/gr-trellis/src/lib/interleaver.cc
deleted file mode 100644
index 740f33ab39..0000000000
--- a/gr-trellis/src/lib/interleaver.cc
+++ /dev/null
@@ -1,144 +0,0 @@
-/* -*- c++ -*- */
-/*
- * Copyright 2002 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.
- */
-
-#include <cstdlib>
-#include <cstdio>
-#include <iostream>
-#include <string>
-#include <fstream>
-#include <stdexcept>
-#include <cmath>
-#include "quicksort_index.h"
-#include "interleaver.h"
-
-
-
-
-interleaver::interleaver()
-{
- d_K=0;
- d_INTER.resize(0);
- d_DEINTER.resize(0);
-}
-
-interleaver::interleaver(const interleaver &INTERLEAVER)
-{
- d_K=INTERLEAVER.K();
- d_INTER=INTERLEAVER.INTER();
- d_DEINTER=INTERLEAVER.DEINTER();
-}
-
-interleaver::interleaver(int K, const std::vector<int> &INTER)
-{
- d_K=K;
- d_INTER=INTER;
- d_DEINTER.resize(d_K);
-
- // generate DEINTER table
- for(int i=0;i<d_K;i++) {
- d_DEINTER[d_INTER[i]]=i;
- }
-}
-
-//######################################################################
-//# Read an INTERLEAVER specification from a file.
-//# Format (hopefully will become more flexible in the future...):
-//# K
-//# blank line
-//# list of space separated K integers from 0 to K-1 in appropriate order
-//# optional comments
-//######################################################################
-interleaver::interleaver(const char *name)
-{
- FILE *interleaverfile;
-
- if((interleaverfile=fopen(name,"r"))==NULL)
- throw std::runtime_error ("file open error in interleaver()");
- //printf("file open error in interleaver()\n");
-
- if(fscanf(interleaverfile,"%d\n",&d_K) == EOF) {
- if(ferror(interleaverfile) != 0)
- throw std::runtime_error ("interleaver::interleaver(const char *name): file read error\n");
- }
-
- d_INTER.resize(d_K);
- d_DEINTER.resize(d_K);
-
- for(int i=0;i<d_K;i++) {
- if(fscanf(interleaverfile,"%d",&(d_INTER[i])) == EOF) {
- if(ferror(interleaverfile) != 0)
- throw std::runtime_error ("interleaver::interleaver(const char *name): file read error\n");
- }
- }
-
- // generate DEINTER table
- for(int i=0;i<d_K;i++) {
- d_DEINTER[d_INTER[i]]=i;
- }
-}
-
-//######################################################################
-//# Generate a random interleaver
-//######################################################################
-interleaver::interleaver(int K, int seed)
-{
- d_K=K;
- d_INTER.resize(d_K);
- d_DEINTER.resize(d_K);
-
- if(seed>=0) srand((unsigned int)seed);
- std::vector<int> tmp(d_K);
- for(int i=0;i<d_K;i++) {
- d_INTER[i]=i;
- tmp[i] = rand();
- }
- quicksort_index <int> (tmp,d_INTER,0,d_K-1);
-
- // generate DEINTER table
- for(int i=0;i<d_K;i++) {
- d_DEINTER[d_INTER[i]]=i;
- }
-}
-
-
-
-
-
-//######################################################################
-//# Write an INTERLEAVER specification to a file.
-//# Format
-//# K
-//# blank line
-//# list of space separated K integers from 0 to K-1 in appropriate order
-//# optional comments
-//######################################################################
-void interleaver::write_interleaver_txt(std::string filename)
-{
- std::ofstream interleaver_fname (filename.c_str());
- if (!interleaver_fname) {std::cout << "file not found " << std::endl ; exit(-1);}
- interleaver_fname << d_K << std::endl;
- interleaver_fname << std::endl;
- for(int i=0;i<d_K;i++)
- interleaver_fname << d_INTER[i] << ' ';
- interleaver_fname << std::endl;
- interleaver_fname.close();
-}
diff --git a/gr-trellis/src/lib/interleaver.i b/gr-trellis/src/lib/interleaver.i
deleted file mode 100644
index bb9078b1bd..0000000000
--- a/gr-trellis/src/lib/interleaver.i
+++ /dev/null
@@ -1,38 +0,0 @@
-/* -*- c++ -*- */
-/*
- * Copyright 2002 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.
- */
-
-class interleaver {
-private:
- int d_K;
- std::vector<int> d_INTER;
- std::vector<int> d_DEINTER;
-public:
- interleaver();
- interleaver(const interleaver & INTERLEAVER);
- interleaver(int K, const std::vector<int> & INTER);
- interleaver(const char *name);
- interleaver(int K, int seed);
- int K () const { return d_K; }
- const std::vector<int> & INTER () const { return d_INTER; }
- const std::vector<int> & DEINTER () const { return d_DEINTER; }
- void write_interleaver_txt(std::string filename);
-};
diff --git a/gr-trellis/src/lib/quicksort_index.cc b/gr-trellis/src/lib/quicksort_index.cc
deleted file mode 100644
index cf37e862e2..0000000000
--- a/gr-trellis/src/lib/quicksort_index.cc
+++ /dev/null
@@ -1,68 +0,0 @@
-/* -*- c++ -*- */
-/*
- * Copyright 2004 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.
- */
-
-#include "quicksort_index.h"
-
-template <class T>
-void
-SWAP
-(T & a, T & b)
-{
- T temp = a;
- a = b;
- b = temp;
-}
-
-template <class T>
-void
-quicksort_index
-(std::vector<T> & p, std::vector<int> & index, int left, int right)
-{
- if (left < right) {
- int i = left;
- int j = right + 1;
- T pivot = p[left];
- do {
- do
- i++;
- while ((p[i] < pivot) && (i < right));
- do
- j--;
- while ((p[j] > pivot) && (j > left));
- if (i < j) {
- SWAP <T> (p[i],p[j]);
- SWAP <int> (index[i],index[j]);
- }
- } while (i < j);
- SWAP <T> (p[left], p[j]);
- SWAP <int> (index[left], index[j]);
- quicksort_index <T> (p,index, left, j-1);
- quicksort_index <T> (p,index, j+1, right);
- }
-}
-
-// instantiate an <int> version of the quicksort_index
-//template <int> void SWAP (int & a, int & b);
-template
-void
-quicksort_index<int>
-(std::vector<int> & p, std::vector<int> & index, int left, int right);
diff --git a/gr-trellis/src/lib/trellis.i b/gr-trellis/src/lib/trellis.i
deleted file mode 100644
index 0debf5e5da..0000000000
--- a/gr-trellis/src/lib/trellis.i
+++ /dev/null
@@ -1,58 +0,0 @@
-/* -*- c++ -*- */
-/*
- * Copyright 2009 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.
- */
-
-%include "gnuradio.i" // the common stuff
-
-//load generated python docstrings
-%include "trellis_swig_doc.i"
-
-%{
-#include "fsm.h"
-#include "interleaver.h"
-#include "trellis_permutation.h"
-#include "trellis_siso_f.h"
-#include "trellis_siso_combined_f.h"
-#include "trellis_constellation_metrics_cf.h"
-#include "digital_constellation.h"
-%}
-
-
-// ----------------------------------------------------------------
-
-%include "fsm.i"
-%include "interleaver.i"
-%include "trellis_permutation.i"
-%include "trellis_siso_f.i"
-%include "trellis_siso_combined_f.i"
-
-%include "siso_type.h"
-
-%include "trellis_constellation_metrics_cf.i"
-
-%include "trellis_generated.i"
-
-%import "digital_metric_type.h"
-%import "digital_constellation.i"
-
- //%pythoncode %{
- // from gnuradio.gr import TRELLIS_EUCLIDEAN, TRELLIS_HARD_SYMBOL, TRELLIS_HARD_BIT
- // %}
diff --git a/gr-trellis/src/lib/trellis_constellation_metrics_cf.cc b/gr-trellis/src/lib/trellis_constellation_metrics_cf.cc
deleted file mode 100644
index 6e6aa2dd03..0000000000
--- a/gr-trellis/src/lib/trellis_constellation_metrics_cf.cc
+++ /dev/null
@@ -1,90 +0,0 @@
-/* -*- c++ -*- */
-/*
- * Copyright 2004,2010,2011 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.
- */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <trellis_constellation_metrics_cf.h>
-#include <gr_io_signature.h>
-#include <assert.h>
-#include <stdexcept>
-#include <iostream>
-
-
-
-trellis_constellation_metrics_cf_sptr
-trellis_make_constellation_metrics_cf (digital_constellation_sptr constellation, trellis_metric_type_t TYPE)
-{
- return gnuradio::get_initial_sptr (new trellis_constellation_metrics_cf (constellation, TYPE));
-}
-
-
-
-trellis_constellation_metrics_cf::trellis_constellation_metrics_cf (digital_constellation_sptr constellation, trellis_metric_type_t TYPE)
- : gr_block ("constellation_metrics_cf",
- gr_make_io_signature (1, -1, sizeof (gr_complex)),
- gr_make_io_signature (1, -1, sizeof (float))),
- d_constellation (constellation),
- d_TYPE (TYPE),
- d_O (constellation->arity()),
- d_D (constellation->dimensionality())
-{
- set_relative_rate (1.0 * d_O / ((double) d_D));
- set_output_multiple ((int)d_O);
-}
-
-void
-trellis_constellation_metrics_cf::forecast (int noutput_items, gr_vector_int &ninput_items_required)
-{
- assert (noutput_items % d_O == 0);
- unsigned int input_required = d_D * noutput_items / d_O;
- unsigned int ninputs = ninput_items_required.size();
- for (unsigned int i = 0; i < ninputs; i++)
- ninput_items_required[i] = input_required;
-}
-
-
-
-int
-trellis_constellation_metrics_cf::general_work (int noutput_items,
- gr_vector_int &ninput_items,
- gr_vector_const_void_star &input_items,
- gr_vector_void_star &output_items)
-{
-
- assert (noutput_items % d_O == 0);
- assert (input_items.size() == output_items.size());
- unsigned int nstreams = input_items.size();
-
-for (unsigned int m=0;m<nstreams;m++) {
- const gr_complex *in = (gr_complex *) input_items[m];
- float *out = (float *) output_items[m];
-
- for (unsigned int i = 0; i < noutput_items / d_O ; i++){
- d_constellation->calc_metric(&(in[i*d_D]), &(out[i*d_O]), d_TYPE);
- }
-}
-
- consume_each (d_D * noutput_items / d_O);
- return noutput_items;
-}
diff --git a/gr-trellis/src/lib/trellis_constellation_metrics_cf.h b/gr-trellis/src/lib/trellis_constellation_metrics_cf.h
deleted file mode 100644
index 2c2070522c..0000000000
--- a/gr-trellis/src/lib/trellis_constellation_metrics_cf.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/* -*- c++ -*- */
-/*
- * Copyright 2004,2010,2011 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.
- */
-
-#ifndef INCLUDED_TRELLIS_CONSTELLATION_METRICS_CF_H
-#define INCLUDED_TRELLIS_CONSTELLATION_METRICS_CF_H
-
-#include <trellis_api.h>
-#include <gr_block.h>
-#include <digital_constellation.h>
-#include <digital_metric_type.h>
-
-class trellis_constellation_metrics_cf;
-typedef boost::shared_ptr<trellis_constellation_metrics_cf> trellis_constellation_metrics_cf_sptr;
-
-TRELLIS_API trellis_constellation_metrics_cf_sptr trellis_make_constellation_metrics_cf (digital_constellation_sptr constellation, trellis_metric_type_t TYPE);
-
-/*!
- * \brief Evaluate metrics for use by the Viterbi algorithm.
- * \ingroup coding_blk
- */
-class TRELLIS_API trellis_constellation_metrics_cf : public gr_block
-{
- public:
- void forecast (int noutput_items,
- gr_vector_int &ninput_items_required);
- int general_work (int noutput_items,
- gr_vector_int &ninput_items,
- gr_vector_const_void_star &input_items,
- gr_vector_void_star &output_items);
- protected:
- trellis_constellation_metrics_cf (digital_constellation_sptr constellation, trellis_metric_type_t TYPE);
-
- private:
- digital_constellation_sptr d_constellation;
- trellis_metric_type_t d_TYPE;
- unsigned int d_O;
- unsigned int d_D;
- friend TRELLIS_API trellis_constellation_metrics_cf_sptr trellis_make_constellation_metrics_cf (digital_constellation_sptr constellation, trellis_metric_type_t TYPE);
-
-};
-
-
-#endif
diff --git a/gr-trellis/src/lib/trellis_constellation_metrics_cf.i b/gr-trellis/src/lib/trellis_constellation_metrics_cf.i
deleted file mode 100644
index c17522b113..0000000000
--- a/gr-trellis/src/lib/trellis_constellation_metrics_cf.i
+++ /dev/null
@@ -1,33 +0,0 @@
-/* -*- c++ -*- */
-/*
- * Copyright 2004,2011 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.
- */
-
-// WARNING: this file is machine generated. Edits will be over written
-
-GR_SWIG_BLOCK_MAGIC(trellis,constellation_metrics_cf);
-
-trellis_constellation_metrics_cf_sptr trellis_make_constellation_metrics_cf (digital_constellation_sptr constellation, trellis_metric_type_t TYPE);
-
-class trellis_constellation_metrics_cf : public gr_block
-{
-private:
- trellis_constellation_metrics_cf (digital_constellation_sptr constellation, trellis_metric_type_t TYPE);
-};
diff --git a/gr-trellis/src/lib/trellis_encoder_XX.cc.t b/gr-trellis/src/lib/trellis_encoder_XX.cc.t
deleted file mode 100644
index dca92b08f3..0000000000
--- a/gr-trellis/src/lib/trellis_encoder_XX.cc.t
+++ /dev/null
@@ -1,76 +0,0 @@
-/* -*- c++ -*- */
-/*
- * Copyright 2004,2010 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.
- */
-
-// @WARNING@
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <@NAME@.h>
-#include <gr_io_signature.h>
-#include <iostream>
-
-@SPTR_NAME@
-trellis_make_@BASE_NAME@ (const fsm &FSM, int ST)
-{
- return gnuradio::get_initial_sptr (new @NAME@ (FSM,ST));
-}
-
-@NAME@::@NAME@ (const fsm &FSM, int ST)
- : gr_sync_block ("@BASE_NAME@",
- gr_make_io_signature (1, -1, sizeof (@I_TYPE@)),
- gr_make_io_signature (1, -1, sizeof (@O_TYPE@))),
- d_FSM (FSM),
- d_ST (ST)
-{
-}
-
-
-
-int
-@NAME@::work (int noutput_items,
- gr_vector_const_void_star &input_items,
- gr_vector_void_star &output_items)
-{
- int ST_tmp=0;
-
- assert (input_items.size() == output_items.size());
- int nstreams = input_items.size();
-
- for (int m=0;m<nstreams;m++) {
- const @I_TYPE@ *in = (const @I_TYPE@ *) input_items[m];
- @O_TYPE@ *out = (@O_TYPE@ *) output_items[m];
- ST_tmp = d_ST;
-
- // per stream processing
- for (int i = 0; i < noutput_items; i++){
- out[i] = (@O_TYPE@) d_FSM.OS()[ST_tmp*d_FSM.I()+in[i]]; // direction of time?
- ST_tmp = (int) d_FSM.NS()[ST_tmp*d_FSM.I()+in[i]];
- }
- // end per stream processing
- }
- d_ST = ST_tmp;
-
- return noutput_items;
-}
-
diff --git a/gr-trellis/src/lib/trellis_encoder_XX.i.t b/gr-trellis/src/lib/trellis_encoder_XX.i.t
deleted file mode 100644
index 29c9c4db33..0000000000
--- a/gr-trellis/src/lib/trellis_encoder_XX.i.t
+++ /dev/null
@@ -1,36 +0,0 @@
-/* -*- c++ -*- */
-/*
- * Copyright 2004 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.
- */
-
-// @WARNING@
-
-GR_SWIG_BLOCK_MAGIC(trellis,@BASE_NAME@);
-
-@SPTR_NAME@ trellis_make_@BASE_NAME@ (const fsm &FSM, int ST);
-
-class @NAME@ : public gr_sync_block
-{
-private:
- @NAME@ (const fsm &FSM, int ST);
-public:
- fsm FSM () const { return d_FSM; }
- int ST () const { return d_ST; }
-};
diff --git a/gr-trellis/src/lib/trellis_metrics_X.cc.t b/gr-trellis/src/lib/trellis_metrics_X.cc.t
deleted file mode 100644
index 77eb8c81b5..0000000000
--- a/gr-trellis/src/lib/trellis_metrics_X.cc.t
+++ /dev/null
@@ -1,97 +0,0 @@
-/* -*- c++ -*- */
-/*
- * Copyright 2004,2010 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.
- */
-
-// @WARNING@
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <@NAME@.h>
-#include <gr_io_signature.h>
-#include <assert.h>
-#include <stdexcept>
-#include <iostream>
-
-
-@SPTR_NAME@
-trellis_make_@BASE_NAME@ (int O, int D, const std::vector<@I_TYPE@> &TABLE, trellis_metric_type_t TYPE)
-{
- return gnuradio::get_initial_sptr (new @NAME@ (O,D,TABLE,TYPE));
-}
-
-
-
-@NAME@::@NAME@ (int O, int D, const std::vector<@I_TYPE@> &TABLE, trellis_metric_type_t TYPE)
- : gr_block ("@BASE_NAME@",
- gr_make_io_signature (1, -1, sizeof (@I_TYPE@)),
- gr_make_io_signature (1, -1, sizeof (float))),
- d_O (O),
- d_D (D),
- d_TYPE (TYPE),
- d_TABLE (TABLE)
-{
- set_relative_rate (1.0 * d_O / ((double) d_D));
- set_output_multiple ((int)d_O);
-}
-
-void @NAME@::set_TABLE (const std::vector<@I_TYPE@> &table)
-{
- d_TABLE = table;
-}
-
-
-void
-@NAME@::forecast (int noutput_items, gr_vector_int &ninput_items_required)
-{
- assert (noutput_items % d_O == 0);
- int input_required = d_D * noutput_items / d_O;
- unsigned ninputs = ninput_items_required.size();
- for (unsigned int i = 0; i < ninputs; i++)
- ninput_items_required[i] = input_required;
-}
-
-
-
-int
-@NAME@::general_work (int noutput_items,
- gr_vector_int &ninput_items,
- gr_vector_const_void_star &input_items,
- gr_vector_void_star &output_items)
-{
-
- assert (noutput_items % d_O == 0);
- assert (input_items.size() == output_items.size());
- int nstreams = input_items.size();
-
-for (int m=0;m<nstreams;m++) {
- const @I_TYPE@ *in = (@I_TYPE@ *) input_items[m];
- float *out = (float *) output_items[m];
-
- for (int i = 0; i < noutput_items / d_O ; i++){
- calc_metric(d_O, d_D, d_TABLE,&(in[i*d_D]),&(out[i*d_O]), d_TYPE);
- }
-}
-
- consume_each (d_D * noutput_items / d_O);
- return noutput_items;
-}
diff --git a/gr-trellis/src/lib/trellis_metrics_X.h.t b/gr-trellis/src/lib/trellis_metrics_X.h.t
deleted file mode 100644
index ab406c51ea..0000000000
--- a/gr-trellis/src/lib/trellis_metrics_X.h.t
+++ /dev/null
@@ -1,66 +0,0 @@
-/* -*- c++ -*- */
-/*
- * Copyright 2004 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.
- */
-
-// @WARNING@
-
-#ifndef @GUARD_NAME@
-#define @GUARD_NAME@
-
-#include <trellis_api.h>
-#include <gr_block.h>
-#include "calc_metric.h"
-
-class @NAME@;
-typedef boost::shared_ptr<@NAME@> @SPTR_NAME@;
-
-TRELLIS_API @SPTR_NAME@ trellis_make_@BASE_NAME@ (int O, int D, const std::vector<@I_TYPE@> &TABLE, trellis_metric_type_t TYPE);
-
-/*!
- * \brief Evaluate metrics for use by the Viterbi algorithm.
- * \ingroup coding_blk
- */
-class TRELLIS_API @NAME@ : public gr_block
-{
- int d_O;
- int d_D;
- trellis_metric_type_t d_TYPE;
- std::vector<@I_TYPE@> d_TABLE;
-
- friend TRELLIS_API @SPTR_NAME@ trellis_make_@BASE_NAME@ (int O, int D, const std::vector<@I_TYPE@> &TABLE, trellis_metric_type_t TYPE);
- @NAME@ (int O, int D, const std::vector<@I_TYPE@> &TABLE, trellis_metric_type_t TYPE);
-
-public:
- int O () const { return d_O; }
- int D () const { return d_D; }
- trellis_metric_type_t TYPE () const { return d_TYPE; }
- std::vector<@I_TYPE@> TABLE () const { return d_TABLE; }
- void set_TABLE (const std::vector<@I_TYPE@> &table);
- void forecast (int noutput_items,
- gr_vector_int &ninput_items_required);
- int general_work (int noutput_items,
- gr_vector_int &ninput_items,
- gr_vector_const_void_star &input_items,
- gr_vector_void_star &output_items);
-};
-
-
-#endif
diff --git a/gr-trellis/src/lib/trellis_pccc_decoder_X.cc.t b/gr-trellis/src/lib/trellis_pccc_decoder_X.cc.t
deleted file mode 100644
index d79192491e..0000000000
--- a/gr-trellis/src/lib/trellis_pccc_decoder_X.cc.t
+++ /dev/null
@@ -1,124 +0,0 @@
-/* -*- c++ -*- */
-/*
- * Copyright 2004,2010 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.
- */
-
-// @WARNING@
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <@NAME@.h>
-#include <gr_io_signature.h>
-#include <assert.h>
-#include <iostream>
-#include "core_algorithms.h"
-
-
-static const float INF = 1.0e9;
-
-@SPTR_NAME@
-trellis_make_@BASE_NAME@ (
- const fsm &FSM1, int ST10, int ST1K,
- const fsm &FSM2, int ST20, int ST2K,
- const interleaver &INTERLEAVER,
- int blocklength,
- int repetitions,
- trellis_siso_type_t SISO_TYPE
-)
-{
- return gnuradio::get_initial_sptr (new @NAME@ (
- FSM1, ST10, ST1K,
- FSM2, ST20, ST2K,
- INTERLEAVER,
- blocklength,
- repetitions,
- SISO_TYPE
- ));
-}
-
-@NAME@::@NAME@ (
- const fsm &FSM1, int ST10, int ST1K,
- const fsm &FSM2, int ST20, int ST2K,
- const interleaver &INTERLEAVER,
- int blocklength,
- int repetitions,
- trellis_siso_type_t SISO_TYPE
-)
- : gr_block ("@BASE_NAME@",
- gr_make_io_signature (1, 1, sizeof (float)),
- gr_make_io_signature (1, 1, sizeof (@O_TYPE@))),
- d_FSM1 (FSM1), d_ST10 (ST10), d_ST1K (ST1K),
- d_FSM2 (FSM2), d_ST20 (ST20), d_ST2K (ST2K),
- d_INTERLEAVER (INTERLEAVER),
- d_blocklength (blocklength),
- d_repetitions (repetitions),
- d_SISO_TYPE (SISO_TYPE)
-{
- assert(d_FSM1.I() == d_FSM2.I());
- set_relative_rate (1.0 / ((double) d_FSM1.O() * d_FSM2.O()));
- set_output_multiple (d_blocklength);
-}
-
-
-void
-@NAME@::forecast (int noutput_items, gr_vector_int &ninput_items_required)
-{
- assert (noutput_items % d_blocklength == 0);
- int input_required = d_FSM1.O() * d_FSM2.O() * noutput_items ;
- ninput_items_required[0] = input_required;
-}
-
-
-
-//===========================================================
-
-int
-@NAME@::general_work (int noutput_items,
- gr_vector_int &ninput_items,
- gr_vector_const_void_star &input_items,
- gr_vector_void_star &output_items)
-{
- assert (noutput_items % d_blocklength == 0);
- int nblocks = noutput_items / d_blocklength;
-
- float (*p2min)(float, float) = NULL;
- if(d_SISO_TYPE == TRELLIS_MIN_SUM)
- p2min = &min;
- else if(d_SISO_TYPE == TRELLIS_SUM_PRODUCT)
- p2min = &min_star;
-
-
- const float *in = (const float *) input_items[0];
- @O_TYPE@ *out = (@O_TYPE@ *) output_items[0];
- for (int n=0;n<nblocks;n++) {
- pccc_decoder(
- d_FSM1, d_ST10, d_ST1K,
- d_FSM2, d_ST20, d_ST2K,
- d_INTERLEAVER, d_blocklength, d_repetitions,
- p2min,
- &(in[n*d_blocklength*d_FSM1.O()*d_FSM2.O()]),&(out[n*d_blocklength])
- );
- }
-
- consume_each (d_FSM1.O() * d_FSM2.O() * noutput_items );
- return noutput_items;
-}
diff --git a/gr-trellis/src/lib/trellis_pccc_decoder_X.h.t b/gr-trellis/src/lib/trellis_pccc_decoder_X.h.t
deleted file mode 100644
index e9bc946818..0000000000
--- a/gr-trellis/src/lib/trellis_pccc_decoder_X.h.t
+++ /dev/null
@@ -1,103 +0,0 @@
-/* -*- c++ -*- */
-/*
- * Copyright 2004 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.
- */
-
-// @WARNING@
-
-#ifndef @GUARD_NAME@
-#define @GUARD_NAME@
-
-#include <trellis_api.h>
-#include "fsm.h"
-#include "interleaver.h"
-#include <gr_block.h>
-#include <vector>
-#include "siso_type.h"
-
-class @NAME@;
-typedef boost::shared_ptr<@NAME@> @SPTR_NAME@;
-
-TRELLIS_API @SPTR_NAME@ trellis_make_@BASE_NAME@ (
- const fsm &FSM1, int ST10, int ST1K,
- const fsm &FSM2, int ST20, int ST2K,
- const interleaver &INTERLEAVER,
- int blocklength,
- int repetitions,
- trellis_siso_type_t SISO_TYPE // perform "min-sum" or "sum-product" combining
-);
-
-
-/*!
- * \ingroup coding_blk
- */
-class TRELLIS_API @NAME@ : public gr_block
-{
- fsm d_FSM1;
- int d_ST10;
- int d_ST1K;
- fsm d_FSM2;
- int d_ST20;
- int d_ST2K;
- interleaver d_INTERLEAVER;
- int d_blocklength;
- int d_repetitions;
- trellis_siso_type_t d_SISO_TYPE;
- std::vector<float> d_buffer;
-
- friend TRELLIS_API @SPTR_NAME@ trellis_make_@BASE_NAME@ (
- const fsm &FSM1, int ST10, int ST1K,
- const fsm &FSM2, int ST20, int ST2K,
- const interleaver &INTERLEAVER,
- int blocklength,
- int repetitions,
- trellis_siso_type_t SISO_TYPE
- );
-
- @NAME@ (
- const fsm &FSM1, int ST10, int ST1K,
- const fsm &FSM2, int ST20, int ST2K,
- const interleaver &INTERLEAVER,
- int blocklength,
- int repetitions,
- trellis_siso_type_t SISO_TYPE
- );
-
-public:
- fsm FSM1 () const { return d_FSM1; }
- fsm FSM2 () const { return d_FSM2; }
- int ST10 () const { return d_ST10; }
- int ST1K () const { return d_ST1K; }
- int ST20 () const { return d_ST20; }
- int ST2K () const { return d_ST2K; }
- interleaver INTERLEAVER () const { return d_INTERLEAVER; }
- int blocklength () const { return d_blocklength; }
- int repetitions () const { return d_repetitions; }
- trellis_siso_type_t SISO_TYPE () const { return d_SISO_TYPE; }
-
- void forecast (int noutput_items,
- gr_vector_int &ninput_items_required);
- int general_work (int noutput_items,
- gr_vector_int &ninput_items,
- gr_vector_const_void_star &input_items,
- gr_vector_void_star &output_items);
-};
-
-#endif
diff --git a/gr-trellis/src/lib/trellis_pccc_decoder_X.i.t b/gr-trellis/src/lib/trellis_pccc_decoder_X.i.t
deleted file mode 100644
index 83d7fe969d..0000000000
--- a/gr-trellis/src/lib/trellis_pccc_decoder_X.i.t
+++ /dev/null
@@ -1,60 +0,0 @@
-/* -*- c++ -*- */
-/*
- * Copyright 2004 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.
- */
-
-// @WARNING@
-
-GR_SWIG_BLOCK_MAGIC(trellis,@BASE_NAME@);
-
-@SPTR_NAME@ trellis_make_@BASE_NAME@ (
- const fsm &FSM1, int ST10, int ST1K,
- const fsm &FSM2, int ST20, int ST2K,
- const interleaver &INTERLEAVER,
- int blocklength,
- int repetitions,
- trellis_siso_type_t SISO_TYPE
-);
-
-
-class @NAME@ : public gr_block
-{
-private:
- @NAME@ (
- const fsm &FSM1, int ST10, int ST1K,
- const fsm &FSM2, int ST20, int ST2K,
- const interleaver &INTERLEAVER,
- int blocklength,
- int repetitions,
- trellis_siso_type_t SISO_TYPE
- );
-
-public:
- fsm FSM1 () const { return d_FSM1; }
- fsm FSM2 () const { return d_FSM2; }
- int ST10 () const { return d_ST10; }
- int ST1K () const { return d_ST1K; }
- int ST20 () const { return d_ST20; }
- int ST2K () const { return d_ST2K; }
- interleaver INTERLEAVER () const { return d_INTERLEAVER; }
- int blocklength () const { return d_blocklength; }
- int repetitions () const { return d_repetitions; }
- trellis_siso_type_t SISO_TYPE () const { return d_SISO_TYPE; }
-};
diff --git a/gr-trellis/src/lib/trellis_pccc_decoder_combined_XX.cc.t b/gr-trellis/src/lib/trellis_pccc_decoder_combined_XX.cc.t
deleted file mode 100644
index 03e21de1f5..0000000000
--- a/gr-trellis/src/lib/trellis_pccc_decoder_combined_XX.cc.t
+++ /dev/null
@@ -1,147 +0,0 @@
-/* -*- c++ -*- */
-/*
- * Copyright 2004,2010 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.
- */
-
-// @WARNING@
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <@NAME@.h>
-#include <gr_io_signature.h>
-#include <assert.h>
-#include <iostream>
-#include "core_algorithms.h"
-
-
-static const float INF = 1.0e9;
-
-@SPTR_NAME@
-trellis_make_@BASE_NAME@ (
- const fsm &FSMo, int STo0, int SToK,
- const fsm &FSMi, int STi0, int STiK,
- const interleaver &INTERLEAVER,
- int blocklength,
- int repetitions,
- trellis_siso_type_t SISO_TYPE,
- int D,
- const std::vector<@I_TYPE@> &TABLE,
- trellis_metric_type_t METRIC_TYPE,
- float scaling
-)
-{
- return gnuradio::get_initial_sptr (new @NAME@ (
- FSMo, STo0, SToK,
- FSMi, STi0, STiK,
- INTERLEAVER,
- blocklength,
- repetitions,
- SISO_TYPE,
- D,
- TABLE,METRIC_TYPE,
- scaling
- ));
-}
-
-@NAME@::@NAME@ (
- const fsm &FSMo, int STo0, int SToK,
- const fsm &FSMi, int STi0, int STiK,
- const interleaver &INTERLEAVER,
- int blocklength,
- int repetitions,
- trellis_siso_type_t SISO_TYPE,
- int D,
- const std::vector<@I_TYPE@> &TABLE,
- trellis_metric_type_t METRIC_TYPE,
- float scaling
-)
- : gr_block ("@BASE_NAME@",
- gr_make_io_signature (1, 1, sizeof (@I_TYPE@)),
- gr_make_io_signature (1, 1, sizeof (@O_TYPE@))),
- d_FSMo (FSMo), d_STo0 (STo0), d_SToK (SToK),
- d_FSMi (FSMi), d_STi0 (STi0), d_STiK (STiK),
- d_INTERLEAVER (INTERLEAVER),
- d_blocklength (blocklength),
- d_repetitions (repetitions),
- d_SISO_TYPE (SISO_TYPE),
- d_D (D),
- d_TABLE (TABLE),
- d_METRIC_TYPE (METRIC_TYPE),
- d_scaling (scaling)
-{
- assert(d_FSMo.I() == d_FSMi.I());
- set_relative_rate (1.0 / ((double) d_D));
- set_output_multiple (d_blocklength);
-}
-
-void @NAME@::set_scaling(float scaling)
-{
- d_scaling = scaling;
-}
-
-
-void
-@NAME@::forecast (int noutput_items, gr_vector_int &ninput_items_required)
-{
- assert (noutput_items % d_blocklength == 0);
- int input_required = d_D * noutput_items ;
- ninput_items_required[0] = input_required;
-}
-
-
-
-//===========================================================
-
-int
-@NAME@::general_work (int noutput_items,
- gr_vector_int &ninput_items,
- gr_vector_const_void_star &input_items,
- gr_vector_void_star &output_items)
-{
- assert (noutput_items % d_blocklength == 0);
- int nblocks = noutput_items / d_blocklength;
-
- float (*p2min)(float, float) = NULL;
- if(d_SISO_TYPE == TRELLIS_MIN_SUM)
- p2min = &min;
- else if(d_SISO_TYPE == TRELLIS_SUM_PRODUCT)
- p2min = &min_star;
-
-
- const @I_TYPE@ *in = (const @I_TYPE@ *) input_items[0];
- @O_TYPE@ *out = (@O_TYPE@ *) output_items[0];
- for (int n=0;n<nblocks;n++) {
- pccc_decoder_combined(
- d_FSMo, d_STo0, d_SToK,
- d_FSMi, d_STi0, d_STiK,
- d_INTERLEAVER, d_blocklength, d_repetitions,
- p2min,
- d_D,d_TABLE,
- d_METRIC_TYPE,
- d_scaling,
- &(in[n*d_blocklength*d_D]),&(out[n*d_blocklength])
- );
- }
-
- consume_each (d_D * noutput_items );
- return noutput_items;
-}
diff --git a/gr-trellis/src/lib/trellis_pccc_decoder_combined_XX.h.t b/gr-trellis/src/lib/trellis_pccc_decoder_combined_XX.h.t
deleted file mode 100644
index 6e45ea10ac..0000000000
--- a/gr-trellis/src/lib/trellis_pccc_decoder_combined_XX.h.t
+++ /dev/null
@@ -1,125 +0,0 @@
-/* -*- c++ -*- */
-/*
- * Copyright 2004 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.
- */
-
-// @WARNING@
-
-#ifndef @GUARD_NAME@
-#define @GUARD_NAME@
-
-#include <trellis_api.h>
-#include "fsm.h"
-#include "interleaver.h"
-#include <gr_block.h>
-#include <vector>
-#include "calc_metric.h"
-#include "siso_type.h"
-
-class @NAME@;
-typedef boost::shared_ptr<@NAME@> @SPTR_NAME@;
-
-TRELLIS_API @SPTR_NAME@ trellis_make_@BASE_NAME@ (
- const fsm &FSMo, int STo0, int SToK,
- const fsm &FSMi, int STi0, int STiK,
- const interleaver &INTERLEAVER,
- int blocklength,
- int repetitions,
- trellis_siso_type_t SISO_TYPE, // perform "min-sum" or "sum-product" combining
- int D,
- const std::vector<@I_TYPE@> &TABLE,
- trellis_metric_type_t METRIC_TYPE,
- float scaling
-);
-
-
-/*!
- * \ingroup coding_blk
- */
-class TRELLIS_API @NAME@ : public gr_block
-{
- fsm d_FSMo;
- int d_STo0;
- int d_SToK;
- fsm d_FSMi;
- int d_STi0;
- int d_STiK;
- interleaver d_INTERLEAVER;
- int d_blocklength;
- int d_repetitions;
- trellis_siso_type_t d_SISO_TYPE;
- int d_D;
- std::vector<@I_TYPE@> d_TABLE;
- trellis_metric_type_t d_METRIC_TYPE;
- float d_scaling;
- std::vector<float> d_buffer;
-
- friend TRELLIS_API @SPTR_NAME@ trellis_make_@BASE_NAME@ (
- const fsm &FSMo, int STo0, int SToK,
- const fsm &FSMi, int STi0, int STiK,
- const interleaver &INTERLEAVER,
- int blocklength,
- int repetitions,
- trellis_siso_type_t SISO_TYPE,
- int D,
- const std::vector<@I_TYPE@> &TABLE,
- trellis_metric_type_t METRIC_TYPE,
- float scaling
- );
-
- @NAME@ (
- const fsm &FSMo, int STo0, int SToK,
- const fsm &FSMi, int STi0, int STiK,
- const interleaver &INTERLEAVER,
- int blocklength,
- int repetitions,
- trellis_siso_type_t SISO_TYPE,
- int D,
- const std::vector<@I_TYPE@> &TABLE,
- trellis_metric_type_t METRIC_TYPE,
- float scaling
- );
-
-public:
- fsm FSM1 () const { return d_FSMo; }
- fsm FSM2 () const { return d_FSMi; }
- int ST10 () const { return d_STo0; }
- int ST1K () const { return d_SToK; }
- int ST20 () const { return d_STi0; }
- int ST2K () const { return d_STiK; }
- interleaver INTERLEAVER () const { return d_INTERLEAVER; }
- int blocklength () const { return d_blocklength; }
- int repetitions () const { return d_repetitions; }
- int D () const { return d_D; }
- std::vector<@I_TYPE@> TABLE () const { return d_TABLE; }
- trellis_metric_type_t METRIC_TYPE () const { return d_METRIC_TYPE; }
- trellis_siso_type_t SISO_TYPE () const { return d_SISO_TYPE; }
- float scaling () const { return d_scaling; }
- void set_scaling (float scaling);
-
- void forecast (int noutput_items,
- gr_vector_int &ninput_items_required);
- int general_work (int noutput_items,
- gr_vector_int &ninput_items,
- gr_vector_const_void_star &input_items,
- gr_vector_void_star &output_items);
-};
-
-#endif
diff --git a/gr-trellis/src/lib/trellis_pccc_decoder_combined_XX.i.t b/gr-trellis/src/lib/trellis_pccc_decoder_combined_XX.i.t
deleted file mode 100644
index d841f67b45..0000000000
--- a/gr-trellis/src/lib/trellis_pccc_decoder_combined_XX.i.t
+++ /dev/null
@@ -1,73 +0,0 @@
-/* -*- c++ -*- */
-/*
- * Copyright 2004 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.
- */
-
-// @WARNING@
-
-GR_SWIG_BLOCK_MAGIC(trellis,@BASE_NAME@);
-
-@SPTR_NAME@ trellis_make_@BASE_NAME@ (
- const fsm &FSMo, int STo0, int SToK,
- const fsm &FSMi, int STi0, int STiK,
- const interleaver &INTERLEAVER,
- int blocklength,
- int repetitions,
- trellis_siso_type_t SISO_TYPE,
- int D,
- const std::vector<@I_TYPE@> &TABLE,
- trellis_metric_type_t METRIC_TYPE,
- float scaling
-);
-
-
-class @NAME@ : public gr_block
-{
-private:
- @NAME@ (
- const fsm &FSMo, int STo0, int SToK,
- const fsm &FSMi, int STi0, int STiK,
- const interleaver &INTERLEAVER,
- int blocklength,
- int repetitions,
- trellis_siso_type_t SISO_TYPE,
- int D,
- const std::vector<@I_TYPE@> &TABLE,
- trellis_metric_type_t METRIC_TYPE,
- float scaling
- );
-
-public:
- fsm FSM1 () const { return d_FSMo; }
- fsm FSM2 () const { return d_FSMi; }
- int ST10 () const { return d_STo0; }
- int ST1K () const { return d_SToK; }
- int ST20 () const { return d_STi0; }
- int ST2K () const { return d_STiK; }
- interleaver INTERLEAVER () const { return d_INTERLEAVER; }
- int blocklength () const { return d_blocklength; }
- int repetitions () const { return d_repetitions; }
- int D () const { return d_D; }
- std::vector<@I_TYPE@> TABLE () const { return d_TABLE; }
- trellis_metric_type_t METRIC_TYPE () const { return d_METRIC_TYPE; }
- trellis_siso_type_t SISO_TYPE () const { return d_SISO_TYPE; }
- float scaling() const { return d_scaling; }
- void set_scaling (float scaling);
-};
diff --git a/gr-trellis/src/lib/trellis_pccc_encoder_XX.cc.t b/gr-trellis/src/lib/trellis_pccc_encoder_XX.cc.t
deleted file mode 100644
index 6cab858cd5..0000000000
--- a/gr-trellis/src/lib/trellis_pccc_encoder_XX.cc.t
+++ /dev/null
@@ -1,90 +0,0 @@
-/* -*- c++ -*- */
-/*
- * Copyright 2004,2010 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.
- */
-
-// @WARNING@
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <@NAME@.h>
-#include <gr_io_signature.h>
-#include <iostream>
-
-@SPTR_NAME@
-trellis_make_@BASE_NAME@ (
- const fsm &FSM1, int ST1,
- const fsm &FSM2, int ST2,
- const interleaver &INTERLEAVER,
- int blocklength
-)
-{
- return gnuradio::get_initial_sptr (new @NAME@ (FSM1,ST1,FSM2,ST2,INTERLEAVER,blocklength));
-}
-
-@NAME@::@NAME@ (
- const fsm &FSM1, int ST1,
- const fsm &FSM2, int ST2,
- const interleaver &INTERLEAVER,
- int blocklength
-)
- : gr_sync_block ("@BASE_NAME@",
- gr_make_io_signature (1, 1, sizeof (@I_TYPE@)),
- gr_make_io_signature (1, 1, sizeof (@O_TYPE@))),
- d_FSM1 (FSM1),
- d_ST1 (ST1),
- d_FSM2 (FSM2),
- d_ST2 (ST2),
- d_INTERLEAVER (INTERLEAVER),
- d_blocklength (blocklength)
-{
- assert(d_FSM1.I() == d_FSM2.I());
- set_output_multiple(d_blocklength);
- d_buffer.resize(d_blocklength);
-}
-
-
-
-int
-@NAME@::work (int noutput_items,
- gr_vector_const_void_star &input_items,
- gr_vector_void_star &output_items)
-{
- assert(noutput_items%d_blocklength ==0);
- for (int b = 0 ; b<noutput_items/d_blocklength; b++) {
- const @I_TYPE@ *in = (const @I_TYPE@ *) input_items[0]+b*d_blocklength;
- @O_TYPE@ *out = (@O_TYPE@ *) output_items[0]+b*d_blocklength;
-
- int ST1_tmp = d_ST1;
- int ST2_tmp = d_ST2;
- for (int i = 0; i < d_blocklength; i++){
- int k = d_INTERLEAVER.INTER()[i];
- int o1 = d_FSM1.OS()[ST1_tmp*d_FSM1.I()+in[i]];
- ST1_tmp = (int) d_FSM1.NS()[ST1_tmp*d_FSM1.I()+in[i]];
- int o2 = d_FSM2.OS()[ST2_tmp*d_FSM2.I()+in[k]];
- ST2_tmp = (int) d_FSM2.NS()[ST2_tmp*d_FSM2.I()+in[k]];
- out[i] = (@O_TYPE@) (o1*d_FSM1.O() + o2);
- }
- }
- return noutput_items;
-}
-
diff --git a/gr-trellis/src/lib/trellis_pccc_encoder_XX.h.t b/gr-trellis/src/lib/trellis_pccc_encoder_XX.h.t
deleted file mode 100644
index 75a22b829c..0000000000
--- a/gr-trellis/src/lib/trellis_pccc_encoder_XX.h.t
+++ /dev/null
@@ -1,84 +0,0 @@
-/* -*- c++ -*- */
-/*
- * Copyright 2004 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.
- */
-
-// @WARNING@
-
-#ifndef @GUARD_NAME@
-#define @GUARD_NAME@
-
-#include <trellis_api.h>
-#include <vector>
-#include "fsm.h"
-#include "interleaver.h"
-#include <gr_sync_block.h>
-
-class @NAME@;
-typedef boost::shared_ptr<@NAME@> @SPTR_NAME@;
-
-TRELLIS_API @SPTR_NAME@ trellis_make_@BASE_NAME@ (
- const fsm &FSM1, int ST1,
- const fsm &FSM2, int ST2,
- const interleaver &INTERLEAVER,
- int blocklength
-);
-
-/*!
- * \brief SCCC encoder.
- * \ingroup coding_blk
- */
-class TRELLIS_API @NAME@ : public gr_sync_block
-{
-private:
- friend TRELLIS_API @SPTR_NAME@ trellis_make_@BASE_NAME@ (
- const fsm &FSM1, int ST1,
- const fsm &FSM2, int ST2,
- const interleaver &INTERLEAVER,
- int blocklength
- );
- fsm d_FSM1;
- int d_ST1;
- fsm d_FSM2;
- int d_ST2;
- interleaver d_INTERLEAVER;
- int d_blocklength;
- std::vector<int> d_buffer;
- @NAME@ (
- const fsm &FSM1, int ST1,
- const fsm &FSM2, int ST2,
- const interleaver &INTERLEAVER,
- int blocklength
- );
-
-public:
- fsm FSM1 () const { return d_FSM1; }
- int ST1 () const { return d_ST1; }
- fsm FSM2 () const { return d_FSM2; }
- int ST2 () const { return d_ST2; }
- interleaver INTERLEAVER () const { return d_INTERLEAVER; }
- int blocklength () const { return d_blocklength; }
-
- int work (int noutput_items,
- gr_vector_const_void_star &input_items,
- gr_vector_void_star &output_items);
-};
-
-#endif
diff --git a/gr-trellis/src/lib/trellis_pccc_encoder_XX.i.t b/gr-trellis/src/lib/trellis_pccc_encoder_XX.i.t
deleted file mode 100644
index c02ee428a3..0000000000
--- a/gr-trellis/src/lib/trellis_pccc_encoder_XX.i.t
+++ /dev/null
@@ -1,50 +0,0 @@
-/* -*- c++ -*- */
-/*
- * Copyright 2004 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.
- */
-
-// @WARNING@
-
-GR_SWIG_BLOCK_MAGIC(trellis,@BASE_NAME@);
-
-@SPTR_NAME@ trellis_make_@BASE_NAME@ (
- const fsm &FSM1, int ST1,
- const fsm &FSM2, int ST2,
- const interleaver &INTERLEAVER,
- int blocklength
-);
-
-class @NAME@ : public gr_sync_block
-{
-private:
- @NAME@ (
- const fsm &FSM1, int ST1,
- const fsm &FSM2, int ST2,
- const interleaver &INTERLEAVER,
- int blocklength
- );
-public:
- fsm FSM1 () const { return d_FSM1; }
- int ST1 () const { return d_ST1; }
- fsm FSM2 () const { return d_FSM2; }
- int ST2 () const { return d_ST2; }
- interleaver INTERLEAVER () const { return d_INTERLEAVER; }
- int blocklength () const { return d_blocklength; }
-};
diff --git a/gr-trellis/src/lib/trellis_permutation.cc b/gr-trellis/src/lib/trellis_permutation.cc
deleted file mode 100644
index 57c6d26938..0000000000
--- a/gr-trellis/src/lib/trellis_permutation.cc
+++ /dev/null
@@ -1,82 +0,0 @@
-/* -*- c++ -*- */
-/*
- * Copyright 2004,2010 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.
- */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <trellis_permutation.h>
-#include <gr_io_signature.h>
-#include <iostream>
-#include <string.h>
-
-trellis_permutation_sptr
-trellis_make_permutation (int K, const std::vector<int> &TABLE, int SYMS_PER_BLOCK, size_t BYTES_PER_SYMBOL)
-{
- return gnuradio::get_initial_sptr(new trellis_permutation (K,TABLE,SYMS_PER_BLOCK,BYTES_PER_SYMBOL));
-}
-
-trellis_permutation::trellis_permutation (int K, const std::vector<int> &TABLE, int SYMS_PER_BLOCK, size_t BYTES_PER_SYMBOL)
- : gr_sync_block ("permutation",
- gr_make_io_signature (1, -1, BYTES_PER_SYMBOL),
- gr_make_io_signature (1, -1, BYTES_PER_SYMBOL)),
- d_K (K),
- d_TABLE (TABLE),
- d_SYMS_PER_BLOCK (SYMS_PER_BLOCK),
- d_BYTES_PER_SYMBOL (BYTES_PER_SYMBOL)
-{
- set_output_multiple (d_K*SYMS_PER_BLOCK);
- //std::cout << d_K << "\n";
-}
-
-
-
-int
-trellis_permutation::work (int noutput_items,
- gr_vector_const_void_star &input_items,
- gr_vector_void_star &output_items)
-{
- int nstreams = input_items.size();
- assert (input_items.size() == output_items.size());
- assert (noutput_items % d_K ==0);
-
- for (int m=0;m<nstreams;m++) {
- const char *in = (const char *) input_items[m];
- char *out = (char *) output_items[m];
-
- // per stream processing
- for (int i = 0; i < noutput_items/d_SYMS_PER_BLOCK; i++){
- // Index i refers to blocks.
- // Begining of packet (in blocks)
- int i0 = d_K*(i/d_K);
- // position of block within packet (in blocks)
- int j0 = i%d_K;
- // new position of block within packet (in blocks)
- int k0 = d_TABLE[j0];
- memcpy(&(out[i*d_SYMS_PER_BLOCK*d_BYTES_PER_SYMBOL]),
- &(in[(i0+k0)*d_SYMS_PER_BLOCK*d_BYTES_PER_SYMBOL]),
- d_BYTES_PER_SYMBOL*d_SYMS_PER_BLOCK);
- }
- // end per stream processing
- }
- return noutput_items;
-}
diff --git a/gr-trellis/src/lib/trellis_permutation.h b/gr-trellis/src/lib/trellis_permutation.h
deleted file mode 100644
index cc40518c2c..0000000000
--- a/gr-trellis/src/lib/trellis_permutation.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/* -*- c++ -*- */
-/*
- * Copyright 2004 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.
- */
-
-
-#ifndef INCLUDED_TRELLIS_PERMUTATION_H
-#define INCLUDED_TRELLIS_PERMUTATION_H
-
-#include <trellis_api.h>
-#include <vector>
-#include <gr_sync_block.h>
-
-class trellis_permutation;
-typedef boost::shared_ptr<trellis_permutation> trellis_permutation_sptr;
-
-TRELLIS_API trellis_permutation_sptr trellis_make_permutation (int K, const std::vector<int> &TABLE, int SYMS_PER_BLOCK, size_t BYTES_PER_SYMBOL);
-
-/*!
- * \brief Permutation.
- * \ingroup coding_blk
- */
-class TRELLIS_API trellis_permutation : public gr_sync_block
-{
-private:
- friend TRELLIS_API trellis_permutation_sptr trellis_make_permutation (int K, const std::vector<int> &TABLE, int SYMS_PER_BLOCK, size_t BYTES_PER_SYMBOL);
- int d_K;
- std::vector<int> d_TABLE;
- int d_SYMS_PER_BLOCK;
- size_t d_BYTES_PER_SYMBOL;
- trellis_permutation (int K, const std::vector<int> &TABLE, int SYMS_PER_BLOCK, size_t NBYTES);
-
-public:
- int K () const { return d_K; }
- const std::vector<int> & TABLE () const { return d_TABLE; }
- int SYMS_PER_BLOCK () const { return d_SYMS_PER_BLOCK; }
- size_t BYTES_PER_SYMBOL () const { return d_BYTES_PER_SYMBOL; }
-
- int work (int noutput_items,
- gr_vector_const_void_star &input_items,
- gr_vector_void_star &output_items);
-};
-
-#endif
diff --git a/gr-trellis/src/lib/trellis_permutation.i b/gr-trellis/src/lib/trellis_permutation.i
deleted file mode 100644
index fdfaa44d33..0000000000
--- a/gr-trellis/src/lib/trellis_permutation.i
+++ /dev/null
@@ -1,41 +0,0 @@
-/* -*- c++ -*- */
-/*
- * Copyright 2004 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.
- */
-
-GR_SWIG_BLOCK_MAGIC(trellis,permutation);
-
-trellis_permutation_sptr trellis_make_permutation (int K, const std::vector<int> &TABLE, int SYMS_PER_BLOCK, size_t BYTES_PER_SYMBOL);
-
-class trellis_permutation : public gr_sync_block
-{
-private:
- int d_K;
- std::vector<int> d_TABLE;
- int d_SYMS_PER_BLOCK;
- size_t d_BYTES_PER_SYMBOL;
- trellis_permutation (int K, const std::vector<int> &TABLE, int SYMS_PER_BLOCK, size_t BYTES_PER_SYMBOL);
-
-public:
- int K () const { return d_K; }
- const std::vector<int> & TABLE () const { return d_TABLE; }
- int SYMS_PER_BLOCK () const { return d_SYMS_PER_BLOCK; }
- size_t BYTES_PER_SYMBOL () const { return d_BYTES_PER_SYMBOL; }
-};
diff --git a/gr-trellis/src/lib/trellis_sccc_decoder_X.cc.t b/gr-trellis/src/lib/trellis_sccc_decoder_X.cc.t
deleted file mode 100644
index c9b78aa8f6..0000000000
--- a/gr-trellis/src/lib/trellis_sccc_decoder_X.cc.t
+++ /dev/null
@@ -1,124 +0,0 @@
-/* -*- c++ -*- */
-/*
- * Copyright 2004,2010 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.
- */
-
-// @WARNING@
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <@NAME@.h>
-#include <gr_io_signature.h>
-#include <assert.h>
-#include <iostream>
-#include "core_algorithms.h"
-
-
-static const float INF = 1.0e9;
-
-@SPTR_NAME@
-trellis_make_@BASE_NAME@ (
- const fsm &FSMo, int STo0, int SToK,
- const fsm &FSMi, int STi0, int STiK,
- const interleaver &INTERLEAVER,
- int blocklength,
- int repetitions,
- trellis_siso_type_t SISO_TYPE
-)
-{
- return gnuradio::get_initial_sptr (new @NAME@ (
- FSMo, STo0, SToK,
- FSMi, STi0, STiK,
- INTERLEAVER,
- blocklength,
- repetitions,
- SISO_TYPE
- ));
-}
-
-@NAME@::@NAME@ (
- const fsm &FSMo, int STo0, int SToK,
- const fsm &FSMi, int STi0, int STiK,
- const interleaver &INTERLEAVER,
- int blocklength,
- int repetitions,
- trellis_siso_type_t SISO_TYPE
-)
- : gr_block ("@BASE_NAME@",
- gr_make_io_signature (1, 1, sizeof (float)),
- gr_make_io_signature (1, 1, sizeof (@O_TYPE@))),
- d_FSMo (FSMo), d_STo0 (STo0), d_SToK (SToK),
- d_FSMi (FSMi), d_STi0 (STi0), d_STiK (STiK),
- d_INTERLEAVER (INTERLEAVER),
- d_blocklength (blocklength),
- d_repetitions (repetitions),
- d_SISO_TYPE (SISO_TYPE)
-{
- assert(d_FSMo.O() == d_FSMi.I());
- set_relative_rate (1.0 / ((double) d_FSMi.O()));
- set_output_multiple (d_blocklength);
-}
-
-
-void
-@NAME@::forecast (int noutput_items, gr_vector_int &ninput_items_required)
-{
- assert (noutput_items % d_blocklength == 0);
- int input_required = d_FSMi.O() * noutput_items ;
- ninput_items_required[0] = input_required;
-}
-
-
-
-//===========================================================
-
-int
-@NAME@::general_work (int noutput_items,
- gr_vector_int &ninput_items,
- gr_vector_const_void_star &input_items,
- gr_vector_void_star &output_items)
-{
- assert (noutput_items % d_blocklength == 0);
- int nblocks = noutput_items / d_blocklength;
-
- float (*p2min)(float, float) = NULL;
- if(d_SISO_TYPE == TRELLIS_MIN_SUM)
- p2min = &min;
- else if(d_SISO_TYPE == TRELLIS_SUM_PRODUCT)
- p2min = &min_star;
-
-
- const float *in = (const float *) input_items[0];
- @O_TYPE@ *out = (@O_TYPE@ *) output_items[0];
- for (int n=0;n<nblocks;n++) {
- sccc_decoder(
- d_FSMo, d_STo0, d_SToK,
- d_FSMi, d_STi0, d_STiK,
- d_INTERLEAVER, d_blocklength, d_repetitions,
- p2min,
- &(in[n*d_blocklength*d_FSMi.O()]),&(out[n*d_blocklength])
- );
- }
-
- consume_each (d_FSMi.O() * noutput_items );
- return noutput_items;
-}
diff --git a/gr-trellis/src/lib/trellis_sccc_decoder_X.h.t b/gr-trellis/src/lib/trellis_sccc_decoder_X.h.t
deleted file mode 100644
index d6fb72f682..0000000000
--- a/gr-trellis/src/lib/trellis_sccc_decoder_X.h.t
+++ /dev/null
@@ -1,103 +0,0 @@
-/* -*- c++ -*- */
-/*
- * Copyright 2004 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.
- */
-
-// @WARNING@
-
-#ifndef @GUARD_NAME@
-#define @GUARD_NAME@
-
-#include <trellis_api.h>
-#include "fsm.h"
-#include "interleaver.h"
-#include <gr_block.h>
-#include <vector>
-#include "siso_type.h"
-
-class @NAME@;
-typedef boost::shared_ptr<@NAME@> @SPTR_NAME@;
-
-TRELLIS_API @SPTR_NAME@ trellis_make_@BASE_NAME@ (
- const fsm &FSMo, int STo0, int SToK,
- const fsm &FSMi, int STi0, int STiK,
- const interleaver &INTERLEAVER,
- int blocklength,
- int repetitions,
- trellis_siso_type_t SISO_TYPE // perform "min-sum" or "sum-product" combining
-);
-
-
-/*!
- * \ingroup coding_blk
- */
-class TRELLIS_API @NAME@ : public gr_block
-{
- fsm d_FSMo;
- int d_STo0;
- int d_SToK;
- fsm d_FSMi;
- int d_STi0;
- int d_STiK;
- interleaver d_INTERLEAVER;
- int d_blocklength;
- int d_repetitions;
- trellis_siso_type_t d_SISO_TYPE;
- std::vector<float> d_buffer;
-
- friend TRELLIS_API @SPTR_NAME@ trellis_make_@BASE_NAME@ (
- const fsm &FSMo, int STo0, int SToK,
- const fsm &FSMi, int STi0, int STiK,
- const interleaver &INTERLEAVER,
- int blocklength,
- int repetitions,
- trellis_siso_type_t SISO_TYPE
- );
-
- @NAME@ (
- const fsm &FSMo, int STo0, int SToK,
- const fsm &FSMi, int STi0, int STiK,
- const interleaver &INTERLEAVER,
- int blocklength,
- int repetitions,
- trellis_siso_type_t SISO_TYPE
- );
-
-public:
- fsm FSMo () const { return d_FSMo; }
- fsm FSMi () const { return d_FSMi; }
- int STo0 () const { return d_STo0; }
- int SToK () const { return d_SToK; }
- int STi0 () const { return d_STi0; }
- int STiK () const { return d_STiK; }
- interleaver INTERLEAVER () const { return d_INTERLEAVER; }
- int blocklength () const { return d_blocklength; }
- int repetitions () const { return d_repetitions; }
- trellis_siso_type_t SISO_TYPE () const { return d_SISO_TYPE; }
-
- void forecast (int noutput_items,
- gr_vector_int &ninput_items_required);
- int general_work (int noutput_items,
- gr_vector_int &ninput_items,
- gr_vector_const_void_star &input_items,
- gr_vector_void_star &output_items);
-};
-
-#endif
diff --git a/gr-trellis/src/lib/trellis_sccc_decoder_X.i.t b/gr-trellis/src/lib/trellis_sccc_decoder_X.i.t
deleted file mode 100644
index a4392ee6fa..0000000000
--- a/gr-trellis/src/lib/trellis_sccc_decoder_X.i.t
+++ /dev/null
@@ -1,60 +0,0 @@
-/* -*- c++ -*- */
-/*
- * Copyright 2004 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.
- */
-
-// @WARNING@
-
-GR_SWIG_BLOCK_MAGIC(trellis,@BASE_NAME@);
-
-@SPTR_NAME@ trellis_make_@BASE_NAME@ (
- const fsm &FSMo, int STo0, int SToK,
- const fsm &FSMi, int STi0, int STiK,
- const interleaver &INTERLEAVER,
- int blocklength,
- int repetitions,
- trellis_siso_type_t SISO_TYPE
-);
-
-
-class @NAME@ : public gr_block
-{
-private:
- @NAME@ (
- const fsm &FSMo, int STo0, int SToK,
- const fsm &FSMi, int STi0, int STiK,
- const interleaver &INTERLEAVER,
- int blocklength,
- int repetitions,
- trellis_siso_type_t SISO_TYPE
- );
-
-public:
- fsm FSMo () const { return d_FSMo; }
- fsm FSMi () const { return d_FSMi; }
- int STo0 () const { return d_STo0; }
- int SToK () const { return d_SToK; }
- int STi0 () const { return d_STi0; }
- int STiK () const { return d_STiK; }
- interleaver INTERLEAVER () const { return d_INTERLEAVER; }
- int blocklength () const { return d_blocklength; }
- int repetitions () const { return d_repetitions; }
- trellis_siso_type_t SISO_TYPE () const { return d_SISO_TYPE; }
-};
diff --git a/gr-trellis/src/lib/trellis_sccc_decoder_combined_XX.cc.t b/gr-trellis/src/lib/trellis_sccc_decoder_combined_XX.cc.t
deleted file mode 100644
index 4508ca5cba..0000000000
--- a/gr-trellis/src/lib/trellis_sccc_decoder_combined_XX.cc.t
+++ /dev/null
@@ -1,147 +0,0 @@
-/* -*- c++ -*- */
-/*
- * Copyright 2004,2010 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.
- */
-
-// @WARNING@
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <@NAME@.h>
-#include <gr_io_signature.h>
-#include <assert.h>
-#include <iostream>
-#include "core_algorithms.h"
-
-
-static const float INF = 1.0e9;
-
-@SPTR_NAME@
-trellis_make_@BASE_NAME@ (
- const fsm &FSMo, int STo0, int SToK,
- const fsm &FSMi, int STi0, int STiK,
- const interleaver &INTERLEAVER,
- int blocklength,
- int repetitions,
- trellis_siso_type_t SISO_TYPE,
- int D,
- const std::vector<@I_TYPE@> &TABLE,
- trellis_metric_type_t METRIC_TYPE,
- float scaling
-)
-{
- return gnuradio::get_initial_sptr (new @NAME@ (
- FSMo, STo0, SToK,
- FSMi, STi0, STiK,
- INTERLEAVER,
- blocklength,
- repetitions,
- SISO_TYPE,
- D,
- TABLE,METRIC_TYPE,
- scaling
- ));
-}
-
-@NAME@::@NAME@ (
- const fsm &FSMo, int STo0, int SToK,
- const fsm &FSMi, int STi0, int STiK,
- const interleaver &INTERLEAVER,
- int blocklength,
- int repetitions,
- trellis_siso_type_t SISO_TYPE,
- int D,
- const std::vector<@I_TYPE@> &TABLE,
- trellis_metric_type_t METRIC_TYPE,
- float scaling
-)
- : gr_block ("@BASE_NAME@",
- gr_make_io_signature (1, 1, sizeof (@I_TYPE@)),
- gr_make_io_signature (1, 1, sizeof (@O_TYPE@))),
- d_FSMo (FSMo), d_STo0 (STo0), d_SToK (SToK),
- d_FSMi (FSMi), d_STi0 (STi0), d_STiK (STiK),
- d_INTERLEAVER (INTERLEAVER),
- d_blocklength (blocklength),
- d_repetitions (repetitions),
- d_SISO_TYPE (SISO_TYPE),
- d_D (D),
- d_TABLE (TABLE),
- d_METRIC_TYPE (METRIC_TYPE),
- d_scaling (scaling)
-{
- assert(d_FSMo.O() == d_FSMi.I());
- set_relative_rate (1.0 / ((double) d_D));
- set_output_multiple (d_blocklength);
-}
-
-void @NAME@::set_scaling(float scaling)
-{
- d_scaling = scaling;
-}
-
-
-void
-@NAME@::forecast (int noutput_items, gr_vector_int &ninput_items_required)
-{
- assert (noutput_items % d_blocklength == 0);
- int input_required = d_D * noutput_items ;
- ninput_items_required[0] = input_required;
-}
-
-
-
-//===========================================================
-
-int
-@NAME@::general_work (int noutput_items,
- gr_vector_int &ninput_items,
- gr_vector_const_void_star &input_items,
- gr_vector_void_star &output_items)
-{
- assert (noutput_items % d_blocklength == 0);
- int nblocks = noutput_items / d_blocklength;
-
- float (*p2min)(float, float) = NULL;
- if(d_SISO_TYPE == TRELLIS_MIN_SUM)
- p2min = &min;
- else if(d_SISO_TYPE == TRELLIS_SUM_PRODUCT)
- p2min = &min_star;
-
-
- const @I_TYPE@ *in = (const @I_TYPE@ *) input_items[0];
- @O_TYPE@ *out = (@O_TYPE@ *) output_items[0];
- for (int n=0;n<nblocks;n++) {
- sccc_decoder_combined(
- d_FSMo, d_STo0, d_SToK,
- d_FSMi, d_STi0, d_STiK,
- d_INTERLEAVER, d_blocklength, d_repetitions,
- p2min,
- d_D,d_TABLE,
- d_METRIC_TYPE,
- d_scaling,
- &(in[n*d_blocklength*d_D]),&(out[n*d_blocklength])
- );
- }
-
- consume_each (d_D * noutput_items );
- return noutput_items;
-}
diff --git a/gr-trellis/src/lib/trellis_sccc_decoder_combined_XX.h.t b/gr-trellis/src/lib/trellis_sccc_decoder_combined_XX.h.t
deleted file mode 100644
index 3fdc53c624..0000000000
--- a/gr-trellis/src/lib/trellis_sccc_decoder_combined_XX.h.t
+++ /dev/null
@@ -1,125 +0,0 @@
-/* -*- c++ -*- */
-/*
- * Copyright 2004 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.
- */
-
-// @WARNING@
-
-#ifndef @GUARD_NAME@
-#define @GUARD_NAME@
-
-#include <trellis_api.h>
-#include "fsm.h"
-#include "interleaver.h"
-#include <gr_block.h>
-#include <vector>
-#include "calc_metric.h"
-#include "siso_type.h"
-
-class @NAME@;
-typedef boost::shared_ptr<@NAME@> @SPTR_NAME@;
-
-TRELLIS_API @SPTR_NAME@ trellis_make_@BASE_NAME@ (
- const fsm &FSMo, int STo0, int SToK,
- const fsm &FSMi, int STi0, int STiK,
- const interleaver &INTERLEAVER,
- int blocklength,
- int repetitions,
- trellis_siso_type_t SISO_TYPE, // perform "min-sum" or "sum-product" combining
- int D,
- const std::vector<@I_TYPE@> &TABLE,
- trellis_metric_type_t METRIC_TYPE,
- float scaling
-);
-
-
-/*!
- * \ingroup coding_blk
- */
-class TRELLIS_API @NAME@ : public gr_block
-{
- fsm d_FSMo;
- int d_STo0;
- int d_SToK;
- fsm d_FSMi;
- int d_STi0;
- int d_STiK;
- interleaver d_INTERLEAVER;
- int d_blocklength;
- int d_repetitions;
- trellis_siso_type_t d_SISO_TYPE;
- int d_D;
- std::vector<@I_TYPE@> d_TABLE;
- trellis_metric_type_t d_METRIC_TYPE;
- float d_scaling;
- std::vector<float> d_buffer;
-
- friend TRELLIS_API @SPTR_NAME@ trellis_make_@BASE_NAME@ (
- const fsm &FSMo, int STo0, int SToK,
- const fsm &FSMi, int STi0, int STiK,
- const interleaver &INTERLEAVER,
- int blocklength,
- int repetitions,
- trellis_siso_type_t SISO_TYPE,
- int D,
- const std::vector<@I_TYPE@> &TABLE,
- trellis_metric_type_t METRIC_TYPE,
- float scaling
- );
-
- @NAME@ (
- const fsm &FSMo, int STo0, int SToK,
- const fsm &FSMi, int STi0, int STiK,
- const interleaver &INTERLEAVER,
- int blocklength,
- int repetitions,
- trellis_siso_type_t SISO_TYPE,
- int D,
- const std::vector<@I_TYPE@> &TABLE,
- trellis_metric_type_t METRIC_TYPE,
- float scaling
- );
-
-public:
- fsm FSMo () const { return d_FSMo; }
- fsm FSMi () const { return d_FSMi; }
- int STo0 () const { return d_STo0; }
- int SToK () const { return d_SToK; }
- int STi0 () const { return d_STi0; }
- int STiK () const { return d_STiK; }
- interleaver INTERLEAVER () const { return d_INTERLEAVER; }
- int blocklength () const { return d_blocklength; }
- int repetitions () const { return d_repetitions; }
- int D () const { return d_D; }
- std::vector<@I_TYPE@> TABLE () const { return d_TABLE; }
- trellis_metric_type_t METRIC_TYPE () const { return d_METRIC_TYPE; }
- trellis_siso_type_t SISO_TYPE () const { return d_SISO_TYPE; }
- float scaling () const { return d_scaling; }
- void set_scaling (float scaling);
-
- void forecast (int noutput_items,
- gr_vector_int &ninput_items_required);
- int general_work (int noutput_items,
- gr_vector_int &ninput_items,
- gr_vector_const_void_star &input_items,
- gr_vector_void_star &output_items);
-};
-
-#endif
diff --git a/gr-trellis/src/lib/trellis_sccc_decoder_combined_XX.i.t b/gr-trellis/src/lib/trellis_sccc_decoder_combined_XX.i.t
deleted file mode 100644
index 84f2eb07d9..0000000000
--- a/gr-trellis/src/lib/trellis_sccc_decoder_combined_XX.i.t
+++ /dev/null
@@ -1,73 +0,0 @@
-/* -*- c++ -*- */
-/*
- * Copyright 2004 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.
- */
-
-// @WARNING@
-
-GR_SWIG_BLOCK_MAGIC(trellis,@BASE_NAME@);
-
-@SPTR_NAME@ trellis_make_@BASE_NAME@ (
- const fsm &FSMo, int STo0, int SToK,
- const fsm &FSMi, int STi0, int STiK,
- const interleaver &INTERLEAVER,
- int blocklength,
- int repetitions,
- trellis_siso_type_t SISO_TYPE,
- int D,
- const std::vector<@I_TYPE@> &TABLE,
- trellis_metric_type_t METRIC_TYPE,
- float scaling
-);
-
-
-class @NAME@ : public gr_block
-{
-private:
- @NAME@ (
- const fsm &FSMo, int STo0, int SToK,
- const fsm &FSMi, int STi0, int STiK,
- const interleaver &INTERLEAVER,
- int blocklength,
- int repetitions,
- trellis_siso_type_t SISO_TYPE,
- int D,
- const std::vector<@I_TYPE@> &TABLE,
- trellis_metric_type_t METRIC_TYPE,
- float scaling
- );
-
-public:
- fsm FSMo () const { return d_FSMo; }
- fsm FSMi () const { return d_FSMi; }
- int STo0 () const { return d_STo0; }
- int SToK () const { return d_SToK; }
- int STi0 () const { return d_STi0; }
- int STiK () const { return d_STiK; }
- interleaver INTERLEAVER () const { return d_INTERLEAVER; }
- int blocklength () const { return d_blocklength; }
- int repetitions () const { return d_repetitions; }
- int D () const { return d_D; }
- std::vector<@I_TYPE@> TABLE () const { return d_TABLE; }
- trellis_metric_type_t METRIC_TYPE () const { return d_METRIC_TYPE; }
- trellis_siso_type_t SISO_TYPE () const { return d_SISO_TYPE; }
- float scaling() const { return d_scaling; }
- void set_scaling (float scaling);
-};
diff --git a/gr-trellis/src/lib/trellis_sccc_encoder_XX.cc.t b/gr-trellis/src/lib/trellis_sccc_encoder_XX.cc.t
deleted file mode 100644
index 8054909db8..0000000000
--- a/gr-trellis/src/lib/trellis_sccc_encoder_XX.cc.t
+++ /dev/null
@@ -1,91 +0,0 @@
-/* -*- c++ -*- */
-/*
- * Copyright 2004,2010 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.
- */
-
-// @WARNING@
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <@NAME@.h>
-#include <gr_io_signature.h>
-#include <iostream>
-
-@SPTR_NAME@
-trellis_make_@BASE_NAME@ (
- const fsm &FSMo, int STo,
- const fsm &FSMi, int STi,
- const interleaver &INTERLEAVER,
- int blocklength
-)
-{
- return gnuradio::get_initial_sptr (new @NAME@ (FSMo,STo,FSMi,STi,INTERLEAVER,blocklength));
-}
-
-@NAME@::@NAME@ (
- const fsm &FSMo, int STo,
- const fsm &FSMi, int STi,
- const interleaver &INTERLEAVER,
- int blocklength
-)
- : gr_sync_block ("@BASE_NAME@",
- gr_make_io_signature (1, 1, sizeof (@I_TYPE@)),
- gr_make_io_signature (1, 1, sizeof (@O_TYPE@))),
- d_FSMo (FSMo),
- d_STo (STo),
- d_FSMi (FSMi),
- d_STi (STi),
- d_INTERLEAVER (INTERLEAVER),
- d_blocklength (blocklength)
-{
- assert(d_FSMo.O() == d_FSMi.I());
- set_output_multiple(d_blocklength);
- d_buffer.resize(d_blocklength);
-}
-
-
-
-int
-@NAME@::work (int noutput_items,
- gr_vector_const_void_star &input_items,
- gr_vector_void_star &output_items)
-{
- assert(noutput_items%d_blocklength ==0);
- for (int b = 0 ; b<noutput_items/d_blocklength; b++) {
- const @I_TYPE@ *in = (const @I_TYPE@ *) input_items[0]+b*d_blocklength;
- @O_TYPE@ *out = (@O_TYPE@ *) output_items[0]+b*d_blocklength;
-
- int STo_tmp = d_STo;
- for (int i = 0; i < d_blocklength; i++){
- d_buffer[i] = d_FSMo.OS()[STo_tmp*d_FSMo.I()+in[i]];
- STo_tmp = (int) d_FSMo.NS()[STo_tmp*d_FSMo.I()+in[i]];
- }
- int STi_tmp = d_STi;
- for (int i = 0; i < d_blocklength; i++){
- int k = d_INTERLEAVER.INTER()[i];
- out[i] = (@O_TYPE@) d_FSMi.OS()[STi_tmp*d_FSMi.I()+d_buffer[k]];
- STi_tmp = (int) d_FSMi.NS()[STi_tmp*d_FSMi.I()+d_buffer[k]];
- }
- }
- return noutput_items;
-}
-
diff --git a/gr-trellis/src/lib/trellis_sccc_encoder_XX.h.t b/gr-trellis/src/lib/trellis_sccc_encoder_XX.h.t
deleted file mode 100644
index b16d7ffca9..0000000000
--- a/gr-trellis/src/lib/trellis_sccc_encoder_XX.h.t
+++ /dev/null
@@ -1,84 +0,0 @@
-/* -*- c++ -*- */
-/*
- * Copyright 2004 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.
- */
-
-// @WARNING@
-
-#ifndef @GUARD_NAME@
-#define @GUARD_NAME@
-
-#include <trellis_api.h>
-#include <vector>
-#include "fsm.h"
-#include "interleaver.h"
-#include <gr_sync_block.h>
-
-class @NAME@;
-typedef boost::shared_ptr<@NAME@> @SPTR_NAME@;
-
-TRELLIS_API @SPTR_NAME@ trellis_make_@BASE_NAME@ (
- const fsm &FSMo, int STo,
- const fsm &FSMi, int STi,
- const interleaver &INTERLEAVER,
- int blocklength
-);
-
-/*!
- * \brief SCCC encoder.
- * \ingroup coding_blk
- */
-class TRELLIS_API @NAME@ : public gr_sync_block
-{
-private:
- friend TRELLIS_API @SPTR_NAME@ trellis_make_@BASE_NAME@ (
- const fsm &FSMo, int STo,
- const fsm &FSMi, int STi,
- const interleaver &INTERLEAVER,
- int blocklength
- );
- fsm d_FSMo;
- int d_STo;
- fsm d_FSMi;
- int d_STi;
- interleaver d_INTERLEAVER;
- int d_blocklength;
- std::vector<int> d_buffer;
- @NAME@ (
- const fsm &FSMo, int STo,
- const fsm &FSMi, int STi,
- const interleaver &INTERLEAVER,
- int blocklength
- );
-
-public:
- fsm FSMo () const { return d_FSMo; }
- int STo () const { return d_STo; }
- fsm FSMi () const { return d_FSMi; }
- int STi () const { return d_STi; }
- interleaver INTERLEAVER () const { return d_INTERLEAVER; }
- int blocklength () const { return d_blocklength; }
-
- int work (int noutput_items,
- gr_vector_const_void_star &input_items,
- gr_vector_void_star &output_items);
-};
-
-#endif
diff --git a/gr-trellis/src/lib/trellis_sccc_encoder_XX.i.t b/gr-trellis/src/lib/trellis_sccc_encoder_XX.i.t
deleted file mode 100644
index ca6b561992..0000000000
--- a/gr-trellis/src/lib/trellis_sccc_encoder_XX.i.t
+++ /dev/null
@@ -1,50 +0,0 @@
-/* -*- c++ -*- */
-/*
- * Copyright 2004 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.
- */
-
-// @WARNING@
-
-GR_SWIG_BLOCK_MAGIC(trellis,@BASE_NAME@);
-
-@SPTR_NAME@ trellis_make_@BASE_NAME@ (
- const fsm &FSMo, int STo,
- const fsm &FSMi, int STi,
- const interleaver &INTERLEAVER,
- int blocklength
-);
-
-class @NAME@ : public gr_sync_block
-{
-private:
- @NAME@ (
- const fsm &FSMo, int STo,
- const fsm &FSMi, int STi,
- const interleaver &INTERLEAVER,
- int blocklength
- );
-public:
- fsm FSMo () const { return d_FSMo; }
- int STo () const { return d_STo; }
- fsm FSMi () const { return d_FSMi; }
- int STi () const { return d_STi; }
- interleaver INTERLEAVER () const { return d_INTERLEAVER; }
- int blocklength () const { return d_blocklength; }
-};
diff --git a/gr-trellis/src/lib/trellis_siso_combined_f.cc b/gr-trellis/src/lib/trellis_siso_combined_f.cc
deleted file mode 100644
index d27fe44257..0000000000
--- a/gr-trellis/src/lib/trellis_siso_combined_f.cc
+++ /dev/null
@@ -1,357 +0,0 @@
-/* -*- c++ -*- */
-/*
- * Copyright 2004,2010 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.
- */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <trellis_siso_combined_f.h>
-#include <gr_io_signature.h>
-#include <stdexcept>
-#include <assert.h>
-#include <iostream>
-
-static const float INF = 1.0e9;
-
-trellis_siso_combined_f_sptr
-trellis_make_siso_combined_f (
- const fsm &FSM,
- int K,
- int S0,
- int SK,
- bool POSTI,
- bool POSTO,
- trellis_siso_type_t SISO_TYPE,
- int D,
- const std::vector<float> &TABLE,
- trellis_metric_type_t TYPE)
-{
- return gnuradio::get_initial_sptr(new trellis_siso_combined_f (FSM,K,S0,SK,POSTI,POSTO,SISO_TYPE,D,TABLE,TYPE));
-}
-
-trellis_siso_combined_f::trellis_siso_combined_f (
- const fsm &FSM,
- int K,
- int S0,
- int SK,
- bool POSTI,
- bool POSTO,
- trellis_siso_type_t SISO_TYPE,
- int D,
- const std::vector<float> &TABLE,
- trellis_metric_type_t TYPE)
- : gr_block ("siso_combined_f",
- gr_make_io_signature (1, -1, sizeof (float)),
- gr_make_io_signature (1, -1, sizeof (float))),
- d_FSM (FSM),
- d_K (K),
- d_S0 (S0),
- d_SK (SK),
- d_POSTI (POSTI),
- d_POSTO (POSTO),
- d_SISO_TYPE (SISO_TYPE),
- d_D (D),
- d_TABLE (TABLE),
- d_TYPE (TYPE)//,
- //d_alpha(FSM.S()*(K+1)),
- //d_beta(FSM.S()*(K+1))
-{
- int multiple;
- if (d_POSTI && d_POSTO)
- multiple = d_FSM.I()+d_FSM.O();
- else if(d_POSTI)
- multiple = d_FSM.I();
- else if(d_POSTO)
- multiple = d_FSM.O();
- else
- throw std::runtime_error ("Not both POSTI and POSTO can be false.");
- //printf("constructor: Multiple = %d\n",multiple);
- set_output_multiple (d_K*multiple);
- //what is the meaning of relative rate for a block with 2 inputs?
- //set_relative_rate ( multiple / ((double) d_FSM.I()) );
- // it turns out that the above gives problems in the scheduler, so
- // let's try (assumption O>I)
- //set_relative_rate ( multiple / ((double) d_FSM.O()) );
- // I am tempted to automate like this
- if(d_FSM.I() <= d_D)
- set_relative_rate ( multiple / ((double) d_D) );
- else
- set_relative_rate ( multiple / ((double) d_FSM.I()) );
-}
-
-
-void
-trellis_siso_combined_f::forecast (int noutput_items, gr_vector_int &ninput_items_required)
-{
- int multiple;
- if (d_POSTI && d_POSTO)
- multiple = d_FSM.I()+d_FSM.O();
- else if(d_POSTI)
- multiple = d_FSM.I();
- else if(d_POSTO)
- multiple = d_FSM.O();
- else
- throw std::runtime_error ("Not both POSTI and POSTO can be false.");
- //printf("forecast: Multiple = %d\n",multiple);
- assert (noutput_items % (d_K*multiple) == 0);
- int input_required1 = d_FSM.I() * (noutput_items/multiple) ;
- int input_required2 = d_D * (noutput_items/multiple) ;
- //printf("forecast: Output requirements: %d\n",noutput_items);
- //printf("forecast: Input requirements: %d %d\n",input_required1,input_required2);
- unsigned ninputs = ninput_items_required.size();
- assert(ninputs % 2 == 0);
- for (unsigned int i = 0; i < ninputs/2; i++) {
- ninput_items_required[2*i] = input_required1;
- ninput_items_required[2*i+1] = input_required2;
- }
-}
-
-
-
-
-
-/*
-
-
-inline float min(float a, float b)
-{
- return a <= b ? a : b;
-}
-
-inline float min_star(float a, float b)
-{
- return (a <= b ? a : b)-log(1+exp(a <= b ? a-b : b-a));
-}
-
-void siso_algorithm_combined(int I, int S, int O,
- const std::vector<int> &NS,
- const std::vector<int> &OS,
- const std::vector< std::vector<int> > &PS,
- const std::vector< std::vector<int> > &PI,
- int K,
- int S0,int SK,
- bool POSTI, bool POSTO,
- float (*p2mymin)(float,float),
- int D,
- const std::vector<float> &TABLE,
- trellis_metric_type_t TYPE,
- const float *priori, const float *observations, float *post//,
- //std::vector<float> &alpha,
- //std::vector<float> &beta
- )
-{
- float norm,mm,minm;
- std::vector<float> alpha(S*(K+1));
- std::vector<float> beta(S*(K+1));
- float *prioro = new float[O*K];
-
-
- if(S0<0) { // initial state not specified
- for(int i=0;i<S;i++) alpha[0*S+i]=0;
- }
- else {
- for(int i=0;i<S;i++) alpha[0*S+i]=INF;
- alpha[0*S+S0]=0.0;
- }
-
- for(int k=0;k<K;k++) { // forward recursion
- calc_metric(O, D, TABLE, &(observations[k*D]), &(prioro[k*O]),TYPE); // calc metrics
- norm=INF;
- for(int j=0;j<S;j++) {
- minm=INF;
- for(unsigned int i=0;i<PS[j].size();i++) {
- //int i0 = j*I+i;
- mm=alpha[k*S+PS[j][i]]+priori[k*I+PI[j][i]]+prioro[k*O+OS[PS[j][i]*I+PI[j][i]]];
- minm=(*p2mymin)(minm,mm);
- }
- alpha[(k+1)*S+j]=minm;
- if(minm<norm) norm=minm;
- }
- for(int j=0;j<S;j++)
- alpha[(k+1)*S+j]-=norm; // normalize total metrics so they do not explode
- }
-
- if(SK<0) { // final state not specified
- for(int i=0;i<S;i++) beta[K*S+i]=0;
- }
- else {
- for(int i=0;i<S;i++) beta[K*S+i]=INF;
- beta[K*S+SK]=0.0;
- }
-
- for(int k=K-1;k>=0;k--) { // backward recursion
- norm=INF;
- for(int j=0;j<S;j++) {
- minm=INF;
- for(int i=0;i<I;i++) {
- int i0 = j*I+i;
- mm=beta[(k+1)*S+NS[i0]]+priori[k*I+i]+prioro[k*O+OS[i0]];
- minm=(*p2mymin)(minm,mm);
- }
- beta[k*S+j]=minm;
- if(minm<norm) norm=minm;
- }
- for(int j=0;j<S;j++)
- beta[k*S+j]-=norm; // normalize total metrics so they do not explode
- }
-
-
- if (POSTI && POSTO)
- {
- for(int k=0;k<K;k++) { // input combining
- norm=INF;
- for(int i=0;i<I;i++) {
- minm=INF;
- for(int j=0;j<S;j++) {
- mm=alpha[k*S+j]+prioro[k*O+OS[j*I+i]]+beta[(k+1)*S+NS[j*I+i]];
- minm=(*p2mymin)(minm,mm);
- }
- post[k*(I+O)+i]=minm;
- if(minm<norm) norm=minm;
- }
- for(int i=0;i<I;i++)
- post[k*(I+O)+i]-=norm; // normalize metrics
- }
-
-
- for(int k=0;k<K;k++) { // output combining
- norm=INF;
- for(int n=0;n<O;n++) {
- minm=INF;
- for(int j=0;j<S;j++) {
- for(int i=0;i<I;i++) {
- mm= (n==OS[j*I+i] ? alpha[k*S+j]+priori[k*I+i]+beta[(k+1)*S+NS[j*I+i]] : INF);
- minm=(*p2mymin)(minm,mm);
- }
- }
- post[k*(I+O)+I+n]=minm;
- if(minm<norm) norm=minm;
- }
- for(int n=0;n<O;n++)
- post[k*(I+O)+I+n]-=norm; // normalize metrics
- }
- }
- else if(POSTI)
- {
- for(int k=0;k<K;k++) { // input combining
- norm=INF;
- for(int i=0;i<I;i++) {
- minm=INF;
- for(int j=0;j<S;j++) {
- mm=alpha[k*S+j]+prioro[k*O+OS[j*I+i]]+beta[(k+1)*S+NS[j*I+i]];
- minm=(*p2mymin)(minm,mm);
- }
- post[k*I+i]=minm;
- if(minm<norm) norm=minm;
- }
- for(int i=0;i<I;i++)
- post[k*I+i]-=norm; // normalize metrics
- }
- }
- else if(POSTO)
- {
- for(int k=0;k<K;k++) { // output combining
- norm=INF;
- for(int n=0;n<O;n++) {
- minm=INF;
- for(int j=0;j<S;j++) {
- for(int i=0;i<I;i++) {
- mm= (n==OS[j*I+i] ? alpha[k*S+j]+priori[k*I+i]+beta[(k+1)*S+NS[j*I+i]] : INF);
- minm=(*p2mymin)(minm,mm);
- }
- }
- post[k*O+n]=minm;
- if(minm<norm) norm=minm;
- }
- for(int n=0;n<O;n++)
- post[k*O+n]-=norm; // normalize metrics
- }
- }
- else
- throw std::runtime_error ("Not both POSTI and POSTO can be false.");
-
- delete [] prioro;
-
-}
-
-*/
-
-
-
-
-int
-trellis_siso_combined_f::general_work (int noutput_items,
- gr_vector_int &ninput_items,
- gr_vector_const_void_star &input_items,
- gr_vector_void_star &output_items)
-{
- assert (input_items.size() == 2*output_items.size());
- int nstreams = output_items.size();
- //printf("general_work:Streams: %d\n",nstreams);
- int multiple;
- if (d_POSTI && d_POSTO)
- multiple = d_FSM.I()+d_FSM.O();
- else if(d_POSTI)
- multiple = d_FSM.I();
- else if(d_POSTO)
- multiple = d_FSM.O();
- else
- throw std::runtime_error ("Not both POSTI and POSTO can be false.");
-
- assert (noutput_items % (d_K*multiple) == 0);
- int nblocks = noutput_items / (d_K*multiple);
- //printf("general_work:Blocks: %d\n",nblocks);
- //for(int i=0;i<ninput_items.size();i++)
- //printf("general_work:Input items available: %d\n",ninput_items[i]);
-
- float (*p2min)(float, float) = NULL;
- if(d_SISO_TYPE == TRELLIS_MIN_SUM)
- p2min = &min;
- else if(d_SISO_TYPE == TRELLIS_SUM_PRODUCT)
- p2min = &min_star;
-
-
- for (int m=0;m<nstreams;m++) {
- const float *in1 = (const float *) input_items[2*m];
- const float *in2 = (const float *) input_items[2*m+1];
- float *out = (float *) output_items[m];
- for (int n=0;n<nblocks;n++) {
- siso_algorithm_combined(d_FSM.I(),d_FSM.S(),d_FSM.O(),
- d_FSM.NS(),d_FSM.OS(),d_FSM.PS(),d_FSM.PI(),
- d_K,d_S0,d_SK,
- d_POSTI,d_POSTO,
- p2min,
- d_D,d_TABLE,d_TYPE,
- &(in1[n*d_K*d_FSM.I()]),&(in2[n*d_K*d_D]),
- &(out[n*d_K*multiple])//,
- //d_alpha,d_beta
- );
- }
- }
-
- for (unsigned int i = 0; i < input_items.size()/2; i++) {
- consume(2*i,d_FSM.I() * noutput_items / multiple );
- consume(2*i+1,d_D * noutput_items / multiple );
- }
-
- return noutput_items;
-}
diff --git a/gr-trellis/src/lib/trellis_siso_combined_f.h b/gr-trellis/src/lib/trellis_siso_combined_f.h
deleted file mode 100644
index 4b28e8de4a..0000000000
--- a/gr-trellis/src/lib/trellis_siso_combined_f.h
+++ /dev/null
@@ -1,112 +0,0 @@
-/* -*- c++ -*- */
-/*
- * Copyright 2004 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.
- */
-
-#ifndef INCLUDED_TRELLIS_SISO_COMBINED_F_H
-#define INCLUDED_TRELLIS_SISO_COMBINED_F_H
-
-#include <trellis_api.h>
-#include "fsm.h"
-#include "siso_type.h"
-#include "calc_metric.h"
-#include "core_algorithms.h"
-#include <gr_block.h>
-
-class trellis_siso_combined_f;
-typedef boost::shared_ptr<trellis_siso_combined_f> trellis_siso_combined_f_sptr;
-
-TRELLIS_API trellis_siso_combined_f_sptr trellis_make_siso_combined_f (
- const fsm &FSM, // underlying FSM
- int K, // block size in trellis steps
- int S0, // initial state (put -1 if not specified)
- int SK, // final state (put -1 if not specified)
- bool POSTI, // true if you want a-posteriori info about the input symbols to be mux-ed in the output
- bool POSTO, // true if you want a-posteriori info about the output symbols to be mux-ed in the output
- trellis_siso_type_t d_SISO_TYPE, // perform "min-sum" or "sum-product" combining
- int D,
- const std::vector<float> &TABLE,
- trellis_metric_type_t TYPE
-);
-
-/*!
- * \ingroup coding_blk
- */
-class TRELLIS_API trellis_siso_combined_f : public gr_block
-{
- fsm d_FSM;
- int d_K;
- int d_S0;
- int d_SK;
- bool d_POSTI;
- bool d_POSTO;
- trellis_siso_type_t d_SISO_TYPE;
- int d_D;
- std::vector<float> d_TABLE;
- trellis_metric_type_t d_TYPE;
- //std::vector<float> d_alpha;
- //std::vector<float> d_beta;
-
- friend TRELLIS_API trellis_siso_combined_f_sptr trellis_make_siso_combined_f (
- const fsm &FSM,
- int K,
- int S0,
- int SK,
- bool POSTI,
- bool POSTO,
- trellis_siso_type_t d_SISO_TYPE,
- int D,
- const std::vector<float> &TABLE,
- trellis_metric_type_t TYPE);
-
-
- trellis_siso_combined_f (
- const fsm &FSM,
- int K,
- int S0,
- int SK,
- bool POSTI,
- bool POSTO,
- trellis_siso_type_t d_SISO_TYPE,
- int D,
- const std::vector<float> &TABLE,
- trellis_metric_type_t TYPE);
-
-
-public:
- fsm FSM () const { return d_FSM; }
- int K () const { return d_K; }
- int S0 () const { return d_S0; }
- int SK () const { return d_SK; }
- bool POSTI () const { return d_POSTI; }
- bool POSTO () const { return d_POSTO; }
- trellis_siso_type_t SISO_TYPE () const { return d_SISO_TYPE; }
- int D () const { return d_D; }
- std::vector<float> TABLE () const { return d_TABLE; }
- trellis_metric_type_t TYPE () const { return d_TYPE; }
- void forecast (int noutput_items,
- gr_vector_int &ninput_items_required);
- int general_work (int noutput_items,
- gr_vector_int &ninput_items,
- gr_vector_const_void_star &input_items,
- gr_vector_void_star &output_items);
-};
-
-#endif
diff --git a/gr-trellis/src/lib/trellis_siso_combined_f.i b/gr-trellis/src/lib/trellis_siso_combined_f.i
deleted file mode 100644
index 781280d896..0000000000
--- a/gr-trellis/src/lib/trellis_siso_combined_f.i
+++ /dev/null
@@ -1,64 +0,0 @@
-/* -*- c++ -*- */
-/*
- * Copyright 2004 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.
- */
-
-GR_SWIG_BLOCK_MAGIC(trellis,siso_combined_f);
-
-trellis_siso_combined_f_sptr trellis_make_siso_combined_f (
- const fsm &FSM,
- int K,
- int S0,
- int SK,
- bool POSTI,
- bool POSTO,
- trellis_siso_type_t SISO_TYPE,
- int D,
- const std::vector<float> &TABLE,
- trellis_metric_type_t TYPE);
-
-
-class trellis_siso_combined_f : public gr_block
-{
-private:
- trellis_siso_combined_f (
- const fsm &FSM,
- int K,
- int S0,
- int SK,
- bool POSTI,
- bool POSTO,
- trellis_siso_type_t SISO_TYPE,
- int D,
- const std::vector<float> &TABLE,
- trellis_metric_type_t TYPE);
-
-public:
- fsm FSM () const { return d_FSM; }
- int K () const { return d_K; }
- int S0 () const { return d_S0; }
- int SK () const { return d_SK; }
- bool POSTI () const { return d_POSTI; }
- bool POSTO () const { return d_POSTO; }
- trellis_siso_type_t SISO_TYPE () const { return d_SISO_TYPE; }
- int D () const { return d_D; }
- std::vector<float> TABLE () const { return d_TABLE; }
- trellis_metric_type_t TYPE () const { return d_TYPE; }
-};
diff --git a/gr-trellis/src/lib/trellis_siso_f.cc b/gr-trellis/src/lib/trellis_siso_f.cc
deleted file mode 100644
index ffebf1928a..0000000000
--- a/gr-trellis/src/lib/trellis_siso_f.cc
+++ /dev/null
@@ -1,338 +0,0 @@
-/* -*- c++ -*- */
-/*
- * Copyright 2004,2010 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.
- */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <trellis_siso_f.h>
-#include <gr_io_signature.h>
-#include <stdexcept>
-#include <assert.h>
-#include <iostream>
-
-static const float INF = 1.0e9;
-
-trellis_siso_f_sptr
-trellis_make_siso_f (
- const fsm &FSM,
- int K,
- int S0,
- int SK,
- bool POSTI,
- bool POSTO,
- trellis_siso_type_t SISO_TYPE)
-{
- return gnuradio::get_initial_sptr(new trellis_siso_f (FSM,K,S0,SK,POSTI,POSTO,SISO_TYPE));
-}
-
-trellis_siso_f::trellis_siso_f (
- const fsm &FSM,
- int K,
- int S0,
- int SK,
- bool POSTI,
- bool POSTO,
- trellis_siso_type_t SISO_TYPE)
- : gr_block ("siso_f",
- gr_make_io_signature (1, -1, sizeof (float)),
- gr_make_io_signature (1, -1, sizeof (float))),
- d_FSM (FSM),
- d_K (K),
- d_S0 (S0),
- d_SK (SK),
- d_POSTI (POSTI),
- d_POSTO (POSTO),
- d_SISO_TYPE (SISO_TYPE)//,
- //d_alpha(FSM.S()*(K+1)),
- //d_beta(FSM.S()*(K+1))
-{
- int multiple;
- if (d_POSTI && d_POSTO)
- multiple = d_FSM.I()+d_FSM.O();
- else if(d_POSTI)
- multiple = d_FSM.I();
- else if(d_POSTO)
- multiple = d_FSM.O();
- else
- throw std::runtime_error ("Not both POSTI and POSTO can be false.");
- //printf("constructor: Multiple = %d\n",multiple);
- set_output_multiple (d_K*multiple);
- //what is the meaning of relative rate for a block with 2 inputs?
- //set_relative_rate ( multiple / ((double) d_FSM.I()) );
- // it turns out that the above gives problems in the scheduler, so
- // let's try (assumption O>I)
- //set_relative_rate ( multiple / ((double) d_FSM.O()) );
- // I am tempted to automate like this
- if(d_FSM.I() <= d_FSM.O())
- set_relative_rate ( multiple / ((double) d_FSM.O()) );
- else
- set_relative_rate ( multiple / ((double) d_FSM.I()) );
-}
-
-
-void
-trellis_siso_f::forecast (int noutput_items, gr_vector_int &ninput_items_required)
-{
- int multiple;
- if (d_POSTI && d_POSTO)
- multiple = d_FSM.I()+d_FSM.O();
- else if(d_POSTI)
- multiple = d_FSM.I();
- else if(d_POSTO)
- multiple = d_FSM.O();
- else
- throw std::runtime_error ("Not both POSTI and POSTO can be false.");
- //printf("forecast: Multiple = %d\n",multiple);
- assert (noutput_items % (d_K*multiple) == 0);
- int input_required1 = d_FSM.I() * (noutput_items/multiple) ;
- int input_required2 = d_FSM.O() * (noutput_items/multiple) ;
- //printf("forecast: Output requirements: %d\n",noutput_items);
- //printf("forecast: Input requirements: %d %d\n",input_required1,input_required2);
- unsigned ninputs = ninput_items_required.size();
- assert(ninputs % 2 == 0);
- for (unsigned int i = 0; i < ninputs/2; i++) {
- ninput_items_required[2*i] = input_required1;
- ninput_items_required[2*i+1] = input_required2;
- }
-}
-
-
-
-
-/* Moved it to "core_algorithms.cc" */
-/*
-inline float min(float a, float b)
-{
- return a <= b ? a : b;
-}
-
-inline float min_star(float a, float b)
-{
- return (a <= b ? a : b)-log(1+exp(a <= b ? a-b : b-a));
-}
-
-void siso_algorithm(int I, int S, int O,
- const std::vector<int> &NS,
- const std::vector<int> &OS,
- const std::vector< std::vector<int> > &PS,
- const std::vector< std::vector<int> > &PI,
- int K,
- int S0,int SK,
- bool POSTI, bool POSTO,
- float (*p2mymin)(float,float),
- const float *priori, const float *prioro, float *post//,
- //std::vector<float> &alpha,
- //std::vector<float> &beta
- )
-{
- float norm,mm,minm;
- std::vector<float> alpha(S*(K+1));
- std::vector<float> beta(S*(K+1));
-
-
- if(S0<0) { // initial state not specified
- for(int i=0;i<S;i++) alpha[0*S+i]=0;
- }
- else {
- for(int i=0;i<S;i++) alpha[0*S+i]=INF;
- alpha[0*S+S0]=0.0;
- }
-
- for(int k=0;k<K;k++) { // forward recursion
- norm=INF;
- for(int j=0;j<S;j++) {
- minm=INF;
- for(unsigned int i=0;i<PS[j].size();i++) {
- //int i0 = j*I+i;
- mm=alpha[k*S+PS[j][i]]+priori[k*I+PI[j][i]]+prioro[k*O+OS[PS[j][i]*I+PI[j][i]]];
- minm=(*p2mymin)(minm,mm);
- }
- alpha[(k+1)*S+j]=minm;
- if(minm<norm) norm=minm;
- }
- for(int j=0;j<S;j++)
- alpha[(k+1)*S+j]-=norm; // normalize total metrics so they do not explode
- }
-
- if(SK<0) { // final state not specified
- for(int i=0;i<S;i++) beta[K*S+i]=0;
- }
- else {
- for(int i=0;i<S;i++) beta[K*S+i]=INF;
- beta[K*S+SK]=0.0;
- }
-
- for(int k=K-1;k>=0;k--) { // backward recursion
- norm=INF;
- for(int j=0;j<S;j++) {
- minm=INF;
- for(int i=0;i<I;i++) {
- int i0 = j*I+i;
- mm=beta[(k+1)*S+NS[i0]]+priori[k*I+i]+prioro[k*O+OS[i0]];
- minm=(*p2mymin)(minm,mm);
- }
- beta[k*S+j]=minm;
- if(minm<norm) norm=minm;
- }
- for(int j=0;j<S;j++)
- beta[k*S+j]-=norm; // normalize total metrics so they do not explode
- }
-
-
-if (POSTI && POSTO)
-{
- for(int k=0;k<K;k++) { // input combining
- norm=INF;
- for(int i=0;i<I;i++) {
- minm=INF;
- for(int j=0;j<S;j++) {
- mm=alpha[k*S+j]+prioro[k*O+OS[j*I+i]]+beta[(k+1)*S+NS[j*I+i]];
- minm=(*p2mymin)(minm,mm);
- }
- post[k*(I+O)+i]=minm;
- if(minm<norm) norm=minm;
- }
- for(int i=0;i<I;i++)
- post[k*(I+O)+i]-=norm; // normalize metrics
- }
-
-
- for(int k=0;k<K;k++) { // output combining
- norm=INF;
- for(int n=0;n<O;n++) {
- minm=INF;
- for(int j=0;j<S;j++) {
- for(int i=0;i<I;i++) {
- mm= (n==OS[j*I+i] ? alpha[k*S+j]+priori[k*I+i]+beta[(k+1)*S+NS[j*I+i]] : INF);
- minm=(*p2mymin)(minm,mm);
- }
- }
- post[k*(I+O)+I+n]=minm;
- if(minm<norm) norm=minm;
- }
- for(int n=0;n<O;n++)
- post[k*(I+O)+I+n]-=norm; // normalize metrics
- }
-}
-else if(POSTI)
-{
- for(int k=0;k<K;k++) { // input combining
- norm=INF;
- for(int i=0;i<I;i++) {
- minm=INF;
- for(int j=0;j<S;j++) {
- mm=alpha[k*S+j]+prioro[k*O+OS[j*I+i]]+beta[(k+1)*S+NS[j*I+i]];
- minm=(*p2mymin)(minm,mm);
- }
- post[k*I+i]=minm;
- if(minm<norm) norm=minm;
- }
- for(int i=0;i<I;i++)
- post[k*I+i]-=norm; // normalize metrics
- }
-}
-else if(POSTO)
-{
- for(int k=0;k<K;k++) { // output combining
- norm=INF;
- for(int n=0;n<O;n++) {
- minm=INF;
- for(int j=0;j<S;j++) {
- for(int i=0;i<I;i++) {
- mm= (n==OS[j*I+i] ? alpha[k*S+j]+priori[k*I+i]+beta[(k+1)*S+NS[j*I+i]] : INF);
- minm=(*p2mymin)(minm,mm);
- }
- }
- post[k*O+n]=minm;
- if(minm<norm) norm=minm;
- }
- for(int n=0;n<O;n++)
- post[k*O+n]-=norm; // normalize metrics
- }
-}
-else
- throw std::runtime_error ("Not both POSTI and POSTO can be false.");
-
-}
-
-*/
-
-
-
-
-int
-trellis_siso_f::general_work (int noutput_items,
- gr_vector_int &ninput_items,
- gr_vector_const_void_star &input_items,
- gr_vector_void_star &output_items)
-{
- assert (input_items.size() == 2*output_items.size());
- int nstreams = output_items.size();
- //printf("general_work:Streams: %d\n",nstreams);
- int multiple;
- if (d_POSTI && d_POSTO)
- multiple = d_FSM.I()+d_FSM.O();
- else if(d_POSTI)
- multiple = d_FSM.I();
- else if(d_POSTO)
- multiple = d_FSM.O();
- else
- throw std::runtime_error ("Not both POSTI and POSTO can be false.");
-
- assert (noutput_items % (d_K*multiple) == 0);
- int nblocks = noutput_items / (d_K*multiple);
- //printf("general_work:Blocks: %d\n",nblocks);
- //for(int i=0;i<ninput_items.size();i++)
- //printf("general_work:Input items available: %d\n",ninput_items[i]);
-
- float (*p2min)(float, float) = NULL;
- if(d_SISO_TYPE == TRELLIS_MIN_SUM)
- p2min = &min;
- else if(d_SISO_TYPE == TRELLIS_SUM_PRODUCT)
- p2min = &min_star;
-
-
- for (int m=0;m<nstreams;m++) {
- const float *in1 = (const float *) input_items[2*m];
- const float *in2 = (const float *) input_items[2*m+1];
- float *out = (float *) output_items[m];
- for (int n=0;n<nblocks;n++) {
- siso_algorithm(d_FSM.I(),d_FSM.S(),d_FSM.O(),
- d_FSM.NS(),d_FSM.OS(),d_FSM.PS(),d_FSM.PI(),
- d_K,d_S0,d_SK,
- d_POSTI,d_POSTO,
- p2min,
- &(in1[n*d_K*d_FSM.I()]),&(in2[n*d_K*d_FSM.O()]),
- &(out[n*d_K*multiple])//,
- //d_alpha,d_beta
- );
- }
- }
-
- for (unsigned int i = 0; i < input_items.size()/2; i++) {
- consume(2*i,d_FSM.I() * noutput_items / multiple );
- consume(2*i+1,d_FSM.O() * noutput_items / multiple );
- }
-
- return noutput_items;
-}
diff --git a/gr-trellis/src/lib/trellis_siso_f.h b/gr-trellis/src/lib/trellis_siso_f.h
deleted file mode 100644
index 9341f24683..0000000000
--- a/gr-trellis/src/lib/trellis_siso_f.h
+++ /dev/null
@@ -1,97 +0,0 @@
-/* -*- c++ -*- */
-/*
- * Copyright 2004 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.
- */
-
-#ifndef INCLUDED_TRELLIS_SISO_F_H
-#define INCLUDED_TRELLIS_SISO_F_H
-
-#include <trellis_api.h>
-#include "fsm.h"
-#include "siso_type.h"
-#include "core_algorithms.h"
-#include <gr_block.h>
-
-class trellis_siso_f;
-typedef boost::shared_ptr<trellis_siso_f> trellis_siso_f_sptr;
-
-TRELLIS_API trellis_siso_f_sptr trellis_make_siso_f (
- const fsm &FSM, // underlying FSM
- int K, // block size in trellis steps
- int S0, // initial state (put -1 if not specified)
- int SK, // final state (put -1 if not specified)
- bool POSTI, // true if you want a-posteriori info about the input symbols to be mux-ed in the output
- bool POSTO, // true if you want a-posteriori info about the output symbols to be mux-ed in the output
- trellis_siso_type_t d_SISO_TYPE // perform "min-sum" or "sum-product" combining
-);
-
-
-/*!
- * \ingroup coding_blk
- */
-class TRELLIS_API trellis_siso_f : public gr_block
-{
- fsm d_FSM;
- int d_K;
- int d_S0;
- int d_SK;
- bool d_POSTI;
- bool d_POSTO;
- trellis_siso_type_t d_SISO_TYPE;
- //std::vector<float> d_alpha;
- //std::vector<float> d_beta;
-
- friend TRELLIS_API trellis_siso_f_sptr trellis_make_siso_f (
- const fsm &FSM,
- int K,
- int S0,
- int SK,
- bool POSTI,
- bool POSTO,
- trellis_siso_type_t d_SISO_TYPE);
-
-
- trellis_siso_f (
- const fsm &FSM,
- int K,
- int S0,
- int SK,
- bool POSTI,
- bool POSTO,
- trellis_siso_type_t d_SISO_TYPE);
-
-
-public:
- fsm FSM () const { return d_FSM; }
- int K () const { return d_K; }
- int S0 () const { return d_S0; }
- int SK () const { return d_SK; }
- bool POSTI () const { return d_POSTI; }
- bool POSTO () const { return d_POSTO; }
- trellis_siso_type_t SISO_TYPE () const { return d_SISO_TYPE; }
- void forecast (int noutput_items,
- gr_vector_int &ninput_items_required);
- int general_work (int noutput_items,
- gr_vector_int &ninput_items,
- gr_vector_const_void_star &input_items,
- gr_vector_void_star &output_items);
-};
-
-#endif
diff --git a/gr-trellis/src/lib/trellis_siso_f.i b/gr-trellis/src/lib/trellis_siso_f.i
deleted file mode 100644
index 63bfb48c8f..0000000000
--- a/gr-trellis/src/lib/trellis_siso_f.i
+++ /dev/null
@@ -1,55 +0,0 @@
-/* -*- c++ -*- */
-/*
- * Copyright 2004 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.
- */
-
-GR_SWIG_BLOCK_MAGIC(trellis,siso_f);
-
-trellis_siso_f_sptr trellis_make_siso_f (
- const fsm &FSM,
- int K,
- int S0,
- int SK,
- bool POSTI,
- bool POSTO,
- trellis_siso_type_t SISO_TYPE);
-
-
-class trellis_siso_f : public gr_block
-{
-private:
- trellis_siso_f (
- const fsm &FSM,
- int K,
- int S0,
- int SK,
- bool POSTI,
- bool POSTO,
- trellis_siso_type_t SISO_TYPE);
-
-public:
- fsm FSM () const { return d_FSM; }
- int K () const { return d_K; }
- int S0 () const { return d_S0; }
- int SK () const { return d_SK; }
- bool POSTI () const { return d_POSTI; }
- bool POSTO () const { return d_POSTO; }
- trellis_siso_type_t SISO_TYPE () const { return d_SISO_TYPE; }
-};
diff --git a/gr-trellis/src/lib/trellis_viterbi_X.cc.t b/gr-trellis/src/lib/trellis_viterbi_X.cc.t
deleted file mode 100644
index cadb89d574..0000000000
--- a/gr-trellis/src/lib/trellis_viterbi_X.cc.t
+++ /dev/null
@@ -1,183 +0,0 @@
-/* -*- c++ -*- */
-/*
- * Copyright 2004,2010 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.
- */
-
-// @WARNING@
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <@NAME@.h>
-#include <gr_io_signature.h>
-#include <assert.h>
-#include <iostream>
-
-static const float INF = 1.0e9;
-
-@SPTR_NAME@
-trellis_make_@BASE_NAME@ (
- const fsm &FSM,
- int K,
- int S0,
- int SK)
-{
- return gnuradio::get_initial_sptr (new @NAME@ (FSM,K,S0,SK));
-}
-
-@NAME@::@NAME@ (
- const fsm &FSM,
- int K,
- int S0,
- int SK)
- : gr_block ("@BASE_NAME@",
- gr_make_io_signature (1, -1, sizeof (float)),
- gr_make_io_signature (1, -1, sizeof (@TYPE@))),
- d_FSM (FSM),
- d_K (K),
- d_S0 (S0),
- d_SK (SK)//,
- //d_trace(FSM.S()*K)
-{
- set_relative_rate (1.0 / ((double) d_FSM.O()));
- set_output_multiple (d_K);
-}
-
-
-void
-@NAME@::forecast (int noutput_items, gr_vector_int &ninput_items_required)
-{
- assert (noutput_items % d_K == 0);
- int input_required = d_FSM.O() * noutput_items ;
- unsigned ninputs = ninput_items_required.size();
- for (unsigned int i = 0; i < ninputs; i++) {
- ninput_items_required[i] = input_required;
- }
-}
-
-/*
-template
-void viterbi_algorithm<@O_TYPE@>(int I, int S, int O,
- const std::vector<int> &NS,
- const std::vector<int> &OS,
- const std::vector< std::vector<int> > &PS,
- const std::vector< std::vector<int> > &PI,
- int K,
- int S0,int SK,
- const float *in, @O_TYPE@ *out);
-*/
-
-
-
-/* Moved it to "core_algorithms.cc" */
-/*
-void viterbi_algorithm(int I, int S, int O,
- const std::vector<int> &NS,
- const std::vector<int> &OS,
- const std::vector< std::vector<int> > &PS,
- const std::vector< std::vector<int> > &PI,
- int K,
- int S0,int SK,
- const float *in, @TYPE@ *out)//,
- //std::vector<int> &trace)
-{
- std::vector<int> trace(S*K);
- std::vector<float> alpha(S*2);
- int alphai;
- float norm,mm,minm;
- int minmi;
- int st;
-
-
- if(S0<0) { // initial state not specified
- for(int i=0;i<S;i++) alpha[0*S+i]=0;
- }
- else {
- for(int i=0;i<S;i++) alpha[0*S+i]=INF;
- alpha[0*S+S0]=0.0;
- }
-
- alphai=0;
- for(int k=0;k<K;k++) {
- norm=INF;
- for(int j=0;j<S;j++) { // for each next state do ACS
- minm=INF;
- minmi=0;
- for(unsigned int i=0;i<PS[j].size();i++) {
- //int i0 = j*I+i;
- if((mm=alpha[alphai*S+PS[j][i]]+in[k*O+OS[PS[j][i]*I+PI[j][i]]])<minm)
- minm=mm,minmi=i;
- }
- trace[k*S+j]=minmi;
- alpha[((alphai+1)%2)*S+j]=minm;
- if(minm<norm) norm=minm;
- }
- for(int j=0;j<S;j++)
- alpha[((alphai+1)%2)*S+j]-=norm; // normalize total metrics so they do not explode
- alphai=(alphai+1)%2;
- }
-
- if(SK<0) { // final state not specified
- minm=INF;
- minmi=0;
- for(int i=0;i<S;i++)
- if((mm=alpha[alphai*S+i])<minm) minm=mm,minmi=i;
- st=minmi;
- }
- else {
- st=SK;
- }
-
- for(int k=K-1;k>=0;k--) { // traceback
- int i0=trace[k*S+st];
- out[k]= (@TYPE@) PI[st][i0];
- st=PS[st][i0];
- }
-
-}
-
-*/
-
-
-
-
-int
-@NAME@::general_work (int noutput_items,
- gr_vector_int &ninput_items,
- gr_vector_const_void_star &input_items,
- gr_vector_void_star &output_items)
-{
- assert (input_items.size() == output_items.size());
- int nstreams = input_items.size();
- assert (noutput_items % d_K == 0);
- int nblocks = noutput_items / d_K;
-
- for (int m=0;m<nstreams;m++) {
- const float *in = (const float *) input_items[m];
- @TYPE@ *out = (@TYPE@ *) output_items[m];
- for (int n=0;n<nblocks;n++) {
- viterbi_algorithm(d_FSM.I(),d_FSM.S(),d_FSM.O(),d_FSM.NS(),d_FSM.OS(),d_FSM.PS(),d_FSM.PI(),d_K,d_S0,d_SK,&(in[n*d_K*d_FSM.O()]),&(out[n*d_K]));//,d_trace);
- }
- }
-
- consume_each (d_FSM.O() * noutput_items );
- return noutput_items;
-}
diff --git a/gr-trellis/src/lib/trellis_viterbi_X.h.t b/gr-trellis/src/lib/trellis_viterbi_X.h.t
deleted file mode 100644
index c0400d3410..0000000000
--- a/gr-trellis/src/lib/trellis_viterbi_X.h.t
+++ /dev/null
@@ -1,91 +0,0 @@
-/* -*- c++ -*- */
-/*
- * Copyright 2004 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.
- */
-
-// @WARNING@
-
-#ifndef @GUARD_NAME@
-#define @GUARD_NAME@
-
-#include <trellis_api.h>
-#include "fsm.h"
-#include <gr_block.h>
-#include "core_algorithms.h"
-
-class @NAME@;
-typedef boost::shared_ptr<@NAME@> @SPTR_NAME@;
-
-TRELLIS_API @SPTR_NAME@ trellis_make_@BASE_NAME@ (
- const fsm &FSM,
- int K,
- int S0,
- int SK);
-
-
-
-/*!
- * \ingroup coding_blk
- */
-class TRELLIS_API @NAME@ : public gr_block
-{
- fsm d_FSM;
- int d_K;
- int d_S0;
- int d_SK;
- //std::vector<int> d_trace;
-
- friend TRELLIS_API @SPTR_NAME@ trellis_make_@BASE_NAME@ (
- const fsm &FSM,
- int K,
- int S0,
- int SK);
-
-
- @NAME@ (
- const fsm &FSM,
- int K,
- int S0,
- int SK);
-
-
-public:
- fsm FSM () const { return d_FSM; }
- int K () const { return d_K; }
- int S0 () const { return d_S0; }
- int SK () const { return d_SK; }
- //std::vector<int> trace () const { return d_trace; }
- void forecast (int noutput_items,
- gr_vector_int &ninput_items_required);
- int general_work (int noutput_items,
- gr_vector_int &ninput_items,
- gr_vector_const_void_star &input_items,
- gr_vector_void_star &output_items);
-};
-
-
-
-
-
-
-
-
-
-#endif
diff --git a/gr-trellis/src/lib/trellis_viterbi_combined_XX.cc.t b/gr-trellis/src/lib/trellis_viterbi_combined_XX.cc.t
deleted file mode 100644
index 74611ab8fb..0000000000
--- a/gr-trellis/src/lib/trellis_viterbi_combined_XX.cc.t
+++ /dev/null
@@ -1,191 +0,0 @@
-/* -*- c++ -*- */
-/*
- * Copyright 2004,2010 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.
- */
-
-// @WARNING@
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <@NAME@.h>
-#include <gr_io_signature.h>
-#include <assert.h>
-#include <iostream>
-
-static const float INF = 1.0e9;
-
-@SPTR_NAME@
-trellis_make_@BASE_NAME@ (
- const fsm &FSM,
- int K,
- int S0,
- int SK,
- int D,
- const std::vector<@I_TYPE@> &TABLE,
- trellis_metric_type_t TYPE)
-{
- return gnuradio::get_initial_sptr (new @NAME@ (FSM,K,S0,SK,D,TABLE,TYPE));
-}
-
-@NAME@::@NAME@ (
- const fsm &FSM,
- int K,
- int S0,
- int SK,
- int D,
- const std::vector<@I_TYPE@> &TABLE,
- trellis_metric_type_t TYPE)
- : gr_block ("@BASE_NAME@",
- gr_make_io_signature (1, -1, sizeof (@I_TYPE@)),
- gr_make_io_signature (1, -1, sizeof (@O_TYPE@))),
- d_FSM (FSM),
- d_K (K),
- d_S0 (S0),
- d_SK (SK),
- d_D (D),
- d_TABLE (TABLE),
- d_TYPE (TYPE)//,
- //d_trace(FSM.S()*K)
-{
- set_relative_rate (1.0 / ((double) d_D));
- set_output_multiple (d_K);
-}
-
-
-void @NAME@::set_TABLE(const std::vector<@I_TYPE@> &table)
-{
- d_TABLE = table;
-}
-
-void
-@NAME@::forecast (int noutput_items, gr_vector_int &ninput_items_required)
-{
- assert (noutput_items % d_K == 0);
- int input_required = d_D * noutput_items ;
- unsigned ninputs = ninput_items_required.size();
- for (unsigned int i = 0; i < ninputs; i++) {
- ninput_items_required[i] = input_required;
- }
-}
-
-
-
-
-/*
-void viterbi_algorithm_combined(int I, int S, int O,
- const std::vector<int> &NS,
- const std::vector<int> &OS,
- const std::vector< std::vector<int> > &PS,
- const std::vector< std::vector<int> > &PI,
- int K,
- int S0,int SK,
- int D,
- const std::vector<@I_TYPE@> &TABLE,
- trellis_metric_type_t TYPE,
- const @I_TYPE@ *in, @O_TYPE@ *out)//,
- //std::vector<int> &trace)
-{
- std::vector<int> trace(S*K);
- std::vector<float> alpha(S*2);
- float *metric = new float[O];
- int alphai;
- float norm,mm,minm;
- int minmi;
- int st;
-
- if(S0<0) { // initial state not specified
- for(int i=0;i<S;i++) alpha[0*S+i]=0;
- }
- else {
- for(int i=0;i<S;i++) alpha[0*S+i]=INF;
- alpha[0*S+S0]=0.0;
- }
-
- alphai=0;
- for(int k=0;k<K;k++) {
- calc_metric(O, D, TABLE, &(in[k*D]), metric,TYPE); // calc metrics
- norm=INF;
- for(int j=0;j<S;j++) { // for each next state do ACS
- minm=INF;
- minmi=0;
- for(unsigned int i=0;i<PS[j].size();i++) {
- //int i0 = j*I+i;
- if((mm=alpha[alphai*S+PS[j][i]]+metric[OS[PS[j][i]*I+PI[j][i]]])<minm)
- minm=mm,minmi=i;
- }
- trace[k*S+j]=minmi;
- alpha[((alphai+1)%2)*S+j]=minm;
- if(minm<norm) norm=minm;
- }
- for(int j=0;j<S;j++)
- alpha[((alphai+1)%2)*S+j]-=norm; // normalize total metrics so they do not explode
- alphai=(alphai+1)%2;
- }
-
- if(SK<0) { // final state not specified
- minm=INF;
- minmi=0;
- for(int i=0;i<S;i++)
- if((mm=alpha[alphai*S+i])<minm) minm=mm,minmi=i;
- st=minmi;
- }
- else {
- st=SK;
- }
-
- for(int k=K-1;k>=0;k--) { // traceback
- int i0=trace[k*S+st];
- out[k]= (@O_TYPE@) PI[st][i0];
- st=PS[st][i0];
- }
-
- delete [] metric;
-
-}
-
-
-*/
-
-
-
-int
-@NAME@::general_work (int noutput_items,
- gr_vector_int &ninput_items,
- gr_vector_const_void_star &input_items,
- gr_vector_void_star &output_items)
-{
- assert (input_items.size() == output_items.size());
- int nstreams = input_items.size();
- assert (noutput_items % d_K == 0);
- int nblocks = noutput_items / d_K;
-
- for (int m=0;m<nstreams;m++) {
- const @I_TYPE@ *in = (const @I_TYPE@ *) input_items[m];
- @O_TYPE@ *out = (@O_TYPE@ *) output_items[m];
- for (int n=0;n<nblocks;n++) {
- viterbi_algorithm_combined(d_FSM.I(),d_FSM.S(),d_FSM.O(),d_FSM.NS(),d_FSM.OS(),d_FSM.PS(),d_FSM.PI(),d_K,d_S0,d_SK,d_D,d_TABLE,d_TYPE,&(in[n*d_K*d_D]),&(out[n*d_K]));//,d_trace);
- }
- }
-
- consume_each (d_D * noutput_items );
- return noutput_items;
-}
diff --git a/gr-trellis/src/lib/trellis_viterbi_combined_XX.h.t b/gr-trellis/src/lib/trellis_viterbi_combined_XX.h.t
deleted file mode 100644
index c7e468e73b..0000000000
--- a/gr-trellis/src/lib/trellis_viterbi_combined_XX.h.t
+++ /dev/null
@@ -1,99 +0,0 @@
-/* -*- c++ -*- */
-/*
- * Copyright 2004 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.
- */
-
-// @WARNING@
-
-#ifndef @GUARD_NAME@
-#define @GUARD_NAME@
-
-#include <trellis_api.h>
-#include "fsm.h"
-#include <gr_block.h>
-#include "calc_metric.h"
-#include "core_algorithms.h"
-
-class @NAME@;
-typedef boost::shared_ptr<@NAME@> @SPTR_NAME@;
-
-TRELLIS_API @SPTR_NAME@ trellis_make_@BASE_NAME@ (
- const fsm &FSM,
- int K,
- int S0,
- int SK,
- int D,
- const std::vector<@I_TYPE@> &TABLE,
- trellis_metric_type_t TYPE);
-
-
-/*!
- * \ingroup coding_blk
- */
-class TRELLIS_API @NAME@ : public gr_block
-{
- fsm d_FSM;
- int d_K;
- int d_S0;
- int d_SK;
- int d_D;
- std::vector<@I_TYPE@> d_TABLE;
- trellis_metric_type_t d_TYPE;
- //std::vector<int> d_trace;
-
- friend TRELLIS_API @SPTR_NAME@ trellis_make_@BASE_NAME@ (
- const fsm &FSM,
- int K,
- int S0,
- int SK,
- int D,
- const std::vector<@I_TYPE@> &TABLE,
- trellis_metric_type_t TYPE);
-
-
- @NAME@ (
- const fsm &FSM,
- int K,
- int S0,
- int SK,
- int D,
- const std::vector<@I_TYPE@> &TABLE,
- trellis_metric_type_t TYPE);
-
-
-public:
- fsm FSM () const { return d_FSM; }
- int K () const { return d_K; }
- int S0 () const { return d_S0; }
- int SK () const { return d_SK; }
- int D () const { return d_D; }
- std::vector<@I_TYPE@> TABLE () const { return d_TABLE; }
- trellis_metric_type_t TYPE () const { return d_TYPE; }
- //std::vector<int> trace () const { return d_trace; }
- void set_TABLE (const std::vector<@I_TYPE@> &table);
- void forecast (int noutput_items,
- gr_vector_int &ninput_items_required);
- int general_work (int noutput_items,
- gr_vector_int &ninput_items,
- gr_vector_const_void_star &input_items,
- gr_vector_void_star &output_items);
-};
-
-#endif
diff --git a/gr-trellis/src/lib/trellis_viterbi_combined_XX.i.t b/gr-trellis/src/lib/trellis_viterbi_combined_XX.i.t
deleted file mode 100644
index 633ded7707..0000000000
--- a/gr-trellis/src/lib/trellis_viterbi_combined_XX.i.t
+++ /dev/null
@@ -1,59 +0,0 @@
-/* -*- c++ -*- */
-/*
- * Copyright 2004 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.
- */
-
-// @WARNING@
-
-GR_SWIG_BLOCK_MAGIC(trellis,@BASE_NAME@);
-
-@SPTR_NAME@ trellis_make_@BASE_NAME@ (
- const fsm &FSM,
- int K,
- int S0,
- int SK,
- int D,
- const std::vector<@I_TYPE@> &TABLE,
- trellis_metric_type_t TYPE);
-
-
-class @NAME@ : public gr_block
-{
-private:
- @NAME@ (
- const fsm &FSM,
- int K,
- int S0,
- int SK,
- int D,
- const std::vector<@I_TYPE@> &TABLE,
- trellis_metric_type_t TYPE);
-
-public:
- fsm FSM () const { return d_FSM; }
- int K () const { return d_K; }
- int S0 () const { return d_S0; }
- int SK () const { return d_SK; }
- int D () const { return d_D; }
- std::vector<@I_TYPE@> TABLE () const { return d_TABLE; }
- trellis_metric_type_t TYPE () const { return d_TYPE; }
- //std::vector<short> trace () const { return d_trace; }
- void set_TABLE (const std::vector<@I_TYPE@> &table);
-};
diff --git a/gr-trellis/swig/CMakeLists.txt b/gr-trellis/swig/CMakeLists.txt
new file mode 100644
index 0000000000..c2bbf3bc69
--- /dev/null
+++ b/gr-trellis/swig/CMakeLists.txt
@@ -0,0 +1,60 @@
+# Copyright 2012 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.
+
+########################################################################
+# Setup swig generation
+########################################################################
+include(GrPython)
+include(GrSwig)
+
+set(GR_SWIG_INCLUDE_DIRS
+ ${GR_TRELLIS_INCLUDE_DIRS}
+ ${GR_DIGITAL_INCLUDE_DIRS}
+ ${GNURADIO_CORE_SWIG_INCLUDE_DIRS}
+ ${GRUEL_INCLUDE_DIRS}
+ ${Boost_INCLUDE_DIRS}
+)
+
+set(GR_SWIG_LIBRARIES gnuradio-trellis gnuradio-digital)
+
+if(ENABLE_GR_CTRLPORT)
+ ADD_DEFINITIONS(-DGR_CTRLPORT)
+ list(APPEND GR_SWIG_INCLUDE_DIRS ${ICE_INCLUDE_DIR})
+endif(ENABLE_GR_CTRLPORT)
+
+# Setup swig docs to depend on includes and pull in from build directory
+set(GR_SWIG_TARGET_DEPS trellis_generated_includes)
+set(GR_SWIG_DOC_FILE ${CMAKE_CURRENT_BINARY_DIR}/trellis_swig_doc.i)
+set(GR_SWIG_DOC_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/../lib)
+
+GR_SWIG_MAKE(trellis_swig trellis_swig.i)
+
+GR_SWIG_INSTALL(
+ TARGETS trellis_swig
+ DESTINATION ${GR_PYTHON_DIR}/gnuradio/trellis
+ COMPONENT "trellis_python"
+)
+
+install(
+ FILES
+ trellis_swig.i
+ ${CMAKE_CURRENT_BINARY_DIR}/trellis_swig_doc.i
+ DESTINATION ${GR_INCLUDE_DIR}/gnuradio/swig
+ COMPONENT "trellis_swig"
+)
diff --git a/gr-trellis/swig/trellis_swig.i b/gr-trellis/swig/trellis_swig.i
new file mode 100644
index 0000000000..5732aca1fb
--- /dev/null
+++ b/gr-trellis/swig/trellis_swig.i
@@ -0,0 +1,216 @@
+/*
+ * Copyright 2012 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.
+ */
+
+#define TRELLIS_API
+#define DIGITAL_API
+
+%include "gnuradio.i"
+
+//load generated python docstrings
+%include "trellis_swig_doc.i"
+
+%include "digital/metric_type.h"
+%include "digital/constellation.h"
+%include "trellis/siso_type.h"
+%include "trellis/fsm.h"
+%include "trellis/interleaver.h"
+
+%{
+#include "trellis/constellation_metrics_cf.h"
+#include "trellis/permutation.h"
+#include "trellis/siso_combined_f.h"
+#include "trellis/siso_f.h"
+#include "trellis/encoder_bb.h"
+#include "trellis/encoder_bs.h"
+#include "trellis/encoder_bi.h"
+#include "trellis/encoder_ss.h"
+#include "trellis/encoder_si.h"
+#include "trellis/encoder_ii.h"
+#include "trellis/sccc_encoder_bb.h"
+#include "trellis/sccc_encoder_bs.h"
+#include "trellis/sccc_encoder_bi.h"
+#include "trellis/sccc_encoder_ss.h"
+#include "trellis/sccc_encoder_si.h"
+#include "trellis/sccc_encoder_ii.h"
+#include "trellis/pccc_encoder_bb.h"
+#include "trellis/pccc_encoder_bs.h"
+#include "trellis/pccc_encoder_bi.h"
+#include "trellis/pccc_encoder_ss.h"
+#include "trellis/pccc_encoder_si.h"
+#include "trellis/pccc_encoder_ii.h"
+#include "trellis/metrics_s.h"
+#include "trellis/metrics_i.h"
+#include "trellis/metrics_f.h"
+#include "trellis/metrics_c.h"
+#include "trellis/pccc_decoder_b.h"
+#include "trellis/pccc_decoder_s.h"
+#include "trellis/pccc_decoder_i.h"
+#include "trellis/pccc_decoder_combined_fb.h"
+#include "trellis/pccc_decoder_combined_fs.h"
+#include "trellis/pccc_decoder_combined_fi.h"
+#include "trellis/pccc_decoder_combined_cb.h"
+#include "trellis/pccc_decoder_combined_cs.h"
+#include "trellis/pccc_decoder_combined_ci.h"
+#include "trellis/viterbi_b.h"
+#include "trellis/viterbi_s.h"
+#include "trellis/viterbi_i.h"
+#include "trellis/viterbi_combined_sb.h"
+#include "trellis/viterbi_combined_ss.h"
+#include "trellis/viterbi_combined_si.h"
+#include "trellis/viterbi_combined_ib.h"
+#include "trellis/viterbi_combined_is.h"
+#include "trellis/viterbi_combined_ii.h"
+#include "trellis/viterbi_combined_fb.h"
+#include "trellis/viterbi_combined_fs.h"
+#include "trellis/viterbi_combined_fi.h"
+#include "trellis/viterbi_combined_cb.h"
+#include "trellis/viterbi_combined_cs.h"
+#include "trellis/viterbi_combined_ci.h"
+#include "trellis/sccc_decoder_b.h"
+#include "trellis/sccc_decoder_s.h"
+#include "trellis/sccc_decoder_i.h"
+#include "trellis/sccc_decoder_combined_fb.h"
+#include "trellis/sccc_decoder_combined_fs.h"
+#include "trellis/sccc_decoder_combined_fi.h"
+#include "trellis/sccc_decoder_combined_cb.h"
+#include "trellis/sccc_decoder_combined_cs.h"
+#include "trellis/sccc_decoder_combined_ci.h"
+%}
+
+%include "trellis/constellation_metrics_cf.h"
+%include "trellis/permutation.h"
+%include "trellis/siso_combined_f.h"
+%include "trellis/siso_f.h"
+%include "trellis/encoder_bb.h"
+%include "trellis/encoder_bs.h"
+%include "trellis/encoder_bi.h"
+%include "trellis/encoder_ss.h"
+%include "trellis/encoder_si.h"
+%include "trellis/encoder_ii.h"
+%include "trellis/sccc_encoder_bb.h"
+%include "trellis/sccc_encoder_bs.h"
+%include "trellis/sccc_encoder_bi.h"
+%include "trellis/sccc_encoder_ss.h"
+%include "trellis/sccc_encoder_si.h"
+%include "trellis/sccc_encoder_ii.h"
+%include "trellis/pccc_encoder_bb.h"
+%include "trellis/pccc_encoder_bs.h"
+%include "trellis/pccc_encoder_bi.h"
+%include "trellis/pccc_encoder_ss.h"
+%include "trellis/pccc_encoder_si.h"
+%include "trellis/pccc_encoder_ii.h"
+%include "trellis/metrics_s.h"
+%include "trellis/metrics_i.h"
+%include "trellis/metrics_f.h"
+%include "trellis/metrics_c.h"
+%include "trellis/pccc_decoder_b.h"
+%include "trellis/pccc_decoder_s.h"
+%include "trellis/pccc_decoder_i.h"
+%include "trellis/pccc_decoder_combined_fb.h"
+%include "trellis/pccc_decoder_combined_fs.h"
+%include "trellis/pccc_decoder_combined_fi.h"
+%include "trellis/pccc_decoder_combined_cb.h"
+%include "trellis/pccc_decoder_combined_cs.h"
+%include "trellis/pccc_decoder_combined_ci.h"
+%include "trellis/viterbi_b.h"
+%include "trellis/viterbi_s.h"
+%include "trellis/viterbi_i.h"
+%include "trellis/viterbi_combined_sb.h"
+%include "trellis/viterbi_combined_ss.h"
+%include "trellis/viterbi_combined_si.h"
+%include "trellis/viterbi_combined_ib.h"
+%include "trellis/viterbi_combined_is.h"
+%include "trellis/viterbi_combined_ii.h"
+%include "trellis/viterbi_combined_fb.h"
+%include "trellis/viterbi_combined_fs.h"
+%include "trellis/viterbi_combined_fi.h"
+%include "trellis/viterbi_combined_cb.h"
+%include "trellis/viterbi_combined_cs.h"
+%include "trellis/viterbi_combined_ci.h"
+%include "trellis/sccc_decoder_b.h"
+%include "trellis/sccc_decoder_s.h"
+%include "trellis/sccc_decoder_i.h"
+%include "trellis/sccc_decoder_combined_fb.h"
+%include "trellis/sccc_decoder_combined_fs.h"
+%include "trellis/sccc_decoder_combined_fi.h"
+%include "trellis/sccc_decoder_combined_cb.h"
+%include "trellis/sccc_decoder_combined_cs.h"
+%include "trellis/sccc_decoder_combined_ci.h"
+
+GR_SWIG_BLOCK_MAGIC2(trellis, constellation_metrics_cf);
+GR_SWIG_BLOCK_MAGIC2(trellis, permutation);
+GR_SWIG_BLOCK_MAGIC2(trellis, siso_combined_f);
+GR_SWIG_BLOCK_MAGIC2(trellis, siso_f);
+GR_SWIG_BLOCK_MAGIC2(trellis, encoder_bb);
+GR_SWIG_BLOCK_MAGIC2(trellis, encoder_bs);
+GR_SWIG_BLOCK_MAGIC2(trellis, encoder_bi);
+GR_SWIG_BLOCK_MAGIC2(trellis, encoder_ss);
+GR_SWIG_BLOCK_MAGIC2(trellis, encoder_si);
+GR_SWIG_BLOCK_MAGIC2(trellis, encoder_ii);
+GR_SWIG_BLOCK_MAGIC2(trellis, sccc_encoder_bb);
+GR_SWIG_BLOCK_MAGIC2(trellis, sccc_encoder_bs);
+GR_SWIG_BLOCK_MAGIC2(trellis, sccc_encoder_bi);
+GR_SWIG_BLOCK_MAGIC2(trellis, sccc_encoder_ss);
+GR_SWIG_BLOCK_MAGIC2(trellis, sccc_encoder_si);
+GR_SWIG_BLOCK_MAGIC2(trellis, sccc_encoder_ii);
+GR_SWIG_BLOCK_MAGIC2(trellis, pccc_encoder_bb);
+GR_SWIG_BLOCK_MAGIC2(trellis, pccc_encoder_bs);
+GR_SWIG_BLOCK_MAGIC2(trellis, pccc_encoder_bi);
+GR_SWIG_BLOCK_MAGIC2(trellis, pccc_encoder_ss);
+GR_SWIG_BLOCK_MAGIC2(trellis, pccc_encoder_si);
+GR_SWIG_BLOCK_MAGIC2(trellis, pccc_encoder_ii);
+GR_SWIG_BLOCK_MAGIC2(trellis, metrics_s);
+GR_SWIG_BLOCK_MAGIC2(trellis, metrics_i);
+GR_SWIG_BLOCK_MAGIC2(trellis, metrics_f);
+GR_SWIG_BLOCK_MAGIC2(trellis, metrics_c);
+GR_SWIG_BLOCK_MAGIC2(trellis, pccc_decoder_b);
+GR_SWIG_BLOCK_MAGIC2(trellis, pccc_decoder_s);
+GR_SWIG_BLOCK_MAGIC2(trellis, pccc_decoder_i);
+GR_SWIG_BLOCK_MAGIC2(trellis, pccc_decoder_combined_fb);
+GR_SWIG_BLOCK_MAGIC2(trellis, pccc_decoder_combined_fs);
+GR_SWIG_BLOCK_MAGIC2(trellis, pccc_decoder_combined_fi);
+GR_SWIG_BLOCK_MAGIC2(trellis, pccc_decoder_combined_cb);
+GR_SWIG_BLOCK_MAGIC2(trellis, pccc_decoder_combined_cs);
+GR_SWIG_BLOCK_MAGIC2(trellis, pccc_decoder_combined_ci);
+GR_SWIG_BLOCK_MAGIC2(trellis, viterbi_b);
+GR_SWIG_BLOCK_MAGIC2(trellis, viterbi_s);
+GR_SWIG_BLOCK_MAGIC2(trellis, viterbi_i);
+GR_SWIG_BLOCK_MAGIC2(trellis, viterbi_combined_sb);
+GR_SWIG_BLOCK_MAGIC2(trellis, viterbi_combined_ss);
+GR_SWIG_BLOCK_MAGIC2(trellis, viterbi_combined_si);
+GR_SWIG_BLOCK_MAGIC2(trellis, viterbi_combined_ib);
+GR_SWIG_BLOCK_MAGIC2(trellis, viterbi_combined_is);
+GR_SWIG_BLOCK_MAGIC2(trellis, viterbi_combined_ii);
+GR_SWIG_BLOCK_MAGIC2(trellis, viterbi_combined_fb);
+GR_SWIG_BLOCK_MAGIC2(trellis, viterbi_combined_fs);
+GR_SWIG_BLOCK_MAGIC2(trellis, viterbi_combined_fi);
+GR_SWIG_BLOCK_MAGIC2(trellis, viterbi_combined_cb);
+GR_SWIG_BLOCK_MAGIC2(trellis, viterbi_combined_cs);
+GR_SWIG_BLOCK_MAGIC2(trellis, viterbi_combined_ci);
+GR_SWIG_BLOCK_MAGIC2(trellis, sccc_decoder_b);
+GR_SWIG_BLOCK_MAGIC2(trellis, sccc_decoder_s);
+GR_SWIG_BLOCK_MAGIC2(trellis, sccc_decoder_i);
+GR_SWIG_BLOCK_MAGIC2(trellis, sccc_decoder_combined_fb);
+GR_SWIG_BLOCK_MAGIC2(trellis, sccc_decoder_combined_fs);
+GR_SWIG_BLOCK_MAGIC2(trellis, sccc_decoder_combined_fi);
+GR_SWIG_BLOCK_MAGIC2(trellis, sccc_decoder_combined_cb);
+GR_SWIG_BLOCK_MAGIC2(trellis, sccc_decoder_combined_cs);
+GR_SWIG_BLOCK_MAGIC2(trellis, sccc_decoder_combined_ci);