24 void load_ir(
const SampleType* ir,
int ir_length,
int block_size = 0) {
25 if (ir ==
nullptr || ir_length <= 0) {
39 block_size_ = block_size > 0 ? block_size : 256;
44 while (fft_size_ < block_size_ + ir_length)
47 fft_ = std::make_unique<FftT<SampleType>>(fft_size_);
53 time_.assign(fft_size_, SampleType{0.0f});
54 std::copy_n(ir, ir_length, time_.begin());
55 ir_spectrum_.assign(fft_size_, SampleType{0.0f});
56 const int half = fft_size_ / 2;
58 ir_spectrum_.data() + half,
59 SampleType{1} /
static_cast<SampleType
>(2 * fft_size_));
62 input_buf_.assign(fft_size_, SampleType{0.0f});
63 output_buf_.assign(fft_size_, SampleType{0.0f});
64 overlap_.assign(fft_size_, SampleType{0.0f});
65 spectrum_.assign(fft_size_, SampleType{0.0f});
71 if (!fft_ || block_size_ <= 0)
74 input_buf_[pos_] = input;
75 SampleType output = output_buf_[pos_];
78 if (pos_ >= block_size_) {
87 void process(
const SampleType* input, SampleType* output,
int num_samples) {
88 for (
int i = 0;
i < num_samples; ++
i)
93 std::fill(input_buf_.begin(), input_buf_.end(), SampleType{0.0f});
94 std::fill(output_buf_.begin(), output_buf_.end(), SampleType{0.0f});
95 std::fill(overlap_.begin(), overlap_.end(), SampleType{0.0f});
100 std::unique_ptr<FftT<SampleType>> fft_;
107 std::vector<SampleType> ir_spectrum_;
108 std::vector<SampleType> spectrum_;
109 std::vector<SampleType> input_buf_;
110 std::vector<SampleType> output_buf_;
111 std::vector<SampleType> overlap_;
112 std::vector<SampleType> time_;
114 void process_block() {
119 const int half = fft_size_ / 2;
120 SampleType* re = spectrum_.data();
121 SampleType* im = re + half;
125 SampleType* time = time_.data();
131 for (
int i = 0;
i < block_size_; ++
i)
132 output_buf_[
i] = time[
i] + overlap_[
i];
133 for (
int i = block_size_;
i < fft_size_; ++
i)
134 overlap_[
i - block_size_] = time[
i] + overlap_[
i];
135 std::fill(overlap_.end() - block_size_, overlap_.end(), SampleType{0.0f});
138 std::fill(input_buf_.begin(), input_buf_.begin() + block_size_, SampleType{0.0f});
Definition overlap_add_convolver.hpp:21
void reset()
Definition overlap_add_convolver.hpp:92
void load_ir(const SampleType *ir, int ir_length, int block_size=0)
Definition overlap_add_convolver.hpp:24
SampleType process(SampleType input)
Definition overlap_add_convolver.hpp:70
void process(const SampleType *input, SampleType *output, int num_samples)
Definition overlap_add_convolver.hpp:87
void multiply_packed_split(const SampleType *a_re, const SampleType *a_im, const SampleType *b_re, const SampleType *b_im, SampleType *out_re, SampleType *out_im, int half) noexcept
Product of two packed split spectra of half = size() / 2 slots each (see FftRealSplit): bin k of out ...
Definition fft.hpp:1111
Definition additive_bank.hpp:218
ConvolverT< double > Convolver64
Definition overlap_add_convolver.hpp:143
@ i
Definition formant_filter_bank.hpp:20
ConvolverT< float > Convolver
Definition overlap_add_convolver.hpp:142
static void inverse(const FftT< SampleType > &fft, const SampleType *re, const SampleType *im, SampleType *output, SampleType scale)
Definition fft.hpp:1099
static void forward(const FftT< SampleType > &fft, const SampleType *input, SampleType *re, SampleType *im, SampleType scale)
Definition fft.hpp:1093