60 return y0 + frac * (y1 - y0);
79 assert(length > 0 && position >= T(0) && position <
static_cast<T
>(length));
80 if (length <= 0)
return T(0);
86 if (!(position >= T(0))) { idx0 = 0; frac = T(0); }
87 else if (position >=
static_cast<T
>(length)) { idx0 = length - 1; frac = T(0); }
89 idx0 =
static_cast<int>(position);
90 frac = position -
static_cast<T
>(idx0);
94 if (idx1 >= length) idx1 = 0;
112template <FloatType T>
114 T c = (y2 - y0) * T(0.5);
117 T a = w + v + (y3 - y1) * T(0.5);
119 return (((a * frac) - b) * frac + c) * frac + y1;
137template <FloatType T>
139 assert(length > 0 && position >= T(0) && position <
static_cast<T
>(length));
140 if (length <= 0)
return T(0);
146 if (!(position >= T(0))) { idx1 = 0; frac = T(0); }
147 else if (position >=
static_cast<T
>(length)) { idx1 = length - 1; frac = T(0); }
149 idx1 =
static_cast<int>(position);
150 frac = position -
static_cast<T
>(idx1);
153 int idx0 = (idx1 > 0) ? idx1 - 1 : length - 1;
154 int idx2 = idx1 + 1;
if (idx2 >= length) idx2 -= length;
155 int idx3 = idx2 + 1;
if (idx3 >= length) idx3 -= length;
157 return interpolateHermite(buffer[idx0], buffer[idx1], buffer[idx2], buffer[idx3], frac);
164template <FloatType T>
182template <FloatType T>
190 static constexpr T inv6 = T(1.0 / 6.0);
191 static constexpr T inv2 = T(0.5);
193 T l0 = -(d * dm1 * dm2) * inv6;
194 T l1 = (dp1 * dm1 * dm2) * inv2;
195 T l2 = -(dp1 * d * dm2) * inv2;
196 T l3 = (dp1 * d * dm1) * inv6;
198 return l0 * y0 + l1 * y1 + l2 * y2 + l3 * y3;
216template <FloatType T>
218 assert(length > 0 && position >= T(0) && position <
static_cast<T
>(length));
219 if (length <= 0)
return T(0);
225 if (!(position >= T(0))) { idx1 = 0; frac = T(0); }
226 else if (position >=
static_cast<T
>(length)) { idx1 = length - 1; frac = T(0); }
228 idx1 =
static_cast<int>(position);
229 frac = position -
static_cast<T
>(idx1);
232 int idx0 = (idx1 > 0) ? idx1 - 1 : length - 1;
233 int idx2 = idx1 + 1;
if (idx2 >= length) idx2 -= length;
234 int idx3 = idx2 + 1;
if (idx3 >= length) idx3 -= length;
265template <FloatType T>
267 T frac, T& state)
noexcept
273 T safeFrac = (frac < T(0.001)) ? T(0.001) : frac;
274 T coeff = (T(1) - safeFrac) / (T(1) + safeFrac);
276 T output = coeff * (currentSample - state) + previousSample;
280 if (std::abs(output) < T(1e-15)) output = T(0);
Core mathematical utilities for digital signal processing.
Main namespace for the DSPark framework.
T interpolateCubic(const T *buffer, int length, T position) noexcept
Alias of interpolateHermite (Catmull-Rom evaluated in Hermite form). Kept for backward compatibility.
T interpolateHermite(T y0, T y1, T y2, T y3, T frac) noexcept
4-point, 3rd-order Hermite interpolation (optimized x-form).
T interpolateLinear(T y0, T y1, T frac) noexcept
Linear interpolation between two adjacent samples.
T interpolateLagrange(T y0, T y1, T y2, T y3, T frac) noexcept
4-point Lagrange interpolation from discrete samples.
T interpolateAllpass(T currentSample, T previousSample, T frac, T &state) noexcept
Allpass interpolation (first-order Thiran) for fractional delay.