diff options
21 files changed, 804 insertions, 41 deletions
diff --git a/gr-digital/python/digital/bindings/CMakeLists.txt b/gr-digital/python/digital/bindings/CMakeLists.txt index 1afdaecb66..51c0493c02 100644 --- a/gr-digital/python/digital/bindings/CMakeLists.txt +++ b/gr-digital/python/digital/bindings/CMakeLists.txt @@ -5,6 +5,10 @@ include(GrPybind) ######################################################################## list(APPEND digital_python_files + adaptive_algorithm_python.cc + adaptive_algorithm_cma_python.cc + adaptive_algorithm_lms_python.cc + adaptive_algorithm_nlms_python.cc additive_scrambler_bb_python.cc binary_slicer_fb_python.cc burst_shaper_python.cc @@ -27,6 +31,7 @@ list(APPEND digital_python_files crc32_python.cc crc32_async_bb_python.cc crc32_bb_python.cc + decision_feedback_equalizer_python.cc descrambler_bb_python.cc diff_decoder_bb_python.cc diff_encoder_bb_python.cc @@ -48,10 +53,12 @@ list(APPEND digital_python_files interpolating_resampler_type_python.cc kurtotic_equalizer_cc_python.cc lfsr_python.cc + linear_equalizer_python.cc lms_dd_equalizer_cc_python.cc map_bb_python.cc + meas_evm_cc_python.cc metric_type_python.cc - # modulate_vector_python.cc + modulate_vector_python.cc mpsk_snr_est_python.cc mpsk_snr_est_cc_python.cc msk_timing_recovery_cc_python.cc diff --git a/gr-digital/python/digital/bindings/adaptive_algorithm_cma_python.cc b/gr-digital/python/digital/bindings/adaptive_algorithm_cma_python.cc new file mode 100644 index 0000000000..11f0563476 --- /dev/null +++ b/gr-digital/python/digital/bindings/adaptive_algorithm_cma_python.cc @@ -0,0 +1,79 @@ +/* + * Copyright 2020 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 */ + +#include <pybind11/complex.h> +#include <pybind11/pybind11.h> +#include <pybind11/stl.h> + +namespace py = pybind11; + +#include <gnuradio/digital/adaptive_algorithm_cma.h> +// pydoc.h is automatically generated in the build directory +#include <adaptive_algorithm_cma_pydoc.h> + +void bind_adaptive_algorithm_cma(py::module& m) +{ + + using adaptive_algorithm_cma = ::gr::digital::adaptive_algorithm_cma; + + + py::class_<adaptive_algorithm_cma, + gr::digital::adaptive_algorithm, + std::shared_ptr<adaptive_algorithm_cma>>( + m, "adaptive_algorithm_cma", D(adaptive_algorithm_cma)) + + .def(py::init(&adaptive_algorithm_cma::make), + py::arg("cons"), + py::arg("step_size"), + py::arg("modulus"), + D(adaptive_algorithm_cma, make)) + + + .def("error", + &adaptive_algorithm_cma::error, + py::arg("out"), + D(adaptive_algorithm_cma, error)) + + + .def("error_dd", + &adaptive_algorithm_cma::error_dd, + py::arg("u_n"), + py::arg("decision"), + D(adaptive_algorithm_cma, error_dd)) + + + .def("error_tr", + &adaptive_algorithm_cma::error_tr, + py::arg("u_n"), + py::arg("d_n"), + D(adaptive_algorithm_cma, error_tr)) + + + .def("update_taps", + &adaptive_algorithm_cma::update_taps, + py::arg("taps"), + py::arg("in"), + py::arg("error"), + py::arg("decision"), + py::arg("num_taps"), + D(adaptive_algorithm_cma, update_taps)) + + + .def("update_tap", + &adaptive_algorithm_cma::update_tap, + py::arg("tap"), + py::arg("u_n"), + py::arg("err"), + py::arg("decision"), + D(adaptive_algorithm_cma, update_tap)) + + ; +} diff --git a/gr-digital/python/digital/bindings/adaptive_algorithm_lms_python.cc b/gr-digital/python/digital/bindings/adaptive_algorithm_lms_python.cc new file mode 100644 index 0000000000..b4ba3cbf0b --- /dev/null +++ b/gr-digital/python/digital/bindings/adaptive_algorithm_lms_python.cc @@ -0,0 +1,64 @@ +/* + * Copyright 2020 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 */ + +#include <pybind11/complex.h> +#include <pybind11/pybind11.h> +#include <pybind11/stl.h> + +namespace py = pybind11; + +#include <gnuradio/digital/adaptive_algorithm_lms.h> +// pydoc.h is automatically generated in the build directory +#include <adaptive_algorithm_lms_pydoc.h> + +void bind_adaptive_algorithm_lms(py::module& m) +{ + + using adaptive_algorithm_lms = ::gr::digital::adaptive_algorithm_lms; + + + py::class_<adaptive_algorithm_lms, + gr::digital::adaptive_algorithm, + std::shared_ptr<adaptive_algorithm_lms>>( + m, "adaptive_algorithm_lms", D(adaptive_algorithm_lms)) + + .def(py::init(&adaptive_algorithm_lms::make), + py::arg("cons"), + py::arg("step_size"), + D(adaptive_algorithm_lms, make)) + + + .def("update_taps", + &adaptive_algorithm_lms::update_taps, + py::arg("taps"), + py::arg("in"), + py::arg("error"), + py::arg("decision"), + py::arg("num_taps"), + D(adaptive_algorithm_lms, update_taps)) + + + .def("update_tap", + &adaptive_algorithm_lms::update_tap, + py::arg("tap"), + py::arg("u_n"), + py::arg("err"), + py::arg("decision"), + D(adaptive_algorithm_lms, update_tap)) + + + .def("initialize_taps", + &adaptive_algorithm_lms::initialize_taps, + py::arg("taps"), + D(adaptive_algorithm_lms, initialize_taps)) + + ; +} diff --git a/gr-digital/python/digital/bindings/adaptive_algorithm_nlms_python.cc b/gr-digital/python/digital/bindings/adaptive_algorithm_nlms_python.cc new file mode 100644 index 0000000000..1127b622fc --- /dev/null +++ b/gr-digital/python/digital/bindings/adaptive_algorithm_nlms_python.cc @@ -0,0 +1,64 @@ +/* + * Copyright 2020 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 */ + +#include <pybind11/complex.h> +#include <pybind11/pybind11.h> +#include <pybind11/stl.h> + +namespace py = pybind11; + +#include <gnuradio/digital/adaptive_algorithm_nlms.h> +// pydoc.h is automatically generated in the build directory +#include <adaptive_algorithm_nlms_pydoc.h> + +void bind_adaptive_algorithm_nlms(py::module& m) +{ + + using adaptive_algorithm_nlms = ::gr::digital::adaptive_algorithm_nlms; + + + py::class_<adaptive_algorithm_nlms, + gr::digital::adaptive_algorithm, + std::shared_ptr<adaptive_algorithm_nlms>>( + m, "adaptive_algorithm_nlms", D(adaptive_algorithm_nlms)) + + .def(py::init(&adaptive_algorithm_nlms::make), + py::arg("cons"), + py::arg("step_size"), + D(adaptive_algorithm_nlms, make)) + + + .def("update_tap", + &adaptive_algorithm_nlms::update_tap, + py::arg("tap"), + py::arg("in"), + py::arg("error"), + py::arg("decision"), + D(adaptive_algorithm_nlms, update_tap)) + + + .def("update_taps", + &adaptive_algorithm_nlms::update_taps, + py::arg("taps"), + py::arg("in"), + py::arg("error"), + py::arg("decision"), + py::arg("num_taps"), + D(adaptive_algorithm_nlms, update_taps)) + + + .def("initialize_taps", + &adaptive_algorithm_nlms::initialize_taps, + py::arg("taps"), + D(adaptive_algorithm_nlms, initialize_taps)) + + ; +} diff --git a/gr-digital/python/digital/bindings/adaptive_algorithm_python.cc b/gr-digital/python/digital/bindings/adaptive_algorithm_python.cc new file mode 100644 index 0000000000..e27279c41f --- /dev/null +++ b/gr-digital/python/digital/bindings/adaptive_algorithm_python.cc @@ -0,0 +1,80 @@ +/* + * Copyright 2020 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 */ + +#include <pybind11/complex.h> +#include <pybind11/pybind11.h> +#include <pybind11/stl.h> + +namespace py = pybind11; + +#include <gnuradio/digital/adaptive_algorithm.h> +// pydoc.h is automatically generated in the build directory +#include <adaptive_algorithm_pydoc.h> + +void bind_adaptive_algorithm(py::module& m) +{ + + using adaptive_algorithm = ::gr::digital::adaptive_algorithm; + + + py::class_<adaptive_algorithm, + std::shared_ptr<adaptive_algorithm>>( + m, "adaptive_algorithm", D(adaptive_algorithm)) + + .def("base", &adaptive_algorithm::base, D(adaptive_algorithm, base)) + + + .def("initialize_taps", + &adaptive_algorithm::initialize_taps, + py::arg("taps"), + D(adaptive_algorithm, initialize_taps)) + + + .def("error_dd", + &adaptive_algorithm::error_dd, + py::arg("wu"), + py::arg("decision"), + D(adaptive_algorithm, error_dd)) + + + .def("error_tr", + &adaptive_algorithm::error_tr, + py::arg("wu"), + py::arg("d_n"), + D(adaptive_algorithm, error_tr)) + + + .def("update_tap", + &adaptive_algorithm::update_tap, + py::arg("tap"), + py::arg("in"), + py::arg("error"), + py::arg("decision"), + D(adaptive_algorithm, update_tap)) + + + .def("update_taps", + &adaptive_algorithm::update_taps, + py::arg("taps"), + py::arg("in"), + py::arg("error"), + py::arg("decision"), + py::arg("num_taps"), + D(adaptive_algorithm, update_taps)) + + ; + + py::enum_<::gr::digital::adaptive_algorithm_t>(m, "adaptive_algorithm_t") + .value("LMS", ::gr::digital::adaptive_algorithm_t::LMS) // 0 + .value("NLMS", ::gr::digital::adaptive_algorithm_t::NLMS) // 1 + .value("CMA", ::gr::digital::adaptive_algorithm_t::CMA) // 2 + .export_values(); +} diff --git a/gr-digital/python/digital/bindings/decision_feedback_equalizer_python.cc b/gr-digital/python/digital/bindings/decision_feedback_equalizer_python.cc new file mode 100644 index 0000000000..fa2345f8b5 --- /dev/null +++ b/gr-digital/python/digital/bindings/decision_feedback_equalizer_python.cc @@ -0,0 +1,68 @@ +/* + * Copyright 2020 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 */ + +#include <pybind11/complex.h> +#include <pybind11/pybind11.h> +#include <pybind11/stl.h> + +namespace py = pybind11; + +#include <gnuradio/digital/decision_feedback_equalizer.h> +// pydoc.h is automatically generated in the build directory +#include <decision_feedback_equalizer_pydoc.h> + +void bind_decision_feedback_equalizer(py::module& m) +{ + + using decision_feedback_equalizer = ::gr::digital::decision_feedback_equalizer; + + + py::class_<decision_feedback_equalizer, + gr::sync_decimator, + std::shared_ptr<decision_feedback_equalizer>>( + m, "decision_feedback_equalizer", D(decision_feedback_equalizer)) + + .def(py::init(&decision_feedback_equalizer::make), + py::arg("num_taps_forward"), + py::arg("num_taps_feedback"), + py::arg("sps"), + py::arg("alg"), + py::arg("adapt_after_training") = true, + py::arg("training_sequence") = std::vector<gr_complex>(), + py::arg("training_start_tag") = "", + D(decision_feedback_equalizer, make)) + + + .def("set_taps", + &decision_feedback_equalizer::set_taps, + py::arg("taps"), + D(decision_feedback_equalizer, set_taps)) + + + .def("taps", + &decision_feedback_equalizer::taps, + D(decision_feedback_equalizer, taps)) + + + .def("equalize", + &decision_feedback_equalizer::equalize, + py::arg("input_samples"), + py::arg("output_symbols"), + py::arg("num_inputs"), + py::arg("max_num_outputs"), + py::arg("training_start_samples") = std::vector<unsigned int>(0), + py::arg("history_included") = false, + py::arg("taps") = nullptr, + py::arg("state") = nullptr, + D(decision_feedback_equalizer, equalize)) + + ; +} diff --git a/gr-digital/python/digital/bindings/docstrings/adaptive_algorithm_cma_pydoc_template.h b/gr-digital/python/digital/bindings/docstrings/adaptive_algorithm_cma_pydoc_template.h new file mode 100644 index 0000000000..fc390e7bbb --- /dev/null +++ b/gr-digital/python/digital/bindings/docstrings/adaptive_algorithm_cma_pydoc_template.h @@ -0,0 +1,40 @@ +/* + * Copyright 2020 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, digital, __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_digital_adaptive_algorithm_cma = R"doc()doc"; + + +static const char* __doc_gr_digital_adaptive_algorithm_cma_adaptive_algorithm_cma = + R"doc()doc"; + + +static const char* __doc_gr_digital_adaptive_algorithm_cma_make = R"doc()doc"; + + +static const char* __doc_gr_digital_adaptive_algorithm_cma_error = R"doc()doc"; + + +static const char* __doc_gr_digital_adaptive_algorithm_cma_error_dd = R"doc()doc"; + + +static const char* __doc_gr_digital_adaptive_algorithm_cma_error_tr = R"doc()doc"; + + +static const char* __doc_gr_digital_adaptive_algorithm_cma_update_taps = R"doc()doc"; + + +static const char* __doc_gr_digital_adaptive_algorithm_cma_update_tap = R"doc()doc"; diff --git a/gr-digital/python/digital/bindings/docstrings/adaptive_algorithm_lms_pydoc_template.h b/gr-digital/python/digital/bindings/docstrings/adaptive_algorithm_lms_pydoc_template.h new file mode 100644 index 0000000000..68a262aa79 --- /dev/null +++ b/gr-digital/python/digital/bindings/docstrings/adaptive_algorithm_lms_pydoc_template.h @@ -0,0 +1,34 @@ +/* + * Copyright 2020 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, digital, __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_digital_adaptive_algorithm_lms = R"doc()doc"; + + +static const char* __doc_gr_digital_adaptive_algorithm_lms_adaptive_algorithm_lms = + R"doc()doc"; + + +static const char* __doc_gr_digital_adaptive_algorithm_lms_make = R"doc()doc"; + + +static const char* __doc_gr_digital_adaptive_algorithm_lms_update_taps = R"doc()doc"; + + +static const char* __doc_gr_digital_adaptive_algorithm_lms_update_tap = R"doc()doc"; + + +static const char* __doc_gr_digital_adaptive_algorithm_lms_initialize_taps = R"doc()doc"; diff --git a/gr-digital/python/digital/bindings/docstrings/adaptive_algorithm_nlms_pydoc_template.h b/gr-digital/python/digital/bindings/docstrings/adaptive_algorithm_nlms_pydoc_template.h new file mode 100644 index 0000000000..301d2032a9 --- /dev/null +++ b/gr-digital/python/digital/bindings/docstrings/adaptive_algorithm_nlms_pydoc_template.h @@ -0,0 +1,34 @@ +/* + * Copyright 2020 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, digital, __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_digital_adaptive_algorithm_nlms = R"doc()doc"; + + +static const char* __doc_gr_digital_adaptive_algorithm_nlms_adaptive_algorithm_nlms = + R"doc()doc"; + + +static const char* __doc_gr_digital_adaptive_algorithm_nlms_make = R"doc()doc"; + + +static const char* __doc_gr_digital_adaptive_algorithm_nlms_update_tap = R"doc()doc"; + + +static const char* __doc_gr_digital_adaptive_algorithm_nlms_update_taps = R"doc()doc"; + + +static const char* __doc_gr_digital_adaptive_algorithm_nlms_initialize_taps = R"doc()doc"; diff --git a/gr-digital/python/digital/bindings/docstrings/adaptive_algorithm_pydoc_template.h b/gr-digital/python/digital/bindings/docstrings/adaptive_algorithm_pydoc_template.h new file mode 100644 index 0000000000..02e11cff85 --- /dev/null +++ b/gr-digital/python/digital/bindings/docstrings/adaptive_algorithm_pydoc_template.h @@ -0,0 +1,42 @@ +/* + * Copyright 2020 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, digital, __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_digital_adaptive_algorithm = R"doc()doc"; + + +static const char* __doc_gr_digital_adaptive_algorithm_adaptive_algorithm_0 = R"doc()doc"; + + +static const char* __doc_gr_digital_adaptive_algorithm_adaptive_algorithm_1 = R"doc()doc"; + + +static const char* __doc_gr_digital_adaptive_algorithm_base = R"doc()doc"; + + +static const char* __doc_gr_digital_adaptive_algorithm_initialize_taps = R"doc()doc"; + + +static const char* __doc_gr_digital_adaptive_algorithm_error_dd = R"doc()doc"; + + +static const char* __doc_gr_digital_adaptive_algorithm_error_tr = R"doc()doc"; + + +static const char* __doc_gr_digital_adaptive_algorithm_update_tap = R"doc()doc"; + + +static const char* __doc_gr_digital_adaptive_algorithm_update_taps = R"doc()doc"; diff --git a/gr-digital/python/digital/bindings/docstrings/decision_feedback_equalizer_pydoc_template.h b/gr-digital/python/digital/bindings/docstrings/decision_feedback_equalizer_pydoc_template.h new file mode 100644 index 0000000000..eb95c4a2d0 --- /dev/null +++ b/gr-digital/python/digital/bindings/docstrings/decision_feedback_equalizer_pydoc_template.h @@ -0,0 +1,40 @@ +/* + * Copyright 2020 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, digital, __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_digital_decision_feedback_equalizer = R"doc()doc"; + + +static const char* + __doc_gr_digital_decision_feedback_equalizer_decision_feedback_equalizer_0 = + R"doc()doc"; + + +static const char* + __doc_gr_digital_decision_feedback_equalizer_decision_feedback_equalizer_1 = + R"doc()doc"; + + +static const char* __doc_gr_digital_decision_feedback_equalizer_make = R"doc()doc"; + + +static const char* __doc_gr_digital_decision_feedback_equalizer_set_taps = R"doc()doc"; + + +static const char* __doc_gr_digital_decision_feedback_equalizer_taps = R"doc()doc"; + + +static const char* __doc_gr_digital_decision_feedback_equalizer_equalize = R"doc()doc"; diff --git a/gr-digital/python/digital/bindings/docstrings/linear_equalizer_pydoc_template.h b/gr-digital/python/digital/bindings/docstrings/linear_equalizer_pydoc_template.h new file mode 100644 index 0000000000..1c796b484e --- /dev/null +++ b/gr-digital/python/digital/bindings/docstrings/linear_equalizer_pydoc_template.h @@ -0,0 +1,36 @@ +/* + * Copyright 2020 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, digital, __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_digital_linear_equalizer = R"doc()doc"; + + +static const char* __doc_gr_digital_linear_equalizer_linear_equalizer_0 = R"doc()doc"; + + +static const char* __doc_gr_digital_linear_equalizer_linear_equalizer_1 = R"doc()doc"; + + +static const char* __doc_gr_digital_linear_equalizer_make = R"doc()doc"; + + +static const char* __doc_gr_digital_linear_equalizer_set_taps = R"doc()doc"; + + +static const char* __doc_gr_digital_linear_equalizer_taps = R"doc()doc"; + + +static const char* __doc_gr_digital_linear_equalizer_equalize = R"doc()doc"; diff --git a/gr-digital/python/digital/bindings/docstrings/meas_evm_cc_pydoc_template.h b/gr-digital/python/digital/bindings/docstrings/meas_evm_cc_pydoc_template.h new file mode 100644 index 0000000000..c348425ad5 --- /dev/null +++ b/gr-digital/python/digital/bindings/docstrings/meas_evm_cc_pydoc_template.h @@ -0,0 +1,24 @@ +/* + * Copyright 2020 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, digital, __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_digital_meas_evm_cc = R"doc()doc"; + + +static const char* __doc_gr_digital_meas_evm_cc_meas_evm_cc = R"doc()doc"; + + +static const char* __doc_gr_digital_meas_evm_cc_make = R"doc()doc"; diff --git a/gr-digital/python/digital/bindings/linear_equalizer_python.cc b/gr-digital/python/digital/bindings/linear_equalizer_python.cc new file mode 100644 index 0000000000..7697a0e0e2 --- /dev/null +++ b/gr-digital/python/digital/bindings/linear_equalizer_python.cc @@ -0,0 +1,63 @@ +/* + * Copyright 2020 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 */ + +#include <pybind11/complex.h> +#include <pybind11/pybind11.h> +#include <pybind11/stl.h> + +namespace py = pybind11; + +#include <gnuradio/digital/linear_equalizer.h> +// pydoc.h is automatically generated in the build directory +#include <linear_equalizer_pydoc.h> + +void bind_linear_equalizer(py::module& m) +{ + + using linear_equalizer = ::gr::digital::linear_equalizer; + + + py::class_<linear_equalizer, gr::sync_decimator, std::shared_ptr<linear_equalizer>>( + m, "linear_equalizer", D(linear_equalizer)) + + .def(py::init(&linear_equalizer::make), + py::arg("num_taps"), + py::arg("sps"), + py::arg("alg"), + py::arg("adapt_after_training") = true, + py::arg("training_sequence") = std::vector<gr_complex>(), + py::arg("training_start_tag") = "", + D(linear_equalizer, make)) + + + .def("set_taps", + &linear_equalizer::set_taps, + py::arg("taps"), + D(linear_equalizer, set_taps)) + + + .def("taps", &linear_equalizer::taps, D(linear_equalizer, taps)) + + + .def("equalize", + &linear_equalizer::equalize, + py::arg("input_samples"), + py::arg("output_symbols"), + py::arg("num_inputs"), + py::arg("max_num_outputs"), + py::arg("training_start_samples") = std::vector<unsigned int>(0), + py::arg("history_included") = false, + py::arg("taps") = nullptr, + py::arg("state") = nullptr, + D(linear_equalizer, equalize)) + + ; +} diff --git a/gr-digital/python/digital/bindings/meas_evm_cc_python.cc b/gr-digital/python/digital/bindings/meas_evm_cc_python.cc new file mode 100644 index 0000000000..fb0b233b89 --- /dev/null +++ b/gr-digital/python/digital/bindings/meas_evm_cc_python.cc @@ -0,0 +1,45 @@ +/* + * Copyright 2020 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 */ + +#include <pybind11/complex.h> +#include <pybind11/pybind11.h> +#include <pybind11/stl.h> + +namespace py = pybind11; + +#include <gnuradio/digital/meas_evm_cc.h> +// pydoc.h is automatically generated in the build directory +#include <meas_evm_cc_pydoc.h> + +void bind_meas_evm_cc(py::module& m) +{ + + using meas_evm_cc = ::gr::digital::meas_evm_cc; + + py::enum_<::gr::digital::evm_measurement_t>(m, "evm_measurement_t") + .value("EVM_PERCENT", ::gr::digital::evm_measurement_t::EVM_PERCENT) // 0 + .value("EVM_DB", ::gr::digital::evm_measurement_t::EVM_DB) // 1 + .export_values(); + + py::class_<meas_evm_cc, + gr::sync_block, + gr::block, + gr::basic_block, + std::shared_ptr<meas_evm_cc>>(m, "meas_evm_cc", D(meas_evm_cc)) + + .def(py::init(&meas_evm_cc::make), + py::arg("cons"), + py::arg("meas_type") = ::gr::digital::evm_measurement_t::EVM_PERCENT, + D(meas_evm_cc, make)) + + + ; +}
\ No newline at end of file diff --git a/gr-digital/python/digital/bindings/modulate_vector_python.cc b/gr-digital/python/digital/bindings/modulate_vector_python.cc new file mode 100644 index 0000000000..6e486a841e --- /dev/null +++ b/gr-digital/python/digital/bindings/modulate_vector_python.cc @@ -0,0 +1,29 @@ +/* + * Copyright 2020 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 */ + +#include <pybind11/complex.h> +#include <pybind11/pybind11.h> +#include <pybind11/stl.h> + +namespace py = pybind11; + +#include <gnuradio/basic_block.h> +#include <gnuradio/runtime_types.h> +#include <gnuradio/digital/modulate_vector.h> + +void bind_modulate_vector(py::module& m) +{ + + m.def("modulate_vector_bc",&::gr::digital::modulate_vector_bc, + py::arg("modulator"), + py::arg("data"), + py::arg("taps")); +} diff --git a/gr-digital/python/digital/bindings/python_bindings.cc b/gr-digital/python/digital/bindings/python_bindings.cc index fddd0e7d90..e7a0428d4e 100644 --- a/gr-digital/python/digital/bindings/python_bindings.cc +++ b/gr-digital/python/digital/bindings/python_bindings.cc @@ -15,6 +15,10 @@ namespace py = pybind11; +void bind_adaptive_algorithm(py::module&); +void bind_adaptive_algorithm_cma(py::module&); +void bind_adaptive_algorithm_lms(py::module&); +void bind_adaptive_algorithm_nlms(py::module&); void bind_additive_scrambler_bb(py::module&); void bind_binary_slicer_fb(py::module&); void bind_burst_shaper(py::module&); @@ -37,6 +41,7 @@ void bind_cpmmod_bc(py::module&); void bind_crc32(py::module&); void bind_crc32_async_bb(py::module&); void bind_crc32_bb(py::module&); +void bind_decision_feedback_equalizer(py::module&); void bind_descrambler_bb(py::module&); void bind_diff_decoder_bb(py::module&); void bind_diff_encoder_bb(py::module&); @@ -58,10 +63,12 @@ void bind_header_payload_demux(py::module&); void bind_interpolating_resampler_type(py::module&); void bind_kurtotic_equalizer_cc(py::module&); void bind_lfsr(py::module&); +void bind_linear_equalizer(py::module&); void bind_lms_dd_equalizer_cc(py::module&); void bind_map_bb(py::module&); +void bind_meas_evm_cc(py::module&); void bind_metric_type(py::module&); -// void bind_modulate_vector(py::module&); +void bind_modulate_vector(py::module&); void bind_mpsk_snr_est(py::module&); void bind_mpsk_snr_est_cc(py::module&); void bind_msk_timing_recovery_cc(py::module&); @@ -114,6 +121,10 @@ PYBIND11_MODULE(digital_python, m) // Allow access to base block methods py::module::import("gnuradio.gr"); + bind_adaptive_algorithm(m); + bind_adaptive_algorithm_cma(m); + bind_adaptive_algorithm_lms(m); + bind_adaptive_algorithm_nlms(m); bind_additive_scrambler_bb(m); bind_binary_slicer_fb(m); bind_burst_shaper(m); @@ -136,6 +147,7 @@ PYBIND11_MODULE(digital_python, m) bind_crc32(m); bind_crc32_async_bb(m); bind_crc32_bb(m); + bind_decision_feedback_equalizer(m); bind_descrambler_bb(m); bind_diff_decoder_bb(m); bind_diff_encoder_bb(m); @@ -157,10 +169,12 @@ PYBIND11_MODULE(digital_python, m) bind_interpolating_resampler_type(m); bind_kurtotic_equalizer_cc(m); bind_lfsr(m); + bind_linear_equalizer(m); bind_lms_dd_equalizer_cc(m); bind_map_bb(m); + bind_meas_evm_cc(m); bind_metric_type(m); - // bind_modulate_vector(m); + bind_modulate_vector(m); bind_mpsk_snr_est(m); bind_mpsk_snr_est_cc(m); bind_msk_timing_recovery_cc(m); diff --git a/gr-digital/python/digital/qa_decision_feedback_equalizer.py b/gr-digital/python/digital/qa_decision_feedback_equalizer.py index a29b783a3e..1a9d3abe79 100755 --- a/gr-digital/python/digital/qa_decision_feedback_equalizer.py +++ b/gr-digital/python/digital/qa_decision_feedback_equalizer.py @@ -106,7 +106,7 @@ class qa_linear_equalizer(gr_unittest.TestCase): preamble_symbols = self.map_symbols_to_constellation(self.unpack_values(self.preamble, 8, 2), cons) alg = digital.adaptive_algorithm_lms(cons, gain).base() - evm = digital.meas_evm_cc(cons, digital.evm_measurement_t_EVM_PERCENT) + evm = digital.meas_evm_cc(cons, digital.evm_measurement_t.EVM_PERCENT) dfe = digital.decision_feedback_equalizer(num_taps_fwd, num_taps_rev, self.sps, alg, True, preamble_symbols, 'corr_est') correst = digital.corr_est_cc(modulated_sync_word, self.sps, 12, corr_calc, digital.THRESHOLD_ABSOLUTE) constmod = digital.generic_mod( @@ -134,8 +134,8 @@ class qa_linear_equalizer(gr_unittest.TestCase): self.tb.run() # look at the last 1000 samples, should converge quickly, below 5% EVM - upper_bound = tuple(20.0*numpy.ones((num_test,))) - lower_bound = tuple(0.0*numpy.zeros((num_test,))) + upper_bound = list(20.0*numpy.ones((num_test,))) + lower_bound = list(0.0*numpy.zeros((num_test,))) output_data = vsi.data() output_data = output_data[-num_test:] self.assertLess(output_data, upper_bound) diff --git a/gr-digital/python/digital/qa_header_payload_demux.py b/gr-digital/python/digital/qa_header_payload_demux.py index dea6c19a9b..bd1b2e1041 100644 --- a/gr-digital/python/digital/qa_header_payload_demux.py +++ b/gr-digital/python/digital/qa_header_payload_demux.py @@ -143,8 +143,8 @@ class qa_header_payload_demux (gr_unittest.TestCase): payload_sink, header_sink) self.run_tb(payload_sink, len(payload), header_sink, len(header)) - self.assertEqual(header_sink.data(), header) - self.assertEqual(payload_sink.data(), payload) + self.assertEqual(header_sink.data(), list(header)) + self.assertEqual(payload_sink.data(), list(payload)) ptags_header = [] for tag in header_sink.tags(): ptag = gr.tag_to_python(tag) @@ -201,8 +201,8 @@ class qa_header_payload_demux (gr_unittest.TestCase): self.connect_all_blocks(data_src, None, hpd, mock_header_demod, payload_sink, header_sink) self.run_tb(payload_sink, len(payload), header_sink, len(header)) # Check results - self.assertEqual(header_sink.data(), header) - self.assertEqual(payload_sink.data(), payload) + self.assertEqual(header_sink.data(), list(header)) + self.assertEqual(payload_sink.data(), list(payload)) ptags_header = [] for tag in header_sink.tags(): ptag = gr.tag_to_python(tag) @@ -225,10 +225,10 @@ class qa_header_payload_demux (gr_unittest.TestCase): def test_001_headerpadding (self): """ Like test 1, but with header padding. """ n_zeros = 3 - header = (1, 2, 3) + header = [1, 2, 3] header_padding = 1 - payload = tuple(range(5, 20)) - data_signal = (0,) * n_zeros + header + payload + payload = list(range(5, 20)) + data_signal = [0,] * n_zeros + header + payload trigger_signal = [0] * len(data_signal) trigger_signal[n_zeros] = 1 # This is dropped: @@ -269,7 +269,7 @@ class qa_header_payload_demux (gr_unittest.TestCase): self.run_tb(payload_sink, len(payload), header_sink, len(header)+2) # Check values # Header now is padded: - self.assertEqual(header_sink.data(), (0,) + header + (payload[0],)) + self.assertEqual(header_sink.data(), [0,] + header + [payload[0],]) self.assertEqual(payload_sink.data(), payload) ptags_header = [] for tag in header_sink.tags(): @@ -293,11 +293,11 @@ class qa_header_payload_demux (gr_unittest.TestCase): def test_001_headerpadding_payload_offset (self): """ Like test 1, but with header padding + payload offset. """ n_zeros = 3 - header = (1, 2, 3) + header = [1, 2, 3] header_padding = 1 payload_offset = -1 - payload = tuple(range(5, 20)) - data_signal = (0,) * n_zeros + header + payload + (0,) * 100 + payload = list(range(5, 20)) + data_signal = [0,] * n_zeros + header + payload + [0,] * 100 trigger_signal = [0] * len(data_signal) trigger_signal[n_zeros] = 1 # This goes on output 1, item 3 + 1 (for payload offset) @@ -339,7 +339,7 @@ class qa_header_payload_demux (gr_unittest.TestCase): self.tb.stop() self.tb.wait() # Header is now padded: - self.assertEqual(header_sink.data(), (0,) + header + (payload[0],)) + self.assertEqual(header_sink.data(), [0,] + header + [payload[0],]) # Payload is now offset: self.assertEqual( payload_sink.data(), @@ -433,12 +433,12 @@ class qa_header_payload_demux (gr_unittest.TestCase): """ ### Tx Data n_zeros = 5 - header = (1, 2, 3) - header_fail = (-1, -2, -4) # Contents don't really matter - payload1 = tuple(range(5, 20)) - payload2 = (42,) + header = [1, 2, 3] + header_fail = [-1, -2, -4] # Contents don't really matter + payload1 = list(range(5, 20)) + payload2 = [42,] sampling_rate = 2 - data_signal = (0,) * n_zeros + header + payload1 + data_signal = [0,] * n_zeros + header + payload1 trigger_signal = [0,] * len(data_signal) * 2 trigger_signal[n_zeros] = 1 trigger_signal[len(data_signal)] = 1 @@ -448,8 +448,8 @@ class qa_header_payload_demux (gr_unittest.TestCase): len(data_signal), len(data_signal)+len(header_fail)+n_zeros)) tx_signal = data_signal + \ - header_fail + (0,) * n_zeros + \ - header + payload2 + (0,) * 1000 + header_fail + [0,] * n_zeros + \ + header + payload2 + [0,] * 1000 # Timing tag: This is preserved and updated: timing_tag = make_tag('rx_time', (0, 0), 0) # Rx freq tags: @@ -513,7 +513,7 @@ class qa_header_payload_demux (gr_unittest.TestCase): # 31: header 3 # 34: payload 2 (length 1) # 35: 1000 zeros - self.assertEqual(header_sink.data(), header + header_fail + header) + self.assertEqual(header_sink.data(), list(header + header_fail + header)) self.assertEqual(payload_sink.data(), payload1 + payload2) tags_payload = [gr.tag_to_python(x) for x in payload_sink.tags()] tags_payload = sorted([(x.offset, x.key, x.value) for x in tags_payload]) @@ -618,8 +618,8 @@ class qa_header_payload_demux (gr_unittest.TestCase): payload_sink = blocks.vector_sink_f() self.connect_all_blocks(data_src, trigger_src, hpd, mock_header_demod, payload_sink, header_sink) self.run_tb(payload_sink, total_payload_len, header_sink, header_len*n_bursts) - self.assertEqual(header_sink.data(), tuple([1]*header_len*n_bursts)) - self.assertEqual(payload_sink.data(), tuple([2]*total_payload_len)) + self.assertEqual(header_sink.data(), list([1]*header_len*n_bursts)) + self.assertEqual(payload_sink.data(), list([2]*total_payload_len)) if __name__ == '__main__': gr_unittest.run(qa_header_payload_demux, "qa_header_payload_demux.xml") diff --git a/gr-digital/python/digital/qa_linear_equalizer.py b/gr-digital/python/digital/qa_linear_equalizer.py index d7a4a597f3..522575db54 100755 --- a/gr-digital/python/digital/qa_linear_equalizer.py +++ b/gr-digital/python/digital/qa_linear_equalizer.py @@ -104,7 +104,7 @@ class qa_linear_equalizer(gr_unittest.TestCase): preamble_symbols = self.map_symbols_to_constellation(self.unpack_values(self.preamble, 8, 2), cons) alg = digital.adaptive_algorithm_lms(cons, gain).base() - evm = digital.meas_evm_cc(cons, digital.evm_measurement_t_EVM_PERCENT) + evm = digital.meas_evm_cc(cons, digital.evm_measurement_t.EVM_PERCENT) leq = digital.linear_equalizer(num_taps, self.sps, alg, False, preamble_symbols, 'corr_est') correst = digital.corr_est_cc(modulated_sync_word, self.sps, 12, corr_calc, digital.THRESHOLD_ABSOLUTE) constmod = digital.generic_mod( @@ -130,8 +130,8 @@ class qa_linear_equalizer(gr_unittest.TestCase): self.tb.run() # look at the last 1000 samples, should converge quickly, below 5% EVM - upper_bound = tuple(20.0*numpy.ones((num_test,))) - lower_bound = tuple(0.0*numpy.zeros((num_test,))) + upper_bound = list(20.0*numpy.ones((num_test,))) + lower_bound = list(0.0*numpy.zeros((num_test,))) output_data = vsi.data() output_data = output_data[-num_test:] self.assertLess(output_data, upper_bound) diff --git a/gr-digital/python/digital/qa_meas_evm_cc.py b/gr-digital/python/digital/qa_meas_evm_cc.py index cf3b4577da..580d2acce5 100755 --- a/gr-digital/python/digital/qa_meas_evm_cc.py +++ b/gr-digital/python/digital/qa_meas_evm_cc.py @@ -27,13 +27,13 @@ class qa_meas_evm_cc(gr_unittest.TestCase): def test_qpsk(self): # set up fg - expected_result = tuple(numpy.zeros((self.num_data,))) + expected_result = list(numpy.zeros((self.num_data,))) self.cons = cons = digital.constellation_qpsk().base() self.data = data = [random.randrange(len(cons.points())) for x in range(self.num_data)] self.symbols = symbols = numpy.squeeze([cons.map_to_points_v(i) for i in data]) - evm = digital.meas_evm_cc(cons, digital.evm_measurement_t_EVM_PERCENT) + evm = digital.meas_evm_cc(cons, digital.evm_measurement_t.EVM_PERCENT) vso = blocks.vector_source_c(symbols, False, 1, []) # mc = blocks.multiply_const_cc(3.0+2.0j) vsi = blocks.vector_sink_f() @@ -47,13 +47,13 @@ class qa_meas_evm_cc(gr_unittest.TestCase): def test_qpsk_nonzeroevm(self): # set up fg - expected_result = tuple(numpy.zeros((self.num_data,))) + expected_result = list(numpy.zeros((self.num_data,))) self.cons = cons = digital.constellation_qpsk().base() self.data = data = [random.randrange(len(cons.points())) for x in range(self.num_data)] self.symbols = symbols = numpy.squeeze([cons.map_to_points_v(i) for i in data]) - evm = digital.meas_evm_cc(cons, digital.evm_measurement_t_EVM_PERCENT) + evm = digital.meas_evm_cc(cons, digital.evm_measurement_t.EVM_PERCENT) vso = blocks.vector_source_c(symbols, False, 1, []) mc = blocks.multiply_const_cc(3.0+2.0j) vsi = blocks.vector_sink_f() @@ -66,8 +66,8 @@ class qa_meas_evm_cc(gr_unittest.TestCase): self.assertNotEqual(expected_result, output_data) def test_qpsk_channel(self): - upper_bound = tuple(50.0*numpy.ones((self.num_data,))) - lower_bound = tuple(0.0*numpy.zeros((self.num_data,))) + upper_bound = list(50.0*numpy.ones((self.num_data,))) + lower_bound = list(0.0*numpy.zeros((self.num_data,))) self.cons = cons = digital.constellation_qpsk().base() self.data = data = [random.randrange(len(cons.points())) for x in range(self.num_data)] @@ -81,7 +81,7 @@ class qa_meas_evm_cc(gr_unittest.TestCase): noise_seed=0, block_tags=False) - evm = digital.meas_evm_cc(cons, digital.evm_measurement_t_EVM_PERCENT) + evm = digital.meas_evm_cc(cons, digital.evm_measurement_t.EVM_PERCENT) vso = blocks.vector_source_c(symbols, False, 1, []) mc = blocks.multiply_const_cc(3.0+2.0j) vsi = blocks.vector_sink_f() @@ -95,8 +95,8 @@ class qa_meas_evm_cc(gr_unittest.TestCase): self.assertGreater(output_data, lower_bound) def test_qam16_channel(self): - upper_bound = tuple(50.0*numpy.ones((self.num_data,))) - lower_bound = tuple(0.0*numpy.zeros((self.num_data,))) + upper_bound = list(50.0*numpy.ones((self.num_data,))) + lower_bound = list(0.0*numpy.zeros((self.num_data,))) self.cons = cons = digital.constellation_16qam().base() self.data = data = [random.randrange(len(cons.points())) for x in range(self.num_data)] @@ -110,7 +110,7 @@ class qa_meas_evm_cc(gr_unittest.TestCase): noise_seed=0, block_tags=False) - evm = digital.meas_evm_cc(cons, digital.evm_measurement_t_EVM_PERCENT) + evm = digital.meas_evm_cc(cons, digital.evm_measurement_t.EVM_PERCENT) vso = blocks.vector_source_c(symbols, False, 1, []) mc = blocks.multiply_const_cc(3.0+2.0j) vsi = blocks.vector_sink_f() |