Skip to main content

TorchLPC

PyPI version

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 no nvcc or compiler is needed at install time. Like torchaudio, each release is built for one torch minor version and pins it:

torchlpc-wheels torch CUDA
0.8.0.206 2.6.x 12.4
0.8.0.207 2.7.x 12.6
0.8.0.208 – 0.8.0.210 2.8.x – 2.10.x 12.8
0.8.0.211 – 0.8.0.214 2.11.x – 2.14.x 13.0

CUDA is whatever the default pip install torch build of that version uses. Each wheel is abi3, 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 version

Import it as usual with import torchlpc. Don't install it next to upstream torchlpc, 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.
  • torchcomp: differentiable compressors that use torchlpc for 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},
}
  1. Differentiable All-pole Filters for Time-varying Audio Systems. ↩

  2. Differentiable Time-Varying Linear Prediction in the Context of End-to-End Analysis-by-Synthesis. ↩

  3. Singing Voice Synthesis Using Differentiable LPC and Glottal-Flow-Inspired Wavetables. ↩

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)

Table of built distributions (wheels) for torchlpc-wheels 0.8.0.210
File Interpreter ABI Platform
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 log

Security 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 log

A 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.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page