/// <summary> /// Apply FIR filter on signal /// </summary> /// <param name="filter">FIR filter object</param> /// <param name="input">input signal</param> /// <returns>array of floating-point samples of filtered signal</returns> public static float[] ApplyFilter(this Filters.FIRFilter filter, float[] input) { float[] output = new float[input.Length]; unsafe { float *y = stackalloc float[input.Length]; libliquid.firfilt_apply(filter.Coefficients, filter.Coefficients.Length, input, input.Length, y); for (int i = 0; i < output.Length; i++) { output[i] = y[i]; } } return(output); }
/// <summary> /// Design a Nyquist FIR filter /// </summary> /// <param name="type">filter type (e.g. kaiser, rrc etc.)</param> /// <param name="_k">samples/symbol</param> /// <param name="_m">symbol delay</param> /// <param name="_beta">rolloff factor (0 < beta < 1)</param> /// <param name="_dt">fractional sample delay</param> /// <returns>returns FIR filter having co-efficient vector of length (2*_k*_m+1)</returns> public static Filters.FIRFilter DesignFIR(FIR_Filter_Type type, int _k, int _m, float _beta, float _dt) { float[] h = new float[(2 * _k * _m + 1)]; unsafe { float *_h = stackalloc float[h.Length]; libliquid.liquid_firdes_prototype(type, _k, _m, _beta, _dt, _h); for (int i = 0; i < h.Length; i++) { h[i] = _h[i]; } } Filters.FIRFilter f = new Filters.FIRFilter(h); return(f); }
/// <summary> /// Designs a Kaiser FIR filter /// </summary> /// <param name="n">filter length</param> /// <param name="fc">cut-off frequency</param> /// <param name="As">Stopband attenuation</param> /// <param name="mu">Fractional time delay</param> /// <returns>FIRFilter object containing prototype co-efficients</returns> public static Filters.FIRFilter DesignFIRKaiser(int n, float fc, float As, float mu, float _scale = 2) { float[] h = new float[n]; unsafe { float *_h = stackalloc float[n]; libliquid.liquid_firdes_kaiser(n, fc / _scale, As, mu, _h); for (int i = 0; i < n; i++) { h[i] = _h[i]; } } Filters.FIRFilter f = new Filters.FIRFilter(h); return(f); }