====
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
============

Linux
-----

If you want to install it via pip you first need
to install the fir1 filter binaries::

    sudo add-apt-repository ppa:berndporr/usbdux
    sudo apt-get update
    sudo apt install fir1
    sudo apt install fir1-dev

Then install the python package with pip::

    pip3 install fir1

You can also install from source::

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


Windows
-------

There is a pre-compiled package which can be installed
via pip::

    pip3 install fir1

If you want to compile from source you first need to
build the static fir windows library which is called
`fir_static.lib`. Open the command line and type::

    cmake -G "Visual Studio 15 2017 Win64" .

Then start Visual Studio and build `fir.sln`. Go
back to the command line and type::

    python 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. 

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
