diff options
author | Tom Rondeau <tom@trondeau.com> | 2015-05-08 13:16:22 -0400 |
---|---|---|
committer | Tom Rondeau <tom@trondeau.com> | 2015-12-29 11:29:46 -0500 |
commit | 8e54c0201cb10c974460122cf4db6df13a00caf0 (patch) | |
tree | 076e7e9618c2bc4e93d5fc803ff3de9cbd478833 | |
parent | 994169c4e3bd5d484a5f9b2e32b3709d2226c66e (diff) |
dtv: atsc: adds ControlPort hooks to RS decoder.
Can get info on number of packets observed, number of erroneous
packets, and estimated number of bit errors.
-rw-r--r-- | gr-dtv/include/gnuradio/dtv/atsc_rs_decoder.h | 15 | ||||
-rw-r--r-- | gr-dtv/lib/atsc/atsc_rs_decoder_impl.cc | 92 | ||||
-rw-r--r-- | gr-dtv/lib/atsc/atsc_rs_decoder_impl.h | 13 |
3 files changed, 99 insertions, 21 deletions
diff --git a/gr-dtv/include/gnuradio/dtv/atsc_rs_decoder.h b/gr-dtv/include/gnuradio/dtv/atsc_rs_decoder.h index 92eb263e5d..c2b7d0defa 100644 --- a/gr-dtv/include/gnuradio/dtv/atsc_rs_decoder.h +++ b/gr-dtv/include/gnuradio/dtv/atsc_rs_decoder.h @@ -42,6 +42,21 @@ namespace gr { typedef boost::shared_ptr<atsc_rs_decoder> sptr; /*! + * Returns the number of errors corrected by the decoder. + */ + virtual int num_errors_corrected() const = 0; + + /*! + * Returns the number of bad packets rejected by the decoder. + */ + virtual int num_bad_packets() const = 0; + + /*! + * Returns the total number of packets seen by the decoder. + */ + virtual int num_packets() const = 0; + + /*! * \brief Make a new instance of gr::dtv::atsc_rs_decoder. */ static sptr make(); diff --git a/gr-dtv/lib/atsc/atsc_rs_decoder_impl.cc b/gr-dtv/lib/atsc/atsc_rs_decoder_impl.cc index 7a950e716e..7a8b4a8f5b 100644 --- a/gr-dtv/lib/atsc/atsc_rs_decoder_impl.cc +++ b/gr-dtv/lib/atsc/atsc_rs_decoder_impl.cc @@ -56,9 +56,9 @@ namespace gr { { d_rs = init_rs_char(rs_init_symsize, rs_init_gfpoly, rs_init_fcr, rs_init_prim, rs_init_nroots); assert (d_rs != 0); - nerrors_corrrected_count = 0; - bad_packet_count = 0; - total_packets = 0; + d_nerrors_corrrected_count = 0; + d_bad_packet_count = 0; + d_total_packets = 0; } int atsc_rs_decoder_impl::decode (atsc_mpeg_packet_no_sync &out, const atsc_mpeg_packet_rs_encoded &in) @@ -89,6 +89,24 @@ namespace gr { } int + atsc_rs_decoder_impl::num_errors_corrected() const + { + return d_nerrors_corrrected_count; + } + + int + atsc_rs_decoder_impl::num_bad_packets() const + { + return d_bad_packet_count; + } + + int + atsc_rs_decoder_impl::num_packets() const + { + return d_total_packets; + } + + int atsc_rs_decoder_impl::work(int noutput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items) @@ -102,24 +120,25 @@ namespace gr { int nerrors_corrrected = decode(out[i], in[i]); out[i].pli.set_transport_error(nerrors_corrrected == -1); - if (nerrors_corrrected == -1) - bad_packet_count++; - else - nerrors_corrrected_count += nerrors_corrrected; + if (nerrors_corrrected == -1) { + d_bad_packet_count++; + d_nerrors_corrrected_count += 10; // lower bound estimate; most this RS can fix + } + else { + d_nerrors_corrrected_count += nerrors_corrrected; + } - total_packets++; + d_total_packets++; #if 0 - if (total_packets > 1000) { + if (d_total_packets > 1000) { // FIXME: convert to logger - std::cout << "Error rate: " - << (float)nerrors_corrrected_count/total_packets - << "\tPacket error rate: " - << (float)bad_packet_count/total_packets - << std::endl; - - nerrors_corrrected_count = 0; - bad_packet_count = 0; - total_packets = 0; + GR_LOG_DEBUG(d_logger, boost::format("Error rate: %1%\tPacket error rate: %2%") \ + % ((float)d_nerrors_corrrected_count/(ATSC_MPEG_DATA_LENGTH*d_total_packets)) + % ((float)d_bad_packet_count/d_total_packets)); + + //d_nerrors_corrrected_count = 0; + //d_bad_packet_count = 0; + //d_total_packets = 0; } #endif } @@ -127,5 +146,42 @@ namespace gr { return noutput_items; } + + void + atsc_rs_decoder_impl::setup_rpc() + { +#ifdef GR_CTRLPORT + add_rpc_variable( + rpcbasic_sptr(new rpcbasic_register_get<atsc_rs_decoder, int >( + alias(), "num_errors_corrected", + &atsc_rs_decoder::num_errors_corrected, + pmt::from_long(0), + pmt::from_long(10000000), + pmt::from_long(0), + "", "Number of errors corrected", RPC_PRIVLVL_MIN, + DISPTIME))); + + add_rpc_variable( + rpcbasic_sptr(new rpcbasic_register_get<atsc_rs_decoder, int >( + alias(), "num_bad_packets", + &atsc_rs_decoder::num_bad_packets, + pmt::from_long(0), + pmt::from_long(10000000), + pmt::from_long(0), + "", "Number of bad packets", RPC_PRIVLVL_MIN, + DISPTIME))); + + add_rpc_variable( + rpcbasic_sptr(new rpcbasic_register_get<atsc_rs_decoder, int >( + alias(), "num_packets", + &atsc_rs_decoder::num_packets, + pmt::from_long(0), + pmt::from_long(10000000), + pmt::from_long(0), + "", "Number of packets", RPC_PRIVLVL_MIN, + DISPTIME))); +#endif /* GR_CTRLPORT */ + } + } /* namespace dtv */ } /* namespace gr */ diff --git a/gr-dtv/lib/atsc/atsc_rs_decoder_impl.h b/gr-dtv/lib/atsc/atsc_rs_decoder_impl.h index 57460128dc..adbc4879a9 100644 --- a/gr-dtv/lib/atsc/atsc_rs_decoder_impl.h +++ b/gr-dtv/lib/atsc/atsc_rs_decoder_impl.h @@ -36,15 +36,22 @@ namespace gr { class atsc_rs_decoder_impl : public atsc_rs_decoder { private: - int nerrors_corrrected_count; - int bad_packet_count; - int total_packets; + int d_nerrors_corrrected_count; + int d_bad_packet_count; + int d_total_packets; + int d_total_bits; void *d_rs; public: atsc_rs_decoder_impl(); ~atsc_rs_decoder_impl(); + void setup_rpc(); + + int num_errors_corrected() const; + int num_bad_packets() const; + int num_packets() const; + /*! * Decode RS encoded packet. * \returns a count of corrected symbols, or -1 if the block was uncorrectible. |