From 828964822b62f61efc38a7afa127ce7e9dbe769a Mon Sep 17 00:00:00 2001 From: csrichter Date: Thu, 9 Mar 2017 18:32:12 +0100 Subject: [PATCH] diff_add_sync_decim added, number of decoded packets doubledgit status --- grc/CMakeLists.txt | 3 +- grc/crfa_diff_add_sync_decim.xml | 60 ++++++++++++ include/crfa/CMakeLists.txt | 3 +- include/crfa/diff_add_sync_decim.h | 56 ++++++++++++ lib/CMakeLists.txt | 3 +- lib/diff_add_sync_decim_impl.cc | 141 +++++++++++++++++++++++++++++ lib/diff_add_sync_decim_impl.h | 54 +++++++++++ python/rds_parser_table_qt.py | 3 +- swig/crfa_swig.i | 3 + 9 files changed, 322 insertions(+), 4 deletions(-) create mode 100644 grc/crfa_diff_add_sync_decim.xml create mode 100644 include/crfa/diff_add_sync_decim.h create mode 100644 lib/diff_add_sync_decim_impl.cc create mode 100644 lib/diff_add_sync_decim_impl.h diff --git a/grc/CMakeLists.txt b/grc/CMakeLists.txt index 203134f..976dd6b 100644 --- a/grc/CMakeLists.txt +++ b/grc/CMakeLists.txt @@ -26,5 +26,6 @@ install(FILES crfa_smooth_vectors.xml crfa_stream_selector.xml crfa_vector_cutter.xml - crfa_decoder_compare.xml DESTINATION share/gnuradio/grc/blocks + crfa_decoder_compare.xml + crfa_diff_add_sync_decim.xml DESTINATION share/gnuradio/grc/blocks ) diff --git a/grc/crfa_diff_add_sync_decim.xml b/grc/crfa_diff_add_sync_decim.xml new file mode 100644 index 0000000..dc61390 --- /dev/null +++ b/grc/crfa_diff_add_sync_decim.xml @@ -0,0 +1,60 @@ + + + diff_add_sync_decim + crfa_diff_add_sync_decim + [crfa] + import crfa + crfa.diff_add_sync_decim($threshold,$max_ratio_below_threshold, $log) + + + Log + log + False + bool + + + + + Threshold + threshold + 0.5 + float + + + max_ratio_below_threshold + max_ratio_below_threshold + 0.8 + float + + 0 < $max_ratio_below_threshold < 1 + + + + in + float + + + + + out + float + + diff --git a/include/crfa/CMakeLists.txt b/include/crfa/CMakeLists.txt index 5743aa6..718cea8 100644 --- a/include/crfa/CMakeLists.txt +++ b/include/crfa/CMakeLists.txt @@ -22,5 +22,6 @@ ######################################################################## install(FILES api.h - rds_decoder.h DESTINATION include/crfa + rds_decoder.h + diff_add_sync_decim.h DESTINATION include/crfa ) diff --git a/include/crfa/diff_add_sync_decim.h b/include/crfa/diff_add_sync_decim.h new file mode 100644 index 0000000..a3bb88b --- /dev/null +++ b/include/crfa/diff_add_sync_decim.h @@ -0,0 +1,56 @@ +/* -*- c++ -*- */ +/* + * Copyright 2017 <+YOU OR YOUR COMPANY+>. + * + * This is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3, or (at your option) + * any later version. + * + * This software is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this software; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + + +#ifndef INCLUDED_CRFA_DIFF_ADD_SYNC_DECIM_H +#define INCLUDED_CRFA_DIFF_ADD_SYNC_DECIM_H + +#include +#include + +namespace gr { + namespace crfa { + + /*! + * \brief <+description of block+> + * \ingroup crfa + * + */ + class CRFA_API diff_add_sync_decim : virtual public gr::sync_decimator + { + public: + typedef boost::shared_ptr sptr; + + /*! + * \brief Return a shared_ptr to a new instance of crfa::diff_add_sync_decim. + * + * To avoid accidental use of raw pointers, crfa::diff_add_sync_decim's + * constructor is in a private implementation + * class. crfa::diff_add_sync_decim::make is the public interface for + * creating new instances. + */ + static sptr make(float threshold,float max_ratio_below_threshold,bool log); + }; + + } // namespace crfa +} // namespace gr + +#endif /* INCLUDED_CRFA_DIFF_ADD_SYNC_DECIM_H */ + diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt index 385b6c2..929fa93 100644 --- a/lib/CMakeLists.txt +++ b/lib/CMakeLists.txt @@ -25,7 +25,8 @@ include(GrPlatform) #define LIB_SUFFIX include_directories(${Boost_INCLUDE_DIR}) link_directories(${Boost_LIBRARY_DIRS}) list(APPEND crfa_sources - rds_decoder_impl.cc ) + rds_decoder_impl.cc + diff_add_sync_decim_impl.cc ) set(crfa_sources "${crfa_sources}" PARENT_SCOPE) if(NOT crfa_sources) diff --git a/lib/diff_add_sync_decim_impl.cc b/lib/diff_add_sync_decim_impl.cc new file mode 100644 index 0000000..0d5de6e --- /dev/null +++ b/lib/diff_add_sync_decim_impl.cc @@ -0,0 +1,141 @@ +/* -*- c++ -*- */ +/* + * Copyright 2017 <+YOU OR YOUR COMPANY+>. + * + * This is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3, or (at your option) + * any later version. + * + * This software is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this software; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include "diff_add_sync_decim_impl.h" +#define DECIM 2 +#define lout log && std::cout + +namespace gr { + namespace crfa { + + diff_add_sync_decim::sptr + diff_add_sync_decim::make(float threshold,float max_ratio_below_threshold,bool log) + { + return gnuradio::get_initial_sptr + (new diff_add_sync_decim_impl(threshold,max_ratio_below_threshold,log)); + } + + /* + * The private constructor + */ + diff_add_sync_decim_impl::diff_add_sync_decim_impl(float threshold,float max_ratio_below_threshold,bool log) + : gr::sync_decimator("diff_add_sync_decim", + gr::io_signature::make(1, 1, sizeof(float)), + gr::io_signature::make(1, 1, sizeof(float)), DECIM), + threshold(threshold), + max_ratio_below_threshold(max_ratio_below_threshold), + log(log) + + { + //nothing to do? + + //init persistant vars + last_input=0; + skip=0; + } + + /* + * Our virtual destructor. + */ + diff_add_sync_decim_impl::~diff_add_sync_decim_impl() + { + } + + int + diff_add_sync_decim_impl::work(int noutput_items, + gr_vector_const_void_star &input_items, + gr_vector_void_star &output_items) + { + const float *in = (const float *) input_items[0]; + float *out = (float *) output_items[0]; + int values_below_threshold=0; + int values_below_threshold_skip=0; + int values_below_threshold_noskip=0; + float out_noskip; + float out_skip; + for (int i = 0; i < noutput_items; i++) { + //out[i]=in[DECIM*i];// keep 1 in DECIM + if(i==0){ + out_skip=last_input-in[DECIM*i];} + else{ + out_skip=in[DECIM*i-1]-in[DECIM*i];} + + out_noskip=in[DECIM*i]-in[DECIM*i+1]; + + switch(skip){ + case 0: + out[i]=out_noskip; + break; + case 1: + out[i]=out_skip; + break; + default: + out[i]=out_noskip; + break; + } + + if(abs(out[i])0.5) + if ((float)values_below_threshold / (float)noutput_items >max_ratio_below_threshold && values_below_threshold>8)//2/2(=100%) below threshold is not significant + { + //lout<<"resync:"<9){ +// if(values_below_threshold_noskip>values_below_threshold_skip){ +// skip=1; +// } +// else{ +// skip=0; +// } +// } + //lout << "noutput_items:"<< noutput_items <<", threshold:"<. + * + * This is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3, or (at your option) + * any later version. + * + * This software is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this software; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#ifndef INCLUDED_CRFA_DIFF_ADD_SYNC_DECIM_IMPL_H +#define INCLUDED_CRFA_DIFF_ADD_SYNC_DECIM_IMPL_H + +#include + +namespace gr { + namespace crfa { + + class diff_add_sync_decim_impl : public diff_add_sync_decim + { + private: + // Nothing to declare in this block. + + public: + diff_add_sync_decim_impl(float threshold,float max_ratio_below_threshold,bool log); + ~diff_add_sync_decim_impl(); + + // Where all the action really happens + int work(int noutput_items, + gr_vector_const_void_star &input_items, + gr_vector_void_star &output_items); + bool log; + float threshold; + float max_ratio_below_threshold; + float last_input; + //enum { SKIP, NOSKIP } d_state; + unsigned int skip; + }; + + } // namespace crfa +} // namespace gr + +#endif /* INCLUDED_CRFA_DIFF_ADD_SYNC_DECIM_IMPL_H */ + diff --git a/python/rds_parser_table_qt.py b/python/rds_parser_table_qt.py index b0ab0ec..4f0b7a7 100644 --- a/python/rds_parser_table_qt.py +++ b/python/rds_parser_table_qt.py @@ -1223,7 +1223,7 @@ class rds_parser_table_qt(gr.sync_block):#START textcolor=""#use default color (white if background is black) l=list(self.RDS_data[PI]["RT_"+str(ab_flag)]["RT"]) rt="".join(l[0:text_end])#remove underscores(default symbol) after line end marker - if not self.RDS_data[PI]["internals"]["last_valid_rt"]==rt:#ignore duplicates + if not self.RDS_data[PI]["internals"]["last_valid_rt"]==rt:#ignore duplicates #TODO add 2nd order duplicates ABAB self.RDS_data[PI]["internals"]["RT_history"].append(l) if len(self.RDS_data[PI]["internals"]["RT_history"])>10:#only store last 10 RTs self.RDS_data[PI]["internals"]["RT_history"].pop(0) @@ -1678,6 +1678,7 @@ class rds_parser_table_qt(gr.sync_block):#START return_string+=alphabet[alnr][index] except KeyError: return_string+="?%02X?"%ord(char) + print("symbol not decoded: "+"?%02X?"%ord(char)+"in string:"+return_string) #charlist[i]='?'#symbol not decoded #TODO pass #return "".join(charlist) diff --git a/swig/crfa_swig.i b/swig/crfa_swig.i index 273d991..f9e337f 100644 --- a/swig/crfa_swig.i +++ b/swig/crfa_swig.i @@ -9,7 +9,10 @@ %{ #include "crfa/rds_decoder.h" +#include "crfa/diff_add_sync_decim.h" %} %include "crfa/rds_decoder.h" GR_SWIG_BLOCK_MAGIC2(crfa, rds_decoder); +%include "crfa/diff_add_sync_decim.h" +GR_SWIG_BLOCK_MAGIC2(crfa, diff_add_sync_decim);