Added hierarchical block for DroneID detection

gr-droneid-rewrite
David Protzman 2022-10-14 23:41:07 -04:00
rodzic 5c11419e2a
commit f4e03c5816
12 zmienionych plików z 320 dodań i 3 usunięć

Wyświetl plik

@ -7,5 +7,6 @@
#
install(FILES
dji_droneid_burst_extractor.block.yml DESTINATION share/gnuradio/grc/blocks
dji_droneid_burst_extractor.block.yml
dji_droneid_detector.block.yml DESTINATION share/gnuradio/grc/blocks
)

Wyświetl plik

@ -0,0 +1,43 @@
id: dji_droneid_detector
label: DJI DroneID Detector
category: '[dji_droneid]'
templates:
imports: from gnuradio import dji_droneid
make: dji_droneid.detector(${sample_rate})
# Make one 'parameters' list entry for every parameter you want settable from the GUI.
# Keys include:
# * id (makes the value accessible as keyname, e.g. in the make entry)
# * label (label shown in the GUI)
# * dtype (e.g. int, float, complex, byte, short, xxx_vector, ...)
# * default
parameters:
- id: sample_rate
label: Sample Rate (Hz)
dtype: float
# Make one 'inputs' list entry per input and one 'outputs' list entry per output.
# Keys include:
# * label (an identifier for the GUI)
# * domain (optional - stream or message. Default is stream)
# * dtype (e.g. int, float, complex, byte, short, xxx_vector, ...)
# * vlen (optional - data stream vector length. Default is 1)
# * optional (optional - set to 1 for optional inputs. Default is 0)
inputs:
- label: in
domain: stream
dtype: complex
vlen: 1
optional: 0
outputs:
- label: out
domain: stream
dtype: float
vlen: 1
optional: 0
# 'file_format' specifies the version of the GRC yml format used in the file
# and should usually not be changed.
file_format: 1

Wyświetl plik

@ -12,5 +12,6 @@
install(FILES
api.h
utils.h
burst_extractor.h DESTINATION include/gnuradio/dji_droneid
burst_extractor.h
detector.h DESTINATION include/gnuradio/dji_droneid
)

Wyświetl plik

@ -0,0 +1,41 @@
/* -*- c++ -*- */
/*
* Copyright 2022 gr-dji_droneid author.
*
* SPDX-License-Identifier: GPL-3.0-or-later
*/
#ifndef INCLUDED_DJI_DRONEID_DETECTOR_H
#define INCLUDED_DJI_DRONEID_DETECTOR_H
#include <gnuradio/dji_droneid/api.h>
#include <gnuradio/hier_block2.h>
namespace gr {
namespace dji_droneid {
/*!
* \brief <+description of block+>
* \ingroup dji_droneid
*
*/
class DJI_DRONEID_API detector : virtual public gr::hier_block2
{
public:
typedef std::shared_ptr<detector> sptr;
/*!
* \brief Return a shared_ptr to a new instance of dji_droneid::detector.
*
* To avoid accidental use of raw pointers, dji_droneid::detector's
* constructor is in a private implementation
* class. dji_droneid::detector::make is the public interface for
* creating new instances.
*/
static sptr make(float sample_rate);
};
} // namespace dji_droneid
} // namespace gr
#endif /* INCLUDED_DJI_DRONEID_DETECTOR_H */

Wyświetl plik

@ -14,6 +14,7 @@ include(GrPlatform) #define LIB_SUFFIX
list(APPEND dji_droneid_sources
utils.cc
burst_extractor_impl.cc
detector_impl.cc
)
set(dji_droneid_sources "${dji_droneid_sources}" PARENT_SCOPE)

Wyświetl plik

@ -0,0 +1,71 @@
/* -*- c++ -*- */
/*
* Copyright 2022 gr-dji_droneid author.
*
* SPDX-License-Identifier: GPL-3.0-or-later
*/
#include "detector_impl.h"
#include <gnuradio/io_signature.h>
#include <gnuradio/dji_droneid/utils.h>
namespace gr {
namespace dji_droneid {
detector::sptr detector::make(float sample_rate)
{
return gnuradio::make_block_sptr<detector_impl>(sample_rate);
}
/*
* The private constructor
*/
detector_impl::detector_impl(const float sample_rate)
: gr::hier_block2("detector",
gr::io_signature::make(
1 /* min inputs */, 1 /* max inputs */, sizeof(gr_complex)),
gr::io_signature::make(
1 /* min outputs */, 1 /*max outputs */, sizeof(float)))
{
const auto fft_size = utils::get_fft_size(sample_rate);
const auto zc = utils::create_zc(fft_size, 4);
const auto zc_variance = utils::variance_vector(zc);
corr_filter_ = gr::filter::fft_filter_ccc::make(1, utils::conj_vector(zc));
c2mag_sq_ = gr::blocks::complex_to_mag_squared::make();
moving_avg_ = gr::blocks::moving_average_ff::make(static_cast<int32_t>(fft_size), 1.0f / static_cast<float>(fft_size - 1));
mult_const_ff_ = gr::blocks::multiply_const_ff::make(zc_variance);
transcendental_ = gr::blocks::transcendental::make("sqrt");
float_to_complex_ = gr::blocks::float_to_complex::make();
const_source_ = gr::analog::sig_source_f::make(0, gr::analog::GR_CONST_WAVE, 0, 0, 0);
mult_const_cc_ = gr::blocks::multiply_const_cc::make({1.0f / static_cast<float>(fft_size), 0});
divide_ = gr::blocks::divide_cc::make();
c2mag_ = gr::blocks::complex_to_mag::make();
connect(self(), 0, corr_filter_, 0);
connect(self(), 0, c2mag_sq_, 0);
connect(corr_filter_, 0, mult_const_cc_, 0);
connect(c2mag_sq_, 0, moving_avg_, 0);
connect(moving_avg_, 0, mult_const_ff_, 0);
connect(mult_const_ff_, 0, transcendental_, 0);
connect(transcendental_, 0, float_to_complex_, 0);
connect(const_source_, 0, float_to_complex_, 1);
connect(mult_const_cc_, 0, divide_, 0);
connect(float_to_complex_, 0, divide_, 1);
connect(divide_, 0, c2mag_, 0);
connect(c2mag_, 0, self(), 0);
}
/*
* Our virtual destructor.
*/
detector_impl::~detector_impl() {}
} /* namespace dji_droneid */
} /* namespace gr */

Wyświetl plik

@ -0,0 +1,50 @@
/* -*- c++ -*- */
/*
* Copyright 2022 gr-dji_droneid author.
*
* SPDX-License-Identifier: GPL-3.0-or-later
*/
#ifndef INCLUDED_DJI_DRONEID_DETECTOR_IMPL_H
#define INCLUDED_DJI_DRONEID_DETECTOR_IMPL_H
#include <gnuradio/dji_droneid/detector.h>
#include <gnuradio/blocks/complex_to_mag_squared.h>
#include <gnuradio/blocks/moving_average.h>
#include <gnuradio/blocks/multiply_const.h>
#include <gnuradio/blocks/transcendental.h>
#include <gnuradio/blocks/float_to_complex.h>
#include <gnuradio/analog/sig_source.h>
#include <gnuradio/blocks/divide.h>
#include <gnuradio/blocks/complex_to_mag.h>
#include <gnuradio/filter/fft_filter_ccc.h>
namespace gr {
namespace dji_droneid {
class detector_impl : public detector
{
private:
gr::blocks::complex_to_mag_squared::sptr c2mag_sq_;
gr::blocks::moving_average_ff::sptr moving_avg_;
gr::blocks::multiply_const_ff::sptr mult_const_ff_;
gr::blocks::transcendental::sptr transcendental_;
gr::blocks::float_to_complex::sptr float_to_complex_;
gr::analog::sig_source_f::sptr const_source_;
gr::blocks::divide_cc::sptr divide_;
gr::blocks::complex_to_mag::sptr c2mag_;
gr::blocks::multiply_const_cc::sptr mult_const_cc_;
gr::filter::fft_filter_ccc::sptr corr_filter_;
public:
detector_impl(float sample_rate);
~detector_impl();
// Where all the action really happens
};
} // namespace dji_droneid
} // namespace gr
#endif /* INCLUDED_DJI_DRONEID_DETECTOR_IMPL_H */

Wyświetl plik

@ -0,0 +1,21 @@
/* -*- c++ -*- */
/*
* Copyright 2022 gr-dji_droneid author.
*
* SPDX-License-Identifier: GPL-3.0-or-later
*/
#include <gnuradio/attributes.h>
#include <gnuradio/dji_droneid/detector.h>
#include <boost/test/unit_test.hpp>
namespace gr {
namespace dji_droneid {
BOOST_AUTO_TEST_CASE(test_detector_replace_with_specific_test_name)
{
// Put test here
}
} /* namespace dji_droneid */
} /* namespace gr */

Wyświetl plik

@ -31,7 +31,7 @@ include(GrPybind)
list(APPEND dji_droneid_python_files
utils_python.cc
burst_extractor_python.cc
python_bindings.cc)
detector_python.cc python_bindings.cc)
GR_PYBIND_MAKE_OOT(dji_droneid
../../..

Wyświetl plik

@ -0,0 +1,59 @@
/*
* Copyright 2022 Free Software Foundation, Inc.
*
* This file is part of GNU Radio
*
* SPDX-License-Identifier: GPL-3.0-or-later
*
*/
/***********************************************************************************/
/* This file is automatically generated using bindtool and can be manually edited */
/* The following lines can be configured to regenerate this file during cmake */
/* If manual edits are made, the following tags should be modified accordingly. */
/* BINDTOOL_GEN_AUTOMATIC(0) */
/* BINDTOOL_USE_PYGCCXML(0) */
/* BINDTOOL_HEADER_FILE(detector.h) */
/* BINDTOOL_HEADER_FILE_HASH(17867f37e707405fecba12ebe8de8db3) */
/***********************************************************************************/
#include <pybind11/complex.h>
#include <pybind11/pybind11.h>
#include <pybind11/stl.h>
namespace py = pybind11;
#include <gnuradio/dji_droneid/detector.h>
// pydoc.h is automatically generated in the build directory
#include <detector_pydoc.h>
void bind_detector(py::module& m)
{
using detector = gr::dji_droneid::detector;
py::class_<detector, gr::hier_block2,
std::shared_ptr<detector>>(m, "detector", D(detector))
.def(py::init(&detector::make),
D(detector,make)
)
;
}

Wyświetl plik

@ -0,0 +1,27 @@
/*
* Copyright 2022 Free Software Foundation, Inc.
*
* This file is part of GNU Radio
*
* SPDX-License-Identifier: GPL-3.0-or-later
*
*/
#include "pydoc_macros.h"
#define D(...) DOC(gr, dji_droneid, __VA_ARGS__)
/*
This file contains placeholders for docstrings for the Python bindings.
Do not edit! These were automatically extracted during the binding process
and will be overwritten during the build process
*/
static const char *__doc_gr_dji_droneid_detector = R"doc()doc";
static const char *__doc_gr_dji_droneid_detector_detector = R"doc()doc";
static const char *__doc_gr_dji_droneid_detector_make = R"doc()doc";

Wyświetl plik

@ -23,6 +23,7 @@ namespace py = pybind11;
// BINDING_FUNCTION_PROTOTYPES(
void bind_utils(py::module& m);
void bind_burst_extractor(py::module& m);
void bind_detector(py::module& m);
// ) END BINDING_FUNCTION_PROTOTYPES
@ -53,5 +54,6 @@ PYBIND11_MODULE(dji_droneid_python, m)
// BINDING_FUNCTION_CALLS(
bind_utils(m);
bind_burst_extractor(m);
bind_detector(m);
// ) END BINDING_FUNCTION_CALLS
}