summaryrefslogtreecommitdiff
path: root/gr-fec/lib
diff options
context:
space:
mode:
Diffstat (limited to 'gr-fec/lib')
-rw-r--r--gr-fec/lib/cc_decoder_impl.cc42
-rw-r--r--gr-fec/lib/cc_decoder_impl.h6
-rw-r--r--gr-fec/lib/polar_decoder_sc.cc22
-rw-r--r--gr-fec/lib/polar_decoder_sc_systematic.cc28
-rw-r--r--gr-fec/lib/polar_encoder.cc36
-rw-r--r--gr-fec/lib/polar_encoder_systematic.cc14
-rw-r--r--gr-fec/lib/scl_list.h8
7 files changed, 62 insertions, 94 deletions
diff --git a/gr-fec/lib/cc_decoder_impl.cc b/gr-fec/lib/cc_decoder_impl.cc
index 2ff08e018d..21062e4f41 100644
--- a/gr-fec/lib/cc_decoder_impl.cc
+++ b/gr-fec/lib/cc_decoder_impl.cc
@@ -98,26 +98,13 @@ cc_decoder_impl::cc_decoder_impl(int frame_size,
throw std::runtime_error("cc_decoder: mode not recognized");
}
- d_vp.metrics = (unsigned char*)volk_malloc(2 * sizeof(unsigned char) * d_numstates,
- volk_get_alignment());
- if (d_vp.metrics == NULL) {
- throw std::runtime_error("bad alloc for d_vp.metrics!");
- }
-
- d_vp.metrics1.t = d_vp.metrics;
- d_vp.metrics2.t = d_vp.metrics + d_numstates;
+ d_vp.metrics.resize(2 * d_numstates);
+ d_vp.metrics1.t = d_vp.metrics.data();
+ d_vp.metrics2.t = d_vp.metrics.data() + d_numstates;
- d_vp.decisions = (unsigned char*)volk_malloc(
- sizeof(unsigned char) * d_veclen * d_decision_t_size, volk_get_alignment());
- if (d_vp.decisions == NULL) {
- throw std::runtime_error("bad alloc for d_vp.decisions!");
- }
+ d_vp.decisions.resize(d_veclen * d_decision_t_size);
- Branchtab = (unsigned char*)volk_malloc(
- sizeof(unsigned char) * d_numstates / 2 * rate, volk_get_alignment());
- if (Branchtab == NULL) {
- throw std::runtime_error("bad alloc for d_vp.decisions!");
- }
+ d_branchtab.resize(d_numstates / 2 * rate);
create_viterbi();
@@ -147,12 +134,7 @@ cc_decoder_impl::cc_decoder_impl(int frame_size,
}
}
-cc_decoder_impl::~cc_decoder_impl()
-{
- volk_free(d_vp.decisions);
- volk_free(Branchtab);
- volk_free(d_vp.metrics);
-}
+cc_decoder_impl::~cc_decoder_impl() {}
int cc_decoder_impl::get_output_size()
{
@@ -191,7 +173,7 @@ void cc_decoder_impl::create_viterbi()
partab_init();
for (state = 0; state < d_numstates / 2; state++) {
for (i = 0; i < d_rate; i++) {
- Branchtab[i * d_numstates / 2 + state] =
+ d_branchtab[i * d_numstates / 2 + state] =
(d_polys[i] < 0) ^ parity((2 * state) & abs(d_polys[i])) ? 255 : 0;
}
}
@@ -297,9 +279,7 @@ int cc_decoder_impl::find_endstate()
int cc_decoder_impl::update_viterbi_blk(unsigned char* syms, int nbits)
{
- unsigned char* d;
-
- d = d_vp.decisions;
+ unsigned char* d = d_vp.decisions.data();
memset(d, 0, d_decision_t_size * nbits);
@@ -309,7 +289,7 @@ int cc_decoder_impl::update_viterbi_blk(unsigned char* syms, int nbits)
d,
nbits - (d_k - 1),
d_k - 1,
- Branchtab);
+ d_branchtab.data());
return 0;
}
@@ -319,10 +299,8 @@ int cc_decoder_impl::chainback_viterbi(unsigned char* data,
unsigned int endstate,
unsigned int tailsize)
{
- unsigned char* d;
-
/* ADDSHIFT and SUBSHIFT make sure that the thing returned is a byte. */
- d = d_vp.decisions;
+ unsigned char* d = d_vp.decisions.data();
/* Make room beyond the end of the encoder register so we can
* accumulate a full byte of decoded data
*/
diff --git a/gr-fec/lib/cc_decoder_impl.h b/gr-fec/lib/cc_decoder_impl.h
index e39cd9846a..d7d236da21 100644
--- a/gr-fec/lib/cc_decoder_impl.h
+++ b/gr-fec/lib/cc_decoder_impl.h
@@ -43,7 +43,7 @@ private:
unsigned int tailsize);
int find_endstate();
- unsigned char* Branchtab;
+ volk::vector<unsigned char> d_branchtab;
unsigned char Partab[256];
@@ -85,6 +85,10 @@ public:
bool padded = false);
~cc_decoder_impl();
+ // Disable copy because of the raw pointers.
+ cc_decoder_impl(const cc_decoder_impl&) = delete;
+ cc_decoder_impl& operator=(const cc_decoder_impl&) = delete;
+
void generic_work(void* inbuffer, void* outbuffer);
bool set_frame_size(unsigned int frame_size);
double rate();
diff --git a/gr-fec/lib/polar_decoder_sc.cc b/gr-fec/lib/polar_decoder_sc.cc
index 9d694bf3bb..eee78fabf8 100644
--- a/gr-fec/lib/polar_decoder_sc.cc
+++ b/gr-fec/lib/polar_decoder_sc.cc
@@ -37,30 +37,22 @@ polar_decoder_sc::polar_decoder_sc(int block_size,
std::vector<int> frozen_bit_positions,
std::vector<uint8_t> frozen_bit_values)
: polar_decoder_common(
- block_size, num_info_bits, frozen_bit_positions, frozen_bit_values)
+ block_size, num_info_bits, frozen_bit_positions, frozen_bit_values),
+ d_llr_vec(block_size * (block_power() + 1)),
+ d_u_hat_vec(block_size * (block_power() + 1))
{
- d_llr_vec = (float*)volk_malloc(sizeof(float) * block_size * (block_power() + 1),
- volk_get_alignment());
- memset(d_llr_vec, 0, sizeof(float) * block_size * (block_power() + 1));
- d_u_hat_vec = (unsigned char*)volk_malloc(block_size * (block_power() + 1),
- volk_get_alignment());
- memset(d_u_hat_vec, 0, sizeof(unsigned char) * block_size * (block_power() + 1));
}
-polar_decoder_sc::~polar_decoder_sc()
-{
- volk_free(d_llr_vec);
- volk_free(d_u_hat_vec);
-}
+polar_decoder_sc::~polar_decoder_sc() {}
void polar_decoder_sc::generic_work(void* in_buffer, void* out_buffer)
{
const float* in = (const float*)in_buffer;
unsigned char* out = (unsigned char*)out_buffer;
- initialize_decoder(d_u_hat_vec, d_llr_vec, in);
- sc_decode(d_llr_vec, d_u_hat_vec);
- extract_info_bits(out, d_u_hat_vec);
+ initialize_decoder(d_u_hat_vec.data(), d_llr_vec.data(), in);
+ sc_decode(d_llr_vec.data(), d_u_hat_vec.data());
+ extract_info_bits(out, d_u_hat_vec.data());
}
void polar_decoder_sc::sc_decode(float* llrs, unsigned char* u)
diff --git a/gr-fec/lib/polar_decoder_sc_systematic.cc b/gr-fec/lib/polar_decoder_sc_systematic.cc
index 20fbad2d38..cd8f3db586 100644
--- a/gr-fec/lib/polar_decoder_sc_systematic.cc
+++ b/gr-fec/lib/polar_decoder_sc_systematic.cc
@@ -30,34 +30,24 @@ generic_decoder::sptr polar_decoder_sc_systematic::make(
polar_decoder_sc_systematic::polar_decoder_sc_systematic(
int block_size, int num_info_bits, std::vector<int> frozen_bit_positions)
: polar_decoder_common(
- block_size, num_info_bits, frozen_bit_positions, std::vector<uint8_t>())
+ block_size, num_info_bits, frozen_bit_positions, std::vector<uint8_t>()),
+ d_llr_vec(block_size * (block_power() + 1)),
+ d_u_hat_vec(block_size * (block_power() + 1)),
+ d_frame_vec(block_size)
{
- d_llr_vec = (float*)volk_malloc(sizeof(float) * block_size * (block_power() + 1),
- volk_get_alignment());
- memset(d_llr_vec, 0, sizeof(float) * block_size * (block_power() + 1));
- d_u_hat_vec = (unsigned char*)volk_malloc(block_size * (block_power() + 1),
- volk_get_alignment());
- memset(d_u_hat_vec, 0, sizeof(unsigned char) * block_size * (block_power() + 1));
- d_frame_vec = (unsigned char*)volk_malloc(block_size, volk_get_alignment());
- memset(d_frame_vec, 0, sizeof(unsigned char) * block_size);
}
-polar_decoder_sc_systematic::~polar_decoder_sc_systematic()
-{
- volk_free(d_llr_vec);
- volk_free(d_u_hat_vec);
- volk_free(d_frame_vec);
-}
+polar_decoder_sc_systematic::~polar_decoder_sc_systematic() {}
void polar_decoder_sc_systematic::generic_work(void* in_buffer, void* out_buffer)
{
const float* in = (const float*)in_buffer;
unsigned char* out = (unsigned char*)out_buffer;
- initialize_decoder(d_u_hat_vec, d_llr_vec, in);
- sc_decode(d_llr_vec, d_u_hat_vec);
- volk_encode_block(d_frame_vec, d_u_hat_vec);
- extract_info_bits_reversed(out, d_frame_vec);
+ initialize_decoder(d_u_hat_vec.data(), d_llr_vec.data(), in);
+ sc_decode(d_llr_vec.data(), d_u_hat_vec.data());
+ volk_encode_block(d_frame_vec.data(), d_u_hat_vec.data());
+ extract_info_bits_reversed(out, d_frame_vec.data());
}
void polar_decoder_sc_systematic::sc_decode(float* llrs, unsigned char* u)
diff --git a/gr-fec/lib/polar_encoder.cc b/gr-fec/lib/polar_encoder.cc
index 568a0b8e5e..84633ec893 100644
--- a/gr-fec/lib/polar_encoder.cc
+++ b/gr-fec/lib/polar_encoder.cc
@@ -25,6 +25,19 @@ namespace gr {
namespace fec {
namespace code {
+volk::vector<unsigned char> polar_encoder::make_prototype() const
+{
+ volk::vector<unsigned char> proto(block_size() >> 3);
+
+ for (unsigned int i = 0; i < d_frozen_bit_positions.size(); i++) {
+ int rev_pos = (int)bit_reverse((long)d_frozen_bit_positions.at(i), block_power());
+ unsigned char frozen_bit = (unsigned char)d_frozen_bit_values.at(i);
+ insert_unpacked_bit_into_packed_array_at_position(
+ proto.data(), frozen_bit, rev_pos);
+ }
+ return proto;
+}
+
generic_encoder::sptr polar_encoder::make(int block_size,
int num_info_bits,
std::vector<int> frozen_bit_positions,
@@ -41,26 +54,12 @@ polar_encoder::polar_encoder(int block_size,
std::vector<uint8_t>& frozen_bit_values,
bool is_packed)
: polar_common(block_size, num_info_bits, frozen_bit_positions, frozen_bit_values),
- d_is_packed(is_packed)
+ d_is_packed(is_packed),
+ d_frozen_bit_prototype(make_prototype())
{
- setup_frozen_bit_inserter();
-}
-
-void polar_encoder::setup_frozen_bit_inserter()
-{
- d_frozen_bit_prototype =
- (unsigned char*)volk_malloc(block_size() >> 3, volk_get_alignment());
- memset(d_frozen_bit_prototype, 0, block_size() >> 3);
-
- for (unsigned int i = 0; i < d_frozen_bit_positions.size(); i++) {
- int rev_pos = (int)bit_reverse((long)d_frozen_bit_positions.at(i), block_power());
- unsigned char frozen_bit = (unsigned char)d_frozen_bit_values.at(i);
- insert_unpacked_bit_into_packed_array_at_position(
- d_frozen_bit_prototype, frozen_bit, rev_pos);
- }
}
-polar_encoder::~polar_encoder() { volk_free(d_frozen_bit_prototype); }
+polar_encoder::~polar_encoder() {}
void polar_encoder::generic_work(void* in_buffer, void* out_buffer)
{
@@ -129,7 +128,8 @@ void polar_encoder::encode_vector_packed_interbyte(unsigned char* target) const
void polar_encoder::insert_packed_frozen_bits_and_reverse(
unsigned char* target, const unsigned char* input) const
{
- memcpy(target, d_frozen_bit_prototype, block_size() >> 3);
+ std::copy(
+ std::begin(d_frozen_bit_prototype), std::end(d_frozen_bit_prototype), target);
const int* info_bit_reversed_positions_ptr = &d_info_bit_positions_reversed[0];
int bit_num = 0;
unsigned char byte = *input;
diff --git a/gr-fec/lib/polar_encoder_systematic.cc b/gr-fec/lib/polar_encoder_systematic.cc
index b77f5e0730..ddf898d8b0 100644
--- a/gr-fec/lib/polar_encoder_systematic.cc
+++ b/gr-fec/lib/polar_encoder_systematic.cc
@@ -31,16 +31,12 @@ polar_encoder_systematic::polar_encoder_systematic(int block_size,
int num_info_bits,
std::vector<int> frozen_bit_positions)
: polar_common(
- block_size, num_info_bits, frozen_bit_positions, std::vector<uint8_t>())
+ block_size, num_info_bits, frozen_bit_positions, std::vector<uint8_t>()),
+ d_volk_syst_intermediate(block_size)
{
- d_volk_syst_intermediate = (unsigned char*)volk_malloc(
- sizeof(unsigned char) * block_size, volk_get_alignment());
}
-polar_encoder_systematic::~polar_encoder_systematic()
-{
- volk_free(d_volk_syst_intermediate);
-}
+polar_encoder_systematic::~polar_encoder_systematic() {}
void polar_encoder_systematic::generic_work(void* in_buffer, void* out_buffer)
{
@@ -48,8 +44,8 @@ void polar_encoder_systematic::generic_work(void* in_buffer, void* out_buffer)
unsigned char* out = (unsigned char*)out_buffer;
volk_encode(out, in);
- bit_reverse_and_reset_frozen_bits(d_volk_syst_intermediate, out);
- volk_encode_block(out, d_volk_syst_intermediate);
+ bit_reverse_and_reset_frozen_bits(d_volk_syst_intermediate.data(), out);
+ volk_encode_block(out, d_volk_syst_intermediate.data());
}
void polar_encoder_systematic::bit_reverse_and_reset_frozen_bits(
diff --git a/gr-fec/lib/scl_list.h b/gr-fec/lib/scl_list.h
index db60b570bc..75eb2fa57f 100644
--- a/gr-fec/lib/scl_list.h
+++ b/gr-fec/lib/scl_list.h
@@ -20,6 +20,9 @@ namespace polar {
struct path {
path();
+ // Disable copy because of raw pointers.
+ path(const path&) = delete;
+ path& operator=(const path&) = delete;
~path();
float path_metric;
bool owns_vectors;
@@ -56,6 +59,11 @@ public:
scl_list(const unsigned int list_size,
const unsigned int block_size,
const unsigned int block_power);
+
+ // Disable copy because of raw pointers.
+ scl_list(const scl_list&) = delete;
+ scl_list& operator=(const scl_list&) = delete;
+
virtual ~scl_list();
const unsigned int size() const { return d_list_size; };
const unsigned int active_size() const { return d_active_path_counter; };