GNU Radio Manual and C++ API Reference  3.10.9.1
The Free & Open Software Radio Ecosystem
fsm.h
Go to the documentation of this file.
1 /* -*- c++ -*- */
2 /*
3  * Copyright 2002,2011-2012 Free Software Foundation, Inc.
4  *
5  * This file is part of GNU Radio
6  *
7  * SPDX-License-Identifier: GPL-3.0-or-later
8  *
9  */
10 
11 #ifndef INCLUDED_TRELLIS_FSM_H
12 #define INCLUDED_TRELLIS_FSM_H
13 
14 #include <gnuradio/trellis/api.h>
15 #include <iosfwd>
16 #include <string>
17 #include <vector>
18 
19 namespace gr {
20 namespace trellis {
21 
22 /*!
23  * \brief Finite State Machine Specification class.
24  * \ingroup trellis_coding_blk
25  *
26  * \details
27  * An instance of this class represents a finite state machine
28  * specification (FSMS) rather than the FSM itself. It particular
29  * the state of the FSM is not stored within an instance of this
30  * class.
31  */
33 {
34 private:
35  // Input alphabet cardinality.
36  int d_I;
37 
38  // Number of states.
39  int d_S;
40 
41  // Output alphabet cardinality.
42  int d_O;
43 
44  // NS means Next State.
45  // next_state = d_NS[current_state * d_I + input_symbol]
46  std::vector<int> d_NS;
47 
48  // OS means Output Symbol.
49  // output_symbol = d_OS[current_state * d_I + input_symbol]
50  std::vector<int> d_OS;
51 
52  // PS means Previous State.
53  std::vector<std::vector<int>> d_PS;
54 
55  // PI means Previous Input Symbol.
56  // d_PS[current_state][k] and d_PI[current_state][k], is a pair of the form
57  // (previous_state, previous_input_symbol) that could have produced the
58  // current state.
59  std::vector<std::vector<int>> d_PI;
60 
61  // TM means Termination matrix.
62  // d_TMl[s*d_S+es] is the shortest number of steps to get from state s to
63  // state es.
64  std::vector<int> d_TMl;
65 
66  // d_TMi[s*d_S+es] is the input symbol required to set off on the shortest
67  // path from state s to es.
68  std::vector<int> d_TMi;
69  void generate_PS_PI();
70  void generate_TM();
71  bool find_es(int es);
72 
73 public:
74  /*!
75  * \brief Constructor to create an uninitialized FSMS.
76  */
77  fsm();
78 
79  /*!
80  * \brief Constructor to copy an FSMS.
81  */
82  fsm(const fsm& FSM);
83 
84  /*!
85  * \brief Constructor to to create an FSMS.
86  *
87  * \param I The number of possible input symbols.
88  * \param S The number of possible FSM states.
89  * \param O The number of possible output symbols.
90  * \param NS A mapping from (current state, input symbol) to next state.
91  * next_state = NS[current_state * I + input_symbol]
92  * \param OS A mapping from (current state, input symbol) to output symbol.
93  * output_symbol = OS[current_state * I + input_symbol]
94  *
95  */
96  fsm(int I, int S, int O, const std::vector<int>& NS, const std::vector<int>& OS);
97 
98  /*!
99  * \brief Constructor to create an FSMS from file contents.
100  *
101  * \param name filename
102  *
103  */
104  fsm(const char* name);
105 
106  /*!
107  * \brief Creates an FSMS from the generator matrix of a (n, k) binary convolutional
108  * code.
109  *
110  * \param k ???
111  * \param n ???
112  * \param G ???
113  *
114  */
115  fsm(int k, int n, const std::vector<int>& G);
116 
117  /*!
118  * \brief Creates an FSMS describing ISI.
119  *
120  * \param mod_size modulation size
121  * \param ch_length channel length
122  *
123  */
124  fsm(int mod_size, int ch_length);
125 
126  /*!
127  * \brief Creates an FSMS describing the trellis for a CPM.
128  *
129  * \param P ???? h=K/P (relatively prime)
130  * \param M alphabet size
131  * \param L pulse duration
132  *
133  * This FSM is based on the paper by B. Rimoldi
134  * "A decomposition approach to CPM", IEEE Trans. Info Theory, March 1988
135  * See also my own notes at http://www.eecs.umich.edu/~anastas/docs/cpm.pdf
136  */
137  fsm(int P, int M, int L);
138 
139  /*!
140  * \brief Creates an FSMS describing the joint trellis of two FSMs.
141  *
142  * \param FSM1 first FSMS
143  * \param FSM2 second FSMS
144  */
145  fsm(const fsm& FSM1, const fsm& FSM2);
146 
147 
148  /*!
149  * \brief Creates an FSMS describing the trellis of two serially concatenated FSMs.
150  *
151  * \param FSMo outer FSMS
152  * \param FSMi inner FSMS
153  * \param serial set it to true to distinguish from the previous constructor
154  */
155  fsm(const fsm& FSMo, const fsm& FSMi, bool serial);
156 
157  /*!
158  * \brief Creates an FSMS representing n stages through the original FSM (AKA radix-n
159  * FSM).
160  *
161  * \param FSM Original FSMs
162  * \param n Number of stages.
163  */
164  fsm(const fsm& FSM, int n);
165  int I() const { return d_I; }
166  int S() const { return d_S; }
167  int O() const { return d_O; }
168  const std::vector<int>& NS() const { return d_NS; }
169  const std::vector<int>& OS() const { return d_OS; }
170  const std::vector<std::vector<int>>& PS() const { return d_PS; }
171  const std::vector<std::vector<int>>& PI() const { return d_PI; }
172  const std::vector<int>& TMi() const { return d_TMi; }
173  const std::vector<int>& TMl() const { return d_TMl; }
174 
175  /*!
176  * \brief Creates an svg image of the trellis representation.
177  *
178  * \param filename filename
179  * \param number_stages ????
180  */
181  void write_trellis_svg(std::string filename, int number_stages);
182 
183  /*!
184  * \brief Write the FSMS to a file.
185  *
186  * \param filename filename
187  */
188  void write_fsm_txt(std::string filename);
189 };
190 
191 } /* namespace trellis */
192 } /* namespace gr */
193 
194 #endif /* INCLUDED_TRELLIS_FSM_H */
Finite State Machine Specification class.
Definition: fsm.h:33
const std::vector< std::vector< int > > & PS() const
Definition: fsm.h:170
void write_fsm_txt(std::string filename)
Write the FSMS to a file.
void write_trellis_svg(std::string filename, int number_stages)
Creates an svg image of the trellis representation.
fsm(const fsm &FSM, int n)
Creates an FSMS representing n stages through the original FSM (AKA radix-n FSM).
const std::vector< int > & TMl() const
Definition: fsm.h:173
fsm(const fsm &FSMo, const fsm &FSMi, bool serial)
Creates an FSMS describing the trellis of two serially concatenated FSMs.
const std::vector< int > & NS() const
Definition: fsm.h:168
fsm(int P, int M, int L)
Creates an FSMS describing the trellis for a CPM.
fsm()
Constructor to create an uninitialized FSMS.
const std::vector< int > & OS() const
Definition: fsm.h:169
fsm(const fsm &FSM1, const fsm &FSM2)
Creates an FSMS describing the joint trellis of two FSMs.
int I() const
Definition: fsm.h:165
int O() const
Definition: fsm.h:167
int S() const
Definition: fsm.h:166
fsm(int k, int n, const std::vector< int > &G)
Creates an FSMS from the generator matrix of a (n, k) binary convolutional code.
fsm(const fsm &FSM)
Constructor to copy an FSMS.
fsm(int mod_size, int ch_length)
Creates an FSMS describing ISI.
fsm(const char *name)
Constructor to create an FSMS from file contents.
fsm(int I, int S, int O, const std::vector< int > &NS, const std::vector< int > &OS)
Constructor to to create an FSMS.
const std::vector< std::vector< int > > & PI() const
Definition: fsm.h:171
const std::vector< int > & TMi() const
Definition: fsm.h:172
#define TRELLIS_API
Definition: gr-trellis/include/gnuradio/trellis/api.h:18
GNU Radio logging wrapper.
Definition: basic_block.h:29
#define S(x)
Definition: rpcserver_thrift.h:24