summaryrefslogtreecommitdiff
path: root/gr-fec
diff options
context:
space:
mode:
authorNick McCarthy <namccart@gmail.com>2014-03-28 14:54:55 -0700
committerTom Rondeau <tom@trondeau.com>2014-05-17 17:45:13 -0400
commitf8ccc154d7f860d0b9c52c451a2ec7cf0fbc41d9 (patch)
tree13bebad6f5fc035d882cb4a753e42746d71a090e /gr-fec
parentba2951861b99f59df79022f98f51a12273fe2aa8 (diff)
fec: improved fecapi stuff.
Fixes for frame lengths, (de)interleave usage, generic conv volk kernel.
Diffstat (limited to 'gr-fec')
-rw-r--r--gr-fec/lib/cc_decoder_impl.cc109
-rw-r--r--gr-fec/lib/cc_decoder_impl.h1
-rw-r--r--gr-fec/python/fec/capillary_threaded_decoder.py2
-rw-r--r--gr-fec/python/fec/threaded_encoder.py4
4 files changed, 40 insertions, 76 deletions
diff --git a/gr-fec/lib/cc_decoder_impl.cc b/gr-fec/lib/cc_decoder_impl.cc
index e09064c3bc..e8d8671e5f 100644
--- a/gr-fec/lib/cc_decoder_impl.cc
+++ b/gr-fec/lib/cc_decoder_impl.cc
@@ -76,33 +76,18 @@ namespace gr {
d_decision_t_size = d_numstates/8; //packed bit array
+ d_managed_in_size = 0;
if(d_tailbiting) {
d_end_state = &d_end_state_chaining;
d_veclen = d_framebits + (6 * (d_k - 1));
d_managed_in = (COMPUTETYPE*)volk_malloc(d_veclen*d_rate*sizeof(COMPUTETYPE),
volk_get_alignment());
- if(d_managed_in) {
- printf("allocation failed\n");
- exit(1);
+ d_managed_in_size = d_veclen * d_rate;
+ if(d_managed_in == NULL) {
+ throw std::runtime_error("bad alloc for d_managed_in!\n");
}
}
- /*
- else if(d_trunc_intrinsic) {
- d_end_state = &d_end_state_nonchaining;
- d_veclen = d_framebits + d_k - 1;
- if(posix_memalign((void**)&d_managed_in, 16, d_veclen * d_rate * sizeof(COMPUTETYPE))){
- printf("allocation failed\n");
- exit(1);
- }
- int cnt = 0;
- for(int i = 0; i < d_rate; ++i) {
- if (d_polys[i] != 1) {
- cnt++;
- }
- }
- d_partial_rate = cnt;
- }
- */
+
else if(d_truncated) {
d_end_state = &d_end_state_chaining;
d_veclen = d_framebits;
@@ -118,24 +103,30 @@ namespace gr {
d_veclen = d_framebits + d_k - 1;
}
- if(posix_memalign((void**)&d_vp->metrics, 16, 2 * d_numstates * sizeof(COMPUTETYPE))) {
- printf("allocation failed\n");
- exit(1);
+ d_vp->metrics = (COMPUTETYPE*) volk_malloc(2 * sizeof(COMPUTETYPE) * d_numstates, volk_get_alignment());
+ if(d_vp->metrics == NULL) {
+ throw std::runtime_error("bad alloc for d_vp->metrics!\n");
}
+
+
d_vp->metrics1.t = d_vp->metrics;
d_vp->metrics2.t = d_vp->metrics + d_numstates;
- if(posix_memalign((void**)&d_vp->decisions, 16,d_veclen*d_decision_t_size)) {
- printf("allocation failed\n");
- exit(1);
+ d_vp->decisions = (DECISIONTYPE*) volk_malloc(d_veclen*d_decision_t_size, volk_get_alignment());
+ if(d_vp->decisions == NULL) {
+ throw std::runtime_error("bad alloc for d_vp->decisions!\n");
}
- if(posix_memalign((void**)&Branchtab, 16, sizeof(COMPUTETYPE) * d_numstates/2*rate)) {
- printf("allocation failed\n");
- exit(1);
+
+
+ Branchtab = (COMPUTETYPE*) volk_malloc(sizeof(COMPUTETYPE) * d_numstates/2*rate, volk_get_alignment());
+ if(Branchtab == NULL) {
+ throw std::runtime_error("bad alloc for d_vp->decisions!\n");
}
+
+
create_viterbi();
if(d_k-1<8) {
@@ -182,17 +173,7 @@ namespace gr {
if(d_terminated) {
return d_rate * (d_framebits + d_k - 1);
}
- /*
- else if(d_trunc_intrinsic) {
- int cnt = 0;
- for(int i = 0; i < d_rate; ++i) {
- if (d_polys[i] != 1) {
- cnt++;
- }
- }
- return (d_rate * (d_framebits)) + (cnt * (d_k - 1));
- }
- */
+
else {
return d_rate * d_framebits;
}
@@ -215,9 +196,7 @@ namespace gr {
}
}
- /*const char* cc_decoder_impl::get_output_conversion() {
- return "unpack";
- }*/
+
float
cc_decoder_impl::get_shift()
@@ -330,7 +309,8 @@ namespace gr {
int
cc_decoder_impl::find_endstate()
{
- COMPUTETYPE* met = (d_k%2 == 0)? d_vp->new_metrics.t : d_vp->old_metrics.t;
+ COMPUTETYPE* met = ((d_k + d_veclen)%2 == 0)? d_vp->new_metrics.t : d_vp->old_metrics.t;
+
COMPUTETYPE min = met[0];
int state = 0;
for(int i = 1; i < d_numstates; ++i) {
@@ -338,7 +318,10 @@ namespace gr {
min = met[i];
state = i;
}
+
+
}
+ //printf("min %d\n", state);
return state;
}
@@ -348,11 +331,11 @@ namespace gr {
DECISIONTYPE *d;
d = d_vp->decisions;
- //going to have to use nbits for tailbiting?
- //memset(d,0,d_decision_t_size * (d_framebits+d_k-1));//use volk here?
- memset(d,0,d_decision_t_size * nbits);//use volk here?
- //d_kernel( d_vp->new_metrics.t, d_vp->old_metrics.t, syms, d, d_framebits, d_k - 1, Branchtab);
+
+ memset(d,0,d_decision_t_size * nbits);
+
+
d_kernel( d_vp->new_metrics.t, d_vp->old_metrics.t, syms, d, nbits - (d_k - 1), d_k -1, Branchtab);
return 0;
@@ -418,6 +401,9 @@ namespace gr {
d_framebits = framebits;
if(d_tailbiting) {
d_veclen = d_framebits + (6 * (d_k - 1));
+ if(d_veclen * d_rate > d_managed_in_size) {
+ throw std::runtime_error("attempt to resize beyond d_managed_in buffer size!\n");
+ }
}
else if(d_truncated) {
d_veclen = d_framebits;
@@ -446,30 +432,7 @@ namespace gr {
init_viterbi_unbiased(d_vp);
}
- /*
- else if(d_trunc_intrinsic) {
- memcpy(d_managed_in, in, d_framebits * d_rate * sizeof(COMPUTETYPE));
- for(int i = 0; i < (d_k - 1); ++i) {
- int cnt = 0;
- for(int j = 0; j < d_rate; ++j) {
- if(d_polys[j] != 1) {
-
- d_managed_in[(d_framebits * d_rate) + (i * d_rate) + j] =
- in[(d_framebits * d_rate) + (i * d_partial_rate) + cnt++];
- }
- else {
-
- d_managed_in[(d_framebits * d_rate) + (i * d_rate) + j] =
- (((*d_end_state) >> (d_k - 2 - i)) & 1) * ((1 << (sizeof(COMPUTETYPE) * 8)) - 1);
- }
- }
- }
- update_viterbi_blk(d_managed_in, d_veclen);
- d_end_state_chaining = find_endstate();
- chainback_viterbi(&out[0], d_framebits, *d_end_state, d_veclen - d_framebits);
- init_viterbi(d_vp, *d_start_state);
- }
- */
+
else if(d_truncated) {
update_viterbi_blk((COMPUTETYPE*)(&in[0]), d_veclen);
@@ -490,7 +453,7 @@ namespace gr {
else {
update_viterbi_blk((COMPUTETYPE*)(&in[0]), d_veclen);
d_end_state_chaining = find_endstate();
- //printf("es: %d\n", d_end_state_chaining);
+ //printf("es: %d, %d\n", d_end_state_chaining, *d_end_state);
d_start_state_chaining = chainback_viterbi(&out[0], d_framebits, *d_end_state,
d_veclen - d_framebits);
diff --git a/gr-fec/lib/cc_decoder_impl.h b/gr-fec/lib/cc_decoder_impl.h
index 7fe093496e..725a27d10a 100644
--- a/gr-fec/lib/cc_decoder_impl.h
+++ b/gr-fec/lib/cc_decoder_impl.h
@@ -71,6 +71,7 @@ namespace gr {
std::vector<int> d_polys;
struct v* d_vp;
COMPUTETYPE* d_managed_in;
+ unsigned int d_managed_in_size;
int d_numstates;
int d_decision_t_size;
int *d_start_state;
diff --git a/gr-fec/python/fec/capillary_threaded_decoder.py b/gr-fec/python/fec/capillary_threaded_decoder.py
index 67c397996b..fcfa39e659 100644
--- a/gr-fec/python/fec/capillary_threaded_decoder.py
+++ b/gr-fec/python/fec/capillary_threaded_decoder.py
@@ -46,7 +46,7 @@ class capillary_threaded_decoder(gr.hier_block2):
self.interleaves_0 = []
for i in range(int(math.log(len(decoder_list_0), 2))):
for j in range(int(math.pow(2, i))):
- self.interleaves_0.append(fec.interleave(output_size,
+ self.interleaves_0.append(blocks.interleave(output_size,
fec.get_decoder_output_size(decoder_list_0[0])))
rootcount = 0
diff --git a/gr-fec/python/fec/threaded_encoder.py b/gr-fec/python/fec/threaded_encoder.py
index b20a07a2b8..6779b04811 100644
--- a/gr-fec/python/fec/threaded_encoder.py
+++ b/gr-fec/python/fec/threaded_encoder.py
@@ -32,7 +32,7 @@ class threaded_encoder(gr.hier_block2):
self.encoder_list_0 = encoder_list_0
- self.fec_deinterleave_0 = fec.deinterleave(input_size,
+ self.fec_deinterleave_0 = blocks.deinterleave(input_size,
fec.get_encoder_input_size(encoder_list_0[0]))
self.generic_encoders_0 = [];
@@ -40,7 +40,7 @@ class threaded_encoder(gr.hier_block2):
self.generic_encoders_0.append(fec.encoder(encoder_list_0[i],
input_size, output_size))
- self.fec_interleave_0 = fec.interleave(output_size,
+ self.fec_interleave_0 = blocks.interleave(output_size,
fec.get_encoder_output_size(encoder_list_0[0]))
for i in range(len(encoder_list_0)):