Skip to content

Commit

Permalink
Remove Hertz alias
Browse files Browse the repository at this point in the history
  • Loading branch information
tobiashienzsch committed May 12, 2024
1 parent 82adb1b commit df55181
Show file tree
Hide file tree
Showing 11 changed files with 97 additions and 57 deletions.
12 changes: 8 additions & 4 deletions src/ra/acoustics/absorber/porous_absorber.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,12 @@
#include <numbers>

namespace ra {
auto propertiesOfAbsorber(PorousAbsorberSpecs specs, AtmosphericEnvironment env, Hertz<double> frequency, double angle)
-> PorousAbsorberProperties
auto propertiesOfAbsorber(
PorousAbsorberSpecs specs,
AtmosphericEnvironment env,
si::frequency<si::hertz> frequency,
double angle
) -> PorousAbsorberProperties
{
auto const airDensity = densityOfAir(env.temperature, env.pressure);
auto const airIm = impedanceOfAir(env.temperature, env.pressure);
Expand Down Expand Up @@ -58,15 +62,15 @@ auto propertiesOfAbsorber(PorousAbsorberSpecs specs, AtmosphericEnvironment env,

namespace detail {

auto waveNumber(si::thermodynamic_temperature<si::kelvin> temperature, Hertz<double> frequency) -> double
auto waveNumber(si::thermodynamic_temperature<si::kelvin> temperature, si::frequency<si::hertz> frequency) -> double
{
// 2p/l
return ((2.0 * std::numbers::pi) / soundVelocity(temperature).number()) * frequency.number();
}

auto delanyBazleyTerm(
si::density<si::kilogram_per_metre_cub> airDensity,
Hertz<double> frequency,
si::frequency<si::hertz> frequency,
double flowResistivity
) -> double
{
Expand Down
18 changes: 12 additions & 6 deletions src/ra/acoustics/absorber/porous_absorber.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -85,16 +85,22 @@ struct PorousAbsorberProperties
double absorptionFactorWithAirGap{};
};

[[nodiscard]] auto
propertiesOfAbsorber(PorousAbsorberSpecs specs, AtmosphericEnvironment env, Hertz<double> frequency, double angle)
-> PorousAbsorberProperties;
[[nodiscard]] auto propertiesOfAbsorber(
PorousAbsorberSpecs specs,
AtmosphericEnvironment env,
si::frequency<si::hertz> frequency,
double angle
) -> PorousAbsorberProperties;

namespace detail {

[[nodiscard]] auto waveNumber(si::thermodynamic_temperature<si::kelvin> temperature, Hertz<double> frequency) -> double;
[[nodiscard]] auto
delanyBazleyTerm(si::density<si::kilogram_per_metre_cub> airDensity, Hertz<double> frequency, double flowResistivity)
-> double;
waveNumber(si::thermodynamic_temperature<si::kelvin> temperature, si::frequency<si::hertz> frequency) -> double;
[[nodiscard]] auto delanyBazleyTerm(
si::density<si::kilogram_per_metre_cub> airDensity,
si::frequency<si::hertz> frequency,
double flowResistivity
) -> double;
[[nodiscard]] auto yComponentOfWaveNumber(double waveNumber, double angle) -> double;
[[nodiscard]] auto angleOfPropagation(std::complex<double> k, double ky) -> double;

Expand Down
76 changes: 54 additions & 22 deletions src/ra/acoustics/absorber/porous_absorber.test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@ TEST_CASE("RaumAkustik: propertiesOfAbsorber", "")
{

{
auto const props = ra::propertiesOfAbsorber({100.0, 8'000.0, 100.0}, C20, ra::Hertz<double>{50.0}, 0.0);
auto const props
= ra::propertiesOfAbsorber({100.0, 8'000.0, 100.0}, C20, ra::si::frequency<ra::si::hertz>{50.0}, 0.0);
REQUIRE(props.X == Catch::Approx(0.0075257395));
REQUIRE(props.zca.real() == Catch::Approx(1355.71904994104));
REQUIRE(props.zca.imag() == Catch::Approx(-1289.23418591288));
Expand Down Expand Up @@ -53,7 +54,7 @@ TEST_CASE("RaumAkustik: propertiesOfAbsorber", "")
}

{
auto const props = ra::propertiesOfAbsorber({100.0, 8'000.0}, C22, ra::Hertz<double>{50.0}, 0.0);
auto const props = ra::propertiesOfAbsorber({100.0, 8'000.0}, C22, ra::si::frequency<ra::si::hertz>{50.0}, 0.0);
REQUIRE(props.X == Catch::Approx(0.0074747434));
REQUIRE(props.zca.real() == Catch::Approx(1355.9444611324));
REQUIRE(props.zca.imag() == Catch::Approx(-1291.26947073563));
Expand All @@ -62,7 +63,8 @@ TEST_CASE("RaumAkustik: propertiesOfAbsorber", "")
}

{
auto const props = ra::propertiesOfAbsorber({100.0, 8'000.0, 100.0}, C22, ra::Hertz<double>{50.0}, 15.0);
auto const props
= ra::propertiesOfAbsorber({100.0, 8'000.0, 100.0}, C22, ra::si::frequency<ra::si::hertz>{50.0}, 15.0);
REQUIRE(props.X == Catch::Approx(0.0074747434));
REQUIRE(props.zca.real() == Catch::Approx(1355.9444611324));
REQUIRE(props.zca.imag() == Catch::Approx(-1291.26947073563));
Expand All @@ -73,43 +75,73 @@ TEST_CASE("RaumAkustik: propertiesOfAbsorber", "")

TEST_CASE("RaumAkustik: detail::waveNumber", "")
{
REQUIRE(ra::detail::waveNumber(ra::celciusToKelvin(20.0), ra::Hertz<double>{50.0}) == Catch::Approx(0.9149));
REQUIRE(ra::detail::waveNumber(ra::celciusToKelvin(22.0), ra::Hertz<double>{50.0}) == Catch::Approx(0.9118));
REQUIRE(
ra::detail::waveNumber(ra::celciusToKelvin(20.0), ra::si::frequency<ra::si::hertz>{50.0})
== Catch::Approx(0.9149)
);
REQUIRE(
ra::detail::waveNumber(ra::celciusToKelvin(22.0), ra::si::frequency<ra::si::hertz>{50.0})
== Catch::Approx(0.9118)
);
}

TEST_CASE("RaumAkustik: detail::delanyBazleyTerm", "")
{
{
auto const density = ra::densityOfAir(ra::celciusToKelvin(20.0), ra::OneAtmosphere<double>);
REQUIRE(ra::detail::delanyBazleyTerm(density, ra::Hertz<double>{50.0}, 8'000.0) == Catch::Approx(0.0075257395));
REQUIRE(
ra::detail::delanyBazleyTerm(density, ra::si::frequency<ra::si::hertz>{50.0}, 8'000.0)
== Catch::Approx(0.0075257395)
);
}
{
auto const density = ra::densityOfAir(ra::celciusToKelvin(22.0), ra::OneAtmosphere<double>);
REQUIRE(ra::detail::delanyBazleyTerm(density, ra::Hertz<double>{50.0}, 8'000.0) == Catch::Approx(0.0074747434));
REQUIRE(
ra::detail::delanyBazleyTerm(density, ra::si::frequency<ra::si::hertz>{50.0}, 8'000.0)
== Catch::Approx(0.0074747434)
);
}
}

TEST_CASE("RaumAkustik: detail::yComponentOfWaveNumber", "")
{
using namespace ra::detail;
REQUIRE(yComponentOfWaveNumber(waveNumber(ra::celciusToKelvin(20.0), ra::Hertz<double>{50.0}), 0.0)
== Catch::Approx(0.0));
REQUIRE(yComponentOfWaveNumber(waveNumber(ra::celciusToKelvin(22.0), ra::Hertz<double>{50.0}), 0.0)
== Catch::Approx(0.0));

REQUIRE(yComponentOfWaveNumber(waveNumber(ra::celciusToKelvin(20.0), ra::Hertz<double>{50.0}), 15.0)
== Catch::Approx(0.2367929161));
REQUIRE(yComponentOfWaveNumber(waveNumber(ra::celciusToKelvin(22.0), ra::Hertz<double>{50.0}), 15.0)
== Catch::Approx(0.2359892724));
REQUIRE(
yComponentOfWaveNumber(waveNumber(ra::celciusToKelvin(20.0), ra::si::frequency<ra::si::hertz>{50.0}), 0.0)
== Catch::Approx(0.0)
);
REQUIRE(
yComponentOfWaveNumber(waveNumber(ra::celciusToKelvin(22.0), ra::si::frequency<ra::si::hertz>{50.0}), 0.0)
== Catch::Approx(0.0)
);

REQUIRE(
yComponentOfWaveNumber(waveNumber(ra::celciusToKelvin(20.0), ra::si::frequency<ra::si::hertz>{50.0}), 15.0)
== Catch::Approx(0.2367929161)
);
REQUIRE(
yComponentOfWaveNumber(waveNumber(ra::celciusToKelvin(22.0), ra::si::frequency<ra::si::hertz>{50.0}), 15.0)
== Catch::Approx(0.2359892724)
);
}

TEST_CASE("RaumAkustik: detail::angleOfPropagation", "")
{
auto const specs = ra::PorousAbsorberSpecs{100.0, 8'000.0};
REQUIRE(ra::propertiesOfAbsorber(specs, C20, ra::Hertz<double>{50.0}, 0.0).betaPorous == Catch::Approx(0.0));
REQUIRE(ra::propertiesOfAbsorber(specs, C22, ra::Hertz<double>{50.0}, 0.0).betaPorous == Catch::Approx(0.0));
REQUIRE(ra::propertiesOfAbsorber(specs, C20, ra::Hertz<double>{50.0}, 15.0).betaPorous
== Catch::Approx(2.8036973865));
REQUIRE(ra::propertiesOfAbsorber(specs, C22, ra::Hertz<double>{50.0}, 15.0).betaPorous
== Catch::Approx(2.7931256656));
REQUIRE(
ra::propertiesOfAbsorber(specs, C20, ra::si::frequency<ra::si::hertz>{50.0}, 0.0).betaPorous
== Catch::Approx(0.0)
);
REQUIRE(
ra::propertiesOfAbsorber(specs, C22, ra::si::frequency<ra::si::hertz>{50.0}, 0.0).betaPorous
== Catch::Approx(0.0)
);
REQUIRE(
ra::propertiesOfAbsorber(specs, C20, ra::si::frequency<ra::si::hertz>{50.0}, 15.0).betaPorous
== Catch::Approx(2.8036973865)
);
REQUIRE(
ra::propertiesOfAbsorber(specs, C22, ra::si::frequency<ra::si::hertz>{50.0}, 15.0).betaPorous
== Catch::Approx(2.7931256656)
);
}
4 changes: 2 additions & 2 deletions src/ra/generator/sweep.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@ enum struct SineSweepCurve

struct SineSweep
{
Hertz<double> from{20.0};
Hertz<double> to{20'000.0};
si::frequency<si::hertz> from{20.0};
si::frequency<si::hertz> to{20'000.0};
SineSweepCurve curve{SineSweepCurve::Linear};
std::chrono::milliseconds duration{1'000};
double sampleRate{44'100.0};
Expand Down
6 changes: 3 additions & 3 deletions src/ra/raum_akustik/tabs/absorber_simulation_tab.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
namespace ra {

namespace {
auto positionForFrequency(Hertz<double> const freq) noexcept -> double
auto positionForFrequency(si::frequency<si::hertz> const freq) noexcept -> double
{
return (std::log(freq.number() / 20.0) / std::numbers::ln2) / 10.0;
}
Expand Down Expand Up @@ -94,7 +94,7 @@ auto PorousAbsorberSimulationView::paint(juce::Graphics& g) -> void

g.setColour(juce::Colours::grey.withAlpha(0.5F));
for (auto freq : std::vector{20.0, 40.0, 80.0, 160.0, 320.0, 640.0, 1280.0, 2560.0, 5120.0}) {
auto const freqPos = static_cast<float>(positionForFrequency(Hertz<double>{freq}));
auto const freqPos = static_cast<float>(positionForFrequency(si::frequency<si::hertz>{freq}));
auto const x = static_cast<float>(_plotArea.getX()) + static_cast<float>(_plotArea.getWidth()) * freqPos;
auto const topY = static_cast<float>(_plotArea.getY());
auto const bottomY = static_cast<float>(_plotArea.getBottom());
Expand Down Expand Up @@ -201,7 +201,7 @@ auto PorousAbsorberSimulationView::updateSimulation() -> void
static_cast<double>(_pressure) * OneAtmosphere<double>,
};

auto const startFrequency = Hertz<double>{static_cast<double>(_plotStartFrequency)};
auto const startFrequency = si::frequency<si::hertz>{static_cast<double>(_plotStartFrequency)};
auto const subDivisions = static_cast<double>(_plotOctaveSubdivision);

for (auto i{0}; i < static_cast<int>(_plotNumPoints); ++i) {
Expand Down
2 changes: 1 addition & 1 deletion src/ra/raum_akustik/tabs/absorber_simulation_tab.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ struct PorousAbsorberSimulationView final
juce::CachedValue<double> _plotStartFrequency{_valueTree, "plotStartFrequency", _undoManager};
juce::CachedValue<double> _plotOctaveSubdivision{_valueTree, "plotOctaveSubdivision", _undoManager};

std::vector<std::pair<Hertz<double>, PorousAbsorberProperties>> _props;
std::vector<std::pair<si::frequency<si::hertz>, PorousAbsorberProperties>> _props;

JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(PorousAbsorberSimulationView) // NOLINT
};
Expand Down
4 changes: 2 additions & 2 deletions src/ra/raum_akustik/tabs/generator_tab.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -202,8 +202,8 @@ auto GeneratorTab::resized() -> void
auto GeneratorTab::handleAsyncUpdate() -> void
{
auto const spec = SineSweep{
.from = Hertz<double>{static_cast<double>(_from)},
.to = Hertz<double>{static_cast<double>(_to)},
.from = si::frequency<si::hertz>{static_cast<double>(_from)},
.to = si::frequency<si::hertz>{static_cast<double>(_to)},
.curve = static_cast<bool>(_curve) ? SineSweepCurve::Logarithmic : SineSweepCurve::Linear,
.duration = std::chrono::milliseconds{juce::roundToInt(static_cast<double>(_duration))},
.sampleRate = static_cast<double>(_sampleRate),
Expand Down
4 changes: 2 additions & 2 deletions src/ra/raum_akustik/tool/measurement_recorder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -77,8 +77,8 @@ void MeasurementRecorder::audioDeviceAboutToStart(juce::AudioIODevice* device)
_sampleRate = device->getCurrentSampleRate();

_sweep = generate(SineSweep{
.from = Hertz<double>{20.0},
.to = Hertz<double>{20'000.0},
.from = si::frequency<si::hertz>{20.0},
.to = si::frequency<si::hertz>{20'000.0},
.curve = SineSweepCurve::Logarithmic,
.duration = std::chrono::milliseconds{10'000},
.sampleRate = _sampleRate,
Expand Down
7 changes: 4 additions & 3 deletions src/ra/unit/frequency.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,13 @@

namespace ra {

auto oactaveSubdivision(Hertz<double> startFrequency, double numSubdivisions, double index) -> Hertz<double>
auto oactaveSubdivision(si::frequency<si::hertz> start, double numSubdivisions, double index)
-> si::frequency<si::hertz>
{
return Hertz<double>{std::pow(2.0, std::log2(startFrequency.number()) + index / numSubdivisions)};
return si::frequency<si::hertz>{std::pow(2.0, std::log2(start.number()) + index / numSubdivisions)};
}

auto toAngularVelocity(Hertz<double> hertz) -> si::angular_velocity<si::radian_per_second>
auto toAngularVelocity(si::frequency<si::hertz> hertz) -> si::angular_velocity<si::radian_per_second>
{
static constexpr auto twoPi = std::numbers::pi * 2.0;
return si::angular_velocity<si::radian_per_second>{twoPi * hertz.number()};
Expand Down
7 changes: 2 additions & 5 deletions src/ra/unit/frequency.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,8 @@
namespace ra {
using namespace units::isq;

template<typename T>
using Hertz = si::frequency<si::hertz, T>;

[[nodiscard]] auto
oactaveSubdivision(Hertz<double> startFrequency, double numSubdivisions, double index) -> Hertz<double>;
[[nodiscard]] auto toAngularVelocity(Hertz<double> hertz) -> si::angular_velocity<si::radian_per_second>;
oactaveSubdivision(si::frequency<si::hertz> start, double numSubdivisions, double index) -> si::frequency<si::hertz>;
[[nodiscard]] auto toAngularVelocity(si::frequency<si::hertz> hertz) -> si::angular_velocity<si::radian_per_second>;

} // namespace ra
14 changes: 7 additions & 7 deletions src/ra/unit/frequency.test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,15 @@

TEST_CASE("RaumAkustik: oactaveSubdivision", "")
{
REQUIRE(ra::oactaveSubdivision(ra::Hertz<double>{50.0}, 6, 1).number() == Catch::Approx(56.1231024));
REQUIRE(ra::oactaveSubdivision(ra::Hertz<double>{50.0}, 6, 2).number() == Catch::Approx(62.9960524));
REQUIRE(ra::oactaveSubdivision(ra::si::frequency<ra::si::hertz>{50.0}, 6, 1).number() == Catch::Approx(56.1231024));
REQUIRE(ra::oactaveSubdivision(ra::si::frequency<ra::si::hertz>{50.0}, 6, 2).number() == Catch::Approx(62.9960524));
}

TEST_CASE("RaumAkustik: toAngularVelocity", "")
{
REQUIRE(ra::toAngularVelocity(ra::Hertz<double>{0.0}).number() == Catch::Approx(0.0));
REQUIRE(ra::toAngularVelocity(ra::Hertz<double>{50.0}).number() == Catch::Approx(314.15927));
REQUIRE(ra::toAngularVelocity(ra::Hertz<double>{53.0}).number() == Catch::Approx(333.00882));
REQUIRE(ra::toAngularVelocity(ra::Hertz<double>{56.0}).number() == Catch::Approx(351.85838));
REQUIRE(ra::toAngularVelocity(ra::Hertz<double>{59.0}).number() == Catch::Approx(370.70793));
REQUIRE(ra::toAngularVelocity(ra::si::frequency<ra::si::hertz>{0.0}).number() == Catch::Approx(0.0));
REQUIRE(ra::toAngularVelocity(ra::si::frequency<ra::si::hertz>{50.0}).number() == Catch::Approx(314.15927));
REQUIRE(ra::toAngularVelocity(ra::si::frequency<ra::si::hertz>{53.0}).number() == Catch::Approx(333.00882));
REQUIRE(ra::toAngularVelocity(ra::si::frequency<ra::si::hertz>{56.0}).number() == Catch::Approx(351.85838));
REQUIRE(ra::toAngularVelocity(ra::si::frequency<ra::si::hertz>{59.0}).number() == Catch::Approx(370.70793));
}

0 comments on commit df55181

Please sign in to comment.