TorchLPC
Fork with prebuilt CUDA kernels. This fork of DiffAPF/torchlpc publishes
torchlpc-wheels: Linux x86_64 wheels with the C++/CUDA extension already compiled, so nonvccor compiler is needed at install time. Like torchaudio, each release is built for one torch minor version and pins it:
torchlpc-wheelstorch CUDA 0.8.0.2062.6.x 12.4 0.8.0.2072.7.x 12.6 0.8.0.208–0.8.0.2102.8.x – 2.10.x 12.8 0.8.0.211–0.8.0.2142.11.x – 2.14.x 13.0 CUDA is whatever the default
pip install torchbuild of that version uses. Each wheel isabi3, so it works on every Python version torch supports.pip install torchlpc-wheels # newest torch (upgrades torch if needed!) pip install torchlpc-wheels "torch==2.8.*" # keep a specific torch versionImport it as usual with
import torchlpc. Don't install it next to upstreamtorchlpc, because both provide the same module.
torchlpc provides a PyTorch implementation of the Linear Predictive Coding (LPC) filter, also known as all-pole filter.
It's fast, differentiable, and supports batched inputs with time-varying filter coefficients.
Given an input signal $\mathbf{x} \in \mathbb{R}^T$ and time-varying LPC coefficients $\mathbf{A} \in \mathbb{R}^{T \times N}$ with an order of $N$, the LPC filter is defined as:
$$ y_t = x_t - \sum_{i=1}^N A_{t,i} y_{t-i}. $$
Usage
import torch
from torchlpc import sample_wise_lpc
# Create a batch of 10 signals, each with 100 time steps
x = torch.randn(10, 100)
# Create a batch of 10 sets of LPC coefficients, each with 100 time steps and an order of 3
A = torch.randn(10, 100, 3)
# Apply LPC filtering
y = sample_wise_lpc(x, A)
# Optionally, you can provide initial values for the output signal (default is 0)
zi = torch.randn(10, 3)
y = sample_wise_lpc(x, A, zi=zi)
# Return the delay values similar to `scipy.signal.lfilter`
y, zf = sample_wise_lpc(x, A, zi=zi, return_zf=True)
Installation
pip install torchlpc
or from source
pip install git+https://github.com/DiffAPF/torchlpc.git
If you want to run it on NVIDIA GPU, make sure you have CUDA toolkit installed, with a verion compatible with your PyTorch installation.
MacOS
To compile with OpenMP support on MacOS, you need to install libomp via Homebrew.
Also, use llvm@15 as the C++ compiler to ensure compatibility with OpenMP.
brew install libomp
export CXX=$(brew --prefix llvm@15)/bin/clang++
export LDFLAGS="-L/usr/local/opt/libomp/lib"
export CPPFLAGS="-I/usr/local/opt/libomp/include"
After performing the above steps, you can install torchlpc as usual.
Derivation of the gradients of the LPC filter
The details of the derivation can be found in our preprints12. We show that, given the instataneous gradient $\frac{\partial \mathcal{L}}{\partial y_t}$ where $\mathcal{L}$ is the loss function, the gradients of the LPC filter with respect to the input signal $\bf x$ and the filter coefficients $\bf A$ can be expresssed also through a time-varying filter:
\frac{\partial \mathcal{L}}{\partial x_t}
= \frac{\partial \mathcal{L}}{\partial y_t}
- \sum_{i=1}^{N} A_{t+i,i} \frac{\partial \mathcal{L}}{\partial x_{t+i}}
$$ \frac{\partial \mathcal{L}}{\partial \bf A} = -\begin{vmatrix} \frac{\partial \mathcal{L}}{\partial x_1} & 0 & \dots & 0 \ 0 & \frac{\partial \mathcal{L}}{\partial x_2} & \dots & 0 \ \vdots & \vdots & \ddots & \vdots \ 0 & 0 & \dots & \frac{\partial \mathcal{L}}{\partial x_t} \end{vmatrix} \begin{vmatrix} y_0 & y_{-1} & \dots & y_{-N + 1} \ y_1 & y_0 & \dots & y_{-N + 2} \ \vdots & \vdots & \ddots & \vdots \ y_{T-1} & y_{T - 2} & \dots & y_{T - N} \end{vmatrix}. $$
Gradients for the initial condition $y_t|_{t \leq 0}$
The initial conditions provide an entry point at $t=1$ for filtering, as we cannot evaluate $t=-\infty$.
Let us assume $A_{t, :}|_{t \leq 0} = 0$ so $y_t|_{t \leq 0} = x_t|_{t \leq 0}$, which also means $\frac{\partial \mathcal{L}}{\partial y_t}|_{t \leq 0} = \frac{\partial \mathcal{L}}{\partial x_t}|_{t \leq 0}$.
Thus, the initial condition gradients are
$$ \frac{\partial \mathcal{L}}{\partial y_t} = \frac{\partial \mathcal{L}}{\partial x_t} = -\sum_{i=1-t}^{N} A_{t+i,i} \frac{\partial \mathcal{L}}{\partial x_{t+i}} \quad \text{for } -N < t \leq 0. $$
In practice, we pad $N$ and $N \times N$ zeros to the beginning of $\frac{\partial \mathcal{L}}{\partial \bf y}$ and $\mathbf{A}$ before evaluating $\frac{\partial \mathcal{L}}{\partial \bf x}$.
The first $N$ outputs are the gradients to $y_t|_{t \leq 0}$ and the rest are to $x_t|_{t > 0}$.
Time-invariant filtering
In the time-invariant setting, $A_{t, i} = A_{1, i} \forall t \in [1, T]$ and the filter is simplified to
y_t = x_t - \sum_{i=1}^N a_i y_{t-i}, \mathbf{a} = A_{1,:}.
The gradients $\frac{\partial \mathcal{L}}{\partial \mathbf{x}}$ are filtering $\frac{\partial \mathcal{L}}{\partial \mathbf{y}}$ with $\mathbf{a}$ backwards in time, same as in the time-varying case.
$\frac{\partial \mathcal{L}}{\partial \mathbf{a}}$ is simply doing a vector-matrix multiplication:
$$ \frac{\partial \mathcal{L}}{\partial \mathbf{a}^T} = -\frac{\partial \mathcal{L}}{\partial \mathbf{x}^T} \begin{vmatrix} y_0 & y_{-1} & \dots & y_{-N + 1} \ y_1 & y_0 & \dots & y_{-N + 2} \ \vdots & \vdots & \ddots & \vdots \ y_{T-1} & y_{T - 2} & \dots & y_{T - N} \end{vmatrix}. $$
This algorithm is more efficient than 3 because it only needs one pass of filtering to get the two gradients while the latter needs two.
TODO
- Use PyTorch C++ extension for faster computation.
- Use native CUDA kernels for GPU computation.
- Support Metal for MacOS.
- Add examples.
Related Projects
- torchcomp: differentiable compressors that use
torchlpcfor differentiable backpropagation. - jaxpole: equivalent implementation in JAX by @rodrigodzf.
Citation
If you find this repository useful in your research, please cite our work with the following BibTex entries:
@inproceedings{ycy2024diffapf,
title={Differentiable All-pole Filters for Time-varying Audio Systems},
author={Chin-Yun Yu and Christopher Mitcheltree and Alistair Carson and Stefan Bilbao and Joshua D. Reiss and György Fazekas},
booktitle={International Conference on Digital Audio Effects (DAFx)},
year={2024},
pages={345--352},
}
@inproceedings{ycy2024golf,
title = {Differentiable Time-Varying Linear Prediction in the Context of End-to-End Analysis-by-Synthesis},
author = {Chin-Yun Yu and György Fazekas},
year = {2024},
booktitle = {Proc. Interspeech},
pages = {1820--1824},
doi = {10.21437/Interspeech.2024-1187},
}
Metadata
Release files for torchlpc-wheels 0.8.0.210
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| torchlpc_wheels-0.8.0.210-cp39-abi3-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl | CPython 3.9 | abi3 | Linux glibc 2.28+ x86-64, Linux glibc 2.24+ x86-64 | Details |
Release files / torchlpc_wheels-0.8.0.210-cp39-abi3-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
| Download URL | torchlpc_wheels-0.8.0.210-cp39-abi3-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 3.0 MB |
| Tags | CPython 3.9 Linux glibc 2.24+ x86-64 Linux glibc 2.28+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
82ffd58f0eca78cb77705d1317895bbaf74aac3aae63aaf0ed34e6d79a58c868
|
|
BLAKE2b-256 checksum How to use checksums |
7dd18518d2e483fc29ff4543b23be866848afa86c2af1a73e1c3064ba33540d2
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 2, 2026.
Transparency logSecurity for torchlpc-wheels 0.8.0.210
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 1 file in this release has been uploaded with provenance metadata.
Attestation for torchlpc_wheels-0.8.0.210-cp39-abi3-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 2, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.