25 _rng_engine(rngEngine)
27 const RealType beta = -(alpha - 2) / 2.0;
28 const int fint =
static_cast<int>(std::floor(beta));
29 const RealType ffrac = std::fmod(beta, 1.0);
31 createTree(ffrac, fint, branches);
33 _scale = 1.0 / std::pow(10.0, (-alpha + 2.0) * 2.0);
44 if (
const int skip_branches =
static_cast<int>(std::log10(
static_cast<double>(samples))) - 1; skip_branches > 0)
46 std::vector<FAlphaBranch*> flushbranches;
49 for (
int i = 0; i < skip_branches && (branch !=
nullptr); ++i)
51 flushbranches.push_back(branch);
55 if (branch !=
nullptr)
57 const auto reduced_samples =
58 samples /
static_cast<std::size_t
>(std::pow(10.0,
static_cast<double>(skip_branches)));
59 for (std::size_t i = 0; i < reduced_samples; ++i)
65 for (
const auto& fb : std::ranges::reverse_view(flushbranches))
72 for (std::size_t i = 0; i < samples; ++i)
74 _topbranch->getSample();
79 void MultirateGenerator::createTree(
const RealType fAlpha,
const int fInt,
const unsigned branches)
81 std::unique_ptr<FAlphaBranch> previous_branch =
nullptr;
82 for (
unsigned i = 0; i < branches; ++i)
84 previous_branch = std::make_unique<FAlphaBranch>(_rng_engine.get(), fAlpha, fInt,
85 std::move(previous_branch), i == branches - 1);
87 _topbranch = std::move(previous_branch);
93 std::vector<FAlphaBranch*> branches;
96 while (branch !=
nullptr)
98 branches.push_back(branch);
102 for (
const auto& b : std::ranges::reverse_view(branches))
109 const std::vector<RealType>& inWeights,
const RealType frequency,
111 int branches) noexcept :
112 _rng_engine(rngEngine), _weights(inWeights), _phase_offset(phaseOffset), _freq_offset(freqOffset),
113 _frequency(frequency)
115 for (
size_t i = 0; i < alpha.size(); ++i)
117 auto mgen = std::make_unique<MultirateGenerator>(_rng_engine.get(), alpha[i], branches);
118 _generators.push_back(std::move(mgen));
120 switch (
static_cast<int>(alpha[i]))
123 _weights[i] *= std::pow(10.0, 1.225);
126 _weights[i] *= std::pow(10.0, 0.25);
129 _weights[i] *= std::pow(10.0, -0.25);
132 _weights[i] *= std::pow(10.0, -0.5);
135 _weights[i] *= std::pow(10.0, -1.0);
146 for (
size_t i = 0; i < _generators.size(); ++i)
148 sample += _generators[i]->getSample() * _weights[i];
151 sample += _phase_offset;
152 sample += 2 *
PI * _freq_offset *
static_cast<double>(_count) /
params::rate();
160 for (
const auto& generator : _generators)
162 generator->skipSamples(samples);
171 for (
const auto& generator : _generators)
180 return !_generators.empty() || _freq_offset != 0 || _phase_offset != 0;
void reset()
Resets the noise generator state.
bool enabled() const
Checks if the noise generator is enabled.
ClockModelGenerator(std::mt19937 &rngEngine, const std::vector< RealType > &alpha, const std::vector< RealType > &inWeights, RealType frequency, RealType phaseOffset, RealType freqOffset, int branches) noexcept
Constructor to initialize the clock model generator.
RealType getSample() override
Generates a clock model noise sample.
void skipSamples(std::size_t samples)
Skips a number of samples in the noise sequence.
Class responsible for generating fractional and integer noise components.
FAlphaBranch * getPre() const noexcept
Retrieves the previous branch in the chain.
void flush(RealType scale)
Flushes the branch with a new scaling factor.
RealType getSample() noexcept
Retrieves the current noise sample.
MultirateGenerator(std::mt19937 &rngEngine, RealType alpha, unsigned branches)
Constructor to initialize the multirate generator.
void reset() noexcept
Resets the noise generator state.
void skipSamples(std::size_t samples) noexcept
Skips a number of samples in the noise sequence.
double RealType
Type for real numbers.
constexpr RealType PI
Mathematical constant π (pi).
Implementation of the FAlphaBranch class for noise generation.
RealType rate() noexcept
Get the rendering sample rate.
Header file for noise generator classes.
Defines the Parameters struct and provides methods for managing simulation parameters.