Skip to main content

Efficient FIR realtime filter

Project description

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:

pip install fir1

You can also install from source:

git clone https://github.com/berndporr/fir1
cd fir1
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:

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

You can query the filter coefficients using getCoeff. This is most useful to obtain the kernel of a trained adaptive filter:

>>> from fir1 import Fir1
>>> fir = Fir1([.25, -.5, 1, -.5, .25])
>>> fir.getCoeff()
array([ 0.25, -0.5 ,  1.  , -0.5 ,  0.25])

You may override the length of array to return and the result will be zero-padded. Specifying too small an array causes an exception to be raised:

>>> fir.getCoeff(8)
array([ 0.25, -0.5 ,  1.  , -0.5 ,  0.25,  0.  ,  0.  ,  0.  ])
>>> fir.getCoeff(3)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File ".../fir1.py", line 97, in getCoeff
return _fir1.Fir1_getCoeff(self, *args)
RuntimeError: Fir1: target of getCoeff: too many weights to copy into target

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

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

fir1-1.8.0.0.tar.gz (21.1 kB view details)

Uploaded Source

File details

Details for the file fir1-1.8.0.0.tar.gz.

File metadata

  • Download URL: fir1-1.8.0.0.tar.gz
  • Upload date:
  • Size: 21.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.10.12

File hashes

Hashes for fir1-1.8.0.0.tar.gz
Algorithm Hash digest
SHA256 cb72f93f21f09b8757d3d4e0ac00421a76a63be677c4b61f4b0a67f8914ceedc
MD5 056b4487dcb76f77bdbe5fa036271425
BLAKE2b-256 7af89e486eaf25676efe30639d1aad11c30d245c47f4ca4b8aaaa2a0facf222d

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page