diff --git a/modules/transform/wavelet.cpp b/modules/transform/wavelet.cpp index 3fd429bb..1ed50d69 100644 --- a/modules/transform/wavelet.cpp +++ b/modules/transform/wavelet.cpp @@ -677,23 +677,60 @@ blaze::CompressedMatrix DaubechiesMat(size_t size, int order = 4) c[i] = c[i] * coeff; } - auto mat = blaze::CompressedMatrix(size, size, 0); + auto mat = blaze::CompressedMatrix(size, size); mat.reserve(size * c.size()); for (size_t i = 0; i < size / 2; ++i) { - for (size_t ci = 0; ci < c.size(); ++ci) { - mat.append(i, (i * 2 + ci) % size, c[ci]); + + size_t ci = mat.columns() - 2 * i; + if (ci > c.size()) { + ci = 0; + } + std::cout << "ci" << ci << std::endl; + for (size_t a = 0; a < c.size(); ++a) { + if (ci >= c.size()) { + ci = ci % c.size(); + } + + size_t j = i * 2 + ci; + if (j >= mat.columns()) { + j = j % mat.columns(); + } + + mat.append(i, j, c[ci]); + std::cout << i << " " << j << " " << ci << " " << c[ci] << std::endl; + + ++ci; } mat.finalize(i); + } - for (size_t i = size / 2; i < size; ++i) { + for (size_t i = 0; i < size / 2; ++i) { int sign = 1; - for (size_t ci = 0; ci < c.size(); ++ci) { - mat.append(i, (i * 2 + ci) % size, c[order - 1 - ci] * sign); - sign *= -1; + + size_t ci = mat.columns() - 2 * i; + if (ci > c.size()) { + ci = 0; } - mat.finalize(i); + std::cout << "ci" << ci << std::endl; + for (size_t a = 0; a < c.size(); ++a) { + if (ci >= c.size()) { + ci = ci % c.size(); + } + + size_t j = i * 2 + ci; + if (j >= mat.columns()) { + j = j % mat.columns(); + } + + mat.append(size / 2 + i, j, c[order - 1 - ci]); + std::cout << i << " " << j << " " << ci << " " << c[ci] << std::endl; + + ++ci; + sign *= -1; + } + mat.finalize(size / 2 + i); } return mat; diff --git a/tests/transform_test/CMakeLists.txt b/tests/transform_test/CMakeLists.txt index 24867802..9ea50dea 100644 --- a/tests/transform_test/CMakeLists.txt +++ b/tests/transform_test/CMakeLists.txt @@ -1,5 +1,6 @@ #target_sources(unit_tests PRIVATE hog_tests.cpp) target_sources(unit_tests PRIVATE dwt_tests.cpp) +target_sources(unit_tests PRIVATE wavelet_tests.cpp) #configure_file(${CMAKE_CURRENT_SOURCE_DIR}/astronaut.pgm ${CMAKE_CURRENT_BINARY_DIR}/astronaut.pgm COPYONLY) diff --git a/tests/transform_test/wavelet_tests.cpp b/tests/transform_test/wavelet_tests.cpp new file mode 100644 index 00000000..a4cf42e2 --- /dev/null +++ b/tests/transform_test/wavelet_tests.cpp @@ -0,0 +1,19 @@ +#include + +#include "modules/transform/wavelet.hpp" + +TEMPLATE_TEST_CASE("DaubechiesMat", "[transform][wavelet]", float) +{ + const auto dmat = wavelet::DaubechiesMat(12, 6); + std::cout << dmat << std::endl; + + const auto sumLow = blaze::sum(blaze::row(dmat, 0)); + + for (size_t i = 0; i < dmat.rows() / 2; ++i) { + REQUIRE(Approx(sumLow) == blaze::sum(blaze::row(dmat, i))); + } + const auto sumHigh = blaze::sum(blaze::row(dmat, 0)); + for (size_t i = dmat.rows() / 2; i < dmat.rows(); ++i) { + REQUIRE(Approx(sumHigh) == blaze::sum(blaze::row(dmat, i))); + } +}