3 * Copyright 2006 Free Software Foundation, Inc.
5 * This file is part of GNU Radio
7 * GNU Radio is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2, or (at your option)
12 * GNU Radio is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with GNU Radio; see the file COPYING. If not, write to
19 * the Free Software Foundation, Inc., 51 Franklin Street,
20 * Boston, MA 02110-1301, USA.
27 #include <ecc_metrics_decode_viterbi_full_block.h>
28 #include <gr_io_signature.h>
32 ecc_metrics_decode_viterbi_full_block_sptr
33 ecc_make_metrics_decode_viterbi_full_block
34 (int sample_precision,
38 const std::vector<int>& code_generator,
40 int start_memory_state,
43 return ecc_metrics_decode_viterbi_full_block_sptr
44 (new ecc_metrics_decode_viterbi_full_block
55 ecc_metrics_decode_viterbi_full_block_feedback_sptr
56 ecc_make_metrics_decode_viterbi_full_block_feedback
57 (int sample_precision,
61 const std::vector<int>& code_generator,
62 const std::vector<int>& code_feedback,
64 int start_memory_state,
67 return ecc_metrics_decode_viterbi_full_block_feedback_sptr
68 (new ecc_metrics_decode_viterbi_full_block
80 ecc_metrics_decode_viterbi_full_block::ecc_metrics_decode_viterbi_full_block
81 (int sample_precision,
85 const std::vector<int>& code_generator,
87 int start_memory_state,
89 : gr_block ("metrics_decode_viterbi_full_block",
90 gr_make_io_signature (0, 0, 0),
91 gr_make_io_signature (0, 0, 0))
93 d_encoder = new encoder_convolutional (frame_size_bits,
101 setup_io_signatures (sample_precision, n_code_inputs, n_code_outputs);
104 ecc_metrics_decode_viterbi_full_block::ecc_metrics_decode_viterbi_full_block
105 (int sample_precision,
109 const std::vector<int>& code_generator,
110 const std::vector<int>& code_feedback,
112 int start_memory_state,
113 int end_memory_state)
114 : gr_block ("metrics_decode_viterbi_full_block_feedback",
115 gr_make_io_signature (0, 0, 0),
116 gr_make_io_signature (0, 0, 0))
118 d_encoder = new encoder_convolutional (frame_size_bits,
127 setup_io_signatures (sample_precision, n_code_inputs, n_code_outputs);
130 ecc_metrics_decode_viterbi_full_block::~ecc_metrics_decode_viterbi_full_block
144 ecc_metrics_decode_viterbi_full_block::setup_io_signatures
145 (int sample_precision,
149 // create the decoder
151 // the input model: individual input streams; two per metric type
152 // (0-bit, 1-bit), single metric per input item (float, char, short,
155 // the "ic1l" output model:
156 // individual output streams per decoded code input stream;
157 // each item is a 'char' type with 1 bit aligned on the LSB.
159 d_decoder = new decoder_viterbi_full_block (sample_precision,
161 d_out_buf = new code_output_ic1l (n_code_inputs);
163 // error checking is done in the encoder and decoder classes
164 // so just use the parameters as given; will be correct!
166 d_n_code_inputs = n_code_inputs;
167 d_n_code_outputs = n_code_outputs;
169 // output signature is always the same:
170 // sizeof (char) with 1 bit per char as the LSB
172 set_output_signature (gr_make_io_signature (d_n_code_inputs,
176 // determine the input signature element size
177 size_t l_input_item_size_bytes;
179 if (sample_precision == 0) {
181 l_input_item_size_bytes = sizeof (float);
182 d_in_buf = new code_input_if (n_code_outputs);
183 } else if (sample_precision <= 8) {
185 l_input_item_size_bytes = sizeof (char);
186 d_in_buf = new code_input_ic (n_code_outputs);
187 } else if (sample_precision <= 16) {
189 l_input_item_size_bytes = sizeof (short);
190 d_in_buf = new code_input_is (n_code_outputs);
193 l_input_item_size_bytes = sizeof (long);
194 d_in_buf = new code_input_il (n_code_outputs);
197 set_input_signature (gr_make_io_signature (2*d_n_code_outputs,
199 l_input_item_size_bytes));
202 void ecc_metrics_decode_viterbi_full_block::forecast
204 gr_vector_int &ninput_items_required)
206 int ninput_items = d_decoder->compute_n_input_items (noutput_items);
207 size_t ninputs = ninput_items_required.size();
208 for (size_t n = 0; n < ninputs; n++)
209 ninput_items_required[n] = ninput_items;
213 ecc_metrics_decode_viterbi_full_block::general_work
215 gr_vector_int &ninput_items,
216 gr_vector_const_void_star &input_items,
217 gr_vector_void_star &output_items)
219 // compute the actual number of output items (1 bit char's) created.
221 size_t t_n_input_items = d_decoder->compute_n_input_items (noutput_items);
223 size_t t_n_output_items = d_decoder->compute_n_output_bits (t_n_input_items);
224 assert (t_n_output_items == ((size_t)noutput_items));
227 // setup the i/o buffers
229 d_in_buf->set_buffer ((void**)(&input_items[0]), t_n_input_items);
230 d_out_buf->set_buffer ((void**)(&output_items[0]), noutput_items);
232 // "work" is handled by the decoder; which returns the actual number
233 // of input items (metrics) used.
235 t_n_input_items = d_decoder->decode (d_in_buf, d_out_buf,
236 (size_t) noutput_items);
238 // consume the number of used input items on all input streams
240 consume_each (t_n_input_items);
242 // returns number of items written to each output stream
244 return (noutput_items);