Browse Source

diff_add_sync_decim added, number of decoded packets doubledgit status

master
Clemens Richter 9 years ago
parent
commit
828964822b
  1. 3
      grc/CMakeLists.txt
  2. 60
      grc/crfa_diff_add_sync_decim.xml
  3. 3
      include/crfa/CMakeLists.txt
  4. 56
      include/crfa/diff_add_sync_decim.h
  5. 3
      lib/CMakeLists.txt
  6. 141
      lib/diff_add_sync_decim_impl.cc
  7. 54
      lib/diff_add_sync_decim_impl.h
  8. 3
      python/rds_parser_table_qt.py
  9. 3
      swig/crfa_swig.i

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

60
grc/crfa_diff_add_sync_decim.xml

@ -0,0 +1,60 @@
<?xml version="1.0"?>
<block>
<name>diff_add_sync_decim</name>
<key>crfa_diff_add_sync_decim</key>
<category>[crfa]</category>
<import>import crfa</import>
<make>crfa.diff_add_sync_decim($threshold,$max_ratio_below_threshold, $log)</make>
<!-- Make one 'param' node for every Parameter you want settable from the GUI.
Sub-nodes:
* name
* key (makes the value accessible as $keyname, e.g. in the make node)
* type -->
<param>
<name>Log</name>
<key>log</key>
<value>False</value>
<type>bool</type>
<option>
<name>Enable</name>
<key>True</key>
</option>
<option>
<name>Disable</name>
<key>False</key>
</option>
</param>
<param>
<name>Threshold</name>
<key>threshold</key>
<value>0.5</value>
<type>float</type>
</param>
<param>
<name>max_ratio_below_threshold</name>
<key>max_ratio_below_threshold</key>
<value>0.8</value>
<type>float</type>
</param>
<check>0 &lt; $max_ratio_below_threshold &lt; 1</check>
<!-- Make one 'sink' node per input. Sub-nodes:
* name (an identifier for the GUI)
* type
* vlen
* optional (set to 1 for optional inputs) -->
<sink>
<name>in</name>
<type>float</type>
</sink>
<!-- Make one 'source' node per output. Sub-nodes:
* name (an identifier for the GUI)
* type
* vlen
* optional (set to 1 for optional inputs) -->
<source>
<name>out</name>
<type>float</type>
</source>
</block>

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

56
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 <crfa/api.h>
#include <gnuradio/sync_decimator.h>
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<diff_add_sync_decim> 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 */

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

141
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 <gnuradio/io_signature.h>
#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])<threshold){
values_below_threshold++;
}
if(abs(out_noskip)<threshold){
values_below_threshold_noskip++;
}
if(abs(out_skip)<threshold){
values_below_threshold_skip++;
}
}
last_input=in[(noutput_items-1)*DECIM+1];//to use for next iteration of work
//if ((float)values_below_threshold / (float)noutput_items >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:"<<values_below_threshold<<"/"<<noutput_items<<", skip:"<<skip<<", last_input:"<<last_input<<std::endl;
lout<<"out_skip:"<<values_below_threshold_skip<<"/"<<noutput_items;
lout<<", out_noskip:"<<values_below_threshold_noskip<<"/"<<noutput_items;
lout<<", skip:"<<skip <<std::endl;
switch(skip){
case 0:skip=1;break;
case 1:skip=0;break;
default:skip=0;break;
}
}
// if(noutput_items>9){
// if(values_below_threshold_noskip>values_below_threshold_skip){
// skip=1;
// }
// else{
// skip=0;
// }
// }
//lout << "noutput_items:"<< noutput_items <<", threshold:"<<threshold << std::endl;
//lout << "out[0]:"<< out[0] <<", threshold:"<<threshold << std::endl;
// Tell runtime system how many output items we produced.
return noutput_items;
}
} /* namespace crfa */
} /* namespace gr */

54
lib/diff_add_sync_decim_impl.h

@ -0,0 +1,54 @@
/* -*- 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_IMPL_H
#define INCLUDED_CRFA_DIFF_ADD_SYNC_DECIM_IMPL_H
#include <crfa/diff_add_sync_decim.h>
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 */

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

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

Loading…
Cancel
Save