summaryrefslogtreecommitdiff
path: root/gr-digital/lib/ofdm_frame_equalizer_vcvc_impl.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gr-digital/lib/ofdm_frame_equalizer_vcvc_impl.cc')
-rw-r--r--gr-digital/lib/ofdm_frame_equalizer_vcvc_impl.cc44
1 files changed, 36 insertions, 8 deletions
diff --git a/gr-digital/lib/ofdm_frame_equalizer_vcvc_impl.cc b/gr-digital/lib/ofdm_frame_equalizer_vcvc_impl.cc
index e9391658b6..168a04cf75 100644
--- a/gr-digital/lib/ofdm_frame_equalizer_vcvc_impl.cc
+++ b/gr-digital/lib/ofdm_frame_equalizer_vcvc_impl.cc
@@ -30,21 +30,39 @@ namespace gr {
namespace digital {
ofdm_frame_equalizer_vcvc::sptr
- ofdm_frame_equalizer_vcvc::make(digital_ofdm_equalizer_base_sptr equalizer, const std::string &len_tag_key, bool propagate_channel_state)
+ ofdm_frame_equalizer_vcvc::make(
+ digital_ofdm_equalizer_base_sptr equalizer,
+ const std::string &len_tag_key,
+ bool propagate_channel_state,
+ int fixed_frame_len
+ )
{
- return gnuradio::get_initial_sptr (new ofdm_frame_equalizer_vcvc_impl(equalizer, len_tag_key, propagate_channel_state));
+ return gnuradio::get_initial_sptr (
+ new ofdm_frame_equalizer_vcvc_impl(
+ equalizer, len_tag_key, propagate_channel_state, fixed_frame_len
+ )
+ );
}
- ofdm_frame_equalizer_vcvc_impl::ofdm_frame_equalizer_vcvc_impl(digital_ofdm_equalizer_base_sptr equalizer, const std::string &len_tag_key, bool propagate_channel_state)
- : gr_tagged_stream_block("ofdm_frame_equalizer_vcvc",
+ ofdm_frame_equalizer_vcvc_impl::ofdm_frame_equalizer_vcvc_impl(
+ digital_ofdm_equalizer_base_sptr equalizer,
+ const std::string &len_tag_key,
+ bool propagate_channel_state,
+ int fixed_frame_len
+ ) : gr_tagged_stream_block("ofdm_frame_equalizer_vcvc",
gr_make_io_signature(1, 1, sizeof (gr_complex) * equalizer->fft_len()),
gr_make_io_signature(1, 1, sizeof (gr_complex) * equalizer->fft_len()),
len_tag_key),
d_fft_len(equalizer->fft_len()),
d_eq(equalizer),
d_propagate_channel_state(propagate_channel_state),
+ d_fixed_frame_len(len_tag_key.empty() ? fixed_frame_len : 0),
d_channel_state(equalizer->fft_len(), gr_complex(1, 0))
- {}
+ {
+ if (d_fixed_frame_len) {
+ set_output_multiple(d_fixed_frame_len);
+ }
+ }
ofdm_frame_equalizer_vcvc_impl::~ofdm_frame_equalizer_vcvc_impl()
{
@@ -60,6 +78,12 @@ namespace gr {
const gr_complex *in = (const gr_complex *) input_items[0];
gr_complex *out = (gr_complex *) output_items[0];
int carrier_offset = 0;
+ int frame_len = 0;
+ if (d_fixed_frame_len) {
+ frame_len = d_fixed_frame_len;
+ } else {
+ frame_len = ninput_items[0];
+ }
std::vector<gr_tag_t> tags;
get_tags_in_range(tags, 0, nitems_read(0), nitems_read(0)+1);
@@ -70,10 +94,10 @@ namespace gr {
}
}
- memcpy((void *) out, (void *) in, sizeof(gr_complex) * d_fft_len * ninput_items[0]);
+ memcpy((void *) out, (void *) in, sizeof(gr_complex) * d_fft_len * frame_len);
d_eq->reset();
d_eq->set_carrier_offset(carrier_offset);
- d_eq->equalize(out, ninput_items[0], d_channel_state);
+ d_eq->equalize(out, frame_len, d_channel_state);
d_eq->get_channel_state(d_channel_state);
if (d_propagate_channel_state) {
add_item_tag(0, nitems_written(0),
@@ -81,7 +105,11 @@ namespace gr {
pmt::pmt_init_c32vector(d_fft_len, d_channel_state));
}
- return ninput_items[0];
+ if (d_fixed_frame_len) {
+ consume_each(frame_len);
+ }
+
+ return frame_len;
}
} /* namespace digital */