diff --git a/Source/FilteringFunctions/arm_fir_f64.c b/Source/FilteringFunctions/arm_fir_f64.c index 07d48161..f22f1459 100644 --- a/Source/FilteringFunctions/arm_fir_f64.c +++ b/Source/FilteringFunctions/arm_fir_f64.c @@ -32,108 +32,6 @@ @ingroup groupFilters */ -/** - @defgroup FIR Finite Impulse Response (FIR) Filters - - This set of functions implements Finite Impulse Response (FIR) filters - for Q7, Q15, Q31, and floating-point data types. Fast versions of Q15 and Q31 are also provided. - The functions operate on blocks of input and output data and each call to the function processes - blockSize samples through the filter. pSrc and - pDst points to input and output arrays containing blockSize values. - - @par Algorithm - The FIR filter algorithm is based upon a sequence of multiply-accumulate (MAC) operations. - Each filter coefficient b[n] is multiplied by a state variable which equals a previous input sample x[n]. -
-      y[n] = b[0] * x[n] + b[1] * x[n-1] + b[2] * x[n-2] + ...+ b[numTaps-1] * x[n-numTaps+1]
-  
- @par - \image html FIR.GIF "Finite Impulse Response filter" - @par - pCoeffs points to a coefficient array of size numTaps. - 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 numTaps + blockSize - 1. - Samples in the state buffer are stored in the following order. - @par -
-      {x[n-numTaps+1], x[n-numTaps], x[n-numTaps-1], x[n-numTaps-2]....x[n](==pSrc[0]), x[n+1](==pSrc[1]), ..., x[n+blockSize-1](==pSrc[blockSize-1])}
-  
- @par - Note that the length of the state buffer exceeds the length of the coefficient array by blockSize-1. - The increased state buffer length allows circular addressing, which is traditionally used in the FIR filters, - to be avoided and yields a significant speed improvement. - 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 arrays cannot be shared. - There are separate instance structure declarations for each of the 4 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. - To do this manually without calling the init function, assign the follow subfields of the instance structure: - numTaps, pCoeffs, 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. - Set the values in the state buffer to zeros before static initialization. - The code below statically initializes each of the 4 different data type filter instance structures -
-      arm_fir_instance_f32 S = {numTaps, pState, pCoeffs};
-      arm_fir_instance_q31 S = {numTaps, pState, pCoeffs};
-      arm_fir_instance_q15 S = {numTaps, pState, pCoeffs};
-      arm_fir_instance_q7 S =  {numTaps, pState, pCoeffs};
-  
- where numTaps is the number of filter coefficients in the filter; pState is the address of the state buffer; - pCoeffs is the address of the coefficient buffer. - @par Initialization of Helium version - For Helium version the array of coefficients must be padded with zero to contain - a full number of lanes. - - The array length L must be a multiple of x. L = x * a : - - x is 4 for f32 - - x is 4 for q31 - - x is 4 for f16 (so managed like the f32 version and not like the q15 one) - - x is 8 for q15 - - x is 16 for q7 - - The additional coefficients - (x * a - numTaps) must be set to 0. - numTaps is still set to its right value in the init function. It means that - the implementation may require to read more coefficients due to the vectorization and - to avoid having to manage too many different cases in the code. - - - @par Helium state buffer - The state buffer must contain some additional temporary data - used during the computation but which is not the state of the FIR. - The first A samples are temporary data. - The remaining samples are the state of the FIR filter. - @par - So the state buffer has size numTaps + A + blockSize - 1 : - - A is blockSize for f32 - - A is 8*ceil(blockSize/8) for f16 - - A is 8*ceil(blockSize/4) for q31 - - A is 0 for other datatypes (q15 and q7) - - - @par Fixed-Point Behavior - Care must be taken when using the fixed-point versions of the FIR filter functions. - In particular, the overflow and saturation behavior of the accumulator used in each function must be considered. - Refer to the function specific documentation below for usage guidelines. - - */ - /** @addtogroup FIR @{