Skip to main content

Adaptive filters for 🐍

Project description

adafilt

This package implements some common (adaptive) filtering operations in Python, that I use mostly for prototyping system identification and active noise control systems.

  • adafilt.olafilt: an efficient multichannel overlap-add algorithm for long sequences
  • adafilt.FIRFilter: finite-impulse response filter
  • adafilt.Delay: a simple delay
  • adafilt.LMSFilter: a sample-wise Least-Mean-Square adaptive filter
  • adafult.FastBlockLMSFilter: fast, block-wise LMS adaptive filter based on overlap-save sectioning
  • adafilt.MultiChannelBlockLMS: same for multi-channel case
  • adafilt.RLSFilter: a recursive Least-Squares filter

The following procedures compute optimal Wiener-filters from time-series:

  • adafilt.optimal.wiener_filter: compute optimal (causally constrained) Wiener filter for single-channel control
  • adafilt.optimal.multi_channel_wiener_filter: compute optimal wiener filter for multi-channel control

Additionally, adafilt.io.FakeInterface can be used to simulate a multichannel plant.

Have a look at the examples, the source code or the following example to get an idea what is possible.

"""A filtered-reference Least-Mean-Square (FxLMS) filter."""

import numpy as np
import matplotlib.pyplot as plt

from adafilt import FastBlockLMSFilter, FIRFilter, olafilt
from adafilt.io import FakeInterface
from adafilt.utils import wgn

length = 8  # number of adaptive FIR filter taps
blocklength = 2  # length of I/O buffer and blocksize of filter
n_buffers = 150  # size of simulation

# primary and secondary paths
h_pri = [0, 0, 0, 0, 0, 0, 0, 0.5]
h_sec = [0, 0, 0, 1, 0, 0, 0, 0]

# white noise signal
signal = np.random.normal(0, 1, size=n_buffers * blocklength)

# the adaptive filter
filt = FastBlockLMSFilter(length, blocklength, stepsize=0.1, leakage=0.9999)

# secondary path estimate has to account for block size
plant_model = FIRFilter(np.concatenate((np.zeros(blocklength), h_sec)))

# simulates an audio interface with primary and secondary paths and 40 dB SNR noise
# at the error sensor
sim = FakeInterface(
    blocklength,
    signal,
    h_pri=h_pri,
    h_sec=h_sec,
    noise=wgn(olafilt(h_pri, signal), 40, "dB"),
)

elog = []
y = np.zeros(blocklength)  # control signal is zero for first block
for i in range(n_buffers):
    # record reference signal x and error signal e while playing back y
    x, e, _, _ = sim.playrec(-y)
    # filter the reference signal
    fx = plant_model(x)
    # adapt filter
    filt.adapt(fx, e)
    # filter
    y = filt.filt(x)
    # log error
    elog.append(e)

plt.plot(np.concatenate(elog), label="e", alpha=0.7)
plt.xlabel("Sample")
plt.ylabel("Error Signal")
plt.show()

Find the full example here.

Happy coding!

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

adafilt-0.1.0.tar.gz (12.4 kB view details)

Uploaded Source

Built Distribution

adafilt-0.1.0-py3-none-any.whl (14.2 kB view details)

Uploaded Python 3

File details

Details for the file adafilt-0.1.0.tar.gz.

File metadata

  • Download URL: adafilt-0.1.0.tar.gz
  • Upload date:
  • Size: 12.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: python-httpx/0.27.2

File hashes

Hashes for adafilt-0.1.0.tar.gz
Algorithm Hash digest
SHA256 a41b2cb062df0c91b95ce237ae4f486ff4253ffbaf7e27fbc7d91c4b46604a9b
MD5 40a6af9a186985f4ddb946ce5ac80e7b
BLAKE2b-256 4449ccb8ba4f6c43659541cd5c7a0d992ae0eeb87213a695a48d6a6592d5fda2

See more details on using hashes here.

File details

Details for the file adafilt-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: adafilt-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 14.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: python-httpx/0.27.2

File hashes

Hashes for adafilt-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 a76d62df5cc5cf69b50ecd58f5be91097fb0162a883a9d796ce2199c2e0cd2c6
MD5 01001f4809d9c5908c2a8c9905f1f4cb
BLAKE2b-256 0f6c39e0a0e8378004dc9dbf4b6b00591b07aae301764061e6e144772a7b3646

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