*    y[n] = b[0] * x[n] + b[L]   * x[n-1] + ... + b[L*(phaseLength-1)] * x[n-phaseLength+1]
*    y[n+1] = b[1] * x[n] + b[L+1] * x[n-1] + ... + b[L*(phaseLength-1)+1] * x[n-phaseLength+1]
*    ...
*    y[n+(L-1)] = b[L-1] * x[n] + b[2*L-1] * x[n-1] + ....+ b[L*(phaseLength-1)+(L-1)] * x[n-phaseLength+1]
*
* This approach is more efficient than straightforward upsample-then-filter algorithms. * With this method the computation is reduced by a factor of 1/L when compared to using a standard FIR filter. * \par * pCoeffs points to a coefficient array of size numTaps. * numTaps must be a multiple of the interpolation factor L and this is checked by the * initialization functions. * Internally, the function divides the FIR filter's impulse response into shorter filters of length * phaseLength=numTaps/L. * Coefficients are stored in time reversed order. * \par *
*    {b[numTaps-1], b[numTaps-2], b[N-2], ..., b[1], b[0]}
*
* \par * pState points to a state array of size blockSize + phaseLength - 1. * Samples in the state buffer are stored in the order: * \par *
*    {x[n-phaseLength+1], x[n-phaseLength], x[n-phaseLength-1], x[n-phaseLength-2]....x[0], x[1], ..., x[blockSize-1]}
*
* The state variables are updated after each block of data is processed, the coefficients are untouched. * * \par Instance Structure * The coefficients and state variables for a filter are stored together in an instance data structure. * A separate instance structure must be defined for each filter. * Coefficient arrays may be shared among several instances while state variable array should be allocated separately. * There are separate instance structure declarations for each of the 3 supported data types. * * \par Initialization Functions * There is also an associated initialization function for each data type. * The initialization function performs the following operations: * - Sets the values of the internal structure fields. * - Zeros out the values in the state buffer. * - Checks to make sure that the length of the filter is a multiple of the interpolation factor. * To do this manually without calling the init function, assign the follow subfields of the instance structure: * L (interpolation factor), pCoeffs, phaseLength (numTaps / L), pState. Also set all of the values in pState to zero. * * \par * Use of the initialization function is optional. * However, if the initialization function is used, then the instance structure cannot be placed into a const data section. * To place an instance structure into a const data section, the instance structure must be manually initialized. * The code below statically initializes each of the 3 different data type filter instance structures *
* arm_fir_interpolate_instance_f32 S = {L, phaseLength, pCoeffs, pState};
* arm_fir_interpolate_instance_q31 S = {L, phaseLength, pCoeffs, pState};
* arm_fir_interpolate_instance_q15 S = {L, phaseLength, pCoeffs, pState};
*