From d9a4ecedfcd777262cde70554d6e6a7b4f0657c0 Mon Sep 17 00:00:00 2001 From: anastas Date: Tue, 24 Mar 2009 13:11:18 +0000 Subject: [PATCH] added a radix-n fsm constructor git-svn-id: http://gnuradio.org/svn/gnuradio/trunk@10673 221aa14e-8319-0410-a670-987f0aec2ac5 --- gr-trellis/src/examples/fsm_utils.py | 27 ------------------ gr-trellis/src/lib/fsm.cc | 42 ++++++++++++++++++++++++++++ gr-trellis/src/lib/fsm.h | 1 + gr-trellis/src/lib/fsm.i | 1 + 4 files changed, 44 insertions(+), 27 deletions(-) diff --git a/gr-trellis/src/examples/fsm_utils.py b/gr-trellis/src/examples/fsm_utils.py index ab7b4e94..e3426637 100755 --- a/gr-trellis/src/examples/fsm_utils.py +++ b/gr-trellis/src/examples/fsm_utils.py @@ -61,33 +61,6 @@ def base2dec(s,base): -###################################################################### -# Generate a new FSM representing n stages through the original FSM -###################################################################### -def fsm_radix(f,n): - I=f.I()**n - S=f.S() - O=f.O()**n - nsm=list([0]*I*S) - osm=list([0]*I*S) - for s in range(f.S()): - for i in range(I): - ii=dec2base(i,f.I(),n) - oo=list([0]*n) - ns=s - for k in range(n): - oo[k]=f.OS()[ns*f.I()+ii[k]] - ns=f.NS()[ns*f.I()+ii[k]] - - nsm[s*I+i]=ns - osm[s*I+i]=base2dec(oo,f.O()) - - - f=trellis.fsm(I,S,O,nsm,osm) - return f - - - ###################################################################### # Automatically generate the lookup table that maps the FSM outputs diff --git a/gr-trellis/src/lib/fsm.cc b/gr-trellis/src/lib/fsm.cc index 550674ad..c65b1345 100644 --- a/gr-trellis/src/lib/fsm.cc +++ b/gr-trellis/src/lib/fsm.cc @@ -315,6 +315,48 @@ fsm::fsm(const fsm &FSM1, const fsm &FSM2) } + + +//###################################################################### +//# Generate a new FSM representing n stages through the original FSM +//# AKA radix-n FSM +//###################################################################### +fsm::fsm(const fsm &FSM, int n) +{ + d_I=(int) (pow(1.0*FSM.I(),1.0*n)+0.5); + d_S=FSM.S(); + d_O=(int) (pow(1.0*FSM.O(),1.0*n)+0.5); + + d_NS.resize(d_I*d_S); + d_OS.resize(d_I*d_S); + + for(int s=0;s ii(n); + dec2base(i,FSM.I(),ii); + std::vector oo(n); + int ns=s; + for(int k=0;k