41 template <
typename SampleType>
43 : coefficients (new Coefficients<typename Filter<SampleType>::NumericType> (1, 0, 1, 0))
48 template <
typename SampleType>
54 template <
typename SampleType>
59 if (newOrder != order)
61 memory.malloc (jmax (order, newOrder, static_cast<size_t> (3)) + 1);
62 state = snapPointerToAlignment (memory.getData(),
sizeof (SampleType));
66 for (
size_t i = 0; i < order; ++i)
67 state[i] = resetToValue;
70 template <
typename SampleType>
73 template <
typename SampleType>
74 template <
typename ProcessContext,
bool bypassed>
75 void Filter<SampleType>::processInternal (
const ProcessContext& context) noexcept
77 static_assert (std::is_same<typename ProcessContext::SampleType, SampleType>::value,
78 "The sample-type of the IIR filter must match the sample-type supplied to this process callback");
81 auto&& inputBlock = context.getInputBlock();
82 auto&& outputBlock = context.getOutputBlock();
86 jassert (inputBlock.getNumChannels() == 1);
87 jassert (outputBlock.getNumChannels() == 1);
89 auto numSamples = inputBlock.getNumSamples();
90 auto* src = inputBlock .getChannelPointer (0);
91 auto* dst = outputBlock.getChannelPointer (0);
104 for (
size_t i = 0; i < numSamples; ++i)
107 auto output = input * b0 + lv1;
109 dst[i] = bypassed ? input : output;
111 lv1 = (input * b1) - (output * a1);
114 util::snapToZero (lv1); state[0] = lv1;
129 for (
size_t i = 0; i < numSamples; ++i)
132 auto output = (input * b0) + lv1;
133 dst[i] = bypassed ? input : output;
135 lv1 = (input * b1) - (output* a1) + lv2;
136 lv2 = (input * b2) - (output* a2);
139 util::snapToZero (lv1); state[0] = lv1;
140 util::snapToZero (lv2); state[1] = lv2;
158 for (
size_t i = 0; i < numSamples; ++i)
161 auto output = (input * b0) + lv1;
162 dst[i] = bypassed ? input : output;
164 lv1 = (input * b1) - (output* a1) + lv2;
165 lv2 = (input * b2) - (output* a2) + lv3;
166 lv3 = (input * b3) - (output* a3);
169 util::snapToZero (lv1); state[0] = lv1;
170 util::snapToZero (lv2); state[1] = lv2;
171 util::snapToZero (lv3); state[2] = lv3;
177 for (
size_t i = 0; i < numSamples; ++i)
180 auto output= (input * coeffs[0]) + state[0];
181 dst[i] = bypassed ? input : output;
183 for (
size_t j = 0; j < order - 1; ++j)
184 state[j] = (input * coeffs[j + 1]) - (output* coeffs[order + j + 1]) + state[j + 1];
186 state[order - 1] = (input * coeffs[order]) - (output* coeffs[order * 2]);
194 template <
typename SampleType>
200 auto output= (c[0] * sample) + state[0];
202 for (
size_t j = 0; j < order - 1; ++j)
203 state[j] = (c[j + 1] * sample) - (c[order + j + 1] * output) + state[j + 1];
205 state[order - 1] = (c[order] * sample) - (c[order * 2] * output);
210 template <
typename SampleType>
213 for (
size_t i = 0; i < order; ++i)
214 util::snapToZero (state[i]);
217 template <
typename SampleType>
218 void Filter<SampleType>::check()
Array< NumericType > coefficients
The raw coefficients.
void reset()
Resets the filter's processing pipeline, ready to start a new stream of data.
void prepare(const ProcessSpec &) noexcept
Called before processing starts.
void snapToZero() noexcept
Ensure that the state variables are rounded to zero if the state variables are denormals.
SampleType JUCE_VECTOR_CALLTYPE processSample(SampleType sample) noexcept
Processes a single sample, without any locking.
Filter()
Creates a filter.