From d5c192f9e3cde58589845b7b51057afc45d3bc79 Mon Sep 17 00:00:00 2001 From: anastas Date: Wed, 16 Aug 2006 20:07:36 +0000 Subject: [PATCH] Several enhancements to gr-trellis and gnuradio-examples/python/channel-coding: -Added fsm constructor for generating FSM directly from the generator matrix of binary convolutional codes. -Added functionality to fsm class to compute the best way to go from any state to any other state (useful for termination) -Added soft-in-soft-out (SISO) block for turbo processing -Added turbo decoding examples git-svn-id: http://gnuradio.org/svn/gnuradio/trunk@3322 221aa14e-8319-0410-a670-987f0aec2ac5 --- .../lib/general/gr_chunks_to_symbols_XX.cc.t | 2 +- .../python/channel-coding/README | 51 +- .../channel-coding/fsm_files/awgn1o2_128.fsm | 5 +- .../channel-coding/fsm_files/awgn1o2_16.fsm | 2 +- .../channel-coding/fsm_files/awgn1o2_4.fsm | 5 +- .../channel-coding/fsm_files/awgn1o2_8.fsm | 2 +- .../channel-coding/fsm_files/awgn2o3_4.fsm | 55 +-- .../channel-coding/fsm_files/awgn2o3_4_1.fsm | 42 -- .../fsm_files/awgn2o3_4_msb.fsm | 46 ++ .../fsm_files/awgn2o3_4_msbG.fsm | 60 +++ .../channel-coding/fsm_files/awgn2o4_4.fsm | 44 +- .../channel-coding/fsm_files/disconnected.fsm | 11 + .../python/channel-coding/fsm_files/rep3.fsm | 3 +- .../channel-coding/fsm_files/simple.fsm | 13 + .../python/channel-coding/fsm_utils.py | 95 ---- .../python/channel-coding/test_sccc_hard.py | 12 +- .../python/channel-coding/test_sccc_soft.py | 108 +++++ .../python/channel-coding/test_sccc_turbo.py | 139 ++++++ .../python/channel-coding/test_tcm.py | 9 +- .../python/channel-coding/test_tcm1.py | 14 +- .../python/channel-coding/test_tcm2.py | 116 +++++ .../channel-coding/test_tcm_combined.py | 16 +- .../channel-coding/test_tcm_parallel.py | 13 +- gr-trellis/doc/gr-trellis.html | 446 ------------------ gr-trellis/src/lib/Makefile.am | 5 + gr-trellis/src/lib/base.cc | 92 ++++ gr-trellis/src/lib/base.h | 38 ++ gr-trellis/src/lib/fsm.cc | 234 +++++++-- gr-trellis/src/lib/fsm.h | 12 +- gr-trellis/src/lib/fsm.i | 14 +- gr-trellis/src/lib/interleaver.cc | 4 +- gr-trellis/src/lib/interleaver.h | 4 +- gr-trellis/src/lib/interleaver.i | 4 +- gr-trellis/src/lib/trellis.i | 4 + gr-trellis/src/lib/trellis_calc_metric.cc | 115 ++--- gr-trellis/src/lib/trellis_calc_metric.h | 8 +- gr-trellis/src/lib/trellis_encoder_XX.cc.t | 30 +- gr-trellis/src/lib/trellis_encoder_XX.h.t | 6 +- gr-trellis/src/lib/trellis_encoder_XX.i.t | 4 +- gr-trellis/src/lib/trellis_encoder_bb.cc | 30 +- gr-trellis/src/lib/trellis_encoder_bb.h | 6 +- gr-trellis/src/lib/trellis_encoder_bb.i | 4 +- gr-trellis/src/lib/trellis_encoder_bi.cc | 30 +- gr-trellis/src/lib/trellis_encoder_bi.h | 6 +- gr-trellis/src/lib/trellis_encoder_bi.i | 4 +- gr-trellis/src/lib/trellis_encoder_bs.cc | 30 +- gr-trellis/src/lib/trellis_encoder_bs.h | 6 +- gr-trellis/src/lib/trellis_encoder_bs.i | 4 +- gr-trellis/src/lib/trellis_encoder_ii.cc | 30 +- gr-trellis/src/lib/trellis_encoder_ii.h | 6 +- gr-trellis/src/lib/trellis_encoder_ii.i | 4 +- gr-trellis/src/lib/trellis_encoder_si.cc | 30 +- gr-trellis/src/lib/trellis_encoder_si.h | 6 +- gr-trellis/src/lib/trellis_encoder_si.i | 4 +- gr-trellis/src/lib/trellis_encoder_ss.cc | 30 +- gr-trellis/src/lib/trellis_encoder_ss.h | 6 +- gr-trellis/src/lib/trellis_encoder_ss.i | 4 +- gr-trellis/src/lib/trellis_metrics_X.cc.t | 4 +- gr-trellis/src/lib/trellis_metrics_X.h.t | 6 +- gr-trellis/src/lib/trellis_metrics_X.i.t | 4 +- gr-trellis/src/lib/trellis_metrics_c.cc | 4 +- gr-trellis/src/lib/trellis_metrics_c.h | 6 +- gr-trellis/src/lib/trellis_metrics_c.i | 4 +- gr-trellis/src/lib/trellis_metrics_f.cc | 4 +- gr-trellis/src/lib/trellis_metrics_f.h | 6 +- gr-trellis/src/lib/trellis_metrics_f.i | 4 +- gr-trellis/src/lib/trellis_metrics_i.cc | 4 +- gr-trellis/src/lib/trellis_metrics_i.h | 6 +- gr-trellis/src/lib/trellis_metrics_i.i | 4 +- gr-trellis/src/lib/trellis_metrics_s.cc | 4 +- gr-trellis/src/lib/trellis_metrics_s.h | 6 +- gr-trellis/src/lib/trellis_metrics_s.i | 4 +- gr-trellis/src/lib/trellis_permutation.cc | 30 +- gr-trellis/src/lib/trellis_permutation.h | 12 +- gr-trellis/src/lib/trellis_permutation.i | 10 +- gr-trellis/src/lib/trellis_siso_f.cc | 323 +++++++++++++ gr-trellis/src/lib/trellis_siso_f.h | 92 ++++ gr-trellis/src/lib/trellis_siso_f.i | 55 +++ gr-trellis/src/lib/trellis_siso_f.lo | 12 + gr-trellis/src/lib/trellis_siso_type.h | 31 ++ gr-trellis/src/lib/trellis_viterbi_X.cc.t | 18 +- gr-trellis/src/lib/trellis_viterbi_X.h.t | 18 +- gr-trellis/src/lib/trellis_viterbi_X.i.t | 12 +- gr-trellis/src/lib/trellis_viterbi_b.cc | 18 +- gr-trellis/src/lib/trellis_viterbi_b.h | 18 +- gr-trellis/src/lib/trellis_viterbi_b.i | 12 +- .../src/lib/trellis_viterbi_combined_X.cc.t | 30 +- .../src/lib/trellis_viterbi_combined_X.h.t | 30 +- .../src/lib/trellis_viterbi_combined_X.i.t | 20 +- .../src/lib/trellis_viterbi_combined_b.cc | 30 +- .../src/lib/trellis_viterbi_combined_b.h | 30 +- .../src/lib/trellis_viterbi_combined_b.i | 20 +- .../src/lib/trellis_viterbi_combined_i.cc | 30 +- .../src/lib/trellis_viterbi_combined_i.h | 30 +- .../src/lib/trellis_viterbi_combined_i.i | 20 +- .../src/lib/trellis_viterbi_combined_s.cc | 30 +- .../src/lib/trellis_viterbi_combined_s.h | 30 +- .../src/lib/trellis_viterbi_combined_s.i | 20 +- gr-trellis/src/lib/trellis_viterbi_i.cc | 18 +- gr-trellis/src/lib/trellis_viterbi_i.h | 18 +- gr-trellis/src/lib/trellis_viterbi_i.i | 12 +- gr-trellis/src/lib/trellis_viterbi_s.cc | 18 +- gr-trellis/src/lib/trellis_viterbi_s.h | 18 +- gr-trellis/src/lib/trellis_viterbi_s.i | 12 +- 104 files changed, 2018 insertions(+), 1252 deletions(-) delete mode 100644 gnuradio-examples/python/channel-coding/fsm_files/awgn2o3_4_1.fsm create mode 100644 gnuradio-examples/python/channel-coding/fsm_files/awgn2o3_4_msb.fsm create mode 100644 gnuradio-examples/python/channel-coding/fsm_files/awgn2o3_4_msbG.fsm create mode 100644 gnuradio-examples/python/channel-coding/fsm_files/disconnected.fsm create mode 100644 gnuradio-examples/python/channel-coding/fsm_files/simple.fsm create mode 100755 gnuradio-examples/python/channel-coding/test_sccc_soft.py create mode 100755 gnuradio-examples/python/channel-coding/test_sccc_turbo.py create mode 100755 gnuradio-examples/python/channel-coding/test_tcm2.py delete mode 100644 gr-trellis/doc/gr-trellis.html create mode 100644 gr-trellis/src/lib/base.cc create mode 100644 gr-trellis/src/lib/base.h create mode 100644 gr-trellis/src/lib/trellis_siso_f.cc create mode 100644 gr-trellis/src/lib/trellis_siso_f.h create mode 100644 gr-trellis/src/lib/trellis_siso_f.i create mode 100644 gr-trellis/src/lib/trellis_siso_f.lo create mode 100644 gr-trellis/src/lib/trellis_siso_type.h diff --git a/gnuradio-core/src/lib/general/gr_chunks_to_symbols_XX.cc.t b/gnuradio-core/src/lib/general/gr_chunks_to_symbols_XX.cc.t index a4887335..971311d1 100644 --- a/gnuradio-core/src/lib/general/gr_chunks_to_symbols_XX.cc.t +++ b/gnuradio-core/src/lib/general/gr_chunks_to_symbols_XX.cc.t @@ -62,7 +62,7 @@ int // per stream processing for (int i = 0; i < noutput_items / d_D; i++){ - assert (((unsigned int)in[i]*d_D) < d_symbol_table.size()); + assert (((unsigned int)in[i]*d_D+d_D) <= d_symbol_table.size()); memcpy(out, &d_symbol_table[(unsigned int)in[i]*d_D], d_D*sizeof(@O_TYPE@)); out+=d_D; } diff --git a/gnuradio-examples/python/channel-coding/README b/gnuradio-examples/python/channel-coding/README index abfceb42..2be8c6ba 100644 --- a/gnuradio-examples/python/channel-coding/README +++ b/gnuradio-examples/python/channel-coding/README @@ -8,26 +8,39 @@ fsm_files is a directory with some FSM definitions If you just want to see what these programs do, run each of the following: -./test_tcm.py fsm_files/awgn1o2_4.fsm 10.0 1000 -./test_tcm1.py fsm_files/awgn1o2_4.fsm 10.0 1000 -./test_tcm_combined.py fsm_files/awgn1o2_4.fsm 10.0 1000 -./test_tcm_parallel.py fsm_files/awgn1o2_4.fsm 10.0 1000 -./test_sccc_hard.py fsm_files/awgn1o2_4.fsm fsm_files/awgn1o2_4.fsm 10.0 1000 +./test_tcm.py fsm_files/awgn1o2_4.fsm 6.0 1000 +./test_tcm1.py fsm_files/awgn1o2_4.fsm 6.0 1000 +./test_tcm2.py 6.0 1000 +./test_tcm_combined.py fsm_files/awgn1o2_4.fsm 6.0 1000 +./test_tcm_parallel.py fsm_files/awgn1o2_4.fsm 6.0 1000 + +./test_sccc_hard.py fsm_files/awgn1o2_4.fsm fsm_files/awgn1o2_4_msb.fsm 10.0 100 +./test_sccc_soft.py fsm_files/awgn1o2_4.fsm fsm_files/awgn1o2_4_msb.fsm 8.0 100 +./test_sccc_turbo.py fsm_files/awgn1o2_4.fsm fsm_files/awgn1o2_4_msb.fsm 5.0 100 In your terminal you will see something like this: -[anastas@ernesto channel-coding]$ ./test_tcm.py fsm_files/awgn1o2_4.fsm 6.0 1000 -100 1024 1 103424 10 9.668936e-05 -200 1024 1 205824 21 1.020289e-04 -300 1024 0 308224 40 1.297757e-04 -400 1024 0 410624 1074 2.615531e-03 -500 1024 0 513024 1081 2.107114e-03 -600 1024 0 615424 1090 1.771137e-03 -700 1024 0 717824 1097 1.528230e-03 -800 1024 0 820224 1107 1.349631e-03 -900 1024 0 922624 1120 1.213929e-03 -1024000 1129 1.102539e-03 - -1.102539e-03 is the error rate estimates by sending 1000 packets of -1024x16 bits each using an 1/2 4-state convolutional code and QPSK +$ ./test_tcm.py fsm_files/awgn1o2_4.fsm 6.0 1000 +100 98 9.80e-01 102400 9 8.79e-05 +200 198 9.90e-01 204800 20 9.77e-05 +300 298 9.93e-01 307200 40 1.30e-04 +400 398 9.95e-01 409600 1074 2.62e-03 +500 498 9.96e-01 512000 1081 2.11e-03 +600 598 9.97e-01 614400 1090 1.77e-03 +700 698 9.97e-01 716800 1097 1.53e-03 +800 798 9.98e-01 819200 1107 1.35e-03 +900 898 9.98e-01 921600 1120 1.22e-03 +1000 998 9.98e-01 1024000 1129 1.10e-03 +1000 998 9.98e-01 1024000 1129 1.10e-03 + +which gives you information about the: +number of transmitted packets +number of packets in error +iestimated packet error rate +number of transmitted shorts +number of shorts in error +estimated (short) error rate + +1.10e-03 is the error rate estimate by sending 1000 packets of +1024 shorts each, using an 1/2 4-state convolutional code and QPSK modulation through an AWGN with Es/N0 = 6.0 dB diff --git a/gnuradio-examples/python/channel-coding/fsm_files/awgn1o2_128.fsm b/gnuradio-examples/python/channel-coding/fsm_files/awgn1o2_128.fsm index 9c14d82f..bb79c59d 100644 --- a/gnuradio-examples/python/channel-coding/fsm_files/awgn1o2_128.fsm +++ b/gnuradio-examples/python/channel-coding/fsm_files/awgn1o2_128.fsm @@ -260,5 +260,6 @@ -GM1o2_128=[1+D^3+D^4+D^5+D^6+D^7 1+D+D^2+D^5+D^7] - =[249 167] +GM1o2_128=[1+D+D^2+D^5+D^7 1+D^3+D^4+D^5+D^6+D^7] + =[11100101 10011111] + =[229 159] diff --git a/gnuradio-examples/python/channel-coding/fsm_files/awgn1o2_16.fsm b/gnuradio-examples/python/channel-coding/fsm_files/awgn1o2_16.fsm index 2b000da6..cdab4135 100644 --- a/gnuradio-examples/python/channel-coding/fsm_files/awgn1o2_16.fsm +++ b/gnuradio-examples/python/channel-coding/fsm_files/awgn1o2_16.fsm @@ -36,4 +36,4 @@ -GM1o2_16=[1+D^2+D^3+D^4 1+D+D^4]; +GM1o2_16=[1+D+D^4 1+D^2+D^3+D^4 ] = [25,23] (decimal) diff --git a/gnuradio-examples/python/channel-coding/fsm_files/awgn1o2_4.fsm b/gnuradio-examples/python/channel-coding/fsm_files/awgn1o2_4.fsm index 33e5ee31..fb316b5e 100644 --- a/gnuradio-examples/python/channel-coding/fsm_files/awgn1o2_4.fsm +++ b/gnuradio-examples/python/channel-coding/fsm_files/awgn1o2_4.fsm @@ -11,7 +11,4 @@ 2 1 AWGN CC from Proakis-Salehi pg 779 -GM1o2_4=[1+D+D^2 1+D^2]; - - - +GM1o2_4=[1+D^2, 1+D+D^2] = [5, 7] (in decimal); diff --git a/gnuradio-examples/python/channel-coding/fsm_files/awgn1o2_8.fsm b/gnuradio-examples/python/channel-coding/fsm_files/awgn1o2_8.fsm index dd63b1ef..604bac6c 100644 --- a/gnuradio-examples/python/channel-coding/fsm_files/awgn1o2_8.fsm +++ b/gnuradio-examples/python/channel-coding/fsm_files/awgn1o2_8.fsm @@ -21,4 +21,4 @@ 1/2 8-state code (Proakis pg. 493) -GM1o2_8=[ 1+D+D^2+D^3 1+D+D^3]; +GM1o2_8=[ 1+D+D^3 1+D+D^2+D^3] =[13 , 15] (decimal) diff --git a/gnuradio-examples/python/channel-coding/fsm_files/awgn2o3_4.fsm b/gnuradio-examples/python/channel-coding/fsm_files/awgn2o3_4.fsm index 567948e7..3ac57be1 100644 --- a/gnuradio-examples/python/channel-coding/fsm_files/awgn2o3_4.fsm +++ b/gnuradio-examples/python/channel-coding/fsm_files/awgn2o3_4.fsm @@ -1,44 +1,15 @@ 4 4 8 -0 2 1 3 -0 2 1 3 -0 2 1 3 -0 2 1 3 - -0 3 5 6 -4 7 1 2 -7 4 2 1 -3 0 6 5 - - -This is generated by the 1/2 AWGN code (5 7) by puncturing the first (MSB) bit. ---> d_free=3 - -before puncturing: - -00 03 31 32 -30 33 01 02 -13 10 22 21 -23 20 12 11 - -or in decimal representation: - - 0 3 13 14 -12 15 1 2 - 7 4 10 9 -11 8 6 5 - -by punturing the MSB you get (dmin=3) - -0 3 5 6 -4 7 1 2 -7 4 2 1 -3 0 6 5 - -and by puncturing the LSB (something is wrong with this code) - -0 1 6 7 -6 7 0 1 -3 2 5 4 -5 4 3 2 - +0 1 2 3 +0 1 2 3 +0 1 2 3 +0 1 2 3 + +0 7 4 3 +3 4 7 0 +5 2 1 6 +6 1 2 5 + +I don't remeber how I generated this one... +it is a bit better than awgn2o3_4_msb and worse +than awgn2o3_4_msbG. diff --git a/gnuradio-examples/python/channel-coding/fsm_files/awgn2o3_4_1.fsm b/gnuradio-examples/python/channel-coding/fsm_files/awgn2o3_4_1.fsm deleted file mode 100644 index c5aee698..00000000 --- a/gnuradio-examples/python/channel-coding/fsm_files/awgn2o3_4_1.fsm +++ /dev/null @@ -1,42 +0,0 @@ -4 4 8 - -0 1 2 3 -0 1 2 3 -0 1 2 3 -0 1 2 3 - -0 7 4 3 -3 4 7 0 -5 2 1 6 -6 1 2 5 - - - -This is generated by the 1/2 AWGN code (5 7) by puncturing the first (MSB) bit. ---> d_free=3 - -before puncturing: - - -or in decimal representation: - -0 7 12 11 -3 4 15 8 -13 10 1 6 -14 9 2 5 - -by punturing the MSB you get (dmin=3) - -0 7 4 3 -3 4 7 0 -5 2 1 6 -6 1 2 5 - - -and by puncturing the LSB (something is wrong with this code) - -0 3 6 5 -1 2 7 4 -6 5 0 3 -7 4 1 2 - diff --git a/gnuradio-examples/python/channel-coding/fsm_files/awgn2o3_4_msb.fsm b/gnuradio-examples/python/channel-coding/fsm_files/awgn2o3_4_msb.fsm new file mode 100644 index 00000000..551b7110 --- /dev/null +++ b/gnuradio-examples/python/channel-coding/fsm_files/awgn2o3_4_msb.fsm @@ -0,0 +1,46 @@ +4 4 8 + +0 1 2 3 +0 1 2 3 +0 1 2 3 +0 1 2 3 + +0 5 3 6 +4 1 7 2 +7 2 4 1 +3 6 0 5 + + +This is generated by the 1/2 AWGN code (5 7) operated twice, ie, +(xk+1 xki) [xk-1 xk-2] -> [xk+1 xki]. +We also puncture the first (MSB) bit. +This code is worse than awgn2o3_4_msbG and slightly worse than +awgn2o3_4, BUT seems to be a good innner code for sctcm (with 8PSK natural). + +intermediate states: + +00 21 02 23 +00 21 02 23 +10 31 12 33 +10 31 12 33 + +output before puncturing: + +00 31 03 32 +30 01 33 02 +13 22 10 21 +23 12 20 11 + +output after punturing the MSB: + +00 11 03 12 +10 01 13 02 +13 02 10 01 +03 12 00 11 + +and in decimal: + +0 5 3 6 +4 1 7 2 +7 2 4 1 +3 6 0 5 diff --git a/gnuradio-examples/python/channel-coding/fsm_files/awgn2o3_4_msbG.fsm b/gnuradio-examples/python/channel-coding/fsm_files/awgn2o3_4_msbG.fsm new file mode 100644 index 00000000..8956c53d --- /dev/null +++ b/gnuradio-examples/python/channel-coding/fsm_files/awgn2o3_4_msbG.fsm @@ -0,0 +1,60 @@ +4 4 8 + +0 1 2 3 +0 1 2 3 +0 1 2 3 +0 1 2 3 + +0 4 2 6 +5 1 3 7 +3 7 5 1 + + +This is generated by the 1/2 AWGN code (5 7) operated twice, ie, +(xk+1 xki) [xk-1 xk-2] -> [xk+1 xki]. +We also puncture the first (MSB) bit and Gray map the symbols. + +intermediate states: + +00 21 02 23 +00 21 02 23 +10 31 12 33 +10 31 12 33 + +output before puncturing: + +00 31 03 32 +30 01 33 02 +13 22 10 21 +23 12 20 11 + +output after punturing the MSB: + +00 11 03 12 +10 01 13 02 +13 02 10 01 +03 12 00 11 + +and in decimal: + +0 5 3 6 +4 1 7 2 +7 2 4 1 +3 6 0 5 + +After Gray mapping: +label -> phase +0 -> 0 +1 -> 0 +2 -> 7 +3 -> 2 +4 -> 5 +5 -> 4 +6 -> 6 +7 -> 3 + +0 4 2 6 +5 1 3 7 +3 7 5 1 +2 6 0 4 + diff --git a/gnuradio-examples/python/channel-coding/fsm_files/awgn2o4_4.fsm b/gnuradio-examples/python/channel-coding/fsm_files/awgn2o4_4.fsm index 793d419c..a895be89 100644 --- a/gnuradio-examples/python/channel-coding/fsm_files/awgn2o4_4.fsm +++ b/gnuradio-examples/python/channel-coding/fsm_files/awgn2o4_4.fsm @@ -1,14 +1,36 @@ -4 4 16 +4 4 16 -0 2 1 3 -0 2 1 3 -0 2 1 3 -0 2 1 3 +0 1 2 3 +0 1 2 3 +0 1 2 3 +0 1 2 3 - 0 3 13 14 -12 15 1 2 - 7 4 10 9 -11 8 6 5 + 0 13 3 14 +12 1 15 2 + 7 10 4 9 +11 6 8 5 -generated by the awgn1o2_4.fsm code -(two steps of the 1o2 code) + +This is generated by the 1/2 AWGN code (5 7) operated twice, ie, +(xk+1 xki) [xk-1 xk-2] -> [xk+1 xki]. + +intermediate states: + +00 21 02 23 +00 21 02 23 +10 31 12 33 +10 31 12 33 + +output: + +00 31 03 32 +30 01 33 02 +13 22 10 21 +23 12 20 11 + +and in decimal: + + 0 13 3 14 +12 1 15 2 + 7 10 4 9 +11 6 8 5 diff --git a/gnuradio-examples/python/channel-coding/fsm_files/disconnected.fsm b/gnuradio-examples/python/channel-coding/fsm_files/disconnected.fsm new file mode 100644 index 00000000..847963e7 --- /dev/null +++ b/gnuradio-examples/python/channel-coding/fsm_files/disconnected.fsm @@ -0,0 +1,11 @@ +1 4 1 + +1 +0 +3 +2 + +0 +0 +0 +0 diff --git a/gnuradio-examples/python/channel-coding/fsm_files/rep3.fsm b/gnuradio-examples/python/channel-coding/fsm_files/rep3.fsm index 1930523b..ef1bd1f0 100644 --- a/gnuradio-examples/python/channel-coding/fsm_files/rep3.fsm +++ b/gnuradio-examples/python/channel-coding/fsm_files/rep3.fsm @@ -4,4 +4,5 @@ 0 7 -1/3 repetition code (with binary input) +1/3 repetition code (with binary input). +There is only one state, since this is essentially a memoryless system. diff --git a/gnuradio-examples/python/channel-coding/fsm_files/simple.fsm b/gnuradio-examples/python/channel-coding/fsm_files/simple.fsm new file mode 100644 index 00000000..07fb0852 --- /dev/null +++ b/gnuradio-examples/python/channel-coding/fsm_files/simple.fsm @@ -0,0 +1,13 @@ +1 4 1 + +1 +2 +3 +0 + +0 +0 +0 +0 + +essentially this fsm has no inputs and no outputs; it ijust cycles through all 4 states. diff --git a/gnuradio-examples/python/channel-coding/fsm_utils.py b/gnuradio-examples/python/channel-coding/fsm_utils.py index dc5ee79f..fe9f4f3b 100755 --- a/gnuradio-examples/python/channel-coding/fsm_utils.py +++ b/gnuradio-examples/python/channel-coding/fsm_utils.py @@ -60,101 +60,6 @@ def base2dec(s,base): - - -###################################################################### -# Automaticaly generate the FSM structure for a binary feed-forward -# convolutional code. -# Input: k x n generator matrix (decimal representation) -###################################################################### -def make_fsm_bin_cc_ff(k,n,GM): - mem=[[]]*k - max_mem_x=[-1]*k - max_mem = -1 - for i in range(k): - memr=[0]*n - for j in range(n): - if GM[i][j]==0: - memr[j]=-1 - else: - memr[j]=int(math.log(GM[i][j],2)) - if memr[j]>max_mem_x[i]: - max_mem_x[i]=memr[j] - if memr[j]>max_mem: - max_mem=memr[j] - mem[i]=memr - - sum_max_mem = 0 - for i in range(k): - sum_max_mem = sum_max_mem+max_mem_x[i] - - - #print mem - #print max_mem_x - #print max_mem - #print sum_max_mem - - I=2**k - S=2**sum_max_mem - O=2**n - - #print I, S, O - - NS=[0]*S*I; - OS=[0]*S*I; - for s in range(S): - for i in range(I): - ss=dec2base(s,2,sum_max_mem) - ind=0 - ss_r=[] - for kk in range(k): - ss1 = [0]*max_mem - ss1[0:max_mem_x[kk]] = ss[ind:ind+max_mem_x[kk]] - ss_r.append(ss1) - ind=ind+max_mem_x[kk] - ii=dec2base(i,2,k) - - tt_r = ss_r - for kk in range(k): - tt_r[kk].insert(0,ii[kk]) - #print tt_r - - ns_r = [] - for kk in range(k): - ns_r.append(tt_r[kk][0:max_mem]) - - ns=[] - for kk in range(k): - ns = ns + ns_r[kk][0:max_mem_x[kk]] - NS[s*I+i]=base2dec(ns,2); - - out_r=[0]*n - for nn in range(n): - out=0; - for kk in range(k): - c=[0]*max_mem - gm = dec2base(GM[kk][nn],2,max_mem_x[kk]+1) - gm.reverse() - c[0:len(gm)] = gm - sy = 0 - for m in range(len(c)): - sy = sy + c[m]*tt_r[kk][m]; - out=operator.mod(out+sy,2); - out_r[nn]=out; - out_r.reverse() - OS[s*I+i] = base2dec(out_r,2); - - #O=max(max(OS))+1; - print I, S, O - print NS - print OS - - return (I,S,O,NS,OS) - - - - - ###################################################################### # Automatically generate the lookup table that maps the FSM outputs # to channel inputs corresponding to a channel 'channel' and a modulation diff --git a/gnuradio-examples/python/channel-coding/test_sccc_hard.py b/gnuradio-examples/python/channel-coding/test_sccc_hard.py index a869e91e..d634282f 100755 --- a/gnuradio-examples/python/channel-coding/test_sccc_hard.py +++ b/gnuradio-examples/python/channel-coding/test_sccc_hard.py @@ -18,7 +18,7 @@ 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_out = trellis.encoder_ss(fo,0) # initial state = 0 - inter = trellis.permutation(interleaver.K(),interleaver.INTER(),gr.sizeof_short) + 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) @@ -29,7 +29,7 @@ def run_test (fo,fi,interleaver,Kb,bitspersymbol,K,dimensionality,constellation, # RX metrics_in = trellis.metrics_f(fi.O(),dimensionality,constellation,trellis.TRELLIS_EUCLIDEAN) # data preprocessing to generate metrics for innner Viterbi va_in = trellis.viterbi_s(fi,K,0,-1) # Put -1 if the Initial/Final states are not set. - deinter = trellis.permutation(interleaver.K(),interleaver.DEINTER(),gr.sizeof_short) + deinter = trellis.permutation(interleaver.K(),interleaver.DEINTER(),1,gr.sizeof_short) metrics_out = trellis.metrics_s(fo.O(),1,[0,1,2,3],trellis.TRELLIS_HARD_SYMBOL) # data preprocessing to generate metrics for outer Viterbi (hard decisions) va_out = trellis.viterbi_s(fo,K,0,-1) # Put -1 if the Initial/Final states are not set. fsmi2s = gr.unpacked_to_packed_ss(bitspersymbol,gr.GR_MSB_FIRST) # pack FSM input symbols to shorts @@ -85,14 +85,16 @@ def main(args): tot_s=0 # total number of transmitted shorts terr_s=0 # total number of shorts in error + terr_p=0 # total number of packets in error for i in range(rep): (s,e)=run_test(fo,fi,interleaver,Kb,bitspersymbol,K,dimensionality,constellation,N0,-long(666+i)) # run experiment with different seed to get different noise realizations tot_s=tot_s+s terr_s=terr_s+e - if (i%100==0) & (i>0): # display progress - print i,s,e,tot_s,terr_s, '%e' % ((1.0*terr_s)/tot_s) + terr_p=terr_p+(terr_s!=0) + if ((i+1)%100==0) : # display progress + print i+1,terr_p, '%.2e' % ((1.0*terr_p)/(i+1)),tot_s,terr_s, '%.2e' % ((1.0*terr_s)/tot_s) # estimate of the (short or bit) error rate - print tot_s,terr_s, '%e' % ((1.0*terr_s)/tot_s) + print rep,terr_p, '%.2e' % ((1.0*terr_p)/(i+1)),tot_s,terr_s, '%.2e' % ((1.0*terr_s)/tot_s) if __name__ == '__main__': diff --git a/gnuradio-examples/python/channel-coding/test_sccc_soft.py b/gnuradio-examples/python/channel-coding/test_sccc_soft.py new file mode 100755 index 00000000..23e6553c --- /dev/null +++ b/gnuradio-examples/python/channel-coding/test_sccc_soft.py @@ -0,0 +1,108 @@ +#!/usr/bin/env python + +from gnuradio import gr +from gnuradio import audio +from gnuradio import trellis +from gnuradio import eng_notation +import math +import sys +import random +import fsm_utils + + + + +def run_test (fo,fi,interleaver,Kb,bitspersymbol,K,dimensionality,constellation,N0,seed): + fg = gr.flow_graph () + + + # TX + src = gr.lfsr_32k_source_s() + 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_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) + + # CHANNEL + add = gr.add_ff() + noise = gr.noise_source_f(gr.GR_GAUSSIAN,math.sqrt(N0/2),seed) + + # RX + metrics_in = trellis.metrics_f(fi.O(),dimensionality,constellation,trellis.TRELLIS_EUCLIDEAN) # data preprocessing to generate metrics for innner Viterbi + gnd = gr.vector_source_f([0],True); + siso_in = trellis.siso_f(fi,K,0,-1,True,False,trellis.TRELLIS_MIN_SUM) # Put -1 if the Initial/Final states are not set. + deinter = trellis.permutation(interleaver.K(),interleaver.DEINTER(),fi.I(),gr.sizeof_float) + va_out = trellis.viterbi_s(fo,K,0,-1) # Put -1 if the Initial/Final states are not set. + fsmi2s = gr.unpacked_to_packed_ss(bitspersymbol,gr.GR_MSB_FIRST) # pack FSM input symbols to shorts + dst = gr.check_lfsr_32k_s() + + fg.connect (src,src_head,s2fsmi,enc_out,inter,enc_in,mod) + fg.connect (mod,(add,0)) + fg.connect (noise,(add,1)) + fg.connect (add,metrics_in) + fg.connect (gnd,(siso_in,0)) + fg.connect (metrics_in,(siso_in,1)) + fg.connect (siso_in,deinter,va_out,fsmi2s,dst) + + fg.run() + + ntotal = dst.ntotal () + nright = dst.nright () + runlength = dst.runlength () + return (ntotal,ntotal-nright) + + +def main(args): + nargs = len (args) + if nargs == 4: + fname_out=args[0] + fname_in=args[1] + esn0_db=float(args[2]) # Es/No in dB + rep=int(args[3]) # number of times the experiment is run to collect enough errors + else: + sys.stderr.write ('usage: test_tcm.py fsm_name_out fsm_fname_in Es/No_db repetitions\n') + sys.exit (1) + + # system parameters + Kb=1024*16 # packet size in bits (make it multiple of 16 so it can be packed in a short) + fo=trellis.fsm(fname_out) # get the outer FSM specification from a file + fi=trellis.fsm(fname_in) # get the innner FSM specification from a file + bitspersymbol = int(round(math.log(fo.I())/math.log(2))) # bits per FSM input symbol + if fo.O() != fi.I(): + sys.stderr.write ('Incompatible cardinality between outer and inner FSM.\n') + sys.exit (1) + K=Kb/bitspersymbol # packet size in trellis steps + interleaver=trellis.interleaver(K,666) # construct a random interleaver + modulation = fsm_utils.psk8 # see fsm_utlis.py for available predefined modulations + dimensionality = modulation[0] + constellation = modulation[1] + if len(constellation)/dimensionality != fi.O(): + sys.stderr.write ('Incompatible FSM output cardinality and modulation size.\n') + sys.exit (1) + # calculate average symbol energy + Es = 0 + for i in range(len(constellation)): + Es = Es + constellation[i]**2 + Es = Es / (len(constellation)/dimensionality) + N0=Es/pow(10.0,esn0_db/10.0); # calculate noise variance + + + tot_s=0 # total number of transmitted shorts + terr_s=0 # total number of shorts in error + terr_p=0 # total number of packets in error + for i in range(rep): + (s,e)=run_test(fo,fi,interleaver,Kb,bitspersymbol,K,dimensionality,constellation,N0,-long(666+i)) # run experiment with different seed to get different noise realizations + tot_s=tot_s+s + terr_s=terr_s+e + terr_p=terr_p+(terr_s!=0) + if ((i+1)%100==0) : # display progress + print i+1,terr_p, '%.2e' % ((1.0*terr_p)/(i+1)),tot_s,terr_s, '%.2e' % ((1.0*terr_s)/tot_s) + # estimate of the (short or bit) error rate + print rep,terr_p, '%.2e' % ((1.0*terr_p)/(i+1)),tot_s,terr_s, '%.2e' % ((1.0*terr_s)/tot_s) + + + +if __name__ == '__main__': + main (sys.argv[1:]) diff --git a/gnuradio-examples/python/channel-coding/test_sccc_turbo.py b/gnuradio-examples/python/channel-coding/test_sccc_turbo.py new file mode 100755 index 00000000..cdd1ad8b --- /dev/null +++ b/gnuradio-examples/python/channel-coding/test_sccc_turbo.py @@ -0,0 +1,139 @@ +#!/usr/bin/env python + +from gnuradio import gr +from gnuradio import audio +from gnuradio import trellis +from gnuradio import eng_notation +import math +import sys +import random +import fsm_utils + + + +def make_rx(fg,fo,fi,dimensionality,constellation,K,interleaver,IT,Es,N0,type): + metrics_in = trellis.metrics_f(fi.O(),dimensionality,constellation,trellis.TRELLIS_EUCLIDEAN) # data preprocessing to generate metrics for innner Viterbi + scale = gr.multiply_const_ff(1.0/N0) + gnd = gr.vector_source_f([0],True); + + inter=[] + deinter=[] + siso_in=[] + siso_out=[] + + for it in range(IT-1): + inter.append( trellis.permutation(interleaver.K(),interleaver.INTER(),fi.I(),gr.sizeof_float) ) + siso_in.append( trellis.siso_f(fi,K,0,3,True,False,type) ) + deinter.append( trellis.permutation(interleaver.K(),interleaver.DEINTER(),fi.I(),gr.sizeof_float) ) + siso_out.append( trellis.siso_f(fo,K,0,3,False,True,type) ) + fg.connect (inter[it],(siso_in[it],0)) + fg.connect (gnd,(siso_out[it],0)) + fg.connect (siso_in[it],deinter[it],(siso_out[it],1)) + + inter.append( trellis.permutation(interleaver.K(),interleaver.INTER(),fi.I(),gr.sizeof_float) ) + siso_in.append( trellis.siso_f(fi,K,0,-1,True,False,type) ) + deinter.append( trellis.permutation(interleaver.K(),interleaver.DEINTER(),fi.I(),gr.sizeof_float) ) + siso_out.append( trellis.viterbi_s(fo,K,0,-1) ) + fg.connect (inter[IT-1],(siso_in[IT-1],0)) + fg.connect (siso_in[IT-1],deinter[IT-1],siso_out[IT-1]) + + # connect first stage + fg.connect (gnd,inter[0]) + fg.connect (metrics_in,scale) + fg.connect (scale,(siso_in[0],1)) + for it in range(IT-1): + fg.connect (siso_out[it],inter[it+1]) + fg.connect (metrics_in,(siso_in[it+1],1)) + return (metrics_in,siso_out[IT-1]) + + +def run_test (fo,fi,interleaver,Kb,bitspersymbol,K,dimensionality,constellation,Es,N0,IT,seed): + fg = gr.flow_graph () + + + # TX + src = gr.lfsr_32k_source_s() + 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_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) + + # CHANNEL + add = gr.add_ff() + noise = gr.noise_source_f(gr.GR_GAUSSIAN,math.sqrt(N0/2),seed) + + # RX + (head,tail) = make_rx(fg,fo,fi,dimensionality,constellation,K,interleaver,IT,Es,N0,trellis.TRELLIS_MIN_SUM) + #(head,tail) = make_rx(fg,fo,fi,dimensionality,constellation,K,interleaver,IT,Es,N0,trellis.TRELLIS_SUM_PRODUCT) + fsmi2s = gr.unpacked_to_packed_ss(bitspersymbol,gr.GR_MSB_FIRST) # pack FSM input symbols to shorts + dst = gr.check_lfsr_32k_s() + + fg.connect (src,src_head,s2fsmi,enc_out,inter,enc_in,mod) + fg.connect (mod,(add,0)) + fg.connect (noise,(add,1)) + fg.connect (add,head) + fg.connect (tail,fsmi2s,dst) + + fg.run() + + #print enc_out.ST(), enc_in.ST() + + ntotal = dst.ntotal () + nright = dst.nright () + runlength = dst.runlength () + return (ntotal,ntotal-nright) + + +def main(args): + nargs = len (args) + if nargs == 4: + fname_out=args[0] + fname_in=args[1] + esn0_db=float(args[2]) # Es/No in dB + rep=int(args[3]) # number of times the experiment is run to collect enough errors + else: + sys.stderr.write ('usage: test_tcm.py fsm_name_out fsm_fname_in Es/No_db repetitions\n') + sys.exit (1) + + # system parameters + Kb=1024*16 # packet size in bits (make it multiple of 16 so it can be packed in a short) + fo=trellis.fsm(fname_out) # get the outer FSM specification from a file + fi=trellis.fsm(fname_in) # get the innner FSM specification from a file + bitspersymbol = int(round(math.log(fo.I())/math.log(2))) # bits per FSM input symbol + if fo.O() != fi.I(): + sys.stderr.write ('Incompatible cardinality between outer and inner FSM.\n') + sys.exit (1) + K=Kb/bitspersymbol # packet size in trellis steps + interleaver=trellis.interleaver(K,666) # construct a random interleaver + modulation = fsm_utils.psk8 # see fsm_utlis.py for available predefined modulations + dimensionality = modulation[0] + constellation = modulation[1] + if len(constellation)/dimensionality != fi.O(): + sys.stderr.write ('Incompatible FSM output cardinality and modulation size.\n') + sys.exit (1) + # calculate average symbol energy + Es = 0 + for i in range(len(constellation)): + Es = Es + constellation[i]**2 + Es = Es / (len(constellation)/dimensionality) + N0=Es/pow(10.0,esn0_db/10.0); # calculate noise variance + IT = 3 # number of turbo iterations + + tot_s=0 # total number of transmitted shorts + terr_s=0 # total number of shorts in error + terr_p=0 # total number of packets in error + for i in range(rep): + (s,e)=run_test(fo,fi,interleaver,Kb,bitspersymbol,K,dimensionality,constellation,Es,N0,IT,-long(666+i)) # run experiment with different seed to get different noise realizations + tot_s=tot_s+s + terr_s=terr_s+e + terr_p=terr_p+(terr_s!=0) + if ((i+1)%10==0): # display progress + print i+1,terr_p, '%.2e' % ((1.0*terr_p)/(i+1)),tot_s,terr_s, '%.2e' % ((1.0*terr_s)/tot_s) + # estimate of the (short or bit) error rate + print rep,terr_p, '%.2e' % ((1.0*terr_p)/(i+1)),tot_s,terr_s, '%.2e' % ((1.0*terr_s)/tot_s) + + +if __name__ == '__main__': + main (sys.argv[1:]) diff --git a/gnuradio-examples/python/channel-coding/test_tcm.py b/gnuradio-examples/python/channel-coding/test_tcm.py index 1f892ef9..f2250155 100755 --- a/gnuradio-examples/python/channel-coding/test_tcm.py +++ b/gnuradio-examples/python/channel-coding/test_tcm.py @@ -101,14 +101,17 @@ def main(args): tot_s=0 # total number of transmitted shorts terr_s=0 # total number of shorts in error + terr_p=0 # total number of packets in error for i in range(rep): (s,e)=run_test(f,Kb,bitspersymbol,K,dimensionality,constellation,N0,-long(666+i)) # run experiment with different seed to get different noise realizations tot_s=tot_s+s terr_s=terr_s+e - if (i%100==0) & (i>0): # display progress - print i,s,e,tot_s,terr_s, '%e' % ((1.0*terr_s)/tot_s) + terr_p=terr_p+(terr_s!=0) + if ((i+1)%100==0) : # display progress + print i+1,terr_p, '%.2e' % ((1.0*terr_p)/(i+1)),tot_s,terr_s, '%.2e' % ((1.0*terr_s)/tot_s) # estimate of the (short or bit) error rate - print tot_s,terr_s, '%e' % ((1.0*terr_s)/tot_s) + print rep,terr_p, '%.2e' % ((1.0*terr_p)/(i+1)),tot_s,terr_s, '%.2e' % ((1.0*terr_s)/tot_s) + if __name__ == '__main__': diff --git a/gnuradio-examples/python/channel-coding/test_tcm1.py b/gnuradio-examples/python/channel-coding/test_tcm1.py index e4f88d0b..66d7131e 100755 --- a/gnuradio-examples/python/channel-coding/test_tcm1.py +++ b/gnuradio-examples/python/channel-coding/test_tcm1.py @@ -102,17 +102,19 @@ def main(args): Es = Es / (len(constellation)/dimensionality) N0=Es/pow(10.0,esn0_db/10.0); # noise variance - - tot_s=0 - terr_s=0 + tot_s=0 # total number of transmitted shorts + terr_s=0 # total number of shorts in error + terr_p=0 # total number of packets in error for i in range(rep): (s,e)=run_test(f,Kb,bitspersymbol,K,dimensionality,constellation,N0,-long(666+i)) # run experiment with different seed to get different noise realizations tot_s=tot_s+s terr_s=terr_s+e - if (i%1==0) & (i>0): - print i,s,e,tot_s,terr_s, '%e' % ((1.0*terr_s)/tot_s) + terr_p=terr_p+(terr_s!=0) + if ((i+1)%1==0) : # display progress + print i+1,terr_p, '%.2e' % ((1.0*terr_p)/(i+1)),tot_s,terr_s, '%.2e' % ((1.0*terr_s)/tot_s) # estimate of the (short or bit) error rate - print tot_s,terr_s, '%e' % ((1.0*terr_s)/tot_s) + print rep,terr_p, '%.2e' % ((1.0*terr_p)/(i+1)),tot_s,terr_s, '%.2e' % ((1.0*terr_s)/tot_s) + if __name__ == '__main__': diff --git a/gnuradio-examples/python/channel-coding/test_tcm2.py b/gnuradio-examples/python/channel-coding/test_tcm2.py new file mode 100755 index 00000000..9680909e --- /dev/null +++ b/gnuradio-examples/python/channel-coding/test_tcm2.py @@ -0,0 +1,116 @@ +#!/usr/bin/env python + +from gnuradio import gr +from gnuradio import audio +from gnuradio import trellis +from gnuradio import eng_notation +import math +import sys +import random +import fsm_utils + +def run_test (f,Kb,bitspersymbol,K,dimensionality,constellation,N0,seed): + fg = gr.flow_graph () + + + # TX + #packet = [0]*Kb + #for i in range(Kb-1*16): # last 16 bits = 0 to drive the final state to 0 + #packet[i] = random.randint(0, 1) # random 0s and 1s + #src = gr.vector_source_s(packet,False) + src = gr.lfsr_32k_source_s() + src_head = gr.head (gr.sizeof_short,Kb/16) # packet size in shorts + #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) + + # CHANNEL + add = gr.add_ff() + noise = gr.noise_source_f(gr.GR_GAUSSIAN,math.sqrt(N0/2),seed) + + # RX + metrics = trellis.metrics_f(f.O(),dimensionality,constellation,trellis.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. + fsmi2s = gr.unpacked_to_packed_ss(bitspersymbol,gr.GR_MSB_FIRST) # pack FSM input symbols to shorts + #s2b = gr.packed_to_unpacked_ss(1,gr.GR_MSB_FIRST) # unpack shorts to bits + #dst = gr.vector_sink_s(); + dst = gr.check_lfsr_32k_s() + + + fg.connect (src,src_head,s2fsmi,enc,mod) + #fg.connect (src,b2s,s2fsmi,enc,mod) + fg.connect (mod,(add,0)) + fg.connect (noise,(add,1)) + fg.connect (add,metrics) + fg.connect (metrics,va,fsmi2s,dst) + #fg.connect (metrics,va,fsmi2s,s2b,dst) + + + fg.run() + + # A bit of cheating: run the program once and print the + # final encoder state.. + # Then put it as the last argument in the viterbi block + #print "final state = " , enc.ST() + + ntotal = dst.ntotal () + nright = dst.nright () + runlength = dst.runlength () + #ntotal = len(packet) + #if len(dst.data()) != ntotal: + #print "Error: not enough data\n" + #nright = 0; + #for i in range(ntotal): + #if packet[i]==dst.data()[i]: + #nright=nright+1 + #else: + #print "Error in ", i + return (ntotal,ntotal-nright) + + + + +def main(args): + nargs = len (args) + if nargs == 2: + esn0_db=float(args[0]) # Es/No in dB + rep=int(args[1]) # number of times the experiment is run to collect enough errors + else: + sys.stderr.write ('usage: test_tcm2.py Es/No_db repetitions\n') + sys.exit (1) + + # system parameters + f=trellis.fsm(1,2,[5,7]) # generate FSM specification from the generator matrix + Kb=1024*16 # packet size in bits (make it multiple of 16 so it can be packed in a short) + bitspersymbol = int(round(math.log(f.I())/math.log(2))) # bits per FSM input symbol + K=Kb/bitspersymbol # packet size in trellis steps + modulation = fsm_utils.psk4 # see fsm_utlis.py for available predefined modulations + dimensionality = modulation[0] + constellation = modulation[1] + if len(constellation)/dimensionality != f.O(): + sys.stderr.write ('Incompatible FSM output cardinality and modulation size.\n') + sys.exit (1) + # calculate average symbol energy + Es = 0 + for i in range(len(constellation)): + Es = Es + constellation[i]**2 + Es = Es / (len(constellation)/dimensionality) + N0=Es/pow(10.0,esn0_db/10.0); # calculate noise variance + + tot_s=0 # total number of transmitted shorts + terr_s=0 # total number of shorts in error + terr_p=0 # total number of packets in error + for i in range(rep): + (s,e)=run_test(f,Kb,bitspersymbol,K,dimensionality,constellation,N0,-long(666+i)) # run experiment with different seed to get different noise realizations + tot_s=tot_s+s + terr_s=terr_s+e + terr_p=terr_p+(terr_s!=0) + if ((i+1)%100==0) : # display progress + print i+1,terr_p, '%.2e' % ((1.0*terr_p)/(i+1)),tot_s,terr_s, '%.2e' % ((1.0*terr_s)/tot_s) + # estimate of the (short or bit) error rate + print rep,terr_p, '%.2e' % ((1.0*terr_p)/(i+1)),tot_s,terr_s, '%.2e' % ((1.0*terr_s)/tot_s) + + +if __name__ == '__main__': + main (sys.argv[1:]) diff --git a/gnuradio-examples/python/channel-coding/test_tcm_combined.py b/gnuradio-examples/python/channel-coding/test_tcm_combined.py index ce086318..37f38ef1 100755 --- a/gnuradio-examples/python/channel-coding/test_tcm_combined.py +++ b/gnuradio-examples/python/channel-coding/test_tcm_combined.py @@ -80,17 +80,19 @@ def main(args): Es = Es / (len(constellation)/dimensionality) N0=Es/pow(10.0,esn0_db/10.0); # noise variance - - tot_s=0 - terr_s=0 + tot_s=0 # total number of transmitted shorts + terr_s=0 # total number of shorts in error + terr_p=0 # total number of packets in error for i in range(rep): (s,e)=run_test(f,Kb,bitspersymbol,K,dimensionality,constellation,N0,-long(666+i)) # run experiment with different seed to get different noise realizations tot_s=tot_s+s terr_s=terr_s+e - if (i%100==0) & (i>0): - print i,s,e,tot_s,terr_s, '%e' % ((1.0*terr_s)/tot_s) - # estimate of the (short) error rate - print tot_s,terr_s, '%e' % ((1.0*terr_s)/tot_s) + terr_p=terr_p+(terr_s!=0) + if ((i+1)%100==0) : # display progress + print i+1,terr_p, '%.2e' % ((1.0*terr_p)/(i+1)),tot_s,terr_s, '%.2e' % ((1.0*terr_s)/tot_s) + # estimate of the (short or bit) error rate + print rep,terr_p, '%.2e' % ((1.0*terr_p)/(i+1)),tot_s,terr_s, '%.2e' % ((1.0*terr_s)/tot_s) + if __name__ == '__main__': diff --git a/gnuradio-examples/python/channel-coding/test_tcm_parallel.py b/gnuradio-examples/python/channel-coding/test_tcm_parallel.py index 230bf4b9..f9dcb585 100755 --- a/gnuradio-examples/python/channel-coding/test_tcm_parallel.py +++ b/gnuradio-examples/python/channel-coding/test_tcm_parallel.py @@ -15,7 +15,7 @@ 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(2,P) # serial to parallel + s2p = gr.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) @@ -26,11 +26,10 @@ def run_test (f,Kb,bitspersymbol,K,dimensionality,constellation,N0,seed,P): add.append(gr.add_ff()) noise.append(gr.noise_source_f(gr.GR_GAUSSIAN,math.sqrt(N0/2),seed)) - # RX metrics = trellis.metrics_f(f.O(),dimensionality,constellation,trellis.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(2,P) # parallel to serial + p2s = gr.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() @@ -90,14 +89,16 @@ def main(args): tot_s=0 # total number of transmitted shorts terr_s=0 # total number of shorts in error + terr_p=0 # total number of packets in error for i in range(rep): (s,e)=run_test(f,Kb,bitspersymbol,K,dimensionality,constellation,N0,-long(666+i),P) # run experiment with different seed to get different noise realizations tot_s=tot_s+s terr_s=terr_s+e - if (i%10==0) & (i>0): # display progress - print i,s,e,tot_s,terr_s, '%e' % ((1.0*terr_s)/tot_s) + terr_p=terr_p+(terr_s!=0) + if ((i+1)%100==0) : # display progress + print i+1,terr_p, '%.2e' % ((1.0*terr_p)/(i+1)),tot_s,terr_s, '%.2e' % ((1.0*terr_s)/tot_s) # estimate of the (short or bit) error rate - print tot_s,terr_s, '%e' % ((1.0*terr_s)/tot_s) + print rep,terr_p, '%.2e' % ((1.0*terr_p)/(i+1)),tot_s,terr_s, '%.2e' % ((1.0*terr_s)/tot_s) if __name__ == '__main__': diff --git a/gr-trellis/doc/gr-trellis.html b/gr-trellis/doc/gr-trellis.html deleted file mode 100644 index 82d92375..00000000 --- a/gr-trellis/doc/gr-trellis.html +++ /dev/null @@ -1,446 +0,0 @@ -Trellis-based algorithms for GNU Radio

Trellis-based algorithms for GNU Radio

Achilleas Anastasopoulos


-           
-        

Revision History
Revision v0.02006-08-03
- First cut. -

Abstract

This document provides a description of the -Finite State Machine (FSM) implementation and the related -trellis-based encoding and decoding algorithms -for GNU Radio. -


Introduction

....

-The basic goal of the implementation is to have a generic way of -describing an FSM that is decoupled from whether it describes a -convolutional -code (CC), a trellis code (TC), an inter-symbol interference (ISI) -channel, or any -other communication system that can be modeled with an FSM. -To achieve this goal, we need to separate the pure FSM descrition from the -rest of the model details. For instance, in the case of a rate 2/3 TC, -the FSM should not involve details about the modulation used (it can -be an 8-ary PAM, or 8-PSK, etc). Similarly, when attempting maximum likelihood -sequence detection (MLSD)--using for instance the Viterbi algorithm (VA)-- -the VA implementation should not be concerned with the channel details -(such as modulations, channel type, hard or soft inputs, etc). -Clearly, having generality as the primary goal implies some penalty -on the code efficiency, as compared to fully custom implementations. -

-We will now describe the implementation of the basic ingedient, the FSM. -

The FSM class

An FSM describes the evolution of a system with inputs -xk, states sk and outputs yk. At time k the FSM state is sk. -Upon reception of a new input symbol xk, it outputs an output symbol -yk which is a function of both xk and sk. -It will then move to a next state sk+1. -An FSM has a finite number of states, input and output symbols. -All these are formally described as follows: -

  • The input alphabet AI={0,1,2,...,I-1}, with cardinality I, so that xk takes values in AI.

  • The state alphabet AS={0,1,2,...,S-1}, with cardinality S, so that sk takes values in AS.

  • The output alphabet AO={0,1,2,...,O-1}, with cardinality O, so that yk takes values in AO

  • The "next-state" function NS: AS x AI --> AS, -with the meaning -sk+1 = NS(sk, xk)

  • The "output-symbol" function OS: AS x AI --> AS, -with the meaning -yk = OS(sk, xk)

-Thus, a complete description of the FSM is given by the -the five-tuple (I,S,O,NS,OS). -Observe that implementation details are hidden -in how the outside world interprets these input and output -integer symbols. -Here is an example of an FSM describing the (2,1) CC -with constraint length 3 and generator polynomial matrix -(1+D+D2 , 1+D2) -from Proakis-Salehi pg. 779. -

Example 1. (2,1) CC with generator polynomials (1+D+D2 , 1+D2)

-This CC accepts 1 bit at a time, and outputs 2 bits at a time. -It has a shift register storing the last two input bits. -In particular, -bk(0)=xk+ -xk-1+xk-2, and -bk(1)=xk+ -xk-2, where addition is mod-2. -We can represent the state of this system -as sk = (xk-1 xk-2)10. In addition we can represent its -output symbol as yk = (bk(1) bk(0))10. -Based on the above assumptions, the input alphabet AI={0,1}, so I=2; -the state alphabet AS={0,1,2,3}, so S=4; and -the output alphabet AO={0,1,2,3}, so O=4. -The "next-state" function NS(,) is given by -

-sk	xk	sk+1
-0	0	0
-0	1	2
-1	0	0
-1	1	2
-2	0	1
-2	1	3
-3	0	1
-3	1	3
-

-The "output-symbol" function OS(,) can be given by -

-sk	xk	yk
-0	0	0
-0	1	3
-1	0	3
-1	1	0
-2	0	1
-2	1	2
-3	0	2
-3	1	1
-

-

-Note that although the CC outputs 2 bits per time period, following -our approach, there is only one (quaternary) output symbol per -time period (for instance, here we use the decimal representation -of the 2-bits). Also note that the modulation used is not part of -the FSM description: it can be BPSK, OOK, BFSK, QPSK with or without Gray mapping, etc; -it is up to the rest of the program to interpret the meaning of -the symbol yk. -

-The C++ implementation of the FSM class keeps private information about -I,S,O,NS,OS and public methods to read and write them. The NS -and OS matrices are implemented as STL 1-dimensional vectors. -

-class fsm {
-private:
-  int d_I;
-  int d_S;
-  int d_O;
-  std::vector<int> d_NS;
-  std::vector<int> d_OS;
-  std::vector<int> d_PS;
-  std::vector<int> d_PI;
-public:
-  fsm();
-  fsm(const fsm &FSM);
-  fsm(const int I, const int S, const int O, const std::vector<int> &NS, const std::vector<int> &OS);
-  fsm(const char *name);
-  fsm(const int mod_size, const int ch_length);
-  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<int> & PS () const { return d_PS; }
-  const std::vector<int> & PI () const { return d_PI; }
-};
-

-As can be seen, other than the trivial and the copy constructor, -there are three additional -ways to construct an FSM. -

  • Supplying the parameters I,S,O,NS,OS:

    -  fsm(const int I, const int S, const int O, const std::vector<int> &NS, const std::vector<int> &OS);
    -
  • Giving a filename containing all the FSM information:

    -  fsm(const char *name);
    -

    -This information has to be in the following format: -

    -I S O
    -
    -NS(0,0)   NS(0,1)   ...  NS(0,I-1)
    -NS(1,0)   NS(1,1)   ...  NS(1,I-1)
    -...
    -NS(S-1,0) NS(S-1,1) ...  NS(S-1,I-1)
    -
    -OS(0,0)   OS(0,1)   ...  OS(0,I-1)
    -OS(1,0)   OS(1,1)   ...  OS(1,I-1)
    -...
    -OS(S-1,0) OS(S-1,1) ... OS(S-1,I-1)
    -

    -

    -For instance, the file containing the information for the example mentioned above is of the form: -

    -2 4 4
    -
    -0 2
    -0 2
    -1 3
    -1 3
    -
    -0 3
    -3 0
    -1 2
    -2 1
    -

    -

  • The third way is specific to FSMs resulting from shift registers, and the output symbol being the entire transition (ie, current_state and current_input). These FSMs are usefull when describibg ISI channels. In particular the state is comprised of the..... -

    -  fsm(const int mod_size, const int ch_length);
    -

-Finally, as can be seen from the above description, there are -two more variables included in the FSM class implementation, -the PS and the PI matrices. These are computed internally -when an FSM is instantiated and their meaning is as follows. -Sometimes (eg, in the traceback operation of the VA) we need -to trace the history of the state or the input sequence. -To do this we would like to know for a given state sk, what are the possible previous states sk-1 -and what input symbols xk-1 will get us from -sk-1 to sk. This information can be derived from NS; however we want to have it ready in a -convenient format. -In the following we assume that for any state, -the number of incoming transitions is the same as the number of -outgoing transitions, ie, equal to I. All applications of interest -have FSMs satisfying this requirement. - -If we arbitrarily index the incoming transitions to the current state -by "i", then as i goes from 0 to I-1, PS(sk,i) -gives all previous states sk-1, -and PI(sk,i) gives all previous inputs xk-1. -In other words, for any given sk and any index i=0,1,...I-1, starting from -sk-1=PS(sk,i) -with input -xk-1=PI(sk,i) -will get us to the state sk. -More formally, for any i=0,1,...I-1 we have -sk = NS(PS(sk,i),PI(sk,i)). - -

TCM: A Complete Example

-We now discuss through a concrete example how -the above FSM model can be used in GNU Radio. - -The communication system that we want to simulate -consists of a source generating the -input information in packets, a CC encoding each packet separately, -a memoryless modulator, -an additive white Gaussian noise (AWGN) channel, and -the VA performing MLSD. -The program source is as follows. -

-  1  #!/usr/bin/env python
-  2  
-  3  from gnuradio import gr
-  4  from gnuradio import audio
-  5  from gnuradio import trellis
-  6  from gnuradio import eng_notation
-  7  import math
-  8  import sys
-  9  import random
- 10  import fsm_utils
- 11  
- 12  def run_test (f,Kb,bitspersymbol,K,dimensionality,constellation,N0,seed):
- 13      fg = gr.flow_graph ()
- 14  
- 15      # TX
- 16      src = gr.lfsr_32k_source_s()
- 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)
- 21  
- 22      # CHANNEL
- 23      add = gr.add_ff()
- 24      noise = gr.noise_source_f(gr.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
- 28      va = trellis.viterbi_s(f,K,0,-1) # Put -1 if the Initial/Final states are not set.
- 29      fsmi2s = gr.unpacked_to_packed_ss(bitspersymbol,gr.GR_MSB_FIRST) # pack FSM input symbols to shorts
- 30      dst = gr.check_lfsr_32k_s(); 
- 31  
- 32      fg.connect (src,src_head,s2fsmi,enc,mod)
- 33      fg.connect (mod,(add,0))
- 34      fg.connect (noise,(add,1))
- 35      fg.connect (add,metrics)
- 36      fg.connect (metrics,va,fsmi2s,dst)
- 37      
- 38      fg.run()
- 39      
- 40      # A bit of cheating: run the program once and print the 
- 41      # final encoder state.
- 42      # Then put it as the last argument in the viterbi block
- 43      #print "final state = " , enc.ST()
- 44  
- 45      ntotal = dst.ntotal ()
- 46      nright = dst.nright ()
- 47      runlength = dst.runlength ()
- 48      return (ntotal,ntotal-nright)
- 49  
- 50  
- 51  def main(args):
- 52      nargs = len (args)
- 53      if nargs == 3:
- 54          fname=args[0]
- 55          esn0_db=float(args[1]) # Es/No in dB
- 56          rep=int(args[2]) # number of times the experiment is run to collect enough errors
- 57      else:
- 58          sys.stderr.write ('usage: test_tcm.py fsm_fname Es/No_db  repetitions\n')
- 59          sys.exit (1)
- 60  
- 61      # system parameters
- 62      f=trellis.fsm(fname) # get the FSM specification from a file (will hopefully be automated in the future...)
- 63      Kb=1024*16  # packet size in bits (make it multiple of 16 so it can be packed in a short)
- 64      bitspersymbol = int(round(math.log(f.I())/math.log(2))) # bits per FSM input symbol
- 65      K=Kb/bitspersymbol # packet size in trellis steps
- 66      modulation = fsm_utils.psk4 # see fsm_utlis.py for available predefined modulations
- 67      dimensionality = modulation[0]
- 68      constellation = modulation[1] 
- 69      if len(constellation)/dimensionality != f.O():
- 70          sys.stderr.write ('Incompatible FSM output cardinality and modulation size.\n')
- 71          sys.exit (1)
- 72      # calculate average symbol energy
- 73      Es = 0
- 74      for i in range(len(constellation)):
- 75          Es = Es + constellation[i]**2
- 76      Es = Es / (len(constellation)/dimensionality)
- 77      N0=Es/pow(10.0,esn0_db/10.0); # noise variance
- 78      
- 79      tot_s=0
- 80      terr_s=0
- 81      for i in range(rep):
- 82          (s,e)=run_test(f,Kb,bitspersymbol,K,dimensionality,constellation,N0,-long(666+i)) # run experiment with different seed to get different noise realizations
- 83          tot_s=tot_s+s
- 84          terr_s=terr_s+e
- 85          if (i%100==0):
- 86              print i,s,e,tot_s,terr_s, '%e' % ((1.0*terr_s)/tot_s)
- 87      # estimate of the (short) error rate
- 88      print tot_s,terr_s, '%e' % ((1.0*terr_s)/tot_s)
- 89  
- 90  
- 91  if __name__ == '__main__':
- 92      main (sys.argv[1:])
-

-The program is called by -


-./test_tcm.py fsm_fname Es/No_db repetitions
-

-where "fsm_fname" is the file containing the FSM specification of the -tested TCM code, "Es/No_db" is the SNR in dB, and "repetitions" -are the number of packets to be transmitted and received in order to -collect sufficient number of errors for an accurate estimate of the -error rate. -

-The FSM is first intantiated in "main" by -

- 62      f=trellis.fsm(fname) # get the FSM specification from a file (will hopefully be automated in the future...)
-

-Each packet has size Kb bits -(we choose Kb to be a multiple of 16 so that all bits fit nicely into shorts and can be generated by the lfsr GNU Radio). -Assuming that the FSM input has cardinality I, each input symbol consists -of bitspersymbol=log2( I ). The Kb/16 shorts are now -unpacked to K=Kb/bitspersymbol input -symbols that will drive the FSM encoder. -

- 63      Kb=1024*16  # packet size in bits (make it multiple of 16 so it can be packed in a short)
- 64      bitspersymbol = int(round(math.log(f.I())/math.log(2))) # bits per FSM input symbol
- 65      K=Kb/bitspersymbol # packet size in trellis steps
-

-The FSM will produce K output symbols (remeber the FSM produces always one output symbol for each input symbol). Each of these symbols needs to be modulated. Since we are simulating the communication system, we need not simulate the actual waveforms. An M-ary, N-dimensional -modulation is completely specified by a set of M, N-dimensional real vectors. In "fsm_utils.py" file we give a number of useful modulations with the following format: modulation = (N,constellation), where -constellation=[c11,c12,...,c1N,c21,c22,...,c2N,...,cM1,cM2,...cMN]. -The meaning of the above is that every constellation point c_i -is an N-dimnsional vector c_i=(ci1,ci2,...,ciN) -For instance, 4-ary PAM is represented as -(1,[-3, -1, 1, 3]), while QPSK is represented as -(2,[1, 0, 0, 1, 0, -1, -1, 0]). In our example we choose QPSK modulation. -Clearly, M should be equal to the cardinality of the FSM output, O. -Finally the average symbol energy and noise variance are calculated. -

- 66      modulation = fsm_utils.psk4 # see fsm_utlis.py for available predefined modulations
- 67      dimensionality = modulation[0]
- 68      constellation = modulation[1]
- 69      if len(constellation)/dimensionality != f.O():
- 70          sys.stderr.write ('Incompatible FSM output cardinality and modulation size.\n')
- 71          sys.exit (1)
- 72      # calculate average symbol energy
- 73      Es = 0
- 74      for i in range(len(constellation)):
- 75          Es = Es + constellation[i]**2
- 76      Es = Es / (len(constellation)/dimensionality)
- 77      N0=Es/pow(10.0,esn0_db/10.0); # noise variance
-

-Then, "run_test" is called with a different "seed" so that we get -different noise realizations. -

- 82          (s,e)=run_test(f,Kb,bitspersymbol,K,dimensionality,constellation,N0,-long(666+i)) # run experiment with different seed to get different noise realizations
-

-Let us examine now the "run_test" function. -First we set up the transmitter blocks. -The Kb/16 shorts are first unpacked to -symbols consistent with the FSM input alphabet. -The FSm encoder requires the FSM specification, -and an initial state (which is set to 0 in this example). -

- 15      # TX
- 16      src = gr.lfsr_32k_source_s()
- 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
-

-We now need to modulate the FSM output symbols. -The "chunks_to_symbols_sf" is essentially a memoryless mapper which -for each input symbol y_k -outputs a sequence of N numbers ci1,ci2,...,ciN representing the -coordianates of the constellation symbol c_i with i=y_k. -

- 20      mod = gr.chunks_to_symbols_sf(constellation,dimensionality)
-

-The channel is AWGN with appropriate noise variance. -For each transmitted symbol c_k=(ck1,ck2,...,ckN) we receive a noisy version -r_k=(rk1,rk2,...,rkN). -

- 22      # CHANNEL
- 23      add = gr.add_ff()
- 24      noise = gr.noise_source_f(gr.GR_GAUSSIAN,math.sqrt(N0/2),seed)
-

-Part of the design methodology was to decouple the FSM and VA from -the details of the modulation, channel, receiver front-end etc. -In order for the VA to run, we only need to provide it with -a number representing a cost associated with each transition -in the trellis. Then the VA will find the sequence with -the smallest total cost through the trellis. -The cost associated with a transition (s_k,x_k) is only a function -of the output y_k = OS(s_k,x_k), and the observation -vector r_k. Thus, for each time period, k, -we need to label each of the SxI transitions with such a cost. -This means that for each time period we need to evaluate -O such numbers (one for each possible output symbol y_k). -This is done -in "metrics_f". In particular, metrics_f is a memoryless device -taking N inputs at a time and producing O outputs. The N inputs are -rk1,rk2,...,rkN. -The O outputs -are the costs associated with observations rk1,rk2,...,rkN and -hypothesized output symbols c_1,c_2,...,c_M. For instance, -if we choose to perform soft-input VA, we need to evaluate -the Euclidean distance between r_k and each of c_1,c_2,...,c_M, -for each of the K transmitted symbols. -Other options are available as well; for instance, we can -do hard decision demodulation and feed the VA with -symbol Hamming distances, or even bit Hamming distances, etc. -These are all implemented in "metrics_f". -

- 26      # RX
- 27      metrics = trellis.metrics_f(f.O(),dimensionality,constellation,trellis.TRELLIS_EUCLIDEAN) # data preprocessing to generate metrics for Viterbi
-

-Now the VA can run once it is supplied by the initial and final states. -The initial state is known to be 0; the final state is usually -forced to some value by padding the information sequence appropriately. -In this example, we always send the the same info sequence (we only randomize noise) so we can evaluate off line the final state and then provide it to the VA (a value of -1 signifies that there is no fixed initial -or final state). The VA outputs the estimates of the symbols x_k which -are then packed to shorts and compared with the transmitted sequence. -

- 28      va = trellis.viterbi_s(f,K,0,-1) # Put -1 if the Initial/Final states are not set.
- 29      fsmi2s = gr.unpacked_to_packed_ss(bitspersymbol,gr.GR_MSB_FIRST) # pack FSM input symbols to shorts
- 30      dst = gr.check_lfsr_32k_s();
-

-The function returns the number of shorts and the number of shorts in error. Observe that this way the estimated error rate refers to -16-bit-symbol error rate. -

- 48      return (ntotal,ntotal-nright)
-

Future Work

  • -Improve the documentation :-) -

  • -automate fsm generation from generator polynomials -(feedforward or feedback form). -

  • -Optimize the VA code. -

  • -Provide implementation of soft-input soft-output (SISO) decoders for -potential use in concatenated systems. Also a host of suboptimal -decoders, eg, sphere decoding, M- and T- algorithms, sequential decoding, etc. -can be implemented. -

  • -Although turbo decoding is rediculously slow in software, -we can design it in principle. One question is, whether we should -use the encoder, and SISO blocks and connect them -through GNU radio or we should implement turbo-decoding -as a single block (issues with buffering between blocks). -

diff --git a/gr-trellis/src/lib/Makefile.am b/gr-trellis/src/lib/Makefile.am index 935fe9fb..769d4a33 100644 --- a/gr-trellis/src/lib/Makefile.am +++ b/gr-trellis/src/lib/Makefile.am @@ -65,9 +65,11 @@ _trellis_la_SOURCES = \ trellis.cc \ fsm.cc \ quicksort_index.cc \ + base.cc \ interleaver.cc \ trellis_calc_metric.cc \ trellis_permutation.cc \ + trellis_siso_f.cc \ $(GENERATED_CC) # magic flags @@ -87,10 +89,13 @@ trellis.cc trellis.py: $(ALL_IFILES) grinclude_HEADERS = \ fsm.h \ quicksort_index.h \ + base.h \ interleaver.h \ trellis_metric_type.h \ trellis_calc_metric.h \ trellis_permutation.h \ + trellis_siso_type.h \ + trellis_siso_f.h \ $(GENERATED_H) diff --git a/gr-trellis/src/lib/base.cc b/gr-trellis/src/lib/base.cc new file mode 100644 index 00000000..35ba2ea1 --- /dev/null +++ b/gr-trellis/src/lib/base.cc @@ -0,0 +1,92 @@ +/* -*- 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 2, 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include +#include +#include +#include "base.h" + + +bool dec2base(unsigned int num, int base, std::vector &s) +{ + int l = s.size(); + unsigned int n=num; + for(int i=0;i &s, int base) +{ + int l = s.size(); + unsigned int num=0; + for(int i=0;i &bases, std::vector &s) +{ + int l = s.size(); + unsigned int n=num; + for(int i=0;i &s, const std::vector &bases) +{ + int l = s.size(); + unsigned int num=0; + for(int i=0;i + +/*! + * \brief change base + */ + + +bool dec2base(unsigned int num, int base, std::vector &s); +bool dec2bases(unsigned int num, const std::vector &bases, std::vector &s); +unsigned int base2dec(const std::vector &s, int base); +unsigned int bases2dec(const std::vector &s, const std::vector &bases); + +#endif diff --git a/gr-trellis/src/lib/fsm.cc b/gr-trellis/src/lib/fsm.cc index 05d1589f..f3430883 100644 --- a/gr-trellis/src/lib/fsm.cc +++ b/gr-trellis/src/lib/fsm.cc @@ -23,8 +23,10 @@ #include #include #include +#include "base.h" #include "fsm.h" + fsm::fsm() { d_I=0; @@ -34,6 +36,8 @@ fsm::fsm() 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) @@ -45,28 +49,20 @@ fsm::fsm(const fsm &FSM) d_OS=FSM.OS(); d_PS=FSM.PS(); d_PI=FSM.PI(); + d_TMi=FSM.TMi(); + d_TMl=FSM.TMl(); } -fsm::fsm(const int I, const int S, const int O, const std::vector &NS, const std::vector &OS) +fsm::fsm(int I, int S, int O, const std::vector &NS, const std::vector &OS) { d_I=I; d_S=S; d_O=O; d_NS=NS; d_OS=OS; - d_PS.resize(d_I*d_S); - d_PI.resize(d_I*d_S); - - // generate the PS, PI tables for later use - for(int i=0;i &G) +{ + + // calculate maximum memory requirements for each input stream + std::vector max_mem_x(k,-1); + int max_mem = -1; + for(int i=0;imax_mem_x[i]) + max_mem_x[i]=mem; + if(mem>max_mem) + max_mem=mem; + } + } - // generate the PS, PI tables for later use - for(int i=0;i > Gb(k*n); + for(int j=0;j bases_x(k); + for(int j=0;j sx(k); + std::vector nsx(k); + std::vector tx(k); + std::vector > tb(k); + for(int j=0;j inb(k); + std::vector outb(n); + + + for(int s=0;s d_OS; std::vector d_PS; std::vector d_PI; + std::vector d_TMi; + std::vector d_TMl; + void generate_PS_PI (); + void generate_TM (); + bool find_es(int es); public: fsm(); fsm(const fsm &FSM); - fsm(const int I, const int S, const int O, const std::vector &NS, const std::vector &OS); + fsm(int I, int S, int O, const std::vector &NS, const std::vector &OS); fsm(const char *name); - fsm(const int mod_size, const int ch_length); + fsm(int k, int n, const std::vector &G); + fsm(int mod_size, int ch_length); int I () const { return d_I; } int S () const { return d_S; } int O () const { return d_O; } @@ -50,6 +56,8 @@ public: const std::vector & OS () const { return d_OS; } const std::vector & PS () const { return d_PS; } const std::vector & PI () const { return d_PI; } + const std::vector & TMi () const { return d_TMi; } + const std::vector & TMl () const { return d_TMl; } }; #endif diff --git a/gr-trellis/src/lib/fsm.i b/gr-trellis/src/lib/fsm.i index eda8aeef..e5b1af0c 100644 --- a/gr-trellis/src/lib/fsm.i +++ b/gr-trellis/src/lib/fsm.i @@ -29,12 +29,17 @@ private: std::vector d_OS; std::vector d_PS; std::vector d_PI; + std::vector d_TMi; + std::vector d_TMl; + void generate_PS_PI (); + void generate_TM (); public: fsm(); fsm(const fsm &FSM); - fsm(const int I, const int S, const int O, const std::vector &NS, const std::vector &OS); + fsm(int I, int S, int O, const std::vector &NS, const std::vector &OS); fsm(const char *name); - fsm(const int mod_size, const int ch_length); + fsm(int k, int n, const std::vector &G); + fsm(int mod_size, int ch_length); int I () const { return d_I; } int S () const { return d_S; } int O () const { return d_O; } @@ -42,8 +47,7 @@ public: const std::vector & OS () const { return d_OS; } const std::vector & PS () const { return d_PS; } const std::vector & PI () const { return d_PI; } + const std::vector & TMi () const { return d_TMi; } + const std::vector & TMl () const { return d_TMl; } }; - - - diff --git a/gr-trellis/src/lib/interleaver.cc b/gr-trellis/src/lib/interleaver.cc index 042dc04b..174d31c0 100644 --- a/gr-trellis/src/lib/interleaver.cc +++ b/gr-trellis/src/lib/interleaver.cc @@ -42,7 +42,7 @@ interleaver::interleaver(const interleaver &INTERLEAVER) d_DEINTER=INTERLEAVER.DEINTER(); } -interleaver::interleaver(const int K, const std::vector &INTER) +interleaver::interleaver(int K, const std::vector &INTER) { d_K=K; d_INTER=INTER; @@ -85,7 +85,7 @@ interleaver::interleaver(const char *name) //###################################################################### //# Generate a random interleaver //###################################################################### -interleaver::interleaver(const int K, unsigned int seed) +interleaver::interleaver(int K, unsigned int seed) { d_K=K; d_INTER.resize(d_K); diff --git a/gr-trellis/src/lib/interleaver.h b/gr-trellis/src/lib/interleaver.h index 13c316be..14ed80fa 100644 --- a/gr-trellis/src/lib/interleaver.h +++ b/gr-trellis/src/lib/interleaver.h @@ -36,9 +36,9 @@ private: public: interleaver(); interleaver(const interleaver & INTERLEAVER); - interleaver(const int K, const std::vector & INTER); + interleaver(int K, const std::vector & INTER); interleaver(const char *name); - interleaver(const int K, unsigned int seed); + interleaver(int K, unsigned int seed); int K () const { return d_K; } const std::vector & INTER () const { return d_INTER; } const std::vector & DEINTER () const { return d_DEINTER; } diff --git a/gr-trellis/src/lib/interleaver.i b/gr-trellis/src/lib/interleaver.i index 6baec3bd..625bd862 100644 --- a/gr-trellis/src/lib/interleaver.i +++ b/gr-trellis/src/lib/interleaver.i @@ -28,9 +28,9 @@ private: public: interleaver(); interleaver(const interleaver & INTERLEAVER); - interleaver(const int K, const std::vector & INTER); + interleaver(int K, const std::vector & INTER); interleaver(const char *name); - interleaver(const int K, unsigned int seed); + interleaver(int K, unsigned int seed); int K () const { return d_K; } const std::vector & INTER () const { return d_INTER; } const std::vector & DEINTER () const { return d_DEINTER; } diff --git a/gr-trellis/src/lib/trellis.i b/gr-trellis/src/lib/trellis.i index bd314411..983576e8 100644 --- a/gr-trellis/src/lib/trellis.i +++ b/gr-trellis/src/lib/trellis.i @@ -10,6 +10,7 @@ #include "fsm.h" #include "interleaver.h" #include "trellis_permutation.h" +#include "trellis_siso_f.h" #include %} @@ -18,7 +19,10 @@ %include "fsm.i" %include "interleaver.i" %include "trellis_permutation.i" +%include "trellis_siso_f.i" + %include "trellis_metric_type.h" +%include "trellis_siso_type.h" %include "trellis_generated.i" diff --git a/gr-trellis/src/lib/trellis_calc_metric.cc b/gr-trellis/src/lib/trellis_calc_metric.cc index ae25a67b..5faa4b7c 100644 --- a/gr-trellis/src/lib/trellis_calc_metric.cc +++ b/gr-trellis/src/lib/trellis_calc_metric.cc @@ -24,8 +24,7 @@ #include #include "trellis_calc_metric.h" -// soft decisions (Euclidean distance squared) -void calc_metric_s(const int O, const int D, const std::vector &TABLE, const short *in, float *metric, trellis_metric_type_t type) +void calc_metric_s(int O, int D, const std::vector &TABLE, const short *in, float *metric, trellis_metric_type_t type) { float minm = FLT_MAX; int minmi = 0; @@ -33,24 +32,24 @@ void calc_metric_s(const int O, const int D, const std::vector &TABLE, co switch (type){ case TRELLIS_EUCLIDEAN: for(int o=0;o &TABLE, co -// soft decisions (Euclidean distance squared) -void calc_metric_i(const int O, const int D, const std::vector &TABLE, const int *in, float *metric, trellis_metric_type_t type) +void calc_metric_i(int O, int D, const std::vector &TABLE, const int *in, float *metric, trellis_metric_type_t type) { float minm = FLT_MAX; int minmi = 0; @@ -75,24 +73,24 @@ void calc_metric_i(const int O, const int D, const std::vector &TABLE, cons switch (type){ case TRELLIS_EUCLIDEAN: for(int o=0;o &TABLE, cons - - - - -// soft decisions (Euclidean distance squared) -void calc_metric_f(const int O, const int D, const std::vector &TABLE, const float *in, float *metric, trellis_metric_type_t type) +void calc_metric_f(int O, int D, const std::vector &TABLE, const float *in, float *metric, trellis_metric_type_t type) { float minm = FLT_MAX; int minmi = 0; @@ -121,24 +114,24 @@ void calc_metric_f(const int O, const int D, const std::vector &TABLE, co switch (type){ case TRELLIS_EUCLIDEAN: for(int o=0;o &TABLE, co } -// soft decisions (Euclidean distance squared) -void calc_metric_c(const int O, const int D, const std::vector &TABLE, const gr_complex *in, float *metric, trellis_metric_type_t type) +void calc_metric_c(int O, int D, const std::vector &TABLE, const gr_complex *in, float *metric, trellis_metric_type_t type) { float minm = FLT_MAX; int minmi = 0; @@ -169,7 +161,20 @@ void calc_metric_c(const int O, const int D, const std::vector &TABL } } case TRELLIS_HARD_SYMBOL: - throw std::runtime_error ("Invalid metric type (not yet implemented)."); + for(int o=0;o #include -void calc_metric_s(const int O, const int D, const std::vector &TABLE, const short *in, float *metric, trellis_metric_type_t type); +void calc_metric_s(int O, int D, const std::vector &TABLE, const short *in, float *metric, trellis_metric_type_t type); -void calc_metric_i(const int O, const int D, const std::vector &TABLE, const int *in, float *metric, trellis_metric_type_t type); +void calc_metric_i(int O, int D, const std::vector &TABLE, const int *in, float *metric, trellis_metric_type_t type); -void calc_metric_f(const int O, const int D, const std::vector &TABLE, const float *in, float *metric, trellis_metric_type_t type); +void calc_metric_f(int O, int D, const std::vector &TABLE, const float *in, float *metric, trellis_metric_type_t type); -void calc_metric_c(const int O, const int D, const std::vector &TABLE, const gr_complex *in, float *metric, trellis_metric_type_t type); +void calc_metric_c(int O, int D, const std::vector &TABLE, const gr_complex *in, float *metric, trellis_metric_type_t type); #endif diff --git a/gr-trellis/src/lib/trellis_encoder_XX.cc.t b/gr-trellis/src/lib/trellis_encoder_XX.cc.t index 75ae0750..810951e6 100644 --- a/gr-trellis/src/lib/trellis_encoder_XX.cc.t +++ b/gr-trellis/src/lib/trellis_encoder_XX.cc.t @@ -29,12 +29,12 @@ #include @SPTR_NAME@ -trellis_make_@BASE_NAME@ (const fsm &FSM, const int ST) +trellis_make_@BASE_NAME@ (const fsm &FSM, int ST) { return @SPTR_NAME@ (new @NAME@ (FSM,ST)); } -@NAME@::@NAME@ (const fsm &FSM, const int 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@))), @@ -50,26 +50,24 @@ int gr_vector_const_void_star &input_items, gr_vector_void_star &output_items) { - int d_ST_tmp; + int ST_tmp; assert (input_items.size() == output_items.size()); int nstreams = input_items.size(); -for (int m=0;m @SPTR_NAME@; -@SPTR_NAME@ trellis_make_@BASE_NAME@ (const fsm &FSM, const int ST); +@SPTR_NAME@ trellis_make_@BASE_NAME@ (const fsm &FSM, int ST); /*! * \brief Convolutional encoder. @@ -42,10 +42,10 @@ typedef boost::shared_ptr<@NAME@> @SPTR_NAME@; class @NAME@ : public gr_sync_block { private: - friend @SPTR_NAME@ trellis_make_@BASE_NAME@ (const fsm &FSM, const int ST); + friend @SPTR_NAME@ trellis_make_@BASE_NAME@ (const fsm &FSM, int ST); fsm d_FSM; int d_ST; - @NAME@ (const fsm &FSM, const int ST); + @NAME@ (const fsm &FSM, int ST); public: fsm FSM () const { return d_FSM; } diff --git a/gr-trellis/src/lib/trellis_encoder_XX.i.t b/gr-trellis/src/lib/trellis_encoder_XX.i.t index ea015a84..e5627be7 100644 --- a/gr-trellis/src/lib/trellis_encoder_XX.i.t +++ b/gr-trellis/src/lib/trellis_encoder_XX.i.t @@ -24,12 +24,12 @@ GR_SWIG_BLOCK_MAGIC(trellis,@BASE_NAME@); -@SPTR_NAME@ trellis_make_@BASE_NAME@ (const fsm &FSM, const int ST); +@SPTR_NAME@ trellis_make_@BASE_NAME@ (const fsm &FSM, int ST); class @NAME@ : public gr_sync_block { private: - @NAME@ (const fsm &FSM, const int ST); + @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_encoder_bb.cc b/gr-trellis/src/lib/trellis_encoder_bb.cc index aecba87a..cad4490a 100644 --- a/gr-trellis/src/lib/trellis_encoder_bb.cc +++ b/gr-trellis/src/lib/trellis_encoder_bb.cc @@ -29,12 +29,12 @@ #include trellis_encoder_bb_sptr -trellis_make_encoder_bb (const fsm &FSM, const int ST) +trellis_make_encoder_bb (const fsm &FSM, int ST) { return trellis_encoder_bb_sptr (new trellis_encoder_bb (FSM,ST)); } -trellis_encoder_bb::trellis_encoder_bb (const fsm &FSM, const int ST) +trellis_encoder_bb::trellis_encoder_bb (const fsm &FSM, int ST) : gr_sync_block ("encoder_bb", gr_make_io_signature (1, -1, sizeof (unsigned char)), gr_make_io_signature (1, -1, sizeof (unsigned char))), @@ -50,26 +50,24 @@ trellis_encoder_bb::work (int noutput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items) { - int d_ST_tmp; + int ST_tmp; assert (input_items.size() == output_items.size()); int nstreams = input_items.size(); -for (int m=0;m trellis_encoder_bb_sptr; -trellis_encoder_bb_sptr trellis_make_encoder_bb (const fsm &FSM, const int ST); +trellis_encoder_bb_sptr trellis_make_encoder_bb (const fsm &FSM, int ST); /*! * \brief Convolutional encoder. @@ -42,10 +42,10 @@ trellis_encoder_bb_sptr trellis_make_encoder_bb (const fsm &FSM, const int ST); class trellis_encoder_bb : public gr_sync_block { private: - friend trellis_encoder_bb_sptr trellis_make_encoder_bb (const fsm &FSM, const int ST); + friend trellis_encoder_bb_sptr trellis_make_encoder_bb (const fsm &FSM, int ST); fsm d_FSM; int d_ST; - trellis_encoder_bb (const fsm &FSM, const int ST); + trellis_encoder_bb (const fsm &FSM, int ST); public: fsm FSM () const { return d_FSM; } diff --git a/gr-trellis/src/lib/trellis_encoder_bb.i b/gr-trellis/src/lib/trellis_encoder_bb.i index 07f5606e..4610d967 100644 --- a/gr-trellis/src/lib/trellis_encoder_bb.i +++ b/gr-trellis/src/lib/trellis_encoder_bb.i @@ -24,12 +24,12 @@ GR_SWIG_BLOCK_MAGIC(trellis,encoder_bb); -trellis_encoder_bb_sptr trellis_make_encoder_bb (const fsm &FSM, const int ST); +trellis_encoder_bb_sptr trellis_make_encoder_bb (const fsm &FSM, int ST); class trellis_encoder_bb : public gr_sync_block { private: - trellis_encoder_bb (const fsm &FSM, const int ST); + trellis_encoder_bb (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_encoder_bi.cc b/gr-trellis/src/lib/trellis_encoder_bi.cc index 968527b8..d0848be6 100644 --- a/gr-trellis/src/lib/trellis_encoder_bi.cc +++ b/gr-trellis/src/lib/trellis_encoder_bi.cc @@ -29,12 +29,12 @@ #include trellis_encoder_bi_sptr -trellis_make_encoder_bi (const fsm &FSM, const int ST) +trellis_make_encoder_bi (const fsm &FSM, int ST) { return trellis_encoder_bi_sptr (new trellis_encoder_bi (FSM,ST)); } -trellis_encoder_bi::trellis_encoder_bi (const fsm &FSM, const int ST) +trellis_encoder_bi::trellis_encoder_bi (const fsm &FSM, int ST) : gr_sync_block ("encoder_bi", gr_make_io_signature (1, -1, sizeof (unsigned char)), gr_make_io_signature (1, -1, sizeof (int))), @@ -50,26 +50,24 @@ trellis_encoder_bi::work (int noutput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items) { - int d_ST_tmp; + int ST_tmp; assert (input_items.size() == output_items.size()); int nstreams = input_items.size(); -for (int m=0;m trellis_encoder_bi_sptr; -trellis_encoder_bi_sptr trellis_make_encoder_bi (const fsm &FSM, const int ST); +trellis_encoder_bi_sptr trellis_make_encoder_bi (const fsm &FSM, int ST); /*! * \brief Convolutional encoder. @@ -42,10 +42,10 @@ trellis_encoder_bi_sptr trellis_make_encoder_bi (const fsm &FSM, const int ST); class trellis_encoder_bi : public gr_sync_block { private: - friend trellis_encoder_bi_sptr trellis_make_encoder_bi (const fsm &FSM, const int ST); + friend trellis_encoder_bi_sptr trellis_make_encoder_bi (const fsm &FSM, int ST); fsm d_FSM; int d_ST; - trellis_encoder_bi (const fsm &FSM, const int ST); + trellis_encoder_bi (const fsm &FSM, int ST); public: fsm FSM () const { return d_FSM; } diff --git a/gr-trellis/src/lib/trellis_encoder_bi.i b/gr-trellis/src/lib/trellis_encoder_bi.i index 4fd389e9..06531196 100644 --- a/gr-trellis/src/lib/trellis_encoder_bi.i +++ b/gr-trellis/src/lib/trellis_encoder_bi.i @@ -24,12 +24,12 @@ GR_SWIG_BLOCK_MAGIC(trellis,encoder_bi); -trellis_encoder_bi_sptr trellis_make_encoder_bi (const fsm &FSM, const int ST); +trellis_encoder_bi_sptr trellis_make_encoder_bi (const fsm &FSM, int ST); class trellis_encoder_bi : public gr_sync_block { private: - trellis_encoder_bi (const fsm &FSM, const int ST); + trellis_encoder_bi (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_encoder_bs.cc b/gr-trellis/src/lib/trellis_encoder_bs.cc index 9546e3d9..34876044 100644 --- a/gr-trellis/src/lib/trellis_encoder_bs.cc +++ b/gr-trellis/src/lib/trellis_encoder_bs.cc @@ -29,12 +29,12 @@ #include trellis_encoder_bs_sptr -trellis_make_encoder_bs (const fsm &FSM, const int ST) +trellis_make_encoder_bs (const fsm &FSM, int ST) { return trellis_encoder_bs_sptr (new trellis_encoder_bs (FSM,ST)); } -trellis_encoder_bs::trellis_encoder_bs (const fsm &FSM, const int ST) +trellis_encoder_bs::trellis_encoder_bs (const fsm &FSM, int ST) : gr_sync_block ("encoder_bs", gr_make_io_signature (1, -1, sizeof (unsigned char)), gr_make_io_signature (1, -1, sizeof (short))), @@ -50,26 +50,24 @@ trellis_encoder_bs::work (int noutput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items) { - int d_ST_tmp; + int ST_tmp; assert (input_items.size() == output_items.size()); int nstreams = input_items.size(); -for (int m=0;m trellis_encoder_bs_sptr; -trellis_encoder_bs_sptr trellis_make_encoder_bs (const fsm &FSM, const int ST); +trellis_encoder_bs_sptr trellis_make_encoder_bs (const fsm &FSM, int ST); /*! * \brief Convolutional encoder. @@ -42,10 +42,10 @@ trellis_encoder_bs_sptr trellis_make_encoder_bs (const fsm &FSM, const int ST); class trellis_encoder_bs : public gr_sync_block { private: - friend trellis_encoder_bs_sptr trellis_make_encoder_bs (const fsm &FSM, const int ST); + friend trellis_encoder_bs_sptr trellis_make_encoder_bs (const fsm &FSM, int ST); fsm d_FSM; int d_ST; - trellis_encoder_bs (const fsm &FSM, const int ST); + trellis_encoder_bs (const fsm &FSM, int ST); public: fsm FSM () const { return d_FSM; } diff --git a/gr-trellis/src/lib/trellis_encoder_bs.i b/gr-trellis/src/lib/trellis_encoder_bs.i index 51fc1d48..5179aaa8 100644 --- a/gr-trellis/src/lib/trellis_encoder_bs.i +++ b/gr-trellis/src/lib/trellis_encoder_bs.i @@ -24,12 +24,12 @@ GR_SWIG_BLOCK_MAGIC(trellis,encoder_bs); -trellis_encoder_bs_sptr trellis_make_encoder_bs (const fsm &FSM, const int ST); +trellis_encoder_bs_sptr trellis_make_encoder_bs (const fsm &FSM, int ST); class trellis_encoder_bs : public gr_sync_block { private: - trellis_encoder_bs (const fsm &FSM, const int ST); + trellis_encoder_bs (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_encoder_ii.cc b/gr-trellis/src/lib/trellis_encoder_ii.cc index 3469a235..11e3a4fd 100644 --- a/gr-trellis/src/lib/trellis_encoder_ii.cc +++ b/gr-trellis/src/lib/trellis_encoder_ii.cc @@ -29,12 +29,12 @@ #include trellis_encoder_ii_sptr -trellis_make_encoder_ii (const fsm &FSM, const int ST) +trellis_make_encoder_ii (const fsm &FSM, int ST) { return trellis_encoder_ii_sptr (new trellis_encoder_ii (FSM,ST)); } -trellis_encoder_ii::trellis_encoder_ii (const fsm &FSM, const int ST) +trellis_encoder_ii::trellis_encoder_ii (const fsm &FSM, int ST) : gr_sync_block ("encoder_ii", gr_make_io_signature (1, -1, sizeof (int)), gr_make_io_signature (1, -1, sizeof (int))), @@ -50,26 +50,24 @@ trellis_encoder_ii::work (int noutput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items) { - int d_ST_tmp; + int ST_tmp; assert (input_items.size() == output_items.size()); int nstreams = input_items.size(); -for (int m=0;m trellis_encoder_ii_sptr; -trellis_encoder_ii_sptr trellis_make_encoder_ii (const fsm &FSM, const int ST); +trellis_encoder_ii_sptr trellis_make_encoder_ii (const fsm &FSM, int ST); /*! * \brief Convolutional encoder. @@ -42,10 +42,10 @@ trellis_encoder_ii_sptr trellis_make_encoder_ii (const fsm &FSM, const int ST); class trellis_encoder_ii : public gr_sync_block { private: - friend trellis_encoder_ii_sptr trellis_make_encoder_ii (const fsm &FSM, const int ST); + friend trellis_encoder_ii_sptr trellis_make_encoder_ii (const fsm &FSM, int ST); fsm d_FSM; int d_ST; - trellis_encoder_ii (const fsm &FSM, const int ST); + trellis_encoder_ii (const fsm &FSM, int ST); public: fsm FSM () const { return d_FSM; } diff --git a/gr-trellis/src/lib/trellis_encoder_ii.i b/gr-trellis/src/lib/trellis_encoder_ii.i index c05cbb36..aaf36d78 100644 --- a/gr-trellis/src/lib/trellis_encoder_ii.i +++ b/gr-trellis/src/lib/trellis_encoder_ii.i @@ -24,12 +24,12 @@ GR_SWIG_BLOCK_MAGIC(trellis,encoder_ii); -trellis_encoder_ii_sptr trellis_make_encoder_ii (const fsm &FSM, const int ST); +trellis_encoder_ii_sptr trellis_make_encoder_ii (const fsm &FSM, int ST); class trellis_encoder_ii : public gr_sync_block { private: - trellis_encoder_ii (const fsm &FSM, const int ST); + trellis_encoder_ii (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_encoder_si.cc b/gr-trellis/src/lib/trellis_encoder_si.cc index 581ffe28..c2b6463d 100644 --- a/gr-trellis/src/lib/trellis_encoder_si.cc +++ b/gr-trellis/src/lib/trellis_encoder_si.cc @@ -29,12 +29,12 @@ #include trellis_encoder_si_sptr -trellis_make_encoder_si (const fsm &FSM, const int ST) +trellis_make_encoder_si (const fsm &FSM, int ST) { return trellis_encoder_si_sptr (new trellis_encoder_si (FSM,ST)); } -trellis_encoder_si::trellis_encoder_si (const fsm &FSM, const int ST) +trellis_encoder_si::trellis_encoder_si (const fsm &FSM, int ST) : gr_sync_block ("encoder_si", gr_make_io_signature (1, -1, sizeof (short)), gr_make_io_signature (1, -1, sizeof (int))), @@ -50,26 +50,24 @@ trellis_encoder_si::work (int noutput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items) { - int d_ST_tmp; + int ST_tmp; assert (input_items.size() == output_items.size()); int nstreams = input_items.size(); -for (int m=0;m trellis_encoder_si_sptr; -trellis_encoder_si_sptr trellis_make_encoder_si (const fsm &FSM, const int ST); +trellis_encoder_si_sptr trellis_make_encoder_si (const fsm &FSM, int ST); /*! * \brief Convolutional encoder. @@ -42,10 +42,10 @@ trellis_encoder_si_sptr trellis_make_encoder_si (const fsm &FSM, const int ST); class trellis_encoder_si : public gr_sync_block { private: - friend trellis_encoder_si_sptr trellis_make_encoder_si (const fsm &FSM, const int ST); + friend trellis_encoder_si_sptr trellis_make_encoder_si (const fsm &FSM, int ST); fsm d_FSM; int d_ST; - trellis_encoder_si (const fsm &FSM, const int ST); + trellis_encoder_si (const fsm &FSM, int ST); public: fsm FSM () const { return d_FSM; } diff --git a/gr-trellis/src/lib/trellis_encoder_si.i b/gr-trellis/src/lib/trellis_encoder_si.i index e1166a6f..0d8a16bd 100644 --- a/gr-trellis/src/lib/trellis_encoder_si.i +++ b/gr-trellis/src/lib/trellis_encoder_si.i @@ -24,12 +24,12 @@ GR_SWIG_BLOCK_MAGIC(trellis,encoder_si); -trellis_encoder_si_sptr trellis_make_encoder_si (const fsm &FSM, const int ST); +trellis_encoder_si_sptr trellis_make_encoder_si (const fsm &FSM, int ST); class trellis_encoder_si : public gr_sync_block { private: - trellis_encoder_si (const fsm &FSM, const int ST); + trellis_encoder_si (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_encoder_ss.cc b/gr-trellis/src/lib/trellis_encoder_ss.cc index 96604a34..3d0016b6 100644 --- a/gr-trellis/src/lib/trellis_encoder_ss.cc +++ b/gr-trellis/src/lib/trellis_encoder_ss.cc @@ -29,12 +29,12 @@ #include trellis_encoder_ss_sptr -trellis_make_encoder_ss (const fsm &FSM, const int ST) +trellis_make_encoder_ss (const fsm &FSM, int ST) { return trellis_encoder_ss_sptr (new trellis_encoder_ss (FSM,ST)); } -trellis_encoder_ss::trellis_encoder_ss (const fsm &FSM, const int ST) +trellis_encoder_ss::trellis_encoder_ss (const fsm &FSM, int ST) : gr_sync_block ("encoder_ss", gr_make_io_signature (1, -1, sizeof (short)), gr_make_io_signature (1, -1, sizeof (short))), @@ -50,26 +50,24 @@ trellis_encoder_ss::work (int noutput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items) { - int d_ST_tmp; + int ST_tmp; assert (input_items.size() == output_items.size()); int nstreams = input_items.size(); -for (int m=0;m trellis_encoder_ss_sptr; -trellis_encoder_ss_sptr trellis_make_encoder_ss (const fsm &FSM, const int ST); +trellis_encoder_ss_sptr trellis_make_encoder_ss (const fsm &FSM, int ST); /*! * \brief Convolutional encoder. @@ -42,10 +42,10 @@ trellis_encoder_ss_sptr trellis_make_encoder_ss (const fsm &FSM, const int ST); class trellis_encoder_ss : public gr_sync_block { private: - friend trellis_encoder_ss_sptr trellis_make_encoder_ss (const fsm &FSM, const int ST); + friend trellis_encoder_ss_sptr trellis_make_encoder_ss (const fsm &FSM, int ST); fsm d_FSM; int d_ST; - trellis_encoder_ss (const fsm &FSM, const int ST); + trellis_encoder_ss (const fsm &FSM, int ST); public: fsm FSM () const { return d_FSM; } diff --git a/gr-trellis/src/lib/trellis_encoder_ss.i b/gr-trellis/src/lib/trellis_encoder_ss.i index ac194306..8cb1d8ef 100644 --- a/gr-trellis/src/lib/trellis_encoder_ss.i +++ b/gr-trellis/src/lib/trellis_encoder_ss.i @@ -24,12 +24,12 @@ GR_SWIG_BLOCK_MAGIC(trellis,encoder_ss); -trellis_encoder_ss_sptr trellis_make_encoder_ss (const fsm &FSM, const int ST); +trellis_encoder_ss_sptr trellis_make_encoder_ss (const fsm &FSM, int ST); class trellis_encoder_ss : public gr_sync_block { private: - trellis_encoder_ss (const fsm &FSM, const int ST); + trellis_encoder_ss (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 index 2dd1adb1..7ace0298 100644 --- a/gr-trellis/src/lib/trellis_metrics_X.cc.t +++ b/gr-trellis/src/lib/trellis_metrics_X.cc.t @@ -32,14 +32,14 @@ @SPTR_NAME@ -trellis_make_@BASE_NAME@ (const int O, const int D, const std::vector<@I_TYPE@> &TABLE, trellis_metric_type_t TYPE) +trellis_make_@BASE_NAME@ (int O, int D, const std::vector<@I_TYPE@> &TABLE, trellis_metric_type_t TYPE) { return @SPTR_NAME@ (new @NAME@ (O,D,TABLE,TYPE)); } -@NAME@::@NAME@ (const int O, const int D, const std::vector<@I_TYPE@> &TABLE, trellis_metric_type_t 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))), diff --git a/gr-trellis/src/lib/trellis_metrics_X.h.t b/gr-trellis/src/lib/trellis_metrics_X.h.t index 626791dd..ef01793a 100644 --- a/gr-trellis/src/lib/trellis_metrics_X.h.t +++ b/gr-trellis/src/lib/trellis_metrics_X.h.t @@ -31,7 +31,7 @@ class @NAME@; typedef boost::shared_ptr<@NAME@> @SPTR_NAME@; -@SPTR_NAME@ trellis_make_@BASE_NAME@ (const int O, const int D, const std::vector<@I_TYPE@> &TABLE, trellis_metric_type_t TYPE); +@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. @@ -45,8 +45,8 @@ class @NAME@ : public gr_block trellis_metric_type_t d_TYPE; std::vector<@I_TYPE@> d_TABLE; - friend @SPTR_NAME@ trellis_make_@BASE_NAME@ (const int O, const int D, const std::vector<@I_TYPE@> &TABLE, trellis_metric_type_t TYPE); - @NAME@ (const int O, const int D, const std::vector<@I_TYPE@> &TABLE, trellis_metric_type_t TYPE); + friend @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; } diff --git a/gr-trellis/src/lib/trellis_metrics_X.i.t b/gr-trellis/src/lib/trellis_metrics_X.i.t index 2fc3ba8f..1687d8fb 100644 --- a/gr-trellis/src/lib/trellis_metrics_X.i.t +++ b/gr-trellis/src/lib/trellis_metrics_X.i.t @@ -24,12 +24,12 @@ GR_SWIG_BLOCK_MAGIC(trellis,@BASE_NAME@); -@SPTR_NAME@ trellis_make_@BASE_NAME@ (const int O, const int D, const std::vector<@I_TYPE@> &TABLE, trellis_metric_type_t TYPE); +@SPTR_NAME@ trellis_make_@BASE_NAME@ (int O, int D, const std::vector<@I_TYPE@> &TABLE, trellis_metric_type_t TYPE); class @NAME@ : public gr_block { private: - @NAME@ (const int O, const 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; } diff --git a/gr-trellis/src/lib/trellis_metrics_c.cc b/gr-trellis/src/lib/trellis_metrics_c.cc index ea1808e8..d80f2e7d 100644 --- a/gr-trellis/src/lib/trellis_metrics_c.cc +++ b/gr-trellis/src/lib/trellis_metrics_c.cc @@ -32,14 +32,14 @@ trellis_metrics_c_sptr -trellis_make_metrics_c (const int O, const int D, const std::vector &TABLE, trellis_metric_type_t TYPE) +trellis_make_metrics_c (int O, int D, const std::vector &TABLE, trellis_metric_type_t TYPE) { return trellis_metrics_c_sptr (new trellis_metrics_c (O,D,TABLE,TYPE)); } -trellis_metrics_c::trellis_metrics_c (const int O, const int D, const std::vector &TABLE, trellis_metric_type_t TYPE) +trellis_metrics_c::trellis_metrics_c (int O, int D, const std::vector &TABLE, trellis_metric_type_t TYPE) : gr_block ("metrics_c", gr_make_io_signature (1, -1, sizeof (gr_complex)), gr_make_io_signature (1, -1, sizeof (float))), diff --git a/gr-trellis/src/lib/trellis_metrics_c.h b/gr-trellis/src/lib/trellis_metrics_c.h index 5de57840..57a549cb 100644 --- a/gr-trellis/src/lib/trellis_metrics_c.h +++ b/gr-trellis/src/lib/trellis_metrics_c.h @@ -31,7 +31,7 @@ class trellis_metrics_c; typedef boost::shared_ptr trellis_metrics_c_sptr; -trellis_metrics_c_sptr trellis_make_metrics_c (const int O, const int D, const std::vector &TABLE, trellis_metric_type_t TYPE); +trellis_metrics_c_sptr trellis_make_metrics_c (int O, int D, const std::vector &TABLE, trellis_metric_type_t TYPE); /*! * \brief Evaluate metrics for use by the Viterbi algorithm. @@ -45,8 +45,8 @@ class trellis_metrics_c : public gr_block trellis_metric_type_t d_TYPE; std::vector d_TABLE; - friend trellis_metrics_c_sptr trellis_make_metrics_c (const int O, const int D, const std::vector &TABLE, trellis_metric_type_t TYPE); - trellis_metrics_c (const int O, const int D, const std::vector &TABLE, trellis_metric_type_t TYPE); + friend trellis_metrics_c_sptr trellis_make_metrics_c (int O, int D, const std::vector &TABLE, trellis_metric_type_t TYPE); + trellis_metrics_c (int O, int D, const std::vector &TABLE, trellis_metric_type_t TYPE); public: int O () const { return d_O; } diff --git a/gr-trellis/src/lib/trellis_metrics_c.i b/gr-trellis/src/lib/trellis_metrics_c.i index 6813cb94..cb5a116d 100644 --- a/gr-trellis/src/lib/trellis_metrics_c.i +++ b/gr-trellis/src/lib/trellis_metrics_c.i @@ -24,12 +24,12 @@ GR_SWIG_BLOCK_MAGIC(trellis,metrics_c); -trellis_metrics_c_sptr trellis_make_metrics_c (const int O, const int D, const std::vector &TABLE, trellis_metric_type_t TYPE); +trellis_metrics_c_sptr trellis_make_metrics_c (int O, int D, const std::vector &TABLE, trellis_metric_type_t TYPE); class trellis_metrics_c : public gr_block { private: - trellis_metrics_c (const int O, const int D, const std::vector &TABLE, trellis_metric_type_t TYPE); + trellis_metrics_c (int O, int D, const std::vector &TABLE, trellis_metric_type_t TYPE); public: int O () const { return d_O; } diff --git a/gr-trellis/src/lib/trellis_metrics_f.cc b/gr-trellis/src/lib/trellis_metrics_f.cc index 2e148bbd..69e4a99d 100644 --- a/gr-trellis/src/lib/trellis_metrics_f.cc +++ b/gr-trellis/src/lib/trellis_metrics_f.cc @@ -32,14 +32,14 @@ trellis_metrics_f_sptr -trellis_make_metrics_f (const int O, const int D, const std::vector &TABLE, trellis_metric_type_t TYPE) +trellis_make_metrics_f (int O, int D, const std::vector &TABLE, trellis_metric_type_t TYPE) { return trellis_metrics_f_sptr (new trellis_metrics_f (O,D,TABLE,TYPE)); } -trellis_metrics_f::trellis_metrics_f (const int O, const int D, const std::vector &TABLE, trellis_metric_type_t TYPE) +trellis_metrics_f::trellis_metrics_f (int O, int D, const std::vector &TABLE, trellis_metric_type_t TYPE) : gr_block ("metrics_f", gr_make_io_signature (1, -1, sizeof (float)), gr_make_io_signature (1, -1, sizeof (float))), diff --git a/gr-trellis/src/lib/trellis_metrics_f.h b/gr-trellis/src/lib/trellis_metrics_f.h index b668c08d..44a9152f 100644 --- a/gr-trellis/src/lib/trellis_metrics_f.h +++ b/gr-trellis/src/lib/trellis_metrics_f.h @@ -31,7 +31,7 @@ class trellis_metrics_f; typedef boost::shared_ptr trellis_metrics_f_sptr; -trellis_metrics_f_sptr trellis_make_metrics_f (const int O, const int D, const std::vector &TABLE, trellis_metric_type_t TYPE); +trellis_metrics_f_sptr trellis_make_metrics_f (int O, int D, const std::vector &TABLE, trellis_metric_type_t TYPE); /*! * \brief Evaluate metrics for use by the Viterbi algorithm. @@ -45,8 +45,8 @@ class trellis_metrics_f : public gr_block trellis_metric_type_t d_TYPE; std::vector d_TABLE; - friend trellis_metrics_f_sptr trellis_make_metrics_f (const int O, const int D, const std::vector &TABLE, trellis_metric_type_t TYPE); - trellis_metrics_f (const int O, const int D, const std::vector &TABLE, trellis_metric_type_t TYPE); + friend trellis_metrics_f_sptr trellis_make_metrics_f (int O, int D, const std::vector &TABLE, trellis_metric_type_t TYPE); + trellis_metrics_f (int O, int D, const std::vector &TABLE, trellis_metric_type_t TYPE); public: int O () const { return d_O; } diff --git a/gr-trellis/src/lib/trellis_metrics_f.i b/gr-trellis/src/lib/trellis_metrics_f.i index e808af16..a0dac39f 100644 --- a/gr-trellis/src/lib/trellis_metrics_f.i +++ b/gr-trellis/src/lib/trellis_metrics_f.i @@ -24,12 +24,12 @@ GR_SWIG_BLOCK_MAGIC(trellis,metrics_f); -trellis_metrics_f_sptr trellis_make_metrics_f (const int O, const int D, const std::vector &TABLE, trellis_metric_type_t TYPE); +trellis_metrics_f_sptr trellis_make_metrics_f (int O, int D, const std::vector &TABLE, trellis_metric_type_t TYPE); class trellis_metrics_f : public gr_block { private: - trellis_metrics_f (const int O, const int D, const std::vector &TABLE, trellis_metric_type_t TYPE); + trellis_metrics_f (int O, int D, const std::vector &TABLE, trellis_metric_type_t TYPE); public: int O () const { return d_O; } diff --git a/gr-trellis/src/lib/trellis_metrics_i.cc b/gr-trellis/src/lib/trellis_metrics_i.cc index 5901c551..b0fa85fa 100644 --- a/gr-trellis/src/lib/trellis_metrics_i.cc +++ b/gr-trellis/src/lib/trellis_metrics_i.cc @@ -32,14 +32,14 @@ trellis_metrics_i_sptr -trellis_make_metrics_i (const int O, const int D, const std::vector &TABLE, trellis_metric_type_t TYPE) +trellis_make_metrics_i (int O, int D, const std::vector &TABLE, trellis_metric_type_t TYPE) { return trellis_metrics_i_sptr (new trellis_metrics_i (O,D,TABLE,TYPE)); } -trellis_metrics_i::trellis_metrics_i (const int O, const int D, const std::vector &TABLE, trellis_metric_type_t TYPE) +trellis_metrics_i::trellis_metrics_i (int O, int D, const std::vector &TABLE, trellis_metric_type_t TYPE) : gr_block ("metrics_i", gr_make_io_signature (1, -1, sizeof (int)), gr_make_io_signature (1, -1, sizeof (float))), diff --git a/gr-trellis/src/lib/trellis_metrics_i.h b/gr-trellis/src/lib/trellis_metrics_i.h index c51e377e..6e46eef6 100644 --- a/gr-trellis/src/lib/trellis_metrics_i.h +++ b/gr-trellis/src/lib/trellis_metrics_i.h @@ -31,7 +31,7 @@ class trellis_metrics_i; typedef boost::shared_ptr trellis_metrics_i_sptr; -trellis_metrics_i_sptr trellis_make_metrics_i (const int O, const int D, const std::vector &TABLE, trellis_metric_type_t TYPE); +trellis_metrics_i_sptr trellis_make_metrics_i (int O, int D, const std::vector &TABLE, trellis_metric_type_t TYPE); /*! * \brief Evaluate metrics for use by the Viterbi algorithm. @@ -45,8 +45,8 @@ class trellis_metrics_i : public gr_block trellis_metric_type_t d_TYPE; std::vector d_TABLE; - friend trellis_metrics_i_sptr trellis_make_metrics_i (const int O, const int D, const std::vector &TABLE, trellis_metric_type_t TYPE); - trellis_metrics_i (const int O, const int D, const std::vector &TABLE, trellis_metric_type_t TYPE); + friend trellis_metrics_i_sptr trellis_make_metrics_i (int O, int D, const std::vector &TABLE, trellis_metric_type_t TYPE); + trellis_metrics_i (int O, int D, const std::vector &TABLE, trellis_metric_type_t TYPE); public: int O () const { return d_O; } diff --git a/gr-trellis/src/lib/trellis_metrics_i.i b/gr-trellis/src/lib/trellis_metrics_i.i index dadd0657..5e217d1d 100644 --- a/gr-trellis/src/lib/trellis_metrics_i.i +++ b/gr-trellis/src/lib/trellis_metrics_i.i @@ -24,12 +24,12 @@ GR_SWIG_BLOCK_MAGIC(trellis,metrics_i); -trellis_metrics_i_sptr trellis_make_metrics_i (const int O, const int D, const std::vector &TABLE, trellis_metric_type_t TYPE); +trellis_metrics_i_sptr trellis_make_metrics_i (int O, int D, const std::vector &TABLE, trellis_metric_type_t TYPE); class trellis_metrics_i : public gr_block { private: - trellis_metrics_i (const int O, const int D, const std::vector &TABLE, trellis_metric_type_t TYPE); + trellis_metrics_i (int O, int D, const std::vector &TABLE, trellis_metric_type_t TYPE); public: int O () const { return d_O; } diff --git a/gr-trellis/src/lib/trellis_metrics_s.cc b/gr-trellis/src/lib/trellis_metrics_s.cc index 3bee2cc9..07b40972 100644 --- a/gr-trellis/src/lib/trellis_metrics_s.cc +++ b/gr-trellis/src/lib/trellis_metrics_s.cc @@ -32,14 +32,14 @@ trellis_metrics_s_sptr -trellis_make_metrics_s (const int O, const int D, const std::vector &TABLE, trellis_metric_type_t TYPE) +trellis_make_metrics_s (int O, int D, const std::vector &TABLE, trellis_metric_type_t TYPE) { return trellis_metrics_s_sptr (new trellis_metrics_s (O,D,TABLE,TYPE)); } -trellis_metrics_s::trellis_metrics_s (const int O, const int D, const std::vector &TABLE, trellis_metric_type_t TYPE) +trellis_metrics_s::trellis_metrics_s (int O, int D, const std::vector &TABLE, trellis_metric_type_t TYPE) : gr_block ("metrics_s", gr_make_io_signature (1, -1, sizeof (short)), gr_make_io_signature (1, -1, sizeof (float))), diff --git a/gr-trellis/src/lib/trellis_metrics_s.h b/gr-trellis/src/lib/trellis_metrics_s.h index b4332bcc..abd027e5 100644 --- a/gr-trellis/src/lib/trellis_metrics_s.h +++ b/gr-trellis/src/lib/trellis_metrics_s.h @@ -31,7 +31,7 @@ class trellis_metrics_s; typedef boost::shared_ptr trellis_metrics_s_sptr; -trellis_metrics_s_sptr trellis_make_metrics_s (const int O, const int D, const std::vector &TABLE, trellis_metric_type_t TYPE); +trellis_metrics_s_sptr trellis_make_metrics_s (int O, int D, const std::vector &TABLE, trellis_metric_type_t TYPE); /*! * \brief Evaluate metrics for use by the Viterbi algorithm. @@ -45,8 +45,8 @@ class trellis_metrics_s : public gr_block trellis_metric_type_t d_TYPE; std::vector d_TABLE; - friend trellis_metrics_s_sptr trellis_make_metrics_s (const int O, const int D, const std::vector &TABLE, trellis_metric_type_t TYPE); - trellis_metrics_s (const int O, const int D, const std::vector &TABLE, trellis_metric_type_t TYPE); + friend trellis_metrics_s_sptr trellis_make_metrics_s (int O, int D, const std::vector &TABLE, trellis_metric_type_t TYPE); + trellis_metrics_s (int O, int D, const std::vector &TABLE, trellis_metric_type_t TYPE); public: int O () const { return d_O; } diff --git a/gr-trellis/src/lib/trellis_metrics_s.i b/gr-trellis/src/lib/trellis_metrics_s.i index d7529a3e..86830f77 100644 --- a/gr-trellis/src/lib/trellis_metrics_s.i +++ b/gr-trellis/src/lib/trellis_metrics_s.i @@ -24,12 +24,12 @@ GR_SWIG_BLOCK_MAGIC(trellis,metrics_s); -trellis_metrics_s_sptr trellis_make_metrics_s (const int O, const int D, const std::vector &TABLE, trellis_metric_type_t TYPE); +trellis_metrics_s_sptr trellis_make_metrics_s (int O, int D, const std::vector &TABLE, trellis_metric_type_t TYPE); class trellis_metrics_s : public gr_block { private: - trellis_metrics_s (const int O, const int D, const std::vector &TABLE, trellis_metric_type_t TYPE); + trellis_metrics_s (int O, int D, const std::vector &TABLE, trellis_metric_type_t TYPE); public: int O () const { return d_O; } diff --git a/gr-trellis/src/lib/trellis_permutation.cc b/gr-trellis/src/lib/trellis_permutation.cc index 78bdbaf4..88e546a4 100644 --- a/gr-trellis/src/lib/trellis_permutation.cc +++ b/gr-trellis/src/lib/trellis_permutation.cc @@ -29,20 +29,21 @@ #include trellis_permutation_sptr -trellis_make_permutation (const int K, const std::vector &TABLE, const size_t NBYTES) +trellis_make_permutation (int K, const std::vector &TABLE, int SYMS_PER_BLOCK, size_t NBYTES_INOUT) { - return trellis_permutation_sptr (new trellis_permutation (K,TABLE,NBYTES)); + return trellis_permutation_sptr (new trellis_permutation (K,TABLE,SYMS_PER_BLOCK,NBYTES_INOUT)); } -trellis_permutation::trellis_permutation (const int K, const std::vector &TABLE, const size_t NBYTES) +trellis_permutation::trellis_permutation (int K, const std::vector &TABLE, int SYMS_PER_BLOCK, size_t NBYTES_INOUT) : gr_sync_block ("permutation", - gr_make_io_signature (1, -1, NBYTES), - gr_make_io_signature (1, -1, NBYTES)), + gr_make_io_signature (1, -1, NBYTES_INOUT), + gr_make_io_signature (1, -1, NBYTES_INOUT)), d_K (K), d_TABLE (TABLE), - d_NBYTES (NBYTES) + d_SYMS_PER_BLOCK (SYMS_PER_BLOCK), + d_NBYTES_INOUT (NBYTES_INOUT) { - set_output_multiple (d_K); + set_output_multiple (d_K*SYMS_PER_BLOCK); //std::cout << d_K << "\n"; } @@ -56,16 +57,23 @@ trellis_permutation::work (int noutput_items, int nstreams = input_items.size(); assert (input_items.size() == output_items.size()); assert (noutput_items % d_K ==0); - //std::cout << noutput_items << "\n"; for (int m=0;m trellis_permutation_sptr; -trellis_permutation_sptr trellis_make_permutation (const int K, const std::vector &TABLE, const size_t NBYTES); +trellis_permutation_sptr trellis_make_permutation (int K, const std::vector &TABLE, int SYMS_PER_BLOCK, size_t NBYTES_INOUT); /*! * \brief Permutation. @@ -41,16 +41,18 @@ trellis_permutation_sptr trellis_make_permutation (const int K, const std::vecto class trellis_permutation : public gr_sync_block { private: - friend trellis_permutation_sptr trellis_make_permutation (const int K, const std::vector &TABLE, const size_t NBYTES); + friend trellis_permutation_sptr trellis_make_permutation (int K, const std::vector &TABLE, int SYMS_PER_BLOCK, size_t NBYTES_INOUT); int d_K; std::vector d_TABLE; - size_t d_NBYTES; - trellis_permutation (const int K, const std::vector &TABLE, const size_t NBYTES); + int d_SYMS_PER_BLOCK; + size_t d_NBYTES_INOUT; + trellis_permutation (int K, const std::vector &TABLE, int SYMS_PER_BLOCK, size_t NBYTES); public: int K () const { return d_K; } const std::vector & TABLE () const { return d_TABLE; } - size_t NBYTES () const { return d_NBYTES; } + int SYMS_PER_BLOCK () const { return d_SYMS_PER_BLOCK; } + size_t NBYTES_INOUT () const { return d_NBYTES_INOUT; } int work (int noutput_items, gr_vector_const_void_star &input_items, diff --git a/gr-trellis/src/lib/trellis_permutation.i b/gr-trellis/src/lib/trellis_permutation.i index db74cdf0..4dbb92be 100644 --- a/gr-trellis/src/lib/trellis_permutation.i +++ b/gr-trellis/src/lib/trellis_permutation.i @@ -22,18 +22,20 @@ GR_SWIG_BLOCK_MAGIC(trellis,permutation); -trellis_permutation_sptr trellis_make_permutation (const int K, const std::vector &TABLE, const size_t NBYTES); +trellis_permutation_sptr trellis_make_permutation (int K, const std::vector &TABLE, int SYMS_PER_BLOCK, size_t NBYTES_INOUT); class trellis_permutation : public gr_sync_block { private: int d_K; std::vector d_TABLE; - size_t d_NBYTES; - trellis_permutation (const int K, const std::vector &TABLE, const size_t NBYTES); + int d_SYMS_PER_BLOCK; + size_t d_NBYTES_INOUT; + trellis_permutation (int K, const std::vector &TABLE, int SYMS_PER_BLOCK, size_t NBYTES_INOUT); public: int K () const { return d_K; } const std::vector & TABLE () const { return d_TABLE; } - size_t NBYTES () const { return d_NBYTES; } + int SYMS_PER_BLOCK () const { return d_SYMS_PER_BLOCK; } + size_t NBYTES_INOUT () const { return d_NBYTES_INOUT; } }; diff --git a/gr-trellis/src/lib/trellis_siso_f.cc b/gr-trellis/src/lib/trellis_siso_f.cc new file mode 100644 index 00000000..df364fc6 --- /dev/null +++ b/gr-trellis/src/lib/trellis_siso_f.cc @@ -0,0 +1,323 @@ +/* -*- 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 2, 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include +#include +#include + +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 trellis_siso_f_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 this? + // it was suggested to use the one furthest from 1.0 + // let's do it. + 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; + } +} + +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 &NS, + const std::vector &OS, + const std::vector &PS, + const std::vector &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 &alpha, + std::vector &beta) +{ + float norm,mm,minm; + + + if(S0<0) { // initial state not specified + for(int i=0;i=0;k--) { // backward recursion + norm=INF; + for(int j=0;j + +class trellis_siso_f; +typedef boost::shared_ptr trellis_siso_f_sptr; + +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); + + + +class 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 d_alpha; + std::vector d_beta; + + friend 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 new file mode 100644 index 00000000..534ac389 --- /dev/null +++ b/gr-trellis/src/lib/trellis_siso_f.i @@ -0,0 +1,55 @@ +/* -*- 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 2, 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, 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_siso_f.lo b/gr-trellis/src/lib/trellis_siso_f.lo new file mode 100644 index 00000000..2d24f85b --- /dev/null +++ b/gr-trellis/src/lib/trellis_siso_f.lo @@ -0,0 +1,12 @@ +# trellis_siso_f.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.6 (1.1220.2.95 2004/04/11 05:50:42) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/trellis_siso_f.o' + +# Name of the non-PIC object. +non_pic_object=none + diff --git a/gr-trellis/src/lib/trellis_siso_type.h b/gr-trellis/src/lib/trellis_siso_type.h new file mode 100644 index 00000000..6f727522 --- /dev/null +++ b/gr-trellis/src/lib/trellis_siso_type.h @@ -0,0 +1,31 @@ +/* -*- 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 2, 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#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; + +#endif + diff --git a/gr-trellis/src/lib/trellis_viterbi_X.cc.t b/gr-trellis/src/lib/trellis_viterbi_X.cc.t index 0ab423b0..8f02320d 100644 --- a/gr-trellis/src/lib/trellis_viterbi_X.cc.t +++ b/gr-trellis/src/lib/trellis_viterbi_X.cc.t @@ -34,18 +34,18 @@ static const float INF = 1.0e9; @SPTR_NAME@ trellis_make_@BASE_NAME@ ( const fsm &FSM, - const int K, - const int S0, - const int SK) + int K, + int S0, + int SK) { return @SPTR_NAME@ (new @NAME@ (FSM,K,S0,SK)); } @NAME@::@NAME@ ( const fsm &FSM, - const int K, - const int S0, - const int SK) + 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@))), @@ -74,13 +74,13 @@ void -void viterbi_algorithm(const int I, const int S, const int O, +void viterbi_algorithm(int I, int S, int O, const std::vector &NS, const std::vector &OS, const std::vector &PS, const std::vector &PI, - const int K, - const int S0,const int SK, + int K, + int S0,int SK, const float *in, @TYPE@ *out, std::vector &trace) { diff --git a/gr-trellis/src/lib/trellis_viterbi_X.h.t b/gr-trellis/src/lib/trellis_viterbi_X.h.t index f1b8e006..f06fdfdc 100644 --- a/gr-trellis/src/lib/trellis_viterbi_X.h.t +++ b/gr-trellis/src/lib/trellis_viterbi_X.h.t @@ -33,9 +33,9 @@ typedef boost::shared_ptr<@NAME@> @SPTR_NAME@; @SPTR_NAME@ trellis_make_@BASE_NAME@ ( const fsm &FSM, - const int K, - const int S0, - const int SK); + int K, + int S0, + int SK); @@ -49,16 +49,16 @@ class @NAME@ : public gr_block friend @SPTR_NAME@ trellis_make_@BASE_NAME@ ( const fsm &FSM, - const int K, - const int S0, - const int SK); + int K, + int S0, + int SK); @NAME@ ( const fsm &FSM, - const int K, - const int S0, - const int SK); + int K, + int S0, + int SK); public: diff --git a/gr-trellis/src/lib/trellis_viterbi_X.i.t b/gr-trellis/src/lib/trellis_viterbi_X.i.t index 605251e4..99d899b9 100644 --- a/gr-trellis/src/lib/trellis_viterbi_X.i.t +++ b/gr-trellis/src/lib/trellis_viterbi_X.i.t @@ -26,9 +26,9 @@ GR_SWIG_BLOCK_MAGIC(trellis,@BASE_NAME@); @SPTR_NAME@ trellis_make_@BASE_NAME@ ( const fsm &FSM, - const int K, - const int S0, - const int SK); + int K, + int S0, + int SK); class @NAME@ : public gr_block @@ -36,9 +36,9 @@ class @NAME@ : public gr_block private: @NAME@ ( const fsm &FSM, - const int K, - const int S0, - const int SK); + int K, + int S0, + int SK); public: fsm FSM () const { return d_FSM; } diff --git a/gr-trellis/src/lib/trellis_viterbi_b.cc b/gr-trellis/src/lib/trellis_viterbi_b.cc index 2e005a31..ce2778af 100644 --- a/gr-trellis/src/lib/trellis_viterbi_b.cc +++ b/gr-trellis/src/lib/trellis_viterbi_b.cc @@ -34,18 +34,18 @@ static const float INF = 1.0e9; trellis_viterbi_b_sptr trellis_make_viterbi_b ( const fsm &FSM, - const int K, - const int S0, - const int SK) + int K, + int S0, + int SK) { return trellis_viterbi_b_sptr (new trellis_viterbi_b (FSM,K,S0,SK)); } trellis_viterbi_b::trellis_viterbi_b ( const fsm &FSM, - const int K, - const int S0, - const int SK) + int K, + int S0, + int SK) : gr_block ("viterbi_b", gr_make_io_signature (1, -1, sizeof (float)), gr_make_io_signature (1, -1, sizeof (unsigned char))), @@ -74,13 +74,13 @@ trellis_viterbi_b::forecast (int noutput_items, gr_vector_int &ninput_items_requ -void viterbi_algorithm(const int I, const int S, const int O, +void viterbi_algorithm(int I, int S, int O, const std::vector &NS, const std::vector &OS, const std::vector &PS, const std::vector &PI, - const int K, - const int S0,const int SK, + int K, + int S0,int SK, const float *in, unsigned char *out, std::vector &trace) { diff --git a/gr-trellis/src/lib/trellis_viterbi_b.h b/gr-trellis/src/lib/trellis_viterbi_b.h index a4fa533e..c1c359b1 100644 --- a/gr-trellis/src/lib/trellis_viterbi_b.h +++ b/gr-trellis/src/lib/trellis_viterbi_b.h @@ -33,9 +33,9 @@ typedef boost::shared_ptr trellis_viterbi_b_sptr; trellis_viterbi_b_sptr trellis_make_viterbi_b ( const fsm &FSM, - const int K, - const int S0, - const int SK); + int K, + int S0, + int SK); @@ -49,16 +49,16 @@ class trellis_viterbi_b : public gr_block friend trellis_viterbi_b_sptr trellis_make_viterbi_b ( const fsm &FSM, - const int K, - const int S0, - const int SK); + int K, + int S0, + int SK); trellis_viterbi_b ( const fsm &FSM, - const int K, - const int S0, - const int SK); + int K, + int S0, + int SK); public: diff --git a/gr-trellis/src/lib/trellis_viterbi_b.i b/gr-trellis/src/lib/trellis_viterbi_b.i index 44fca365..8f456b0b 100644 --- a/gr-trellis/src/lib/trellis_viterbi_b.i +++ b/gr-trellis/src/lib/trellis_viterbi_b.i @@ -26,9 +26,9 @@ GR_SWIG_BLOCK_MAGIC(trellis,viterbi_b); trellis_viterbi_b_sptr trellis_make_viterbi_b ( const fsm &FSM, - const int K, - const int S0, - const int SK); + int K, + int S0, + int SK); class trellis_viterbi_b : public gr_block @@ -36,9 +36,9 @@ class trellis_viterbi_b : public gr_block private: trellis_viterbi_b ( const fsm &FSM, - const int K, - const int S0, - const int SK); + int K, + int S0, + int SK); public: fsm FSM () const { return d_FSM; } diff --git a/gr-trellis/src/lib/trellis_viterbi_combined_X.cc.t b/gr-trellis/src/lib/trellis_viterbi_combined_X.cc.t index 52e01026..de2079ad 100644 --- a/gr-trellis/src/lib/trellis_viterbi_combined_X.cc.t +++ b/gr-trellis/src/lib/trellis_viterbi_combined_X.cc.t @@ -34,24 +34,24 @@ static const float INF = 1.0e9; @SPTR_NAME@ trellis_make_@BASE_NAME@ ( const fsm &FSM, - const int D, + int D, const std::vector &TABLE, - const int K, - const int S0, - const int SK, - const trellis_metric_type_t TYPE) + int K, + int S0, + int SK, + trellis_metric_type_t TYPE) { return @SPTR_NAME@ (new @NAME@ (FSM,D,TABLE,K,S0,SK,TYPE)); } @NAME@::@NAME@ ( const fsm &FSM, - const int D, + int D, const std::vector &TABLE, - const int K, - const int S0, - const int SK, - const trellis_metric_type_t TYPE) + int K, + int S0, + int SK, + trellis_metric_type_t TYPE) : gr_block ("@BASE_NAME@", gr_make_io_signature (1, -1, sizeof (float)), gr_make_io_signature (1, -1, sizeof (@TYPE@))), @@ -83,16 +83,16 @@ void -void viterbi_algorithm_combined(const int I, const int S, const int O, +void viterbi_algorithm_combined(int I, int S, int O, const std::vector &NS, const std::vector &OS, const std::vector &PS, const std::vector &PI, - const int D, + int D, const std::vector &TABLE, - const int K, - const int S0,const int SK, - const trellis_metric_type_t TYPE, + int K, + int S0,int SK, + trellis_metric_type_t TYPE, const float *in, @TYPE@ *out, std::vector &trace) { diff --git a/gr-trellis/src/lib/trellis_viterbi_combined_X.h.t b/gr-trellis/src/lib/trellis_viterbi_combined_X.h.t index 8d7059a5..14f56520 100644 --- a/gr-trellis/src/lib/trellis_viterbi_combined_X.h.t +++ b/gr-trellis/src/lib/trellis_viterbi_combined_X.h.t @@ -34,12 +34,12 @@ typedef boost::shared_ptr<@NAME@> @SPTR_NAME@; @SPTR_NAME@ trellis_make_@BASE_NAME@ ( const fsm &FSM, - const int D, + int D, const std::vector &TABLE, - const int K, - const int S0, - const int SK, - const trellis_metric_type_t TYPE); + int K, + int S0, + int SK, + trellis_metric_type_t TYPE); class @NAME@ : public gr_block @@ -55,22 +55,22 @@ class @NAME@ : public gr_block friend @SPTR_NAME@ trellis_make_@BASE_NAME@ ( const fsm &FSM, - const int D, + int D, const std::vector &TABLE, - const int K, - const int S0, - const int SK, - const trellis_metric_type_t TYPE); + int K, + int S0, + int SK, + trellis_metric_type_t TYPE); @NAME@ ( const fsm &FSM, - const int D, + int D, const std::vector &TABLE, - const int K, - const int S0, - const int SK, - const trellis_metric_type_t TYPE); + int K, + int S0, + int SK, + trellis_metric_type_t TYPE); public: diff --git a/gr-trellis/src/lib/trellis_viterbi_combined_X.i.t b/gr-trellis/src/lib/trellis_viterbi_combined_X.i.t index 388e0626..e4b68402 100644 --- a/gr-trellis/src/lib/trellis_viterbi_combined_X.i.t +++ b/gr-trellis/src/lib/trellis_viterbi_combined_X.i.t @@ -26,12 +26,12 @@ GR_SWIG_BLOCK_MAGIC(trellis,@BASE_NAME@); @SPTR_NAME@ trellis_make_@BASE_NAME@ ( const fsm &FSM, - const int D, + int D, const std::vector &TABLE, - const int K, - const int S0, - const int SK, - const trellis_metric_type_t TYPE); + int K, + int S0, + int SK, + trellis_metric_type_t TYPE); class @NAME@ : public gr_block @@ -39,12 +39,12 @@ class @NAME@ : public gr_block private: @NAME@ ( const fsm &FSM, - const int D, + int D, const std::vector &TABLE, - const int K, - const int S0, - const int SK, - const trellis_metric_type_t TYPE); + int K, + int S0, + int SK, + trellis_metric_type_t TYPE); public: fsm FSM () const { return d_FSM; } diff --git a/gr-trellis/src/lib/trellis_viterbi_combined_b.cc b/gr-trellis/src/lib/trellis_viterbi_combined_b.cc index 8c72b2a3..2d245f58 100644 --- a/gr-trellis/src/lib/trellis_viterbi_combined_b.cc +++ b/gr-trellis/src/lib/trellis_viterbi_combined_b.cc @@ -34,24 +34,24 @@ static const float INF = 1.0e9; trellis_viterbi_combined_b_sptr trellis_make_viterbi_combined_b ( const fsm &FSM, - const int D, + int D, const std::vector &TABLE, - const int K, - const int S0, - const int SK, - const trellis_metric_type_t TYPE) + int K, + int S0, + int SK, + trellis_metric_type_t TYPE) { return trellis_viterbi_combined_b_sptr (new trellis_viterbi_combined_b (FSM,D,TABLE,K,S0,SK,TYPE)); } trellis_viterbi_combined_b::trellis_viterbi_combined_b ( const fsm &FSM, - const int D, + int D, const std::vector &TABLE, - const int K, - const int S0, - const int SK, - const trellis_metric_type_t TYPE) + int K, + int S0, + int SK, + trellis_metric_type_t TYPE) : gr_block ("viterbi_combined_b", gr_make_io_signature (1, -1, sizeof (float)), gr_make_io_signature (1, -1, sizeof (unsigned char))), @@ -83,16 +83,16 @@ trellis_viterbi_combined_b::forecast (int noutput_items, gr_vector_int &ninput_i -void viterbi_algorithm_combined(const int I, const int S, const int O, +void viterbi_algorithm_combined(int I, int S, int O, const std::vector &NS, const std::vector &OS, const std::vector &PS, const std::vector &PI, - const int D, + int D, const std::vector &TABLE, - const int K, - const int S0,const int SK, - const trellis_metric_type_t TYPE, + int K, + int S0,int SK, + trellis_metric_type_t TYPE, const float *in, unsigned char *out, std::vector &trace) { diff --git a/gr-trellis/src/lib/trellis_viterbi_combined_b.h b/gr-trellis/src/lib/trellis_viterbi_combined_b.h index f523c5ce..5de0924d 100644 --- a/gr-trellis/src/lib/trellis_viterbi_combined_b.h +++ b/gr-trellis/src/lib/trellis_viterbi_combined_b.h @@ -34,12 +34,12 @@ typedef boost::shared_ptr trellis_viterbi_combined_b trellis_viterbi_combined_b_sptr trellis_make_viterbi_combined_b ( const fsm &FSM, - const int D, + int D, const std::vector &TABLE, - const int K, - const int S0, - const int SK, - const trellis_metric_type_t TYPE); + int K, + int S0, + int SK, + trellis_metric_type_t TYPE); class trellis_viterbi_combined_b : public gr_block @@ -55,22 +55,22 @@ class trellis_viterbi_combined_b : public gr_block friend trellis_viterbi_combined_b_sptr trellis_make_viterbi_combined_b ( const fsm &FSM, - const int D, + int D, const std::vector &TABLE, - const int K, - const int S0, - const int SK, - const trellis_metric_type_t TYPE); + int K, + int S0, + int SK, + trellis_metric_type_t TYPE); trellis_viterbi_combined_b ( const fsm &FSM, - const int D, + int D, const std::vector &TABLE, - const int K, - const int S0, - const int SK, - const trellis_metric_type_t TYPE); + int K, + int S0, + int SK, + trellis_metric_type_t TYPE); public: diff --git a/gr-trellis/src/lib/trellis_viterbi_combined_b.i b/gr-trellis/src/lib/trellis_viterbi_combined_b.i index 44b4aa43..06986089 100644 --- a/gr-trellis/src/lib/trellis_viterbi_combined_b.i +++ b/gr-trellis/src/lib/trellis_viterbi_combined_b.i @@ -26,12 +26,12 @@ GR_SWIG_BLOCK_MAGIC(trellis,viterbi_combined_b); trellis_viterbi_combined_b_sptr trellis_make_viterbi_combined_b ( const fsm &FSM, - const int D, + int D, const std::vector &TABLE, - const int K, - const int S0, - const int SK, - const trellis_metric_type_t TYPE); + int K, + int S0, + int SK, + trellis_metric_type_t TYPE); class trellis_viterbi_combined_b : public gr_block @@ -39,12 +39,12 @@ class trellis_viterbi_combined_b : public gr_block private: trellis_viterbi_combined_b ( const fsm &FSM, - const int D, + int D, const std::vector &TABLE, - const int K, - const int S0, - const int SK, - const trellis_metric_type_t TYPE); + int K, + int S0, + int SK, + trellis_metric_type_t TYPE); public: fsm FSM () const { return d_FSM; } diff --git a/gr-trellis/src/lib/trellis_viterbi_combined_i.cc b/gr-trellis/src/lib/trellis_viterbi_combined_i.cc index 3301d028..4506fd12 100644 --- a/gr-trellis/src/lib/trellis_viterbi_combined_i.cc +++ b/gr-trellis/src/lib/trellis_viterbi_combined_i.cc @@ -34,24 +34,24 @@ static const float INF = 1.0e9; trellis_viterbi_combined_i_sptr trellis_make_viterbi_combined_i ( const fsm &FSM, - const int D, + int D, const std::vector &TABLE, - const int K, - const int S0, - const int SK, - const trellis_metric_type_t TYPE) + int K, + int S0, + int SK, + trellis_metric_type_t TYPE) { return trellis_viterbi_combined_i_sptr (new trellis_viterbi_combined_i (FSM,D,TABLE,K,S0,SK,TYPE)); } trellis_viterbi_combined_i::trellis_viterbi_combined_i ( const fsm &FSM, - const int D, + int D, const std::vector &TABLE, - const int K, - const int S0, - const int SK, - const trellis_metric_type_t TYPE) + int K, + int S0, + int SK, + trellis_metric_type_t TYPE) : gr_block ("viterbi_combined_i", gr_make_io_signature (1, -1, sizeof (float)), gr_make_io_signature (1, -1, sizeof (int))), @@ -83,16 +83,16 @@ trellis_viterbi_combined_i::forecast (int noutput_items, gr_vector_int &ninput_i -void viterbi_algorithm_combined(const int I, const int S, const int O, +void viterbi_algorithm_combined(int I, int S, int O, const std::vector &NS, const std::vector &OS, const std::vector &PS, const std::vector &PI, - const int D, + int D, const std::vector &TABLE, - const int K, - const int S0,const int SK, - const trellis_metric_type_t TYPE, + int K, + int S0,int SK, + trellis_metric_type_t TYPE, const float *in, int *out, std::vector &trace) { diff --git a/gr-trellis/src/lib/trellis_viterbi_combined_i.h b/gr-trellis/src/lib/trellis_viterbi_combined_i.h index 171fcb93..1ac5d7d1 100644 --- a/gr-trellis/src/lib/trellis_viterbi_combined_i.h +++ b/gr-trellis/src/lib/trellis_viterbi_combined_i.h @@ -34,12 +34,12 @@ typedef boost::shared_ptr trellis_viterbi_combined_i trellis_viterbi_combined_i_sptr trellis_make_viterbi_combined_i ( const fsm &FSM, - const int D, + int D, const std::vector &TABLE, - const int K, - const int S0, - const int SK, - const trellis_metric_type_t TYPE); + int K, + int S0, + int SK, + trellis_metric_type_t TYPE); class trellis_viterbi_combined_i : public gr_block @@ -55,22 +55,22 @@ class trellis_viterbi_combined_i : public gr_block friend trellis_viterbi_combined_i_sptr trellis_make_viterbi_combined_i ( const fsm &FSM, - const int D, + int D, const std::vector &TABLE, - const int K, - const int S0, - const int SK, - const trellis_metric_type_t TYPE); + int K, + int S0, + int SK, + trellis_metric_type_t TYPE); trellis_viterbi_combined_i ( const fsm &FSM, - const int D, + int D, const std::vector &TABLE, - const int K, - const int S0, - const int SK, - const trellis_metric_type_t TYPE); + int K, + int S0, + int SK, + trellis_metric_type_t TYPE); public: diff --git a/gr-trellis/src/lib/trellis_viterbi_combined_i.i b/gr-trellis/src/lib/trellis_viterbi_combined_i.i index 4b8355e0..05d68d58 100644 --- a/gr-trellis/src/lib/trellis_viterbi_combined_i.i +++ b/gr-trellis/src/lib/trellis_viterbi_combined_i.i @@ -26,12 +26,12 @@ GR_SWIG_BLOCK_MAGIC(trellis,viterbi_combined_i); trellis_viterbi_combined_i_sptr trellis_make_viterbi_combined_i ( const fsm &FSM, - const int D, + int D, const std::vector &TABLE, - const int K, - const int S0, - const int SK, - const trellis_metric_type_t TYPE); + int K, + int S0, + int SK, + trellis_metric_type_t TYPE); class trellis_viterbi_combined_i : public gr_block @@ -39,12 +39,12 @@ class trellis_viterbi_combined_i : public gr_block private: trellis_viterbi_combined_i ( const fsm &FSM, - const int D, + int D, const std::vector &TABLE, - const int K, - const int S0, - const int SK, - const trellis_metric_type_t TYPE); + int K, + int S0, + int SK, + trellis_metric_type_t TYPE); public: fsm FSM () const { return d_FSM; } diff --git a/gr-trellis/src/lib/trellis_viterbi_combined_s.cc b/gr-trellis/src/lib/trellis_viterbi_combined_s.cc index 46dda3d1..f103db22 100644 --- a/gr-trellis/src/lib/trellis_viterbi_combined_s.cc +++ b/gr-trellis/src/lib/trellis_viterbi_combined_s.cc @@ -34,24 +34,24 @@ static const float INF = 1.0e9; trellis_viterbi_combined_s_sptr trellis_make_viterbi_combined_s ( const fsm &FSM, - const int D, + int D, const std::vector &TABLE, - const int K, - const int S0, - const int SK, - const trellis_metric_type_t TYPE) + int K, + int S0, + int SK, + trellis_metric_type_t TYPE) { return trellis_viterbi_combined_s_sptr (new trellis_viterbi_combined_s (FSM,D,TABLE,K,S0,SK,TYPE)); } trellis_viterbi_combined_s::trellis_viterbi_combined_s ( const fsm &FSM, - const int D, + int D, const std::vector &TABLE, - const int K, - const int S0, - const int SK, - const trellis_metric_type_t TYPE) + int K, + int S0, + int SK, + trellis_metric_type_t TYPE) : gr_block ("viterbi_combined_s", gr_make_io_signature (1, -1, sizeof (float)), gr_make_io_signature (1, -1, sizeof (short))), @@ -83,16 +83,16 @@ trellis_viterbi_combined_s::forecast (int noutput_items, gr_vector_int &ninput_i -void viterbi_algorithm_combined(const int I, const int S, const int O, +void viterbi_algorithm_combined(int I, int S, int O, const std::vector &NS, const std::vector &OS, const std::vector &PS, const std::vector &PI, - const int D, + int D, const std::vector &TABLE, - const int K, - const int S0,const int SK, - const trellis_metric_type_t TYPE, + int K, + int S0,int SK, + trellis_metric_type_t TYPE, const float *in, short *out, std::vector &trace) { diff --git a/gr-trellis/src/lib/trellis_viterbi_combined_s.h b/gr-trellis/src/lib/trellis_viterbi_combined_s.h index 5b74b35a..c174c5f0 100644 --- a/gr-trellis/src/lib/trellis_viterbi_combined_s.h +++ b/gr-trellis/src/lib/trellis_viterbi_combined_s.h @@ -34,12 +34,12 @@ typedef boost::shared_ptr trellis_viterbi_combined_s trellis_viterbi_combined_s_sptr trellis_make_viterbi_combined_s ( const fsm &FSM, - const int D, + int D, const std::vector &TABLE, - const int K, - const int S0, - const int SK, - const trellis_metric_type_t TYPE); + int K, + int S0, + int SK, + trellis_metric_type_t TYPE); class trellis_viterbi_combined_s : public gr_block @@ -55,22 +55,22 @@ class trellis_viterbi_combined_s : public gr_block friend trellis_viterbi_combined_s_sptr trellis_make_viterbi_combined_s ( const fsm &FSM, - const int D, + int D, const std::vector &TABLE, - const int K, - const int S0, - const int SK, - const trellis_metric_type_t TYPE); + int K, + int S0, + int SK, + trellis_metric_type_t TYPE); trellis_viterbi_combined_s ( const fsm &FSM, - const int D, + int D, const std::vector &TABLE, - const int K, - const int S0, - const int SK, - const trellis_metric_type_t TYPE); + int K, + int S0, + int SK, + trellis_metric_type_t TYPE); public: diff --git a/gr-trellis/src/lib/trellis_viterbi_combined_s.i b/gr-trellis/src/lib/trellis_viterbi_combined_s.i index ddac5269..c1d5693a 100644 --- a/gr-trellis/src/lib/trellis_viterbi_combined_s.i +++ b/gr-trellis/src/lib/trellis_viterbi_combined_s.i @@ -26,12 +26,12 @@ GR_SWIG_BLOCK_MAGIC(trellis,viterbi_combined_s); trellis_viterbi_combined_s_sptr trellis_make_viterbi_combined_s ( const fsm &FSM, - const int D, + int D, const std::vector &TABLE, - const int K, - const int S0, - const int SK, - const trellis_metric_type_t TYPE); + int K, + int S0, + int SK, + trellis_metric_type_t TYPE); class trellis_viterbi_combined_s : public gr_block @@ -39,12 +39,12 @@ class trellis_viterbi_combined_s : public gr_block private: trellis_viterbi_combined_s ( const fsm &FSM, - const int D, + int D, const std::vector &TABLE, - const int K, - const int S0, - const int SK, - const trellis_metric_type_t TYPE); + int K, + int S0, + int SK, + trellis_metric_type_t TYPE); public: fsm FSM () const { return d_FSM; } diff --git a/gr-trellis/src/lib/trellis_viterbi_i.cc b/gr-trellis/src/lib/trellis_viterbi_i.cc index 58a39f6e..2ff304eb 100644 --- a/gr-trellis/src/lib/trellis_viterbi_i.cc +++ b/gr-trellis/src/lib/trellis_viterbi_i.cc @@ -34,18 +34,18 @@ static const float INF = 1.0e9; trellis_viterbi_i_sptr trellis_make_viterbi_i ( const fsm &FSM, - const int K, - const int S0, - const int SK) + int K, + int S0, + int SK) { return trellis_viterbi_i_sptr (new trellis_viterbi_i (FSM,K,S0,SK)); } trellis_viterbi_i::trellis_viterbi_i ( const fsm &FSM, - const int K, - const int S0, - const int SK) + int K, + int S0, + int SK) : gr_block ("viterbi_i", gr_make_io_signature (1, -1, sizeof (float)), gr_make_io_signature (1, -1, sizeof (int))), @@ -74,13 +74,13 @@ trellis_viterbi_i::forecast (int noutput_items, gr_vector_int &ninput_items_requ -void viterbi_algorithm(const int I, const int S, const int O, +void viterbi_algorithm(int I, int S, int O, const std::vector &NS, const std::vector &OS, const std::vector &PS, const std::vector &PI, - const int K, - const int S0,const int SK, + int K, + int S0,int SK, const float *in, int *out, std::vector &trace) { diff --git a/gr-trellis/src/lib/trellis_viterbi_i.h b/gr-trellis/src/lib/trellis_viterbi_i.h index 5da0a386..86ac8987 100644 --- a/gr-trellis/src/lib/trellis_viterbi_i.h +++ b/gr-trellis/src/lib/trellis_viterbi_i.h @@ -33,9 +33,9 @@ typedef boost::shared_ptr trellis_viterbi_i_sptr; trellis_viterbi_i_sptr trellis_make_viterbi_i ( const fsm &FSM, - const int K, - const int S0, - const int SK); + int K, + int S0, + int SK); @@ -49,16 +49,16 @@ class trellis_viterbi_i : public gr_block friend trellis_viterbi_i_sptr trellis_make_viterbi_i ( const fsm &FSM, - const int K, - const int S0, - const int SK); + int K, + int S0, + int SK); trellis_viterbi_i ( const fsm &FSM, - const int K, - const int S0, - const int SK); + int K, + int S0, + int SK); public: diff --git a/gr-trellis/src/lib/trellis_viterbi_i.i b/gr-trellis/src/lib/trellis_viterbi_i.i index de402e36..3b99f317 100644 --- a/gr-trellis/src/lib/trellis_viterbi_i.i +++ b/gr-trellis/src/lib/trellis_viterbi_i.i @@ -26,9 +26,9 @@ GR_SWIG_BLOCK_MAGIC(trellis,viterbi_i); trellis_viterbi_i_sptr trellis_make_viterbi_i ( const fsm &FSM, - const int K, - const int S0, - const int SK); + int K, + int S0, + int SK); class trellis_viterbi_i : public gr_block @@ -36,9 +36,9 @@ class trellis_viterbi_i : public gr_block private: trellis_viterbi_i ( const fsm &FSM, - const int K, - const int S0, - const int SK); + int K, + int S0, + int SK); public: fsm FSM () const { return d_FSM; } diff --git a/gr-trellis/src/lib/trellis_viterbi_s.cc b/gr-trellis/src/lib/trellis_viterbi_s.cc index f5a0705c..bb3dafa6 100644 --- a/gr-trellis/src/lib/trellis_viterbi_s.cc +++ b/gr-trellis/src/lib/trellis_viterbi_s.cc @@ -34,18 +34,18 @@ static const float INF = 1.0e9; trellis_viterbi_s_sptr trellis_make_viterbi_s ( const fsm &FSM, - const int K, - const int S0, - const int SK) + int K, + int S0, + int SK) { return trellis_viterbi_s_sptr (new trellis_viterbi_s (FSM,K,S0,SK)); } trellis_viterbi_s::trellis_viterbi_s ( const fsm &FSM, - const int K, - const int S0, - const int SK) + int K, + int S0, + int SK) : gr_block ("viterbi_s", gr_make_io_signature (1, -1, sizeof (float)), gr_make_io_signature (1, -1, sizeof (short))), @@ -74,13 +74,13 @@ trellis_viterbi_s::forecast (int noutput_items, gr_vector_int &ninput_items_requ -void viterbi_algorithm(const int I, const int S, const int O, +void viterbi_algorithm(int I, int S, int O, const std::vector &NS, const std::vector &OS, const std::vector &PS, const std::vector &PI, - const int K, - const int S0,const int SK, + int K, + int S0,int SK, const float *in, short *out, std::vector &trace) { diff --git a/gr-trellis/src/lib/trellis_viterbi_s.h b/gr-trellis/src/lib/trellis_viterbi_s.h index 2c3a61c9..6232ce5b 100644 --- a/gr-trellis/src/lib/trellis_viterbi_s.h +++ b/gr-trellis/src/lib/trellis_viterbi_s.h @@ -33,9 +33,9 @@ typedef boost::shared_ptr trellis_viterbi_s_sptr; trellis_viterbi_s_sptr trellis_make_viterbi_s ( const fsm &FSM, - const int K, - const int S0, - const int SK); + int K, + int S0, + int SK); @@ -49,16 +49,16 @@ class trellis_viterbi_s : public gr_block friend trellis_viterbi_s_sptr trellis_make_viterbi_s ( const fsm &FSM, - const int K, - const int S0, - const int SK); + int K, + int S0, + int SK); trellis_viterbi_s ( const fsm &FSM, - const int K, - const int S0, - const int SK); + int K, + int S0, + int SK); public: diff --git a/gr-trellis/src/lib/trellis_viterbi_s.i b/gr-trellis/src/lib/trellis_viterbi_s.i index 44e43726..99b14db7 100644 --- a/gr-trellis/src/lib/trellis_viterbi_s.i +++ b/gr-trellis/src/lib/trellis_viterbi_s.i @@ -26,9 +26,9 @@ GR_SWIG_BLOCK_MAGIC(trellis,viterbi_s); trellis_viterbi_s_sptr trellis_make_viterbi_s ( const fsm &FSM, - const int K, - const int S0, - const int SK); + int K, + int S0, + int SK); class trellis_viterbi_s : public gr_block @@ -36,9 +36,9 @@ class trellis_viterbi_s : public gr_block private: trellis_viterbi_s ( const fsm &FSM, - const int K, - const int S0, - const int SK); + int K, + int S0, + int SK); public: fsm FSM () const { return d_FSM; } -- 2.30.2