11#include "../OfflineProcessing.h"
14#include "../SimdOps.h"
29 template <
class Impulse>
32 if (block < 128 || block > 65536 || (block & (block - 1)))
34 const auto size = 4 *
static_cast<std::uint64_t
>(block);
41 fft_.emplace(
static_cast<std::size_t
>(size));
42 for (
int i = 0; i < 4 * block; ++i)
44 const int lag = i < 2 * block ? i : i - 4 * block;
45 const double value = i == 2 * block ? 0 : impulse(lag);
46 if (!std::isfinite(value))
50 fft_->forward(time_.get(), kernel_.get());
51 for (std::uint64_t i = 0; i < size + 2; ++i)
52 if (!std::isfinite(kernel_[i]))
59 [[nodiscard]]
double *
input() noexcept
63 [[nodiscard]]
const double *
process() noexcept
65 const int size = 4 * block_;
66 std::fill_n(time_.get() + 3 * block_, block_ + 2, 0.);
67 fft_->forward(time_.get(), spectrum_.get());
68 std::fill_n(time_.get(), size + 2, 0.);
70 fft_->inverse(time_.get(), time_.get());
71 return time_.get() + block_;
77 std::optional<FFTReal<double>> fft_;
OfflineConvolutionWindow(const OfflineConvolutionWindow &)=delete
double * input() noexcept
const double * process() noexcept
OfflineConvolutionWindow(OfflineSession &job, int block, Impulse impulse)
OfflineConvolutionWindow & operator=(const OfflineConvolutionWindow &)=delete
void charge(std::size_t bytes)
OfflineScratchArray< U > allocateScratch(std::uint64_t count)
void offlineFail(OfflineStatus status)
std::unique_ptr< T[], OfflineScratchDeleter< T > > OfflineScratchArray
std::size_t offlineBytes(std::uint64_t count, std::size_t size)
void complexMulAccum(float *DSPARK_RESTRICT accum, const float *DSPARK_RESTRICT a, const float *DSPARK_RESTRICT b, int bins) noexcept
Complex multiply-accumulate over interleaved [re, im, ...] spectra.