37template <
typename SampleType>
44template <
typename SampleType>
50template <
typename SampleType>
53 auto newOrder = coefficients->getFilterOrder();
57 memory.malloc (jmax (order,
newOrder,
static_cast<size_t> (3)) + 1);
58 state = snapPointerToAlignment (memory.getData(),
sizeof (SampleType));
62 for (
size_t i = 0; i < order; ++i)
66template <
typename SampleType>
69template <
typename SampleType>
70template <
typename ProcessContext,
bool bypassed>
73 static_assert (std::is_same<typename ProcessContext::SampleType, SampleType>::value,
74 "The sample-type of the IIR filter must match the sample-type supplied to this process callback");
77 auto&& inputBlock =
context.getInputBlock();
78 auto&& outputBlock =
context.getOutputBlock();
82 jassert (inputBlock.getNumChannels() == 1);
83 jassert (outputBlock.getNumChannels() == 1);
85 auto numSamples = inputBlock.getNumSamples();
86 auto*
src = inputBlock .getChannelPointer (0);
87 auto*
dst = outputBlock.getChannelPointer (0);
88 auto* coeffs = coefficients->getRawCoefficients();
100 for (
size_t i = 0; i < numSamples; ++i)
103 auto output = input *
b0 +
lv1;
107 lv1 = (input *
b1) - (output *
a1);
110 util::snapToZero (
lv1); state[0] =
lv1;
125 for (
size_t i = 0; i < numSamples; ++i)
128 auto output = (input *
b0) +
lv1;
132 lv2 = (input *
b2) - (output*
a2);
135 util::snapToZero (lv1); state[0] = lv1;
136 util::snapToZero (lv2); state[1] = lv2;
154 for (
size_t i = 0; i < numSamples; ++i)
157 auto output = (input * b0) + lv1;
158 dst[i] = bypassed ? input : output;
160 lv1 = (input * b1) - (output* a1) + lv2;
161 lv2 = (input * b2) - (output* a2) + lv3;
162 lv3 = (input * b3) - (output* a3);
165 util::snapToZero (lv1); state[0] = lv1;
166 util::snapToZero (lv2); state[1] = lv2;
167 util::snapToZero (lv3); state[2] = lv3;
173 for (
size_t i = 0; i < numSamples; ++i)
176 auto output= (input * coeffs[0]) + state[0];
177 dst[i] = bypassed ? input : output;
179 for (
size_t j = 0; j < order - 1; ++j)
180 state[j] = (input * coeffs[j + 1]) - (output* coeffs[order + j + 1]) + state[j + 1];
182 state[order - 1] = (input * coeffs[order]) - (output* coeffs[order * 2]);
190template <
typename SampleType>
194 auto*
c = coefficients->getRawCoefficients();
196 auto output= (
c[0] *
sample) + state[0];
198 for (
size_t j = 0;
j < order - 1; ++
j)
199 state[
j] = (
c[
j + 1] *
sample) - (
c[order +
j + 1] * output) + state[
j + 1];
201 state[order - 1] = (
c[order] *
sample) - (
c[order * 2] * output);
206template <
typename SampleType>
209 for (
size_t i = 0; i < order; ++i)
210 util::snapToZero (state[i]);
213template <
typename SampleType>
216 jassert (coefficients !=
nullptr);
218 if (order != coefficients->getFilterOrder())
void prepare(const ProcessSpec &) noexcept
void snapToZero() noexcept
SampleType JUCE_VECTOR_CALLTYPE processSample(SampleType sample) noexcept
typename Coefficients< NumericType >::Ptr CoefficientsPtr
typename SampleTypeHelpers::ElementType< SampleType >::Type NumericType