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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
|