37 template <
typename NumericType>
54 template <
typename SampleType>
61 using NumericType =
typename SampleTypeHelpers::ElementType<SampleType>::Type;
84 jassert (spec.numChannels == 1);
102 memory.
malloc (1 + jmax (newSize, size, static_cast<size_t> (128)));
104 fifo = snapPointerToAlignment (memory.
getData(),
sizeof (SampleType));
108 for (
size_t i = 0; i < size; ++i)
109 fifo[i] = SampleType {0};
124 template <
typename ProcessContext>
125 void process (
const ProcessContext& context) noexcept
127 static_assert (std::is_same<typename ProcessContext::SampleType, SampleType>::value,
128 "The sample-type of the FIR filter must match the sample-type supplied to this process callback");
131 auto&& inputBlock = context.getInputBlock();
132 auto&& outputBlock = context.getOutputBlock();
136 jassert (inputBlock.getNumChannels() == 1);
137 jassert (outputBlock.getNumChannels() == 1);
139 auto numSamples = inputBlock.getNumSamples();
140 auto* src = inputBlock .getChannelPointer (0);
141 auto* dst = outputBlock.getChannelPointer (0);
143 auto* fir = coefficients->getRawCoefficients();
146 if (context.isBypassed)
148 for (
size_t i = 0; i < numSamples; ++i)
150 fifo[p] = dst[i] = src[i];
151 p = (p == 0 ? size - 1 : p - 1);
156 for (
size_t i = 0; i < numSamples; ++i)
157 dst[i] = processSingleSample (src[i], fifo, fir, size, p);
170 return processSingleSample (sample, fifo, coefficients->getRawCoefficients(), size, pos);
176 SampleType* fifo =
nullptr;
177 size_t pos = 0, size = 0;
182 jassert (coefficients !=
nullptr);
184 if (size != (coefficients->getFilterOrder() + 1))
188 static SampleType JUCE_VECTOR_CALLTYPE processSingleSample (SampleType sample, SampleType* buf,
189 const NumericType* fir,
size_t m,
size_t& p) noexcept
196 for (k = 0; k < m - p; ++k)
197 out += buf[(p + k)] * fir[k];
199 for (
size_t j = 0; j < p; ++j)
200 out += buf[j] * fir[j + k];
202 p = (p == 0 ? m - 1 : p - 1);
208 JUCE_LEAK_DETECTOR (
Filter)
219 template <
typename NumericType>
249 double getMagnitudeForFrequency (
double frequency,
double sampleRate)
const noexcept;
254 void getMagnitudeForFrequencyArray (
double* frequencies,
double* magnitudes,
255 size_t numSamples,
double sampleRate)
const noexcept;
260 double getPhaseForFrequency (
double frequency,
double sampleRate)
const noexcept;
265 void getPhaseForFrequencyArray (
double* frequencies,
double* phases,
266 size_t numSamples,
double sampleRate)
const noexcept;
276 void normalise() noexcept;
Coefficients(const NumericType *samples, size_t numSamples)
SampleType JUCE_VECTOR_CALLTYPE processSample(SampleType sample) noexcept
void prepare(const ProcessSpec &spec) noexcept
size_t getFilterOrder() const noexcept
void malloc(SizeType newNumElements, size_t elementSize=sizeof(ElementType))
ElementType * getData() const noexcept
typename SampleTypeHelpers::ElementType< SampleType >::Type NumericType
Coefficients< NumericType >::Ptr coefficients
Coefficients(size_t size)
const NumericType * getRawCoefficients() const noexcept
NumericType * getRawCoefficients() noexcept
void process(const ProcessContext &context) noexcept
Array< NumericType > coefficients
Filter(CoefficientsPtr coefficientsToUse)
typename Coefficients< NumericType >::Ptr CoefficientsPtr