====
Fir1
====

An efficient Finite Impulse Response (FIR) filter class
written in C++ with python wrapper.

Adaptive filtering is also implemented using the Least Mean 
Square (LMS) or Normalised Least Mean
Square (NLMS) algorithm.

Installation
============

Install the python package with pip::

    pip3 install fir1

You can also install from source::

    git clone https://github.com/berndporr/fir1
    cd fir1
    python3 setup.py install


Usage
=====

Realtime filtering
------------------

The filter is a realtime filter which receives samples
one by one so it can process data as it arrives from
an ADC converter. This is simulated here with the for loop::

    import fir1
    b = signal.firwin(999,0.1)
    f = fir1.Fir1(b)
    for i in range(len(noisy_signal)):
        clean_signal[i] = f.filter(noisy_signal[i])

The constructor ``Fir1()`` receives the filter coefficients 
(= impulse response) and then filtering is performed 
with the method ``filter()``.


LMS adaptive filter
-------------------

The file `lms_50Hz_ecg_filter.py` removes 50Hz from 
an ECG with the help of the lms filter. 
The filter learns its own frequency response from a
reference 50Hz sine wave::

    f = fir1.Fir1(NTAPS)
    f.setLearningRate(LEARNING_RATE);

    y= np.empty(len(ecg))
    for i in range(len(ecg)):
        ref_noise = np.sin(2.0 * np.pi / 20.0 * i);
        canceller = f.filter(ref_noise)
        output_signal = ecg[i] - canceller
        f.lms_update(output_signal)
        y[i] = output_signal

Both the demo file and an explanation how the LMS
filter works can be found on the homepage of the
project:

https://github.com/berndporr/fir1
