30 std::expected<RealType, std::string> besselI0(
const RealType x)
36 return std::unexpected(
"Modified Bessel approximation only valid for x > 0");
42 t * (3.5156229 + t * (3.0899424 + t * (1.2067492 + t * (0.2659732 + t * (0.0360768 + t * 0.0045813)))));
55 t * (-0.02057706 + t * (0.02635537 + t * (-0.01647633 + t * 0.00392377)))))));
56 return i0 * std::exp(x) / std::sqrt(x);
71 if (x < 0 || x > _alpha * 2)
75 if (
auto bessel = besselI0(_beta * std::sqrt(1 - std::pow((x - _alpha) / _alpha, 2))); bessel)
77 return *bessel / _bessel_beta;
81 return std::unexpected(bessel.error());
87 if (
auto kaiser = kaiserWinCompute(x + _alpha); kaiser)
89 return *kaiser * sinc(x);
93 return std::unexpected(kaiser.error());
97 InterpFilter::InterpFilter()
100 _table_filters = 1000;
101 _filter_table = std::vector<RealType>(_table_filters * _length);
104 if (
auto bessel = besselI0(_beta); bessel)
106 _bessel_beta = *bessel;
110 LOG(Level::FATAL,
"Bessel function calculation failed: {}", bessel.error());
111 throw std::runtime_error(
"Bessel function calculation failed");
114 const int hfilt = _table_filters / 2;
116 LOG(Level::DEBUG,
"Building table of {} filters", _table_filters);
118 for (
int i = -hfilt; i < hfilt; ++i)
121 for (
int j =
static_cast<int>(-_alpha); j < _alpha; ++j)
125 _filter_table[(i + hfilt) * _length + j +
static_cast<int>(_alpha)] = *
interp;
129 LOG(Level::FATAL,
"Interpolation filter calculation failed: {}",
interp.error());
130 throw std::runtime_error(
"Interpolation filter calculation failed");
135 LOG(Level::DEBUG,
"Filter table complete");
140 if (delay < -1 || delay > 1)
142 LOG(Level::FATAL,
"Requested delay filter value out of range: {}", delay);
143 throw std::runtime_error(
"Requested delay filter value out of range");
146 const auto filt =
static_cast<unsigned>((delay + 1) * (_table_filters / 2.0));
147 return std::span{&_filter_table[filt * _length],
static_cast<size_t>(_length)};
Provides methods to generate interpolation filters using Kaiser windows.
static InterpFilter & getInstance() noexcept
Retrieves the singleton instance of the InterpFilter class.
std::span< const RealType > getFilter(RealType delay) const
Retrieves a span of precomputed filter values for a given delay.
std::expected< RealType, std::string > kaiserWinCompute(RealType x) const noexcept
Computes the Kaiser window function for a given input.
std::expected< RealType, std::string > interpFilter(RealType x) const noexcept
Computes the interpolation filter value for a given input.
double RealType
Type for real numbers.
Interpolation filter implementation using Kaiser windowing.
Header file for the logging system.
unsigned renderFilterLength() noexcept
Get the render filter length.
Defines the Parameters struct and provides methods for managing simulation parameters.