History#
Unreleased#
Add the
example_multislope_rir_to_fdnnotebook: a measured room-transition response is fitted with two decay slopes per octave band using DecayFitNet from themultislopepackage, and each slope is resynthesised by its own FDN. The response it uses ships with the package as themeetingroom_to_hallway_290cmaudio resource, taken from the coupled-rooms transition dataset.Add nonlinear and pitch-shifting time-domain operators for shimmer reverberation –
DCBlocker,ControllableFullWaveRect,SDFD,RingModulator,PitchShiftandGranularPitchShift– all usable asprocess_fdnhooks, plus theexample_shimmer_fdnnotebook that walks through each one inside the feedback loop of the same 8-line FDN.is_uniallpassno longer solves a singular Lyapunov equation whenAis itself lossless (as in the allpass-in-FDN structure). The spectral radius is checked first and such a system is reported as not uniallpass, instead of the result depending on whether LAPACK chose to warn or raise on the ill- conditioned solve.Fix a device mismatch when a loss built for one run is used in another: every loss that holds a reference impulse response (
MatchCumulativeEnergy,MatchEnergyDecay,MatchMagnitude,MatchImpulseResponse,MatchSpectrogram,MatchMelSpectrogram) aligned its reference once, on the first response it saw, and then handed that CPU tensor to a later CUDA step – the way a notebook cell that builds the loss but does not re-run on a runtime switch would hit it. The aligned reference is now keyed on the response’s shape, device, dtype and sample rate, and rebuilt when any of them changes.MatchSpectrogramandMatchMelSpectrogramalso default theirdeviceto the response’s rather than to the CPU, so FLAMO builds its filterbanks where the model is.
0.4.1 (2026-08-24)#
Let
fdn_build_galleryand the target-to-EQ functions optionally return the design choices used to produce their coefficients, ready to store in anFDNPreset. Build generation now also exposes the delay distribution and coprimality options and lives separately from the matrix galleries.Breaking: rename the
Fsparameter tofseverywhere it is still spelled with a capital –dss_to_flamo,dss_to_pr,delay_moduleandSDN. Every other sampling-rate argument in the package was alreadyfs, and the odd one out forced callers to remember which spelling each function wanted.SDNalso renames itsfsattribute and the"fs"key of the dictionarySDN.compute()returns.
0.4.0 (2026-08-23)#
Add
FDNPresetJSON documents: a bakedFDNBuildplus catalog metadata and a controlled vocabulary for delays, matrices, and the three filter hooks.trainable_from_presetrestores filter targets as meaningful FLAMO parameters only when they reproduce the baked coefficients.Breaking: replace
train_fdn’smodestring, and thetarget,criteria,sparsity_alphaandmss_nfftarguments that went with it, with a composed loss object. An objective is now written out –FlatMagnitude() + 0.2 * Sparsity(param(model, "feedback"))– and every loss is a function of the impulse response, carried as aResponse, so losses own their reference data and one objective can fit two different references.pyFDN.train.objectivesandbuild_objectiveare gone.Breaking: collect every EQ design in
pyFDN.eq(formerlypyFDN.graphicEQ) behind oneEQDesigninterface, withGraphicEQ,FirstOrderShelfandOnePolesharing a single implementation across the numpy and torch backends.Breaking: remove
absorption_filtersandabsorption_to_rt; the FIR absorption path they served has no callers left.Breaking: name the three filter hooks
post_delay,post_matrixandpost_outputeverywhere – onFDNBuild, in the FLAMO graph, in the plots and in the JSON schema – and add the slot for the third. The build schema is version 2; version 1 files no longer load.Fix colorless training on a lossless FDN, whose poles sit on the unit circle and leave
|H|unbounded.build_fdnnow defaultsalias_decay_dbfromrt(LOSSLESS_ALIAS_DECAY_DBwhenrtis None) andtrainable_from_buildthreads it into every module, so a magnitude objective sees a bounded response.Train the decay:
AttenuationFilterparametrizes the in-loop absorption filter by reverberation time per band, so the loop stays contractive for every value the parameter can take, and takes either one RT curve for the network or one per delay line.OutputEQtrains the output filter outside the recursion, the only part of an FDN that shapes the spectral envelope without touching the decay. Both are passed as thepost_delayandpost_outputhooks oftrainable_from_build.Add the losses that go with it:
AsymmetricFlatMagnitude,FlatSpectrogram,MatchEnergyDecay,MatchCumulativeEnergy,MatchMagnitude,MatchSpectrogram,MatchMelSpectrogram,MatchImpulseResponse,Energy,Sparsity,L1andL2.Resolve trainable parameters by name:
param(model, "feedback")fails where you write it with the list of available names, andparams(model)enumerates them.Export the FLAMO graph builders (
assemble_fdn_core,wrap_fdn_shell,gain_module,delay_module,matrix_module,fir_matrix_module,sos_filter_module,hook_module,AttenuationFilter,OutputEQ) from the top-level namespace.Make
build_to_impzapply all three hooks, so it no longer rejects builds that carry an output EQ, and makeextract_buildrefuse a hook it cannot bake rather than silently dropping it.Add an example notebook that fits every parameter of an FDN, decay included, to a measured concert-hall RIR, and document the loss rationale and measurements in
docs/training_losses.rst.Fix stereo orientation in
labeled_audio, which decoded a stereo render as thousands of channels.Check packaging metadata in CI and fail the documentation build on notebook cell errors.
0.3.0 (2026-08-17)#
Breaking: replace the
pyFDN.dspsubpackage withpyFDN.td. The top-levelFeedbackDelay,FIRMatrixFilterandSOSFilterBankexports are gone; usepyFDN.tdoperators instead.Breaking: ship the packaged colorless-FDN presets as JSON rather than MATLAB
.matfiles.Add
pyFDN.td, a time-domain block-based processing graph built on NumPy alone (no torch, no FFT), with theSeries,ParallelandRecursionconnectors and statefulGain,Delay,SOSBank,MatrixFIR,MatrixConvolverandTimeVaryingMatrixoperators.Add
load_fdn_build,save_fdn_build,fdn_build_from_dictandfdn_build_to_dictfor reading and writing FDN builds as JSON.Add an FDN-to-FAUST example that compiles a pyFDN design with adac, and a reverberation-enhancement example.
Improve the example gallery and stop tracking generated documentation in the repository.
Test on Python 3.14 in CI and the documentation build.
0.2.0 (2026-08-10)#
Package compact audio examples and predefined colorless-FDN coefficients so browser-hosted tutorials work without repository-relative files.
Add public APIs for packaged audio, FDN presets, and paper references.
Add generated documentation galleries and wheel-content checks.
Keep decay-estimation dependencies optional for a smaller core installation.
0.1.0 (2025-07-02)#
First release on PyPI.