Pulp 1.88.0
Cross-platform audio plugin framework
Loading...
Searching...
No Matches
sample_mip_builder.hpp
Go to the documentation of this file.
1#pragma once
2
4
5#include <algorithm>
6#include <cstdint>
7#include <vector>
8
9namespace pulp::audio {
10
11inline std::vector<double> design_sample_mip_decimator() {
12 constexpr double stopband_db = 140.0;
13 const auto beta = signal::kaiser_beta_for_stopband(stopband_db);
14 const auto taps = signal::kaiser_length_for_transition(stopband_db, 0.025);
15 return signal::design_windowed_sinc(taps, 0.2375, beta);
16}
17
18inline void decimate_sample_mip_2x(const float* input,
19 std::uint64_t input_frames,
20 float* output,
21 std::uint64_t output_frames,
22 const std::vector<double>& coefficients) noexcept {
23 if (input == nullptr || output == nullptr || input_frames == 0 ||
24 coefficients.empty() || (coefficients.size() & 1u) == 0u) {
25 return;
26 }
27 const auto radius = static_cast<std::int64_t>(coefficients.size() / 2);
28 const auto last = static_cast<std::int64_t>(input_frames - 1);
29 for (std::uint64_t frame = 0; frame < output_frames; ++frame) {
30 const auto center = static_cast<std::int64_t>(frame * 2);
31 double sum = static_cast<double>(input[std::clamp(
32 center, std::int64_t{0}, last)]) * coefficients[static_cast<std::size_t>(radius)];
33 for (std::int64_t tap = 1; tap <= radius; ++tap) {
34 const auto before = std::clamp(center - tap, std::int64_t{0}, last);
35 const auto after = std::clamp(center + tap, std::int64_t{0}, last);
36 sum += (static_cast<double>(input[before]) +
37 static_cast<double>(input[after])) *
38 coefficients[static_cast<std::size_t>(radius + tap)];
39 }
40 output[frame] = static_cast<float>(sum);
41 }
42}
43
44} // namespace pulp::audio
Definition analyzer_provider.hpp:12
void decimate_sample_mip_2x(const float *input, std::uint64_t input_frames, float *output, std::uint64_t output_frames, const std::vector< double > &coefficients) noexcept
Definition sample_mip_builder.hpp:18
std::vector< double > design_sample_mip_decimator()
Definition sample_mip_builder.hpp:11
std::size_t kaiser_length_for_transition(double stopband_db, double normalized_width)
Definition windowed_sinc_design.hpp:36
std::vector< double > design_windowed_sinc(std::size_t taps, double cutoff, double beta)
Definition windowed_sinc_design.hpp:58
double kaiser_beta_for_stopband(double stopband_db)
Definition windowed_sinc_design.hpp:27
Shared Kaiser-windowed-sinc FIR design helpers.