00001
00029 #ifndef PUNCT_CONVCODE_H
00030 #define PUNCT_CONVCODE_H
00031
00032 #include <itpp/base/vec.h>
00033 #include <itpp/base/mat.h>
00034 #include <itpp/base/array.h>
00035 #include <itpp/comm/convcode.h>
00036
00037
00038 namespace itpp
00039 {
00040
00080 class Punctured_Convolutional_Code : public Convolutional_Code
00081 {
00082 public:
00084 Punctured_Convolutional_Code(void) : Convolutional_Code() {}
00086 virtual ~Punctured_Convolutional_Code(void) {}
00087
00094 void set_code(const CONVOLUTIONAL_CODE_TYPE type_of_code, int inverse_rate, int constraint_length)
00095 { Convolutional_Code::set_code(type_of_code, inverse_rate, constraint_length); }
00097 void set_generator_polynomials(const ivec &gen, int constraint_length)
00098 { Convolutional_Code::set_generator_polynomials(gen, constraint_length); }
00100 ivec get_generator_polynomials() const { return gen_pol; }
00101
00103 virtual double get_rate() const { return rate; }
00104
00106 void set_method(const CONVOLUTIONAL_CODE_METHOD method) { Convolutional_Code::set_method(method); }
00107
00109 void set_puncture_matrix(const bmat &pmatrix);
00111 bmat get_puncture_matrix() const { return puncture_matrix; }
00113 int get_puncture_period() const { return Period; }
00114
00116 void init_encoder() { encoder_state = start_state; }
00117
00119 void encode(const bvec &input, bvec &output);
00121 bvec encode(const bvec &input) { bvec output; encode(input, output); return output; }
00122
00124 void encode_trunc(const bvec &input, bvec &output);
00126 bvec encode_trunc(const bvec &input) { bvec output; encode_trunc(input, output); return output; }
00127
00135 void encode_tail(const bvec &input, bvec &output);
00143 bvec encode_tail(const bvec &input) { bvec output; encode_tail(input, output); return output; }
00144
00146 void encode_tailbite(const bvec &input, bvec &output);
00148 bvec encode_tailbite(const bvec &input)
00149 { bvec output; encode_tailbite(input, output); return output; }
00150
00151
00153 virtual void decode(const vec &received_signal, bvec &output);
00155 virtual bvec decode(const vec &received_signal) { bvec output; decode(received_signal, output); return output; }
00156
00157
00158 virtual void decode(const bvec &coded_bits, bvec &decoded_bits);
00159 virtual bvec decode(const bvec &coded_bits);
00160
00162 void decode_trunc(const vec &received_signal, bvec &output);
00164 bvec decode_trunc(const vec &received_signal) { bvec output; decode_trunc(received_signal, output); return output; }
00165
00172 void decode_tail(const vec &received_signal, bvec &output);
00179 bvec decode_tail(const vec &received_signal) { bvec output; decode_tail(received_signal, output); return output; }
00180
00182 void decode_tailbite(const vec &received_signal, bvec &output);
00184 bvec decode_tailbite(const vec &received_signal)
00185 { bvec output; decode_tailbite(received_signal, output); return output; }
00186
00187
00188
00189
00190
00191
00192
00193 bool inverse_tail(const bvec coded_sequence, bvec &input);
00194
00196 bool catastrophic(void);
00197
00199 void distance_profile(ivec &dist_prof, int time, int dmax = 100000, bool reverse = false);
00200
00217 void calculate_spectrum(Array<ivec> &spectrum, int dmax, int no_terms);
00218
00229 void calculate_spectrum(Array<ivec> &spectrum, int time, int dmax, int no_terms, int block_length = 0);
00230
00247 int fast(Array<ivec> &spectrum, int time, int dfree, int no_terms, int d_best_so_far = 0, bool test_catastrophic = false);
00248
00249 protected:
00251 int weight(const int state, const int input, int time);
00253 void weight(const int state, int &w0, int &w1, int time);
00255 int weight_reverse(const int state, const int input, int time);
00257 void weight_reverse(const int state, int &w0, int &w1, int time);
00258
00260 int Period;
00262 int total;
00264 bmat puncture_matrix;
00265 };
00266
00267 }
00268
00269 #endif // #ifndef PUNCT_CONVCODE_H