37template <
typename SampleType>
44template <
typename SampleType>
50template <
typename SampleType>
53 auto newOrder = coefficients->getFilterOrder();
55 if (newOrder != order)
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)
63 state[i] = resetToValue;
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;
105 dst[i] = bypassed ? input : output;
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;
129 dst[i] = bypassed ? input : output;
131 lv1 = (input * b1) - (output* a1) + lv2;
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