Skip to content

Commit

Permalink
Add DiodeRectifier
Browse files Browse the repository at this point in the history
  • Loading branch information
tobiashienzsch committed Feb 10, 2024
1 parent 294cc82 commit f6a6e6f
Show file tree
Hide file tree
Showing 4 changed files with 66 additions and 0 deletions.
1 change: 1 addition & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ if(NOT CMAKE_CROSSCOMPILING)
"lib/grit/audio/noise/airwindows_vinyl_dither_test.cpp"
"lib/grit/audio/noise/dither_test.cpp"
"lib/grit/audio/noise/white_noise_test.cpp"
"lib/grit/audio/waveshape/diode_rectifier_test.cpp"
"lib/grit/audio/waveshape/full_wave_rectifier_test.cpp"
"lib/grit/audio/waveshape/half_wave_rectifier_test.cpp"
"lib/grit/audio/waveshape/hard_clipper_test.cpp"
Expand Down
1 change: 1 addition & 0 deletions lib/grit/audio/waveshape.hpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#pragma once

#include <grit/audio/waveshape/diode_rectifier.hpp>
#include <grit/audio/waveshape/full_wave_rectifier.hpp>
#include <grit/audio/waveshape/half_wave_rectifier.hpp>
#include <grit/audio/waveshape/hard_clipper.hpp>
Expand Down
35 changes: 35 additions & 0 deletions lib/grit/audio/waveshape/diode_rectifier.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
#pragma once

#include <grit/audio/waveshape/wave_shaper.hpp>
#include <grit/audio/waveshape/wave_shaper_adaa1.hpp>

#include <etl/cmath.hpp>
#include <etl/concepts.hpp>

namespace grit {

template<etl::floating_point Float>
struct DiodeRectifierNonlinearity
{
constexpr DiodeRectifierNonlinearity() = default;

[[nodiscard]] constexpr auto operator()(Float x) const -> Float { return f(x); }

[[nodiscard]] static constexpr auto f(Float x) -> Float
{
return Float(0.2) * etl::exp(Float(1.79) * x) - Float(0.2);
}

[[nodiscard]] static constexpr auto ad1(Float x) -> Float
{
return Float(-0.2) * x + Float(0.111731843575419) * etl::exp(Float(1.79) * x);
}
};

template<etl::floating_point Float>
using DiodeRectifier = WaveShaper<Float, DiodeRectifierNonlinearity<Float>>;

template<etl::floating_point Float>
using DiodeRectifierADAA1 = WaveShaperADAA1<Float, DiodeRectifierNonlinearity<Float>>;

} // namespace grit
29 changes: 29 additions & 0 deletions lib/grit/audio/waveshape/diode_rectifier_test.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
#include "diode_rectifier.hpp"

#include <catch2/catch_approx.hpp>
#include <catch2/catch_template_test_macros.hpp>

TEMPLATE_TEST_CASE("grit/audio/waveshape: DiodeRectifier", "", double)
{
using Float = TestType;

auto shaper = grit::DiodeRectifier<Float>{};
STATIC_REQUIRE(etl::is_empty_v<grit::DiodeRectifier<Float>>);

REQUIRE(shaper(Float(-2.0)) == Catch::Approx(-0.1944248603));
REQUIRE(shaper(Float(-1.5)) == Catch::Approx(-0.1863557612));
REQUIRE(shaper(Float(+0.0)) == Catch::Approx(+0.0));
REQUIRE(shaper(Float(+1.0)) == Catch::Approx(+0.9978904933));
}

TEMPLATE_TEST_CASE("grit/audio/waveshape: DiodeRectifierADAA1", "", float, double)
{
using Float = TestType;

auto shaper = grit::DiodeRectifierADAA1<Float>{};
REQUIRE(shaper(Float(-2.0)) < Float(0));
REQUIRE(shaper(Float(-2.0)) == Catch::Approx(-0.1944248603));

REQUIRE(shaper(Float(-1.5)) < Float(0));
REQUIRE(shaper(Float(-1.5)) == Catch::Approx(-0.1863557612));
}

0 comments on commit f6a6e6f

Please sign in to comment.