60 assert(sourceFactor == 1 || sourceFactor == 2 || sourceFactor == 4 || sourceFactor == 8);
61 const int sourceIndex = sourceFactor == 8 ? 3 : sourceFactor == 4 ? 2 : sourceFactor == 2 ? 1 : 0;
62 for (
int k = 0; k < powers; ++k)
64 input_[k].prepare(257, 1);
67 for (
int k = 0; k < count; ++k)
69 output_[k].prepare(258, 1);
81 for (
int offset = 0; offset < data.getNumSamples(); offset += block)
83 const int size = std::min(block, data.getNumSamples() - offset);
84 auto *samples = data.getChannel(0) + offset;
85 for (
int k = 0; k < powers; ++k)
87 auto *channel = scratch_[k].data();
88 std::copy_n(samples, size, channel);
89 input_[k].processBlock({&channel, 1, size});
91 for (
int i = 0; i < size; ++i)
93 std::array<double, powers> power{};
94 for (
int k = 0; k < powers; ++k) power[k] = scratch_[k][i];
95 const auto moments = integral_.
polynomial(power);
96 for (
int k = 0; k < count; ++k) scratch_[k][i] = moments[k];
98 for (
int k = 0; k < count; ++k)
100 auto *channel = scratch_[k].data();
101 output_[k].processBlock({&channel, 1, size});
103 for (
int i = 0; i < size; ++i)
106 for (
int k = 0; k < count; ++k) result += scratch_[k][i];