38 std::complex<double>
Low;
45 std::complex<double>
Low;
61 float s1 = 0.0f,
s2 = 0.0f;
64 [[nodiscard]]
static JPL_INLINE
Params Prepare(
float sampleRate,
float frequency)
noexcept
66 static constexpr float R = std::numbers::sqrt2_v<float>;
67 const float g = std::tan(JPL_PI * (frequency / sampleRate));
78 using Complex = std::complex<double>;
80 const double omega = 2.0 * std::numbers::pi_v<double> * normalizedFrequency;
82 const Complex q = std::polar(1.0, -omega);
83 const Complex u = Complex(1.0, 0.0) - q;
84 const Complex v = Complex(1.0, 0.0) + q;
86 const double g = params.
g;
87 static constexpr double R = std::numbers::sqrt2_v<double>;
89 const Complex denominator = u * u + R * g * u * v + g * g * v * v;
92 .Low = g * g * v * v / denominator,
93 .Band = g * u * v / denominator,
94 .High = u * u / denominator
98 JPL_INLINE
void Reset() noexcept {
s1 = 0.0f;
s2 = 0.0f; }
100 JPL_INLINE
void Process(
const Params& params,
float x,
float& yL,
float& yB,
float& yH)
noexcept
153 static constexpr float minusR = -std::numbers::sqrt2_v<float>;
155 Process(params, x, yL, yB, yH);
177 static const simd R = std::numbers::sqrt2_v<float>;
178 const simd g =
tan(JPL_PI * (frequency / sampleRate));
187 JPL_INLINE
void Reset() noexcept {
s1 = 0.0f;
s2 = 0.0f; }
225 static const simd minusR = -std::numbers::sqrt2_v<float>;
227 Process(params, x, yL, yB, yH);
237 JPL_INLINE
void Prepare(
float sampleRate,
float frequency)
noexcept
247 [[nodiscard]] JPL_INLINE
float Process(
float x)
noexcept
249 static constexpr float minusR = -std::numbers::sqrt2_v<float>;
258 return response.
Low - std::numbers::sqrt2_v<double> * response.
Band + response.
High;
294 JPL_INLINE
void Prepare(
float sampleRate,
float frequency)
noexcept
296 frequency = std::clamp(frequency, 1.0f, 0.49f * sampleRate);
307 [[nodiscard]] JPL_INLINE
float ProcessLP(
float x)
noexcept
320 [[nodiscard]] JPL_INLINE
float ProcessHP(
float x)
noexcept
336 JPL_INLINE
void Process(
float x,
float& low,
float& high)
noexcept
338 static constexpr float minusR = -std::numbers::sqrt2_v<float>;
351 high =
Math::FMA(minusR, yB, yL + yH - yL2);
358 const std::complex<double> allpass = svf.
Low - std::numbers::sqrt2_v<double> * svf.
Band + svf.
High;
359 const auto low = svf.
Low * svf.
Low;
360 const auto high = allpass - low;
392 JPL_INLINE
void Prepare(
float sampleRate,
float f1,
float f3)
noexcept
398 simd(0.49f) * sampleRate);
434 const simd x(low, high, low, high);
459 JPL_INLINE
void Process(
float low,
float high,
simd& out_b1234)
noexcept
480 X13.
Prepare(sampleRate, splits.F1, splits.F3);
514 inline void ProcessBlock(std::span<const float> in, std::span<simd> outBands)
noexcept
518 for (
size_t i = 0; i < in.size(); ++i)
525 inline void ProcessBlock(std::span<const float> in,
simd gains, std::span<float> out)
noexcept
535 for (
size_t i = 0; i < in.size(); ++i)
542 out[i] = low * gains[0] + high * gains[3];
550 out[i] = (bands * gains).reduce();
560 std::span<float> out)
noexcept
570 const simd increment = (endGains - startGains) /
static_cast<float>(in.size());
572 for (
size_t i = 0; i < in.size(); ++i)
583 out[i] = (bands * startGains).reduce();
585 startGains += increment;
591 using Complex = std::complex<double>;
597 const Complex A1 = L1 + H1;
598 const Complex A3 = L3 + H3;
600 const Complex total =
601 double(gains[0]) * L2 * L1 * A3 +
602 double(gains[1]) * L2 * H1 * A3 +
603 double(gains[2]) * H2 * L3 * A1 +
604 double(gains[3]) * H2 * H3 * A1;
#define JPL_ASSERT(inExpression,...)
Main assert macro, usage: JPL_ASSERT(condition, message) or JPL_ASSERT(condition)
Definition ErrorReporting.h:80
JPL_INLINE constexpr T FMA(T a, T b, T c) noexcept
Inlined fuse multiply-add. Compiler in some circumstances is more eager to optimize this than std::fm...
Definition Math.h:186
Definition AcousticMaterial.h:36
JPL_INLINE simd clamp(const simd &value, const simd &minV, const simd &maxV) noexcept
Element-wise clamp.
Definition SIMD.h:1838
constexpr SplitFrequencies cDefaultFrequencySplits
At the moment JPL Spatial uses these frequency sptits for sound propagation.
Definition FrequencyBands.h:53
JPL_INLINE simd reverse(const simd &vec) noexcept
Reverse the order of the lanes.
Definition SIMD.h:2005
JPL_INLINE simd combine_lohi(const simd &a, const simd &b) noexcept
Combine two low lanes of a and two high lanes from b as { a0, a1, b2, b3 }.
Definition SIMD.h:1994
JPL_INLINE simd interleave_lohi(const simd &vec) noexcept
Interleave two low lanes with the two high lanes (e.g. { 0, 1, 2, 3 } -> { 0, 2, 1,...
Definition SIMD.h:1950
JPL_INLINE simd combine_lo(const simd &a, const simd &b) noexcept
Combine two low lanes of input a and b as { a0, a1, b0, b1 }.
Definition SIMD.h:1962
simd tan(simd x) noexcept
Definition SIMDMath.h:643
4th order Linkwitz-Riley 4-band crossover
Definition CrossoverFilter.h:469
JPL_INLINE simd SplitSample(float sample) noexcept
Definition CrossoverFilter.h:502
void ProcessBlock(std::span< const float > in, simd startGains, simd endGains, std::span< float > out) noexcept
Definition CrossoverFilter.h:557
void ProcessBlock(std::span< const float > in, simd gains, std::span< float > out) noexcept
Definition CrossoverFilter.h:525
void SplitSample(float sample, simd &outBands) noexcept
Definition CrossoverFilter.h:491
void ProcessBlock(std::span< const float > in, std::span< simd > outBands) noexcept
Definition CrossoverFilter.h:514
JPL_INLINE float ProcessSample(float sample, simd gains) noexcept
Definition CrossoverFilter.h:508
static std::complex< double > CalculateResponse(double sampleRate, double normalizedFrequency, std::span< const float, 4 > gains, SplitFrequencies splits=cDefaultFrequencySplits)
Definition CrossoverFilter.h:589
JPL_INLINE void Prepare(float sampleRate, SplitFrequencies splits=cDefaultFrequencySplits) noexcept
Definition CrossoverFilter.h:477
LR4Split X2
Definition CrossoverFilter.h:471
JPL_INLINE void Reset() noexcept
Definition CrossoverFilter.h:485
LR4Split2Lanes X13
Definition CrossoverFilter.h:475
Definition CrossoverFilter.h:44
std::complex< double > Low
Definition CrossoverFilter.h:45
std::complex< double > High
Definition CrossoverFilter.h:46
Definition CrossoverFilter.h:377
JPL_INLINE void Reset() noexcept
Definition CrossoverFilter.h:412
TPTSVFStageSIMD Stage1
Definition CrossoverFilter.h:378
TPTSVFStageSIMD Stage2
Definition CrossoverFilter.h:379
JPL_INLINE void Process(float low, float high, simd &out_b1234) noexcept
Definition CrossoverFilter.h:459
JPL_INLINE void Prepare(float sampleRate, float f1, float f3) noexcept
Definition CrossoverFilter.h:392
TPTSVFAllpassSIMD AllpassEqualizer
Definition CrossoverFilter.h:384
JPL_INLINE void ProcessInterleaved(float low, float high, simd &out_b1324) noexcept
Definition CrossoverFilter.h:423
TPTSVFStageSIMD::Params Params
Definition CrossoverFilter.h:387
4th order Linkwitz-Riley crossover
Definition CrossoverFilter.h:288
JPL_INLINE float ProcessLP(float x) noexcept
Definition CrossoverFilter.h:307
JPL_INLINE void Reset() noexcept
Definition CrossoverFilter.h:301
JPL_INLINE void Prepare(float sampleRate, float frequency) noexcept
Definition CrossoverFilter.h:294
JPL_INLINE void Process(float x, float &low, float &high) noexcept
Definition CrossoverFilter.h:336
JPL_INLINE float ProcessHP(float x) noexcept
Definition CrossoverFilter.h:320
StateVariableFilterTPT::Params Params
Definition CrossoverFilter.h:292
StateVariableFilterTPT Stage2
Definition CrossoverFilter.h:290
StateVariableFilterTPT Stage1
Definition CrossoverFilter.h:289
static LR4Response CalculateResponse(const typename StateVariableFilterTPT::Params ¶ms, double normalizedFrequency)
Definition CrossoverFilter.h:355
Definition CrossoverFilter.h:37
std::complex< double > Band
Definition CrossoverFilter.h:39
std::complex< double > High
Definition CrossoverFilter.h:40
std::complex< double > Low
Definition CrossoverFilter.h:38
Split frequencies points for crossover.
Definition FrequencyBands.h:46
Definition CrossoverFilter.h:54
float g
Definition CrossoverFilter.h:55
float d
Definition CrossoverFilter.h:56
float MinusRg
Definition CrossoverFilter.h:57
State Variable Filter with Topology-Preserving Transform structure.
Definition CrossoverFilter.h:52
JPL_INLINE void Reset() noexcept
Definition CrossoverFilter.h:98
static SVFResponse CalculateResponse(const Params ¶ms, double normalizedFrequency)
Definition CrossoverFilter.h:76
float s1
Definition CrossoverFilter.h:61
JPL_INLINE void Process(const Params ¶ms, float x, float &yL, float &yB, float &yH) noexcept
Definition CrossoverFilter.h:100
JPL_INLINE void ProcessBP(const Params ¶ms, float x, float &yB)
Definition CrossoverFilter.h:139
JPL_INLINE void ProcessBPLP(const Params ¶ms, float x, float &yL, float &yB)
Definition CrossoverFilter.h:114
JPL_INLINE void ProcessBPHP(const Params ¶ms, float x, float &yB, float &yH)
Definition CrossoverFilter.h:126
static JPL_INLINE Params Prepare(float sampleRate, float frequency) noexcept
Prepare parameters for a TPT SVGF Stage.
Definition CrossoverFilter.h:64
JPL_INLINE void ProcessAP(const Params ¶ms, float x, float &yAP)
Definition CrossoverFilter.h:151
float s2
Definition CrossoverFilter.h:61
Definition CrossoverFilter.h:264
JPL_INLINE void Prepare(const simd &sampleRate, const simd &frequency) noexcept
Definition CrossoverFilter.h:267
TPTSVFStageSIMD::Params Params
Definition CrossoverFilter.h:265
JPL_INLINE simd Process(const simd &x) noexcept
Definition CrossoverFilter.h:277
JPL_INLINE void Reset() noexcept
Definition CrossoverFilter.h:272
Definition CrossoverFilter.h:234
StateVariableFilterTPT::Params Params
Definition CrossoverFilter.h:235
JPL_INLINE void Reset() noexcept
Definition CrossoverFilter.h:242
JPL_INLINE void Prepare(float sampleRate, float frequency) noexcept
Definition CrossoverFilter.h:237
static auto CalculateResponse(const typename StateVariableFilterTPT::Params ¶ms, double normalizedFrequency)
Definition CrossoverFilter.h:255
JPL_INLINE float Process(float x) noexcept
Definition CrossoverFilter.h:247
Definition CrossoverFilter.h:166
simd d
Definition CrossoverFilter.h:168
simd MinusRg
Definition CrossoverFilter.h:169
simd g
Definition CrossoverFilter.h:167
Definition CrossoverFilter.h:164
JPL_INLINE void Reset() noexcept
Definition CrossoverFilter.h:187
JPL_INLINE void ProcessBP(const Params ¶ms, simd x, simd &yB)
Definition CrossoverFilter.h:215
static JPL_INLINE Params Prepare(const simd &sampleRate, const simd &frequency) noexcept
Definition CrossoverFilter.h:175
JPL_INLINE void ProcessBPLP(const Params ¶ms, simd x, simd &yL, simd &yB)
Definition CrossoverFilter.h:199
JPL_INLINE void ProcessAP(const Params ¶ms, simd x, simd &yAP)
Definition CrossoverFilter.h:223
simd s1
Definition CrossoverFilter.h:173
JPL_INLINE void ProcessBPHP(const Params ¶ms, simd x, simd &yB, simd &yH)
Definition CrossoverFilter.h:207
simd s2
Definition CrossoverFilter.h:173
JPL_INLINE void Process(const Params ¶ms, const simd &x, simd &yL, simd &yB, simd &yH) noexcept
Definition CrossoverFilter.h:189
Minimal 4-wide 32-bit float vector implementation for SIMD.
Definition SIMD.h:60
static JPL_INLINE simd c_1() noexcept
Definition SIMD.h:461