pyFDN 0.3.0__tar.gz → 0.4.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {pyfdn-0.3.0 → pyfdn-0.4.0}/CONTRIBUTING.rst +4 -4
- pyfdn-0.4.0/HISTORY.rst +91 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/PKG-INFO +1 -1
- {pyfdn-0.3.0 → pyfdn-0.4.0}/docs/api_reference.rst +72 -7
- {pyfdn-0.3.0 → pyfdn-0.4.0}/docs/conf.py +42 -3
- {pyfdn-0.3.0 → pyfdn-0.4.0}/docs/index.rst +1 -0
- pyfdn-0.4.0/docs/training_losses.rst +99 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/pyproject.toml +2 -2
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/__init__.py +99 -18
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/auxiliary/__init__.py +2 -2
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/auxiliary/acoustics.py +8 -209
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/auxiliary/coupled_rooms.py +5 -5
- pyfdn-0.4.0/src/pyFDN/auxiliary/flamo.py +1103 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/auxiliary/flamo_graph.py +59 -24
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/auxiliary/marimo_utils.py +25 -2
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/auxiliary/plot.py +43 -30
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/auxiliary/utils.py +1 -1
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/build_io.py +45 -20
- pyfdn-0.4.0/src/pyFDN/eq/__init__.py +45 -0
- pyfdn-0.4.0/src/pyFDN/eq/_backend.py +34 -0
- {pyfdn-0.3.0/src/pyFDN/graphicEQ → pyfdn-0.4.0/src/pyFDN/eq}/absorption_geq.py +13 -15
- pyfdn-0.4.0/src/pyFDN/eq/bandpass_filter.py +42 -0
- pyfdn-0.4.0/src/pyFDN/eq/design_geq.py +175 -0
- pyfdn-0.4.0/src/pyFDN/eq/designs.py +177 -0
- pyfdn-0.4.0/src/pyFDN/eq/first_order.py +168 -0
- {pyfdn-0.3.0/src/pyFDN/graphicEQ → pyfdn-0.4.0/src/pyFDN/eq}/graphic_eq.py +26 -17
- pyfdn-0.4.0/src/pyFDN/eq/one_pole.py +76 -0
- pyfdn-0.4.0/src/pyFDN/eq/shelving_filter.py +64 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/generate/fdn_matrix_gallery.py +66 -27
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/process.py +1 -1
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/resources/presets/colorless_FDN/colorless_N16_d1.json +4 -3
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/resources/presets/colorless_FDN/colorless_N16_d2.json +4 -3
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/resources/presets/colorless_FDN/colorless_N4_d1.json +4 -3
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/resources/presets/colorless_FDN/colorless_N4_d2.json +4 -3
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/resources/presets/colorless_FDN/colorless_N6_d1.json +4 -3
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/resources/presets/colorless_FDN/colorless_N6_d2.json +4 -3
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/resources/presets/colorless_FDN/colorless_N8_d1.json +4 -3
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/resources/presets/colorless_FDN/colorless_N8_d2.json +4 -3
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/resources/presets/colorless_FDN/colorless_init_N16_d1.json +4 -3
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/resources/presets/colorless_FDN/colorless_init_N16_d2.json +4 -3
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/resources/presets/colorless_FDN/colorless_init_N4_d1.json +4 -3
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/resources/presets/colorless_FDN/colorless_init_N4_d2.json +4 -3
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/resources/presets/colorless_FDN/colorless_init_N6_d1.json +4 -3
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/resources/presets/colorless_FDN/colorless_init_N6_d2.json +4 -3
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/resources/presets/colorless_FDN/colorless_init_N8_d1.json +4 -3
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/resources/presets/colorless_FDN/colorless_init_N8_d2.json +4 -3
- pyfdn-0.4.0/src/pyFDN/train/__init__.py +84 -0
- pyfdn-0.4.0/src/pyFDN/train/build.py +456 -0
- pyfdn-0.4.0/src/pyFDN/train/engine.py +207 -0
- pyfdn-0.4.0/src/pyFDN/train/losses/__init__.py +46 -0
- pyfdn-0.4.0/src/pyFDN/train/losses/_targets.py +63 -0
- pyfdn-0.4.0/src/pyFDN/train/losses/base.py +151 -0
- pyfdn-0.4.0/src/pyFDN/train/losses/parameter.py +66 -0
- pyfdn-0.4.0/src/pyFDN/train/losses/spectral.py +356 -0
- pyfdn-0.4.0/src/pyFDN/train/losses/temporal.py +347 -0
- pyfdn-0.4.0/src/pyFDN/train/params.py +152 -0
- pyfdn-0.4.0/src/pyFDN/train/response.py +148 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/translate/dss_to_flamo.py +55 -41
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/translate/dss_to_impz.py +17 -21
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/translate/impz_to_res.py +1 -1
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN.egg-info/PKG-INFO +1 -1
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN.egg-info/SOURCES.txt +21 -9
- {pyfdn-0.3.0 → pyfdn-0.4.0}/tests/test_api_reference.py +5 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/tests/test_auxiliary_acoustics.py +0 -61
- {pyfdn-0.3.0 → pyfdn-0.4.0}/tests/test_auxiliary_flamo.py +3 -10
- {pyfdn-0.3.0 → pyfdn-0.4.0}/tests/test_auxiliary_plot.py +35 -14
- {pyfdn-0.3.0 → pyfdn-0.4.0}/tests/test_auxiliary_utils.py +39 -1
- {pyfdn-0.3.0 → pyfdn-0.4.0}/tests/test_build_io.py +14 -4
- pyfdn-0.4.0/tests/test_eq_designs.py +289 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/tests/test_flamo_graph.py +4 -4
- {pyfdn-0.3.0 → pyfdn-0.4.0}/tests/test_flamo_to_pr.py +1 -1
- {pyfdn-0.3.0 → pyfdn-0.4.0}/tests/test_generate.py +22 -19
- {pyfdn-0.3.0 → pyfdn-0.4.0}/tests/test_process_extensions.py +51 -9
- pyfdn-0.4.0/tests/test_train.py +1408 -0
- pyfdn-0.3.0/HISTORY.rst +0 -37
- pyfdn-0.3.0/src/pyFDN/auxiliary/flamo.py +0 -648
- pyfdn-0.3.0/src/pyFDN/graphicEQ/__init__.py +0 -17
- pyfdn-0.3.0/src/pyFDN/graphicEQ/bandpass_filter.py +0 -34
- pyfdn-0.3.0/src/pyFDN/graphicEQ/design_geq.py +0 -73
- pyfdn-0.3.0/src/pyFDN/graphicEQ/shelving_filter.py +0 -55
- pyfdn-0.3.0/src/pyFDN/train/__init__.py +0 -35
- pyfdn-0.3.0/src/pyFDN/train/build.py +0 -321
- pyfdn-0.3.0/src/pyFDN/train/engine.py +0 -182
- pyfdn-0.3.0/src/pyFDN/train/objectives.py +0 -207
- pyfdn-0.3.0/tests/test_graphic_eq.py +0 -129
- pyfdn-0.3.0/tests/test_train.py +0 -269
- {pyfdn-0.3.0 → pyfdn-0.4.0}/AUTHORS.rst +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/LICENSE +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/MANIFEST.in +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/README.rst +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/docs/Makefile +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/docs/__init__.py +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/docs/audio_gallery.py +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/docs/authors.rst +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/docs/contributing.rst +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/docs/example_gallery.py +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/docs/history.rst +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/docs/installation.rst +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/docs/logo/logo_pyFDN_3.png +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/docs/logo/logo_pyFDN_4.png +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/docs/logo/pyfdn_logo_basic.png +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/docs/logo/pyfdn_logo_wave.png +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/docs/make.bat +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/docs/patch_rst.py +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/docs/readme.rst +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/docs/references.py +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/docs/usage.rst +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/setup.cfg +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/setup.py +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/auxiliary/allpass.py +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/auxiliary/audio.py +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/auxiliary/delay.py +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/auxiliary/math.py +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/auxiliary/poles.py +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/auxiliary/tiny_rotation_matrix.py +0 -0
- {pyfdn-0.3.0/src/pyFDN/graphicEQ → pyfdn-0.4.0/src/pyFDN/eq}/probe_sos.py +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/generate/SDN.py +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/generate/allpass_FDN/__init__.py +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/generate/allpass_FDN/allpass_completion.py +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/generate/allpass_FDN/homogeneous_allpass_fdn.py +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/generate/allpass_FDN/rand_admissible_homogeneous_allpass.py +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/generate/allpass_in_fdn.py +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/generate/anderson_matrix.py +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/generate/complete_orthogonal.py +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/generate/construct_cascaded_paraunitary_matrix.py +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/generate/construct_paraunitary_from_elementals.py +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/generate/construct_velvet_feedback_matrix.py +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/generate/degree_one_lossless.py +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/generate/householder_matrix.py +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/generate/is_almost_zero.py +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/generate/nearest_orthogonal.py +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/generate/nearest_sign_agnostic_orthogonal.py +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/generate/random_matrix_shift.py +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/generate/random_orthogonal.py +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/generate/sample_delay_lengths.py +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/generate/schroeder_reverberator.py +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/generate/shift_matrix.py +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/generate/shift_matrix_distribute.py +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/presets.py +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/references.py +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/resources/ATTRIBUTION.md +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/resources/__init__.py +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/resources/audio/drums/drums.wav +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/resources/audio/general/synth_dry.wav +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/resources/audio/metadata.json +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/resources/audio/rir/s3_r4_o.wav +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/resources/audio/speech/P1_Set1_8.wav +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/resources/audio/speech/P20_Set1_8.wav +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/resources/audio/strings/Kleiderschrank_Taylor_DI.wav +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/resources/audio/strings/Sommerhit2016_Taylor_DI.wav +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/resources/licenses/diff-fdn-colorless-MIT.txt +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/resources/references.bib +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/td/__init__.py +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/td/connectors.py +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/td/operators.py +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/translate/dss_to_pr.py +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/translate/dss_to_ss.py +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/translate/dss_to_tf.py +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/translate/flamo_to_pr.py +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/translate/mtf_to_impz.py +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/translate/pr_to_impz.py +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN.egg-info/dependency_links.txt +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN.egg-info/requires.txt +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN.egg-info/top_level.txt +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/tests/__init__.py +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/tests/conftest.py +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/tests/matloader.py +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/tests/reference/README.md +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/tests/reference/example_onePoleAbsorption.mat +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/tests/reference/onePoleAbsorption_reference.mat +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/tests/test_audio_gallery.py +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/tests/test_auxiliary_delay.py +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/tests/test_auxiliary_math.py +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/tests/test_coupled_rooms.py +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/tests/test_dss_to_pr.py +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/tests/test_example_gallery.py +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/tests/test_flamo_one_pole_absorption.py +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/tests/test_marimo_examples_run.py +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/tests/test_packaged_resources.py +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/tests/test_pyFDN.py +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/tests/test_sdn.py +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/tests/test_td_connectors.py +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/tests/test_td_graph_processing.py +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/tests/test_td_operators.py +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/tests/test_time_varying_matrix.py +0 -0
- {pyfdn-0.3.0 → pyfdn-0.4.0}/tests/test_translate.py +0 -0
|
@@ -150,11 +150,11 @@ documentation sources, and tests:
|
|
|
150
150
|
time-domain graph. ``process_fdn`` uses ``MatrixFIR`` for polynomial feedback
|
|
151
151
|
matrices; ``SOSBank`` implements per-delay-line filter cascades used for
|
|
152
152
|
frequency-dependent absorption.
|
|
153
|
-
* ``src/pyFDN/
|
|
154
|
-
|
|
153
|
+
* ``src/pyFDN/eq/`` contains every EQ and absorption-filter design, while
|
|
154
|
+
``src/pyFDN/translate/`` converts between delay state-space, transfer
|
|
155
155
|
function, pole-residue, impulse-response, and FLAMO representations.
|
|
156
|
-
* ``src/pyFDN/train/`` contains the trainable FDN construction,
|
|
157
|
-
and optimization loop. ``src/pyFDN/auxiliary/`` holds shared analysis,
|
|
156
|
+
* ``src/pyFDN/train/`` contains the trainable FDN construction, the composable
|
|
157
|
+
losses in ``train/losses/``, and the optimization loop. ``src/pyFDN/auxiliary/`` holds shared analysis,
|
|
158
158
|
plotting, audio, delay, and numerical helpers.
|
|
159
159
|
* ``examples/`` contains executable Marimo notebooks. Metadata at the top of
|
|
160
160
|
each ``example_*.py`` file drives the generated documentation gallery.
|
pyfdn-0.4.0/HISTORY.rst
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
=======
|
|
2
|
+
History
|
|
3
|
+
=======
|
|
4
|
+
|
|
5
|
+
0.4.0 (2026-08-23)
|
|
6
|
+
------------------
|
|
7
|
+
|
|
8
|
+
* **Breaking:** replace ``train_fdn``'s ``mode`` string, and the ``target``,
|
|
9
|
+
``criteria``, ``sparsity_alpha`` and ``mss_nfft`` arguments that went with
|
|
10
|
+
it, with a composed loss object. An objective is now written out --
|
|
11
|
+
``FlatMagnitude() + 0.2 * Sparsity(param(model, "feedback"))`` -- and every
|
|
12
|
+
loss is a function of the impulse response, carried as a ``Response``, so
|
|
13
|
+
losses own their reference data and one objective can fit two different
|
|
14
|
+
references. ``pyFDN.train.objectives`` and ``build_objective`` are gone.
|
|
15
|
+
* **Breaking:** collect every EQ design in ``pyFDN.eq`` (formerly
|
|
16
|
+
``pyFDN.graphicEQ``) behind one ``EQDesign`` interface, with ``GraphicEQ``,
|
|
17
|
+
``FirstOrderShelf`` and ``OnePole`` sharing a single implementation across
|
|
18
|
+
the numpy and torch backends.
|
|
19
|
+
* **Breaking:** remove ``absorption_filters`` and ``absorption_to_rt``; the FIR
|
|
20
|
+
absorption path they served has no callers left.
|
|
21
|
+
* **Breaking:** name the three filter hooks ``post_delay``, ``post_matrix`` and
|
|
22
|
+
``post_output`` everywhere -- on ``FDNBuild``, in the FLAMO graph, in the
|
|
23
|
+
plots and in the JSON schema -- and add the slot for the third. The build
|
|
24
|
+
schema is version 2; version 1 files no longer load.
|
|
25
|
+
* Fix colorless training on a lossless FDN, whose poles sit on the unit circle
|
|
26
|
+
and leave ``|H|`` unbounded. ``build_fdn`` now defaults ``alias_decay_db``
|
|
27
|
+
from ``rt`` (``LOSSLESS_ALIAS_DECAY_DB`` when ``rt`` is None) and
|
|
28
|
+
``trainable_from_build`` threads it into every module, so a magnitude
|
|
29
|
+
objective sees a bounded response.
|
|
30
|
+
* Train the decay: ``DecayFilter`` parametrizes the in-loop absorption filter
|
|
31
|
+
by reverberation time per band, so the loop stays contractive for every value
|
|
32
|
+
the parameter can take, and takes either one RT curve for the network or one
|
|
33
|
+
per delay line. ``OutputEQ`` trains the output filter outside the recursion,
|
|
34
|
+
the only part of an FDN that shapes the spectral envelope without touching
|
|
35
|
+
the decay. Both are passed as the ``post_delay`` and ``post_output`` hooks of
|
|
36
|
+
``trainable_from_build``.
|
|
37
|
+
* Add the losses that go with it: ``AsymmetricFlatMagnitude``,
|
|
38
|
+
``FlatSpectrogram``, ``MatchEnergyDecay``, ``MatchCumulativeEnergy``,
|
|
39
|
+
``MatchMagnitude``, ``MatchSpectrogram``, ``MatchMelSpectrogram``,
|
|
40
|
+
``MatchImpulseResponse``, ``Energy``, ``Sparsity``, ``L1`` and ``L2``.
|
|
41
|
+
* Resolve trainable parameters by name: ``param(model, "feedback")`` fails
|
|
42
|
+
where you write it with the list of available names, and ``params(model)``
|
|
43
|
+
enumerates them.
|
|
44
|
+
* Export the FLAMO graph builders (``assemble_fdn_core``, ``wrap_fdn_shell``,
|
|
45
|
+
``gain_module``, ``delay_module``, ``matrix_module``, ``fir_matrix_module``,
|
|
46
|
+
``sos_filter_module``, ``hook_module``, ``DecayFilter``, ``OutputEQ``) from
|
|
47
|
+
the top-level namespace.
|
|
48
|
+
* Make ``build_to_impz`` apply all three hooks, so it no longer rejects builds
|
|
49
|
+
that carry an output EQ, and make ``extract_build`` refuse a hook it cannot
|
|
50
|
+
bake rather than silently dropping it.
|
|
51
|
+
* Add an example notebook that fits every parameter of an FDN, decay included,
|
|
52
|
+
to a measured concert-hall RIR, and document the loss rationale and
|
|
53
|
+
measurements in ``docs/training_losses.rst``.
|
|
54
|
+
* Fix stereo orientation in ``labeled_audio``, which decoded a stereo render as
|
|
55
|
+
thousands of channels.
|
|
56
|
+
* Check packaging metadata in CI and fail the documentation build on notebook
|
|
57
|
+
cell errors.
|
|
58
|
+
|
|
59
|
+
0.3.0 (2026-08-17)
|
|
60
|
+
------------------
|
|
61
|
+
|
|
62
|
+
* **Breaking:** replace the ``pyFDN.dsp`` subpackage with ``pyFDN.td``. The
|
|
63
|
+
top-level ``FeedbackDelay``, ``FIRMatrixFilter`` and ``SOSFilterBank``
|
|
64
|
+
exports are gone; use ``pyFDN.td`` operators instead.
|
|
65
|
+
* **Breaking:** ship the packaged colorless-FDN presets as JSON rather than
|
|
66
|
+
MATLAB ``.mat`` files.
|
|
67
|
+
* Add ``pyFDN.td``, a time-domain block-based processing graph built on NumPy
|
|
68
|
+
alone (no torch, no FFT), with the ``Series``, ``Parallel`` and
|
|
69
|
+
``Recursion`` connectors and stateful ``Gain``, ``Delay``, ``SOSBank``,
|
|
70
|
+
``MatrixFIR``, ``MatrixConvolver`` and ``TimeVaryingMatrix`` operators.
|
|
71
|
+
* Add ``load_fdn_build``, ``save_fdn_build``, ``fdn_build_from_dict`` and
|
|
72
|
+
``fdn_build_to_dict`` for reading and writing FDN builds as JSON.
|
|
73
|
+
* Add an FDN-to-FAUST example that compiles a pyFDN design with adac, and a
|
|
74
|
+
reverberation-enhancement example.
|
|
75
|
+
* Improve the example gallery and stop tracking generated documentation in the
|
|
76
|
+
repository.
|
|
77
|
+
* Test on Python 3.14 in CI and the documentation build.
|
|
78
|
+
|
|
79
|
+
0.2.0 (2026-08-10)
|
|
80
|
+
------------------
|
|
81
|
+
|
|
82
|
+
* Package compact audio examples and predefined colorless-FDN coefficients so
|
|
83
|
+
browser-hosted tutorials work without repository-relative files.
|
|
84
|
+
* Add public APIs for packaged audio, FDN presets, and paper references.
|
|
85
|
+
* Add generated documentation galleries and wheel-content checks.
|
|
86
|
+
* Keep decay-estimation dependencies optional for a smaller core installation.
|
|
87
|
+
|
|
88
|
+
0.1.0 (2025-07-02)
|
|
89
|
+
------------------
|
|
90
|
+
|
|
91
|
+
* First release on PyPI.
|
|
@@ -83,14 +83,9 @@ Acoustics & Absorption
|
|
|
83
83
|
:toctree: generated/
|
|
84
84
|
:nosignatures:
|
|
85
85
|
|
|
86
|
-
pyFDN.absorption_filters
|
|
87
|
-
pyFDN.first_order_absorption
|
|
88
|
-
pyFDN.first_order_shelving_eq
|
|
89
|
-
pyFDN.one_pole_absorption
|
|
90
86
|
pyFDN.sos_gain_per_sample_curves
|
|
91
87
|
pyFDN.echo_density
|
|
92
88
|
pyFDN.edc
|
|
93
|
-
pyFDN.absorption_to_rt
|
|
94
89
|
pyFDN.estimate_initial_level_bands
|
|
95
90
|
pyFDN.estimate_rt_bands
|
|
96
91
|
pyFDN.octave_bands
|
|
@@ -100,16 +95,31 @@ Acoustics & Absorption
|
|
|
100
95
|
pyFDN.slope_amplitude_to_level
|
|
101
96
|
pyFDN.slope_to_rt
|
|
102
97
|
|
|
103
|
-
|
|
104
|
-
|
|
98
|
+
EQ & Absorption Design (``pyFDN.eq``)
|
|
99
|
+
--------------------------------------
|
|
100
|
+
|
|
101
|
+
Three designs of the same two filters -- an FDN's in-loop absorption and its
|
|
102
|
+
output EQ -- behind one interface. A design carries its own target and maps it
|
|
103
|
+
to biquad sections in numpy or in torch from a single implementation, which is
|
|
104
|
+
what a trainable :class:`pyFDN.DecayFilter` or :class:`pyFDN.OutputEQ` runs
|
|
105
|
+
inside a training loop.
|
|
105
106
|
|
|
106
107
|
.. autosummary::
|
|
107
108
|
:toctree: generated/
|
|
108
109
|
:nosignatures:
|
|
109
110
|
|
|
111
|
+
pyFDN.EQDesign
|
|
112
|
+
pyFDN.GraphicEQ
|
|
113
|
+
pyFDN.FirstOrderShelf
|
|
114
|
+
pyFDN.OnePole
|
|
110
115
|
pyFDN.design_geq
|
|
116
|
+
pyFDN.geq_sos
|
|
117
|
+
pyFDN.geq_design_matrix
|
|
111
118
|
pyFDN.graphic_eq
|
|
112
119
|
pyFDN.absorption_geq
|
|
120
|
+
pyFDN.first_order_absorption
|
|
121
|
+
pyFDN.first_order_shelving_eq
|
|
122
|
+
pyFDN.one_pole_absorption
|
|
113
123
|
pyFDN.probe_sos
|
|
114
124
|
pyFDN.shelving_filter
|
|
115
125
|
pyFDN.bandpass_filter
|
|
@@ -151,6 +161,29 @@ Delay Utilities
|
|
|
151
161
|
pyFDN.flamo_time_response
|
|
152
162
|
pyFDN.flamo_freq_response
|
|
153
163
|
|
|
164
|
+
Building a FLAMO Graph
|
|
165
|
+
----------------------
|
|
166
|
+
|
|
167
|
+
An FDN as FLAMO modules, assembled from numpy values. The three filter hooks --
|
|
168
|
+
``post_delay`` inside the loop, ``post_matrix`` on the feedback path,
|
|
169
|
+
``post_output`` on the wet signal -- are the same three
|
|
170
|
+
:func:`pyFDN.process_fdn` takes, in the same positions and under the same names.
|
|
171
|
+
|
|
172
|
+
.. autosummary::
|
|
173
|
+
:toctree: generated/
|
|
174
|
+
:nosignatures:
|
|
175
|
+
|
|
176
|
+
pyFDN.assemble_fdn_core
|
|
177
|
+
pyFDN.wrap_fdn_shell
|
|
178
|
+
pyFDN.gain_module
|
|
179
|
+
pyFDN.delay_module
|
|
180
|
+
pyFDN.matrix_module
|
|
181
|
+
pyFDN.fir_matrix_module
|
|
182
|
+
pyFDN.sos_filter_module
|
|
183
|
+
pyFDN.hook_module
|
|
184
|
+
pyFDN.DecayFilter
|
|
185
|
+
pyFDN.OutputEQ
|
|
186
|
+
|
|
154
187
|
Polynomial & Matrix Maths
|
|
155
188
|
--------------------------
|
|
156
189
|
|
|
@@ -265,6 +298,38 @@ Training
|
|
|
265
298
|
pyFDN.Trainable
|
|
266
299
|
pyFDN.train_fdn
|
|
267
300
|
pyFDN.TrainLog
|
|
301
|
+
pyFDN.LOSSLESS_ALIAS_DECAY_DB
|
|
302
|
+
|
|
303
|
+
Training Objectives
|
|
304
|
+
-------------------
|
|
305
|
+
|
|
306
|
+
An objective is a weighted sum of losses, composed with ``+`` and ``*``. Losses
|
|
307
|
+
on the impulse response read a :class:`pyFDN.Response`; losses on a model
|
|
308
|
+
parameter take a :class:`pyFDN.ParamRef` from :func:`pyFDN.param`.
|
|
309
|
+
|
|
310
|
+
.. autosummary::
|
|
311
|
+
:toctree: generated/
|
|
312
|
+
:nosignatures:
|
|
313
|
+
|
|
314
|
+
pyFDN.Response
|
|
315
|
+
pyFDN.model_response
|
|
316
|
+
pyFDN.param
|
|
317
|
+
pyFDN.params
|
|
318
|
+
pyFDN.ParamRef
|
|
319
|
+
pyFDN.Loss
|
|
320
|
+
pyFDN.FlatMagnitude
|
|
321
|
+
pyFDN.AsymmetricFlatMagnitude
|
|
322
|
+
pyFDN.FlatSpectrogram
|
|
323
|
+
pyFDN.MatchMagnitude
|
|
324
|
+
pyFDN.MatchSpectrogram
|
|
325
|
+
pyFDN.MatchMelSpectrogram
|
|
326
|
+
pyFDN.MatchImpulseResponse
|
|
327
|
+
pyFDN.MatchEnergyDecay
|
|
328
|
+
pyFDN.MatchCumulativeEnergy
|
|
329
|
+
pyFDN.Energy
|
|
330
|
+
pyFDN.Sparsity
|
|
331
|
+
pyFDN.L1
|
|
332
|
+
pyFDN.L2
|
|
268
333
|
|
|
269
334
|
Plotting
|
|
270
335
|
--------
|
|
@@ -148,6 +148,17 @@ marimo_cache_notebooks = False
|
|
|
148
148
|
#
|
|
149
149
|
# This patch lives in conf.py (our repo), so the installed sphinx-marimo package
|
|
150
150
|
# stays pristine and deployment (RTD / GitHub Actions) needs no vendored changes.
|
|
151
|
+
#
|
|
152
|
+
# Cell errors are build failures: a notebook that raises still produces HTML,
|
|
153
|
+
# with the traceback baked in where the output should be, so a broken example
|
|
154
|
+
# reaches the published site looking like a rendered page. We record every
|
|
155
|
+
# notebook whose export exited non-zero and fail the build at the end (see
|
|
156
|
+
# ``setup`` below) instead of aborting on the first one, so a single run reports
|
|
157
|
+
# all of them. Set ``PYFDN_DOCS_ALLOW_NOTEBOOK_ERRORS=1`` to downgrade this back
|
|
158
|
+
# to a warning when you need a build out of a knowingly broken notebook.
|
|
159
|
+
_marimo_export_failures: "list[tuple[str, str]]" = []
|
|
160
|
+
|
|
161
|
+
|
|
151
162
|
def _patch_marimo_static_export():
|
|
152
163
|
import subprocess
|
|
153
164
|
|
|
@@ -173,8 +184,8 @@ def _patch_marimo_static_export():
|
|
|
173
184
|
# `html` (not `html-wasm`) executes the notebook server-side with the real
|
|
174
185
|
# venv and embeds the outputs. marimo returns a non-zero exit code when any
|
|
175
186
|
# cell raises during execution, but it still writes the HTML (with the error
|
|
176
|
-
# baked in), so we
|
|
177
|
-
#
|
|
187
|
+
# baked in), so we record the failure and keep going; the build-finished
|
|
188
|
+
# handler turns the collected failures into a build error.
|
|
178
189
|
proc = subprocess.run(
|
|
179
190
|
[
|
|
180
191
|
"marimo",
|
|
@@ -190,9 +201,10 @@ def _patch_marimo_static_export():
|
|
|
190
201
|
)
|
|
191
202
|
if proc.returncode != 0:
|
|
192
203
|
print(
|
|
193
|
-
f"[conf.py]
|
|
204
|
+
f"[conf.py] ERROR: '{relative_path}' had cell errors during static "
|
|
194
205
|
f"export (output still written):\n{proc.stderr.strip()}"
|
|
195
206
|
)
|
|
207
|
+
_marimo_export_failures.append((str(relative_path), proc.stderr.strip()))
|
|
196
208
|
|
|
197
209
|
return {
|
|
198
210
|
"name": output_name,
|
|
@@ -205,3 +217,30 @@ def _patch_marimo_static_export():
|
|
|
205
217
|
|
|
206
218
|
|
|
207
219
|
_patch_marimo_static_export()
|
|
220
|
+
|
|
221
|
+
|
|
222
|
+
def _fail_on_marimo_export_errors(app, exception):
|
|
223
|
+
"""Fail the build if any notebook raised while being exported."""
|
|
224
|
+
# The build already failed for another reason; don't mask it.
|
|
225
|
+
if exception is not None or not _marimo_export_failures:
|
|
226
|
+
return
|
|
227
|
+
|
|
228
|
+
report = "\n\n".join(
|
|
229
|
+
f"{path}:\n{stderr}" for path, stderr in _marimo_export_failures
|
|
230
|
+
)
|
|
231
|
+
if os.environ.get("PYFDN_DOCS_ALLOW_NOTEBOOK_ERRORS") == "1":
|
|
232
|
+
print(
|
|
233
|
+
f"[conf.py] WARNING: {len(_marimo_export_failures)} notebook(s) had cell "
|
|
234
|
+
f"errors; failing is disabled via PYFDN_DOCS_ALLOW_NOTEBOOK_ERRORS:\n{report}"
|
|
235
|
+
)
|
|
236
|
+
return
|
|
237
|
+
|
|
238
|
+
raise RuntimeError(
|
|
239
|
+
f"{len(_marimo_export_failures)} example notebook(s) raised during static "
|
|
240
|
+
f"export. The generated HTML contains the traceback instead of the intended "
|
|
241
|
+
f"output, so this must not be published:\n\n{report}"
|
|
242
|
+
)
|
|
243
|
+
|
|
244
|
+
|
|
245
|
+
def setup(app):
|
|
246
|
+
app.connect("build-finished", _fail_on_marimo_export_errors)
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
===============================
|
|
2
|
+
Training losses: design notes
|
|
3
|
+
===============================
|
|
4
|
+
|
|
5
|
+
Why the losses in :mod:`pyFDN.train.losses` are shaped the way they are. The
|
|
6
|
+
reasoning is qualitative on purpose: what is stated here is a design choice and
|
|
7
|
+
its rationale, not a benchmark. Behaviour is FDN- and seed-dependent, so measure
|
|
8
|
+
your own case before assuming any of it transfers.
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
Flatness on the training grid depends on ``nfft``
|
|
12
|
+
=================================================
|
|
13
|
+
|
|
14
|
+
:class:`~pyFDN.FlatMagnitude` measures ``|H|`` at the model's DFT bins, so its
|
|
15
|
+
frequency resolution *is* the model's ``nfft``. The truncation to ``nfft``
|
|
16
|
+
samples is a rectangular window, so the peak-to-median range of ``|H|`` grows
|
|
17
|
+
with ``nfft``, and the mean-squared error weights the tallest modes ever more
|
|
18
|
+
heavily. Loss values are therefore comparable across runs at one ``nfft`` and
|
|
19
|
+
not across different ones. A multi-resolution loss
|
|
20
|
+
(:class:`~pyFDN.FlatSpectrogram`), whose analysis windows set their own
|
|
21
|
+
resolution, is the way out.
|
|
22
|
+
|
|
23
|
+
The optimization crosses long plateaus on ``FlatMagnitude``; ``train_fdn``'s
|
|
24
|
+
default ``patience=10`` stops inside one. Raise it for a converged fit.
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
Asymmetric flatness: peaks over dips
|
|
28
|
+
====================================
|
|
29
|
+
|
|
30
|
+
:class:`~pyFDN.AsymmetricFlatMagnitude` raises the two sides of the deviation
|
|
31
|
+
from flat to different powers so peaks cost more than dips. The exponent, not a
|
|
32
|
+
weight, is what makes it bite: at ``peak_power=4`` a peak twice as tall costs
|
|
33
|
+
sixteen times as much. Flat stays the unique minimum at every ``peak_power``
|
|
34
|
+
(normalizing by RMS forces ``<(1 + d)^2> = 1``), and the loss is gain-invariant.
|
|
35
|
+
|
|
36
|
+
It is deliberately **not** in decibels: ``∂dB/∂|H| ∝ 1/|H|``, so in dB the
|
|
37
|
+
deepest nulls dominate the gradient however lightly weighted. In linear
|
|
38
|
+
magnitude the gradient is ``∝ p·(d⁺)^(p-1)``, largest at the tallest peaks,
|
|
39
|
+
while a dip is bounded at ``d = -1``.
|
|
40
|
+
|
|
41
|
+
The cost is steps and steadiness: that same gradient vanishes near the optimum,
|
|
42
|
+
so a higher exponent takes longer to converge and varies more from seed to seed.
|
|
43
|
+
The advantage over ``FlatMagnitude`` is not unconditional. Loss values are not
|
|
44
|
+
comparable across ``peak_power``, or with ``FlatMagnitude``; compare the
|
|
45
|
+
responses.
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
Multi-resolution flatness: average over frames first
|
|
49
|
+
====================================================
|
|
50
|
+
|
|
51
|
+
:class:`~pyFDN.FlatSpectrogram` averages the short-time magnitudes over frames
|
|
52
|
+
into a Welch estimate *before* measuring flatness. Asking each individual frame
|
|
53
|
+
to be flat instead is actively harmful: an isolated echo inside a short frame
|
|
54
|
+
already has a flat frame spectrum, so that objective rewards an impulsive,
|
|
55
|
+
comb-filtered IR.
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
Energy decay vs. spectrogram distance
|
|
59
|
+
=====================================
|
|
60
|
+
|
|
61
|
+
:class:`~pyFDN.MatchEnergyDecay` compares octave-band Schroeder curves. A
|
|
62
|
+
magnitude spectrogram distance is not a substitute for fitting a decay: it
|
|
63
|
+
compares two signals frame by frame, and two rooms with identical decay have
|
|
64
|
+
uncorrelated fine structure, so predicting *silence* scores better there than
|
|
65
|
+
predicting the right amount of the wrong detail. Fitted to a measured room, a
|
|
66
|
+
spectrogram distance is minimized by an FDN whose RT falls well short of the
|
|
67
|
+
measurement, where an energy-decay loss is not.
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
Doubly-cumulated energy
|
|
71
|
+
=======================
|
|
72
|
+
|
|
73
|
+
:class:`~pyFDN.MatchCumulativeEnergy` integrates the short-time power spectrum
|
|
74
|
+
twice — backwards in time and along frequency — and scores the RMS difference of
|
|
75
|
+
the two surfaces after a compressive power.
|
|
76
|
+
|
|
77
|
+
**Why cumulate twice.** The time direction is Schroeder backward integration
|
|
78
|
+
(the reason ``MatchEnergyDecay`` exists). The frequency direction replaces
|
|
79
|
+
splitting into octave bands: band edges are an arbitrary quantization a fit can
|
|
80
|
+
satisfy on average while getting the shape wrong, whereas a cumulative sum is
|
|
81
|
+
the limit of ever-finer bands and is monotone and smooth in both axes, which a
|
|
82
|
+
gradient values. Read down the ``t = 0`` edge and you have the integrated
|
|
83
|
+
spectrum (colour); read across the ``f = 0`` edge and you have the full-band
|
|
84
|
+
decay; the interior ties them together band by band.
|
|
85
|
+
|
|
86
|
+
**Compression, not decibels.** The surface spans the whole dynamic range of the
|
|
87
|
+
decay, so a plain MSE would see only the first frames. Raising the normalized
|
|
88
|
+
surface to a fractional ``power`` (0.5 default) compresses that range while
|
|
89
|
+
staying bounded, its gradient ``∝ x^(p-1)`` finite everywhere the floor allows.
|
|
90
|
+
A logarithm is worse: it turns the silence *below* the response into an
|
|
91
|
+
unbounded penalty dominated by whichever bin is nearest zero.
|
|
92
|
+
|
|
93
|
+
**Which way the frequency cumulation runs.** Cumulating downwards alone — the
|
|
94
|
+
default, and the plain reading of "energy above this frequency" — leaves the
|
|
95
|
+
bottom octave with almost no gradient, and a fit that has to *find* a decay
|
|
96
|
+
tends to abandon it there. ``frequency="both"`` scores both directions and
|
|
97
|
+
averages, which recovers the low end; it is the setting to reach for when the
|
|
98
|
+
decay is not given. This is a matter of weighting rather than frequency
|
|
99
|
+
resolution, so a longer analysis window is not the fix.
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "pyFDN"
|
|
7
|
-
version = "0.
|
|
7
|
+
version = "0.4.0"
|
|
8
8
|
description = "Python library for Feedback Delay Networks"
|
|
9
9
|
readme = "README.rst"
|
|
10
10
|
authors = [
|
|
@@ -113,7 +113,7 @@ include = ["pyFDN*"]
|
|
|
113
113
|
# triggers on. Usage: bump-my-version bump {major|minor|patch}
|
|
114
114
|
|
|
115
115
|
[tool.bumpversion]
|
|
116
|
-
current_version = "0.
|
|
116
|
+
current_version = "0.4.0"
|
|
117
117
|
allow_dirty = false
|
|
118
118
|
commit = true
|
|
119
119
|
message = "Bump version: {current_version} → {new_version}"
|
|
@@ -3,15 +3,13 @@
|
|
|
3
3
|
from importlib import import_module
|
|
4
4
|
|
|
5
5
|
__author__ = "Facundo Franchino"
|
|
6
|
-
__version__ = "0.
|
|
6
|
+
__version__ = "0.4.0"
|
|
7
7
|
|
|
8
8
|
__all__ = [
|
|
9
9
|
# acoustics
|
|
10
|
-
"absorption_filters",
|
|
11
10
|
"echo_density",
|
|
12
11
|
"estimate_initial_level_bands",
|
|
13
12
|
"estimate_rt_bands",
|
|
14
|
-
"absorption_to_rt",
|
|
15
13
|
"edc",
|
|
16
14
|
"first_order_absorption",
|
|
17
15
|
"first_order_shelving_eq",
|
|
@@ -32,6 +30,17 @@ __all__ = [
|
|
|
32
30
|
"flamo_time_response",
|
|
33
31
|
"flamo_freq_response",
|
|
34
32
|
"flamo_process",
|
|
33
|
+
# building a FLAMO FDN graph from numpy values
|
|
34
|
+
"assemble_fdn_core",
|
|
35
|
+
"wrap_fdn_shell",
|
|
36
|
+
"gain_module",
|
|
37
|
+
"delay_module",
|
|
38
|
+
"matrix_module",
|
|
39
|
+
"fir_matrix_module",
|
|
40
|
+
"sos_filter_module",
|
|
41
|
+
"hook_module",
|
|
42
|
+
"DecayFilter",
|
|
43
|
+
"OutputEQ",
|
|
35
44
|
"audio_metadata",
|
|
36
45
|
"available_audio",
|
|
37
46
|
"load_audio",
|
|
@@ -70,10 +79,16 @@ __all__ = [
|
|
|
70
79
|
"shift_matrix",
|
|
71
80
|
"shift_matrix_distribute",
|
|
72
81
|
"tiny_rotation_matrix",
|
|
73
|
-
#
|
|
82
|
+
# eq
|
|
74
83
|
"absorption_geq",
|
|
75
84
|
"bandpass_filter",
|
|
85
|
+
"EQDesign",
|
|
86
|
+
"FirstOrderShelf",
|
|
87
|
+
"GraphicEQ",
|
|
88
|
+
"OnePole",
|
|
76
89
|
"design_geq",
|
|
90
|
+
"geq_design_matrix",
|
|
91
|
+
"geq_sos",
|
|
77
92
|
"graphic_eq",
|
|
78
93
|
"probe_sos",
|
|
79
94
|
"shelving_filter",
|
|
@@ -133,10 +148,35 @@ __all__ = [
|
|
|
133
148
|
# training
|
|
134
149
|
"build_fdn",
|
|
135
150
|
"trainable_from_build",
|
|
151
|
+
"LOSSLESS_ALIAS_DECAY_DB",
|
|
136
152
|
"build_set_decay",
|
|
137
153
|
"Trainable",
|
|
138
154
|
"train_fdn",
|
|
139
155
|
"TrainLog",
|
|
156
|
+
# training: what a loss sees
|
|
157
|
+
"Response",
|
|
158
|
+
"model_response",
|
|
159
|
+
"impulse_excitation",
|
|
160
|
+
"param",
|
|
161
|
+
"params",
|
|
162
|
+
"ParamRef",
|
|
163
|
+
# training: losses
|
|
164
|
+
"Loss",
|
|
165
|
+
"ResponseLoss",
|
|
166
|
+
"ParameterLoss",
|
|
167
|
+
"FlatMagnitude",
|
|
168
|
+
"AsymmetricFlatMagnitude",
|
|
169
|
+
"FlatSpectrogram",
|
|
170
|
+
"MatchMagnitude",
|
|
171
|
+
"MatchSpectrogram",
|
|
172
|
+
"MatchMelSpectrogram",
|
|
173
|
+
"MatchImpulseResponse",
|
|
174
|
+
"MatchEnergyDecay",
|
|
175
|
+
"MatchCumulativeEnergy",
|
|
176
|
+
"Energy",
|
|
177
|
+
"Sparsity",
|
|
178
|
+
"L1",
|
|
179
|
+
"L2",
|
|
140
180
|
# plotting
|
|
141
181
|
"animate",
|
|
142
182
|
"plot_db_per_sample",
|
|
@@ -192,17 +232,12 @@ __all__ = [
|
|
|
192
232
|
|
|
193
233
|
# acoustics and absorption
|
|
194
234
|
from .auxiliary.acoustics import (
|
|
195
|
-
absorption_filters,
|
|
196
|
-
absorption_to_rt,
|
|
197
235
|
echo_density,
|
|
198
236
|
edc,
|
|
199
237
|
estimate_initial_level_bands,
|
|
200
238
|
estimate_rt_bands,
|
|
201
|
-
first_order_absorption,
|
|
202
|
-
first_order_shelving_eq,
|
|
203
239
|
octave_band_filterbank,
|
|
204
240
|
octave_bands,
|
|
205
|
-
one_pole_absorption,
|
|
206
241
|
rt_to_gain_per_sample,
|
|
207
242
|
rt_to_slope,
|
|
208
243
|
slope_amplitude_to_level,
|
|
@@ -227,7 +262,21 @@ from .auxiliary.delay import (
|
|
|
227
262
|
ms_to_smp,
|
|
228
263
|
swap_flamo_recursion_paths,
|
|
229
264
|
)
|
|
230
|
-
from .auxiliary.flamo import
|
|
265
|
+
from .auxiliary.flamo import (
|
|
266
|
+
DecayFilter,
|
|
267
|
+
OutputEQ,
|
|
268
|
+
assemble_fdn_core,
|
|
269
|
+
delay_module,
|
|
270
|
+
fir_matrix_module,
|
|
271
|
+
flamo_freq_response,
|
|
272
|
+
flamo_process,
|
|
273
|
+
flamo_time_response,
|
|
274
|
+
gain_module,
|
|
275
|
+
hook_module,
|
|
276
|
+
matrix_module,
|
|
277
|
+
sos_filter_module,
|
|
278
|
+
wrap_fdn_shell,
|
|
279
|
+
)
|
|
231
280
|
from .auxiliary.flamo_graph import (
|
|
232
281
|
extract_build,
|
|
233
282
|
flamo_model_to_nodes,
|
|
@@ -307,6 +356,23 @@ from .build_io import (
|
|
|
307
356
|
load_fdn_build,
|
|
308
357
|
save_fdn_build,
|
|
309
358
|
)
|
|
359
|
+
from .eq import (
|
|
360
|
+
EQDesign,
|
|
361
|
+
FirstOrderShelf,
|
|
362
|
+
GraphicEQ,
|
|
363
|
+
OnePole,
|
|
364
|
+
absorption_geq,
|
|
365
|
+
bandpass_filter,
|
|
366
|
+
design_geq,
|
|
367
|
+
first_order_absorption,
|
|
368
|
+
first_order_shelving_eq,
|
|
369
|
+
geq_design_matrix,
|
|
370
|
+
geq_sos,
|
|
371
|
+
graphic_eq,
|
|
372
|
+
one_pole_absorption,
|
|
373
|
+
probe_sos,
|
|
374
|
+
shelving_filter,
|
|
375
|
+
)
|
|
310
376
|
from .generate.allpass_FDN import allpass_completion
|
|
311
377
|
from .generate.allpass_FDN.allpass_completion import (
|
|
312
378
|
apply_diagonal_similarity,
|
|
@@ -360,14 +426,6 @@ from .generate.schroeder_reverberator import schroeder_reverberator
|
|
|
360
426
|
from .generate.SDN import SDN
|
|
361
427
|
from .generate.shift_matrix import shift_matrix
|
|
362
428
|
from .generate.shift_matrix_distribute import shift_matrix_distribute
|
|
363
|
-
from .graphicEQ import (
|
|
364
|
-
absorption_geq,
|
|
365
|
-
bandpass_filter,
|
|
366
|
-
design_geq,
|
|
367
|
-
graphic_eq,
|
|
368
|
-
probe_sos,
|
|
369
|
-
shelving_filter,
|
|
370
|
-
)
|
|
371
429
|
from .presets import available_fdn_presets, load_fdn_preset
|
|
372
430
|
|
|
373
431
|
# fdn processing
|
|
@@ -376,10 +434,33 @@ from .references import paper_link, paper_reference
|
|
|
376
434
|
|
|
377
435
|
# training (torch/flamo are imported lazily inside these)
|
|
378
436
|
from .train import (
|
|
437
|
+
L1,
|
|
438
|
+
L2,
|
|
439
|
+
LOSSLESS_ALIAS_DECAY_DB,
|
|
440
|
+
AsymmetricFlatMagnitude,
|
|
441
|
+
Energy,
|
|
442
|
+
FlatMagnitude,
|
|
443
|
+
FlatSpectrogram,
|
|
444
|
+
Loss,
|
|
445
|
+
MatchCumulativeEnergy,
|
|
446
|
+
MatchEnergyDecay,
|
|
447
|
+
MatchImpulseResponse,
|
|
448
|
+
MatchMagnitude,
|
|
449
|
+
MatchMelSpectrogram,
|
|
450
|
+
MatchSpectrogram,
|
|
451
|
+
ParameterLoss,
|
|
452
|
+
ParamRef,
|
|
453
|
+
Response,
|
|
454
|
+
ResponseLoss,
|
|
455
|
+
Sparsity,
|
|
379
456
|
Trainable,
|
|
380
457
|
TrainLog,
|
|
381
458
|
build_fdn,
|
|
382
459
|
build_set_decay,
|
|
460
|
+
impulse_excitation,
|
|
461
|
+
model_response,
|
|
462
|
+
param,
|
|
463
|
+
params,
|
|
383
464
|
train_fdn,
|
|
384
465
|
trainable_from_build,
|
|
385
466
|
)
|
|
@@ -11,6 +11,7 @@ from .allpass import (
|
|
|
11
11
|
from .audio import load_audio
|
|
12
12
|
from .flamo import (
|
|
13
13
|
assemble_fdn_core,
|
|
14
|
+
core_alias_decay_db,
|
|
14
15
|
delay_module,
|
|
15
16
|
fir_matrix_module,
|
|
16
17
|
flamo_freq_response,
|
|
@@ -18,7 +19,6 @@ from .flamo import (
|
|
|
18
19
|
flamo_time_response,
|
|
19
20
|
gain_module,
|
|
20
21
|
matrix_module,
|
|
21
|
-
output_layer,
|
|
22
22
|
sos_filter_module,
|
|
23
23
|
wrap_fdn_shell,
|
|
24
24
|
)
|
|
@@ -40,7 +40,7 @@ __all__ = [
|
|
|
40
40
|
"matrix_module",
|
|
41
41
|
"assemble_fdn_core",
|
|
42
42
|
"wrap_fdn_shell",
|
|
43
|
-
"
|
|
43
|
+
"core_alias_decay_db",
|
|
44
44
|
"flamo_time_response",
|
|
45
45
|
"flamo_freq_response",
|
|
46
46
|
"flamo_process",
|