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 sequencesadafilt.FIRFilter
: finite-impulse response filteradafilt.Delay
: a simple delayadafilt.LMSFilter
: a sample-wise Least-Mean-Square adaptive filteradafult.FastBlockLMSFilter
: fast, block-wise LMS adaptive filter based on overlap-save sectioningadafilt.MultiChannelBlockLMS
: same for multi-channel caseadafilt.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 controladafilt.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
Release history Release notifications | RSS feed
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)
Built Distribution
adafilt-0.1.0-py3-none-any.whl
(14.2 kB
view details)
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
Algorithm | Hash digest | |
---|---|---|
SHA256 | a41b2cb062df0c91b95ce237ae4f486ff4253ffbaf7e27fbc7d91c4b46604a9b |
|
MD5 | 40a6af9a186985f4ddb946ce5ac80e7b |
|
BLAKE2b-256 | 4449ccb8ba4f6c43659541cd5c7a0d992ae0eeb87213a695a48d6a6592d5fda2 |
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
Algorithm | Hash digest | |
---|---|---|
SHA256 | a76d62df5cc5cf69b50ecd58f5be91097fb0162a883a9d796ce2199c2e0cd2c6 |
|
MD5 | 01001f4809d9c5908c2a8c9905f1f4cb |
|
BLAKE2b-256 | 0f6c39e0a0e8378004dc9dbf4b6b00591b07aae301764061e6e144772a7b3646 |