| 
							- #pragma once
 - 
 - #include "BiquadParams.h"
 - #include "BiquadState.h"
 - #include "BiquadFilter.h"
 - #include "ObjectCache.h"
 - 
 - /**
 -  * A traditional decimator, using IIR filters for interpolation.
 -  * Takes a signal at a higher sample rate, and reduces it to a lower
 -  * sample rate without adding (much) aliasing.
 -  */
 - class IIRDecimator
 - {
 - public:
 -     /**
 -      * Will set the oversample factor, and set the filter cutoff.
 -      * Normalized cutoff is fixed at 1 / 4 * oversample, so most of the
 -      * top octave will be filtered out.
 -      */
 -     void setup(int oversampleFactor)
 -     {
 -         if (oversampleFactor != oversample) {
 -             oversample = oversampleFactor;
 - 
 -             // Set out IIR filter to be a six pole butterworth lowpass and the magic frequency.
 -             params = ObjectCache<float>::get6PLPParams(1.f / (4.0f * oversample));
 -         }
 -     }
 - 
 -     /**
 -      * Down-sample a buffer of data.
 -      * input is just an array of floats, the size is our oversampling factor.
 -      *
 -      * return value is a single sample
 -      */
 -     float process(const float * input)
 -     {
 -         float x = 0;
 -         for (int i = 0; i < oversample; ++i) {
 -             // The key here is to filter out all the frequencies that will
 -             // be higher than the destination Nyquist frequency.
 -             x = BiquadFilter<float>::run(input[i], state, *params);
 -         }
 -         // Note that we return just the last sample, and ignore the others.
 -         // Decimator is supposed to only keep one out of 'n' samples. We could 
 -         // average them all, but that would just apply a little undesired high
 -         // frequency roll-off.
 -         return x;
 -     }
 - 
 - private:
 -     /**
 -      * This is the oversampling factor. For example,
 -      * for 4x oversample, 'oversample' will be set to 4.
 -      */
 -     int oversample = -1;
 - 
 -     /**
 -      * "standard" Squinky Labs Biquad filter data.
 -      */
 -     std::shared_ptr<BiquadParams<float, 3>> params;
 -     BiquadState<float, 3> state;
 - };
 
 
  |