Skip to main content

flamo

Docs | PyPI | ICASSP25-arXiv

Open-source library for frequency-domain differentiable audio processing.

It contains differentiable implementation of common LTI audio system modules with learnable parameters.


⚙️ Optimization of audio LTI systems

Available differentiable audio signal processors - in flamo.processor.dsp:

  • Gains : Gains, Matrices, Householder Matrices
  • Filters : Biquads, State Variable Filters (SVF), Graphic Equalizers (GEQ), Parametric Equalizers (PEQ - not released yet)
  • Delays : Integer Delays, Fractional Delays

Transforms - in flamo.processor.dsp:

  • Transform : FFT, iFFT, time anti-aliasing enabled FFT and iFFT

Utilities, system designers, and optimization - in flamo.processor.system:

  • Series : Serial chaining of differentiable systems
  • Recursion : Closed loop with assignable feedforward and feedback paths
  • Shell: Container class for safe interaction between system, dataset, and loss functions

Optimization - in flamo.optimize:

  • Trainer : Handling of the training and validation steps
  • Dataset : Customizable dataset class and helper methods

🛠️ Installation

To install it via pip, on a new Python virtual environment flamo-env

python3.10 -m venv .flamo-env
source .flamo-env/bin/activate
pip install flamo

If you are using conda, you might need to install libsndfile manually

conda create -n flamo-env python=3.10
conda activate flamo-env
pip install flamo
conda install -c conda-forge libsndfile

For local installation: clone and install dependencies on a new Python virtual environment flamo-env

git clone https://github.com/gdalsanto/flamo
cd flamo
python3.10 -m venv .flamo-env
source .flamo-env/bin/activate
pip install -e .

Note that it requires python>=3.10


💻 How to use the library

We included a few examples in ./examples that take you through the library's API.

The following example demonstrates how to optimize the parameters of Biquad filters to match a target magnitude response. This is just a toy example; you can create and optimize much more complex systems by cascading modules either serially or recursively.

Import modules

import torch
import torch.nn as nn
from flamo.optimize.dataset import Dataset, load_dataset
from flamo.optimize.trainer import Trainer
from flamo.processor import dsp, system
from flamo.functional import signal_gallery, highpass_filter

Define parameters and target response with randomized cutoff frequency and gains

in_ch, out_ch = 1, 2    # input and output channels
n_sections = 2  # number of cascaded biquad sections
fs = 48000      # sampling frequency
nfft = fs*2     # number of fft points

b, a = highpass_filter(
    fc=torch.tensor(fs/2)*torch.rand(size=(n_sections, out_ch, in_ch)), 
    gain=torch.tensor(-1) + (torch.tensor(2))*torch.rand(size=(n_sections, out_ch, in_ch)), 
    fs=fs)
B = torch.fft.rfft(b, nfft, dim=0)
A = torch.fft.rfft(a, nfft, dim=0)
target_filter = torch.prod(B, dim=1) / torch.prod(A, dim=1)

Define an instance of learnable Biquads

filt = dsp.Biquad(
    size=(out_ch, in_ch), 
    n_sections=n_sections,
    filter_type='highpass',
    nfft=nfft,
    fs=fs,
    requires_grad=True,
    alias_decay_db=0,
)   

Use the Shell class to add input and output layers and to get the magnitude response at initialization Optimization is done in the frequency domain. The input will be an impulse in the time domain, thus the input layer should perform the Fourier transform. The target is the magnitude response, so the output layer takes the absolute value of the filter's output.

input_layer = dsp.FFT(nfft)
output_layer = dsp.Transform(transform=lambda x : torch.abs(x))
model = system.Shell(core=filt, input_layer=input_layer, output_layer=output_layer)    
estimation_init = model.get_freq_response()

Set up the optimization framework and launch it. The Trainer class is used to contain the model, training parameters, and training/valid steps in one class.

input = signal_gallery(1, n_samples=nfft, n=in_ch, signal_type='impulse', fs=fs)
target = torch.einsum('...ji,...i->...j', target_filter, input_layer(input))

dataset = Dataset(
    input=input,
    target=torch.abs(target),
    expand=100,
)
train_loader, valid_loader = load_dataset(dataset, batch_size=1)

trainer = Trainer(model, max_epochs=10, lr=1e-2, train_dir="./output")
trainer.register_criterion(nn.MSELoss(), 1)

trainer.train(train_loader, valid_loader)

end get the resulting response after optimization!

estimation = model.get_freq_response()

📖 Documentation

A first version of the documentation is available on the repo's Github Page. Note that we are currently working on improving the documentation to include examples, images, and a more pleasant template.


📖 Reference

This work has been submitted to ICASSP 2025. Pre-print is available on arxiv.

Dal Santo, G., De Bortoli, G. M., Prawda, K., Schlecht, S. J., & Välimäki, V. (2024). FLAMO: An Open-Source Library for Frequency-Domain Differentiable Audio Processing. arXiv preprint arXiv:2409.08723.

Release files for flamo 0.2.19

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for flamo 0.2.19
File Size Uploaded
flamo-0.2.19.tar.gz 23.7 MB Details

Built distribution (wheel)

Table of built distributions (wheels) for flamo 0.2.19
File Interpreter ABI Platform
flamo-0.2.19-py3-none-any.whl Python 3 none any Details

Total release size: 23.8 MB

Release files / flamo-0.2.19.tar.gz

Download URL flamo-0.2.19.tar.gz
Size 23.7 MB
Tags Source
SHA-256 checksum
How to use checksums
63384c852d18f3e17fdeac5a79cc022e22fc9c159034dc6280a4ba8006680b57
BLAKE2b-256 checksum
How to use checksums
850a610e10e97e58c14af993b36e1ac86a1f11ebf01d850f82e83391d895daf6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.10.15

Release files / flamo-0.2.19-py3-none-any.whl

Download URL flamo-0.2.19-py3-none-any.whl
Size 87.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
6dc944895b9bf1b4cf2b5e3f180b591eb4f5b893edfd31e1c2da1be1aad0b255
BLAKE2b-256 checksum
How to use checksums
0b1d66a711f75da7e3ff3d89c6a5cb6f8000d65e9769722947609b8e14c89b0a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.10.15

Release history Release notifications | RSS feed

0.2.20

2 release files

This release

0.2.19 This release

2 release files

0.2.18

2 release files

0.2.17

2 release files

0.2.16

2 release files

0.2.14

2 release files

0.2.12

2 release files

0.2.9

2 release files

0.2.8

2 release files

0.2.7

2 release files

0.2.6

2 release files

0.2.5

2 release files

0.2.4

2 release files

0.2.3

2 release files

0.2.2

2 release files

0.2.1

2 release files

0.2.0

2 release files

0.1.11

2 release files

0.1.10

2 release files

0.1.9

2 release files

0.1.8

2 release files

0.1.7

2 release files

0.1.6

2 release files

0.1.5

2 release files

0.1.4

2 release files

0.1.3

2 release files

0.1.2

2 release files

0.1.1

2 release files

0.1.0

2 release files

0.0.19

2 release files

0.0.18

2 release files

0.0.17

2 release files

0.0.16

2 release files

0.0.11

2 release files

0.0.10

2 release files

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