From 9c49101420c27b4cda975b36cdeed901d9f083e1 Mon Sep 17 00:00:00 2001 From: Relintai Date: Mon, 13 Feb 2023 17:23:25 +0100 Subject: [PATCH] Added MLPPTransformsOld. --- SCsub | 1 + mlpp/transforms/transforms_old.cpp | 56 ++++++++++++++++++++++++++++++ mlpp/transforms/transforms_old.h | 27 ++++++++++++++ 3 files changed, 84 insertions(+) create mode 100644 mlpp/transforms/transforms_old.cpp create mode 100644 mlpp/transforms/transforms_old.h diff --git a/SCsub b/SCsub index 7dd2803..1dcbe50 100644 --- a/SCsub +++ b/SCsub @@ -79,6 +79,7 @@ sources = [ "mlpp/regularization/reg_old.cpp", "mlpp/gauss_markov_checker/gauss_markov_checker_old.cpp", "mlpp/utilities/utilities_old.cpp", + "mlpp/transforms/transforms_old.cpp", "test/mlpp_tests.cpp", ] diff --git a/mlpp/transforms/transforms_old.cpp b/mlpp/transforms/transforms_old.cpp new file mode 100644 index 0000000..ffd1962 --- /dev/null +++ b/mlpp/transforms/transforms_old.cpp @@ -0,0 +1,56 @@ +// +// Transforms.cpp +// +// Created by Marc Melikyan on 11/13/20. +// + +#include "transforms_old.h" +#include "../lin_alg/lin_alg.h" +#include +#include +#include + +// DCT ii. +// https://www.mathworks.com/help/images/discrete-cosine-transform.html +std::vector> MLPPTransformsOld::discreteCosineTransform(std::vector> A) { + MLPPLinAlg alg; + A = alg.scalarAdd(-128, A); // Center around 0. + + std::vector> B; + B.resize(A.size()); + for (uint32_t i = 0; i < B.size(); i++) { + B[i].resize(A[i].size()); + } + + int M = A.size(); + + for (uint32_t i = 0; i < B.size(); i++) { + for (uint32_t j = 0; j < B[i].size(); j++) { + real_t sum = 0; + real_t alphaI; + if (i == 0) { + alphaI = 1 / std::sqrt(M); + } else { + alphaI = std::sqrt(real_t(2) / real_t(M)); + } + real_t alphaJ; + if (j == 0) { + alphaJ = 1 / std::sqrt(M); + } else { + alphaJ = std::sqrt(real_t(2) / real_t(M)); + } + + for (uint32_t k = 0; k < B.size(); k++) { + for (uint32_t f = 0; f < B[k].size(); f++) { + sum += A[k][f] * std::cos((M_PI * i * (2 * k + 1)) / (2 * M)) * std::cos((M_PI * j * (2 * f + 1)) / (2 * M)); + } + } + B[i][j] = sum; + B[i][j] *= alphaI * alphaJ; + } + } + return B; +} + +void MLPPTransformsOld::_bind_methods() { +} diff --git a/mlpp/transforms/transforms_old.h b/mlpp/transforms/transforms_old.h new file mode 100644 index 0000000..aabb326 --- /dev/null +++ b/mlpp/transforms/transforms_old.h @@ -0,0 +1,27 @@ + +#ifndef MLPP_TRANSFORMS_OLD_H +#define MLPP_TRANSFORMS_OLD_H + +// +// Transforms.hpp +// +// + +#include "core/math/math_defs.h" + +#include "core/object/reference.h" + +#include +#include + +class MLPPTransformsOld : public Reference { + GDCLASS(MLPPTransformsOld, Reference); + +public: + std::vector> discreteCosineTransform(std::vector> A); + +protected: + static void _bind_methods(); +}; + +#endif /* Transforms_hpp */