17 constexpr
double kPi = 3.14159265358979323846;
68 : startIndex(startIndex)
69 , sampleCount(sampleCount)
92 if (outputRangeStart < outputRangeEnd)
94 return {outputRangeStart, outputRangeEnd - outputRangeStart};
113 return {outputRangeStart, outputRangeEnd - outputRangeStart};
126 template <
typename SampleTypeArg,
size_t SampleRateArg,
size_t ChannelCountArg = 1>
129 static_assert(ChannelCountArg != 0,
"Channel count can't be zero.");
130 static_assert(SampleRateArg != 0,
"Sample rate cannot be zero.");
133 static constexpr
size_t SampleRate = SampleRateArg;
134 static constexpr
size_t ChannelCount = ChannelCountArg;
142 template <
typename IntegralType>
145 static_assert(std::is_integral<IntegralType>::value,
"Must be an integral type.");
146 return 1 << ((
sizeof(IntegralType) * 8) - 1);
156 template <
typename SampleType>
157 std::enable_if_t<std::is_floating_point<SampleType>::value, SampleType>
ClampAndCastSample(
double input)
161 return static_cast<SampleType
>(1.0);
166 return static_cast<SampleType
>(-1.0);
169 return static_cast<SampleType
>(input);
178 template <
typename SampleType>
181 if (input > std::numeric_limits<SampleType>::max())
183 return std::numeric_limits<SampleType>::max();
186 if (input < std::numeric_limits<SampleType>::min())
188 return std::numeric_limits<SampleType>::min();
191 return static_cast<SampleType
>(input);
201 template <
typename Generator,
size_t Length>
207 for (
size_t i = 0; i < Length; i++)
209 mValues[i] = Generator::Generate(i, Length);
213 typename Generator::ReturnType
operator[](
size_t index)
const 215 assert(index < mValues.size());
217 return mValues[index];
221 std::array<typename Generator::ReturnType, Length>
mValues;
239 template <
typename FirstGenerator,
typename SecondGenerator>
242 static_assert(std::is_same<typename FirstGenerator::ReturnType, typename SecondGenerator::ReturnType>::value,
"Factors of ProductGenerator must return the same type.");
247 return FirstGenerator::Generate(index, length) * SecondGenerator::Generate(index, length);
258 template <
typename InputGenerator,
size_t SamplingInterval>
265 size_t cycleCount = length / SamplingInterval;
266 size_t intervalCount = index % cycleCount;
267 size_t shift = index / cycleCount;
269 size_t cycledIndex = intervalCount * SamplingInterval + shift;
271 return InputGenerator::Generate(cycledIndex, length);
279 template <
typename SincFunctionParameters>
286 if (index * 2 == length + 1)
292 double time =
static_cast<double>(index) / static_cast<double>(length - 1);
297 time *=
static_cast<double>(SincFunctionParameters::Range);
299 double x = 2.0 * kPi * time * SincFunctionParameters::Cutoff;
301 return std::sin(x) / x;
309 template <
typename Parameters>
319 constexpr
double epsilon = 1E-21;
320 double halfXSquared = x * x / 4.0;
322 double sigmaTerm = 1.0;
323 double sigma = sigmaTerm;
325 for (
double sigmaIndex = 1.0; sigmaTerm > sigma * epsilon; sigmaIndex++)
328 sigmaTerm *= halfXSquared;
329 sigmaTerm /= (sigmaIndex * sigmaIndex);
340 double windowLengthMinusOne =
static_cast<double>(Parameters::Length - 1);
341 double position =
static_cast<double>(index) * static_cast<double>(windowLengthMinusOne) /
static_cast<double>(length);
343 double value = 2 * position - windowLengthMinusOne;
344 value /= windowLengthMinusOne;
348 value *= Parameters::Beta;
349 value = BesselFunction(value);
350 value /= BesselFunction(Parameters::Beta);
SampleRange ExtendSampleRange(SampleRange range, SampleRange extension)
Definition: dsputilities.h:106
std::enable_if_t< std::is_floating_point< SampleType >::value, SampleType > ClampAndCastSample(double input)
Definition: dsputilities.h:157
Generator::ReturnType operator[](size_t index) const
Definition: dsputilities.h:213
Definition: dsputilities.h:202
double ReturnType
Definition: dsputilities.h:282
typename InputGenerator::ReturnType ReturnType
Definition: dsputilities.h:261
static ReturnType Generate(size_t index, size_t length)
Definition: dsputilities.h:338
constexpr double kPi
Definition: dsputilities.h:17
size_t sampleCount
Definition: dsputilities.h:80
Definition: dsputilities.h:259
JSON (JavaScript Object Notation).
Definition: adsapi.h:16
#define assert(expr)
Definition: assertion.h:47
static ReturnType Generate(size_t index, size_t length)
Definition: dsputilities.h:263
Definition: dsputilities.h:310
Definition: dsputilities.h:60
Definition: dsputilities.h:240
SampleRange()
Definition: dsputilities.h:62
size_t startIndex
Definition: dsputilities.h:75
std::array< typename Generator::ReturnType, Length > mValues
Definition: dsputilities.h:221
Definition: dsputilities.h:280
typename FirstGenerator::ReturnType ReturnType
Definition: dsputilities.h:243
double ReturnType
Definition: dsputilities.h:312
SampleRange IntersectSampleRanges(SampleRange firstRange, SampleRange secondRange)
Definition: dsputilities.h:87
constexpr size_t BisectRange()
Definition: dsputilities.h:143
static ReturnType Generate(size_t index, size_t length)
Definition: dsputilities.h:245
SampleRange(size_t startIndex, size_t sampleCount)
Definition: dsputilities.h:67
LookupTable()
Definition: dsputilities.h:205
static ReturnType Generate(size_t index, size_t length)
Definition: dsputilities.h:284
static double BesselFunction(double x)
Definition: dsputilities.h:317