From e9df863e462c2b3fee1501e8f31416ad259de6c9 Mon Sep 17 00:00:00 2001 From: jd-13 Date: Sun, 28 Jan 2024 15:36:52 +0000 Subject: [PATCH] Make TPTSVFilter cloneable --- WECore/WEFilters/TPTSVFilter.h | 19 +++++++- WECore/WEFilters/Tests/TPTSVFilterTests.cpp | 48 +++++++++++++++++++++ 2 files changed, 66 insertions(+), 1 deletion(-) diff --git a/WECore/WEFilters/TPTSVFilter.h b/WECore/WEFilters/TPTSVFilter.h index 84abb6b9..6c2d8abc 100644 --- a/WECore/WEFilters/TPTSVFilter.h +++ b/WECore/WEFilters/TPTSVFilter.h @@ -53,7 +53,6 @@ namespace WECore::TPTSVF { _calculateCoefficients(); } - TPTSVFilter(const TPTSVFilter& other) = default; virtual ~TPTSVFilter() = default; /** @@ -95,6 +94,10 @@ namespace WECore::TPTSVF { /** @} */ + TPTSVFilter clone() const { + return TPTSVFilter(*this); + } + private: double _sampleRate, _cutoffHz, @@ -109,6 +112,20 @@ namespace WECore::TPTSVF { int _mode; void _calculateCoefficients(); + + TPTSVFilter(const TPTSVFilter& other) { + _sampleRate = other._sampleRate; + _cutoffHz = other._cutoffHz; + _q = other._q; + _gain = other._gain; + + _s1 = other._s1; + _s2 = other._s2; + _g = other._g; + _h = other._h; + + _mode = other._mode; + } }; template diff --git a/WECore/WEFilters/Tests/TPTSVFilterTests.cpp b/WECore/WEFilters/Tests/TPTSVFilterTests.cpp index 5f1ae14f..b12bc9b2 100644 --- a/WECore/WEFilters/Tests/TPTSVFilterTests.cpp +++ b/WECore/WEFilters/Tests/TPTSVFilterTests.cpp @@ -105,3 +105,51 @@ SCENARIO("TPTSVFilter: Silence in = silence out") { } } } + +SCENARIO("TPTSVFilter: Clone works correctly") { + GIVEN("A TPTSVFilter and a buffer of samples") { + auto generateBuffer = []() { + std::vector buffer(1024); + std::fill(buffer.begin(), buffer.end(), 0); + std::fill(buffer.begin() + 300, buffer.end(), 0.5); + std::fill(buffer.begin() + 600, buffer.end(), 0.7); + return buffer; + }; + + std::vector initialBuffer = generateBuffer(); + WECore::TPTSVF::TPTSVFilter filter; + + // Set some unique values so we can test for them later + filter.setMode(WECore::TPTSVF::Parameters::FILTER_MODE.HIGHPASS); + filter.setCutoff(1001); + filter.setQ(1.1); + filter.setGain(0.8); + filter.setSampleRate(48000); + + // Set up some internal state + filter.processBlock(&initialBuffer[0], initialBuffer.size()); + + WHEN("It is cloned") { + WECore::TPTSVF::TPTSVFilter clonedFilter = filter.clone(); + + THEN("The cloned filter is equal to the original") { + CHECK(clonedFilter.getMode() == filter.getMode()); + CHECK(clonedFilter.getCutoff() == Approx(filter.getCutoff())); + CHECK(clonedFilter.getQ() == Approx(filter.getQ())); + CHECK(clonedFilter.getGain() == Approx(filter.getGain())); + // CHECK(clonedFilter.getSampleRate() == Approx(filter.getSampleRate())); + + // Check internal state + std::vector buffer1 = generateBuffer(); + filter.processBlock(&buffer1[0], buffer1.size()); + + std::vector buffer2 = generateBuffer(); + clonedFilter.processBlock(&buffer2[0], buffer2.size()); + + for (int index {0}; index < buffer.size(); index++) { + CHECK(buffer1[index] == Approx(buffer2[index])); + } + } + } + } +}