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);