pyFDN 0.4.2__tar.gz → 0.5.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.4.2 → pyfdn-0.5.0}/CONTRIBUTING.rst +12 -6
- pyfdn-0.5.0/HISTORY.rst +284 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/PKG-INFO +3 -7
- {pyfdn-0.4.2 → pyfdn-0.5.0}/README.rst +1 -1
- {pyfdn-0.4.2 → pyfdn-0.5.0}/docs/api_reference.rst +26 -5
- {pyfdn-0.4.2 → pyfdn-0.5.0}/docs/usage.rst +10 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/pyproject.toml +6 -26
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/__init__.py +166 -77
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/auxiliary/acoustics.py +24 -5
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/auxiliary/allpass.py +11 -152
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/auxiliary/flamo.py +51 -60
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/auxiliary/flamo_graph.py +4 -10
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/auxiliary/math.py +10 -12
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/auxiliary/plot.py +345 -479
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/auxiliary/poles.py +49 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/auxiliary/utils.py +71 -55
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/build.py +15 -4
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/eq/__init__.py +2 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/eq/biquads.py +2 -2
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/eq/design.py +8 -4
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/eq/graphic_eq.py +8 -8
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/generate/SDN.py +64 -106
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/generate/allpass_FDN/allpass_completion.py +11 -28
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/generate/allpass_FDN/homogeneous_allpass_fdn.py +1 -1
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/generate/fdn_build_gallery.py +5 -72
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/generate/fdn_matrix_gallery.py +77 -43
- pyfdn-0.5.0/src/pyFDN/generate/kronecker_matrix.py +284 -0
- pyfdn-0.5.0/src/pyFDN/generate/orthogonal.py +273 -0
- pyfdn-0.5.0/src/pyFDN/generate/paraunitary.py +227 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/generate/sample_delay_lengths.py +3 -8
- pyfdn-0.5.0/src/pyFDN/generate/structures.py +300 -0
- pyfdn-0.5.0/src/pyFDN/process.py +98 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/resources/references.bib +31 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/td/__init__.py +5 -1
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/td/connectors.py +22 -31
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/td/operators.py +217 -39
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/train/__init__.py +17 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/train/build.py +34 -128
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/train/engine.py +5 -2
- pyfdn-0.5.0/src/pyFDN/train/features/__init__.py +7 -0
- pyfdn-0.5.0/src/pyFDN/train/features/spatial.py +64 -0
- pyfdn-0.5.0/src/pyFDN/train/features/temporal.py +60 -0
- pyfdn-0.5.0/src/pyFDN/train/filters.py +271 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/train/losses/__init__.py +21 -0
- pyfdn-0.5.0/src/pyFDN/train/losses/distances.py +156 -0
- pyfdn-0.5.0/src/pyFDN/train/losses/features.py +366 -0
- pyfdn-0.5.0/src/pyFDN/train/losses/match.py +80 -0
- pyfdn-0.5.0/src/pyFDN/train/losses/reductions.py +72 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/train/losses/spectral.py +211 -79
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/train/losses/temporal.py +40 -157
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/train/response.py +4 -1
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/translate/dss_to_flamo.py +91 -63
- pyfdn-0.5.0/src/pyFDN/translate/dss_to_impz.py +93 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/translate/dss_to_pr.py +29 -53
- pyfdn-0.5.0/src/pyFDN/translate/dss_to_ss.py +113 -0
- pyfdn-0.5.0/src/pyFDN/translate/dss_to_td.py +219 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/translate/dss_to_tf.py +7 -3
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/translate/flamo_to_pr.py +32 -82
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN.egg-info/PKG-INFO +3 -7
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN.egg-info/SOURCES.txt +16 -22
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN.egg-info/requires.txt +1 -5
- {pyfdn-0.4.2 → pyfdn-0.5.0}/tests/test_api_reference.py +2 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/tests/test_auxiliary_allpass.py +2 -2
- {pyfdn-0.4.2 → pyfdn-0.5.0}/tests/test_auxiliary_flamo.py +5 -5
- {pyfdn-0.4.2 → pyfdn-0.5.0}/tests/test_auxiliary_plot.py +64 -63
- {pyfdn-0.4.2 → pyfdn-0.5.0}/tests/test_auxiliary_utils.py +5 -7
- {pyfdn-0.4.2 → pyfdn-0.5.0}/tests/test_dss_to_pr.py +5 -5
- {pyfdn-0.4.2 → pyfdn-0.5.0}/tests/test_eq_designs.py +45 -2
- pyfdn-0.5.0/tests/test_features.py +108 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/tests/test_flamo_to_pr.py +4 -4
- {pyfdn-0.4.2 → pyfdn-0.5.0}/tests/test_generate.py +71 -24
- pyfdn-0.5.0/tests/test_import.py +23 -0
- pyfdn-0.5.0/tests/test_kronecker_matrix.py +383 -0
- pyfdn-0.5.0/tests/test_losses_features.py +346 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/tests/test_marimo_examples_run.py +3 -8
- {pyfdn-0.4.2 → pyfdn-0.5.0}/tests/test_process_extensions.py +108 -12
- {pyfdn-0.4.2 → pyfdn-0.5.0}/tests/test_sdn.py +6 -8
- {pyfdn-0.4.2 → pyfdn-0.5.0}/tests/test_td_graph_processing.py +17 -15
- {pyfdn-0.4.2 → pyfdn-0.5.0}/tests/test_td_operators.py +41 -30
- {pyfdn-0.4.2 → pyfdn-0.5.0}/tests/test_time_varying_matrix.py +8 -6
- {pyfdn-0.4.2 → pyfdn-0.5.0}/tests/test_train.py +328 -6
- {pyfdn-0.4.2 → pyfdn-0.5.0}/tests/test_translate.py +35 -9
- pyfdn-0.4.2/HISTORY.rst +0 -140
- pyfdn-0.4.2/docs/references.py +0 -8
- pyfdn-0.4.2/setup.py +0 -7
- pyfdn-0.4.2/src/pyFDN/auxiliary/coupled_rooms.py +0 -193
- pyfdn-0.4.2/src/pyFDN/auxiliary/tiny_rotation_matrix.py +0 -109
- pyfdn-0.4.2/src/pyFDN/eq/_backend.py +0 -34
- pyfdn-0.4.2/src/pyFDN/generate/allpass_in_fdn.py +0 -78
- pyfdn-0.4.2/src/pyFDN/generate/anderson_matrix.py +0 -46
- pyfdn-0.4.2/src/pyFDN/generate/complete_orthogonal.py +0 -56
- pyfdn-0.4.2/src/pyFDN/generate/construct_cascaded_paraunitary_matrix.py +0 -58
- pyfdn-0.4.2/src/pyFDN/generate/construct_paraunitary_from_elementals.py +0 -52
- pyfdn-0.4.2/src/pyFDN/generate/construct_velvet_feedback_matrix.py +0 -17
- pyfdn-0.4.2/src/pyFDN/generate/degree_one_lossless.py +0 -31
- pyfdn-0.4.2/src/pyFDN/generate/householder_matrix.py +0 -24
- pyfdn-0.4.2/src/pyFDN/generate/is_almost_zero.py +0 -18
- pyfdn-0.4.2/src/pyFDN/generate/nearest_orthogonal.py +0 -24
- pyfdn-0.4.2/src/pyFDN/generate/nearest_sign_agnostic_orthogonal.py +0 -82
- pyfdn-0.4.2/src/pyFDN/generate/random_matrix_shift.py +0 -42
- pyfdn-0.4.2/src/pyFDN/generate/random_orthogonal.py +0 -10
- pyfdn-0.4.2/src/pyFDN/generate/schroeder_reverberator.py +0 -85
- pyfdn-0.4.2/src/pyFDN/generate/shift_matrix.py +0 -45
- pyfdn-0.4.2/src/pyFDN/generate/shift_matrix_distribute.py +0 -24
- pyfdn-0.4.2/src/pyFDN/process.py +0 -115
- pyfdn-0.4.2/src/pyFDN/train/filters.py +0 -304
- pyfdn-0.4.2/src/pyFDN/translate/dss_to_impz.py +0 -119
- pyfdn-0.4.2/src/pyFDN/translate/dss_to_ss.py +0 -101
- pyfdn-0.4.2/tests/test_coupled_rooms.py +0 -229
- {pyfdn-0.4.2 → pyfdn-0.5.0}/AUTHORS.rst +0 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/LICENSE +0 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/MANIFEST.in +0 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/docs/Makefile +0 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/docs/__init__.py +0 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/docs/audio_gallery.py +0 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/docs/authors.rst +0 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/docs/conf.py +0 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/docs/contributing.rst +0 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/docs/example_gallery.py +0 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/docs/history.rst +0 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/docs/index.rst +0 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/docs/installation.rst +0 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/docs/logo/logo_pyFDN_3.png +0 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/docs/logo/logo_pyFDN_4.png +0 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/docs/logo/pyfdn_logo_basic.png +0 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/docs/logo/pyfdn_logo_wave.png +0 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/docs/make.bat +0 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/docs/patch_rst.py +0 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/docs/readme.rst +0 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/docs/training_losses.rst +0 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/setup.cfg +0 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/auxiliary/__init__.py +0 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/auxiliary/audio.py +0 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/auxiliary/delay.py +0 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/auxiliary/marimo_utils.py +0 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/eq/_design_record.py +0 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/eq/probe_sos.py +0 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/generate/allpass_FDN/__init__.py +0 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/generate/allpass_FDN/rand_admissible_homogeneous_allpass.py +0 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/preset.py +0 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/references.py +0 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/resources/ATTRIBUTION.md +0 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/resources/__init__.py +0 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/resources/audio/drums/drums.wav +0 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/resources/audio/general/synth_dry.wav +0 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/resources/audio/metadata.json +0 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/resources/audio/rir/meetingroom_to_hallway_290cm.wav +0 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/resources/audio/rir/s3_r4_o.wav +0 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/resources/audio/speech/P1_Set1_8.wav +0 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/resources/audio/speech/P20_Set1_8.wav +0 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/resources/audio/strings/Kleiderschrank_Taylor_DI.wav +0 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/resources/audio/strings/Sommerhit2016_Taylor_DI.wav +0 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/resources/licenses/coupled-rooms-CC-BY-4.0.txt +0 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/resources/licenses/diff-fdn-colorless-MIT.txt +0 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/resources/presets/colorless_FDN/colorless_N16_d1.json +0 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/resources/presets/colorless_FDN/colorless_N16_d2.json +0 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/resources/presets/colorless_FDN/colorless_N4_d1.json +0 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/resources/presets/colorless_FDN/colorless_N4_d2.json +0 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/resources/presets/colorless_FDN/colorless_N6_d1.json +0 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/resources/presets/colorless_FDN/colorless_N6_d2.json +0 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/resources/presets/colorless_FDN/colorless_N8_d1.json +0 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/resources/presets/colorless_FDN/colorless_N8_d2.json +0 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/resources/presets/colorless_FDN/colorless_init_N16_d1.json +0 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/resources/presets/colorless_FDN/colorless_init_N16_d2.json +0 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/resources/presets/colorless_FDN/colorless_init_N4_d1.json +0 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/resources/presets/colorless_FDN/colorless_init_N4_d2.json +0 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/resources/presets/colorless_FDN/colorless_init_N6_d1.json +0 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/resources/presets/colorless_FDN/colorless_init_N6_d2.json +0 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/resources/presets/colorless_FDN/colorless_init_N8_d1.json +0 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/resources/presets/colorless_FDN/colorless_init_N8_d2.json +0 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/train/losses/_targets.py +0 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/train/losses/base.py +0 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/train/losses/parameter.py +0 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/train/params.py +0 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/translate/impz_to_res.py +0 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/translate/mtf_to_impz.py +0 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/translate/pr_to_impz.py +0 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN.egg-info/dependency_links.txt +0 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN.egg-info/top_level.txt +0 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/tests/__init__.py +0 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/tests/conftest.py +0 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/tests/matloader.py +0 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/tests/reference/README.md +0 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/tests/reference/example_onePoleAbsorption.mat +0 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/tests/reference/onePoleAbsorption_reference.mat +0 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/tests/test_audio_gallery.py +0 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/tests/test_auxiliary_acoustics.py +0 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/tests/test_auxiliary_delay.py +1 -1
- {pyfdn-0.4.2 → pyfdn-0.5.0}/tests/test_auxiliary_math.py +0 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/tests/test_build.py +0 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/tests/test_example_gallery.py +0 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/tests/test_flamo_graph.py +1 -1
- {pyfdn-0.4.2 → pyfdn-0.5.0}/tests/test_flamo_one_pole_absorption.py +0 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/tests/test_packaged_resources.py +0 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/tests/test_preset.py +0 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/tests/test_pyFDN.py +0 -0
- {pyfdn-0.4.2 → pyfdn-0.5.0}/tests/test_td_connectors.py +0 -0
|
@@ -141,15 +141,21 @@ The repository separates the installable package, executable examples,
|
|
|
141
141
|
documentation sources, and tests:
|
|
142
142
|
|
|
143
143
|
* ``src/pyFDN/`` contains the library. The top-level ``__init__.py`` defines
|
|
144
|
-
the public API, while ``process.py``, ``
|
|
145
|
-
provide the main processing and persistence entry points.
|
|
144
|
+
the public API, while ``process.py``, ``build.py``, and ``preset.py``
|
|
145
|
+
provide the main build-processing and persistence entry points.
|
|
146
146
|
* ``src/pyFDN/generate/`` contains feedback-matrix and FDN construction
|
|
147
|
-
algorithms
|
|
147
|
+
algorithms: ``orthogonal.py``, ``paraunitary.py`` and ``kronecker_matrix.py``
|
|
148
|
+
for feedback matrices, ``structures.py`` for classic reverberator structures,
|
|
149
|
+
the galleries, and the allpass and scattering-delay-network builders.
|
|
148
150
|
* ``src/pyFDN/td/`` contains stateful block-processing operators and the
|
|
149
151
|
connectors (``Series``, ``Parallel``, ``Recursion``) that wire them into a
|
|
150
|
-
time-domain graph. ``
|
|
151
|
-
|
|
152
|
-
|
|
152
|
+
time-domain graph. ``dss_to_td`` / ``build_to_td`` assemble an FDN from these
|
|
153
|
+
operators (``MatrixFIR`` for polynomial feedback matrices, ``SOSBank`` for
|
|
154
|
+
per-delay-line filter cascades); ``process_dss`` and ``process_fdn`` render
|
|
155
|
+
through that graph.
|
|
156
|
+
* ``import pyFDN`` must not import torch or flamo (``tests/test_import.py``):
|
|
157
|
+
import them inside the functions that need them, or add the module to the
|
|
158
|
+
lazily loaded names at the end of ``src/pyFDN/__init__.py``.
|
|
153
159
|
* ``src/pyFDN/eq/`` contains every EQ and absorption-filter design, while
|
|
154
160
|
``src/pyFDN/translate/`` converts between delay state-space, transfer
|
|
155
161
|
function, pole-residue, impulse-response, and FLAMO representations.
|
pyfdn-0.5.0/HISTORY.rst
ADDED
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
=======
|
|
2
|
+
History
|
|
3
|
+
=======
|
|
4
|
+
|
|
5
|
+
0.5.0 (2026-09-28)
|
|
6
|
+
------------------
|
|
7
|
+
|
|
8
|
+
* Fix GPU training (#231): ``model_response`` excites the model on its own
|
|
9
|
+
device, ``wrap_fdn_shell`` / ``dss_to_flamo`` / ``trainable_from_build``
|
|
10
|
+
build the FFT layers on the requested device, and ``train_fdn`` now defaults
|
|
11
|
+
to the model's device instead of the CPU. Requires ``flamo>=0.2.20``, whose
|
|
12
|
+
canonical module devices let ``device="cpu"`` / ``"cuda"`` mix with
|
|
13
|
+
``.to(...)`` (previously ``Shell`` rejected them as different devices).
|
|
14
|
+
* ``import pyFDN`` no longer loads torch or flamo, which makes it about three
|
|
15
|
+
times faster; the training API and ``flamo_to_pr`` load on first use. Every
|
|
16
|
+
public name is still exported from ``pyFDN``.
|
|
17
|
+
* ``construct_cascaded_paraunitary_matrix`` (and the ``velvet`` /
|
|
18
|
+
``random_dense`` gallery types), ``shift_matrix_distribute`` and
|
|
19
|
+
``random_matrix_shift`` are now reproducible with ``np.random.seed``; they
|
|
20
|
+
used an unseeded generator before. ``random_orthogonal`` takes an optional
|
|
21
|
+
``rng``.
|
|
22
|
+
* ``process_dss`` renders through the same graph as ``dss_to_td`` (one
|
|
23
|
+
time-domain engine), with identical output. ``dss_to_td`` / ``build_to_td``
|
|
24
|
+
now accept a ``td`` operator or any ``process_block`` object as a hook, and
|
|
25
|
+
run ``post_delay`` on the delay output in real time.
|
|
26
|
+
* **Breaking:** delay state-space arguments are ``(delays, A, B, C, D)``
|
|
27
|
+
everywhere: ``dss_to_flamo(delays, A, B, C, D, fs, ...)``,
|
|
28
|
+
``is_allpass(delays, A, B, C, D)`` and
|
|
29
|
+
``dss_to_impz(delays, A, B, C, D, ir_len)``.
|
|
30
|
+
* **Breaking:** ``pole_boundaries`` takes the absorption as an
|
|
31
|
+
``(sections, 6, N)`` SOS bank (the ``FDNBuild.post_delay`` format) instead of
|
|
32
|
+
an object with ``b`` and ``a`` fields, and accepts a 2-D feedback matrix.
|
|
33
|
+
* **Breaking:** ``tiny_rotation_matrix`` and ``rotation_matrix_from_angles``
|
|
34
|
+
return NumPy arrays (the ``dtype`` argument is gone) and draw from NumPy's
|
|
35
|
+
random state.
|
|
36
|
+
* ``fdn_system_gallery`` and ``filter_matrix_gallery`` use snake_case type
|
|
37
|
+
names like ``fdn_matrix_gallery`` (``"nested_allpass"``,
|
|
38
|
+
``"allpass_in_fdn"``, ``"velvet"``, ...); the old spellings are still
|
|
39
|
+
accepted.
|
|
40
|
+
* ``plot_FDN_build`` is now ``plot_fdn_build``; the old name remains an alias.
|
|
41
|
+
* **Breaking:** Plotly is gone; every plot function returns a Matplotlib
|
|
42
|
+
figure, built without pyplot. ``animate`` returns a Matplotlib
|
|
43
|
+
``FuncAnimation`` (show it with ``.to_jshtml()``; the Plotly-only
|
|
44
|
+
``transition_ms`` argument is removed), ``SDN.visualize`` draws a
|
|
45
|
+
Matplotlib 3-D axes, and the Plotly helpers ``downsampled_scatter`` and
|
|
46
|
+
``downsample_plotly_trace`` are removed. The example notebooks use
|
|
47
|
+
Matplotlib throughout, and ``plotly`` is no longer in any extra.
|
|
48
|
+
* ``flamo_to_pr`` no longer prints progress by default (``verbose=False``, like
|
|
49
|
+
``dss_to_pr``). ``matrix_sqrt`` keeps float64 precision.
|
|
50
|
+
* ``edc`` accepts torch tensors and shares its Schroeder integral with
|
|
51
|
+
``energy_decay_curve`` and the decay losses.
|
|
52
|
+
* Remove the ``pyFDN.auxiliary.coupled_rooms`` module (a hand-wired FLAMO FDN
|
|
53
|
+
used only by its test; ``example_coupled_rooms`` covers the model) and the
|
|
54
|
+
unused ``flareverb`` dependency.
|
|
55
|
+
* Internal: ``generate/`` is consolidated into ``orthogonal.py``,
|
|
56
|
+
``paraunitary.py`` and ``structures.py``; ``dss_to_flamo`` and
|
|
57
|
+
``trainable_from_build`` share one FLAMO core builder; the residue
|
|
58
|
+
extraction, device default, tensor conversion and seed handling exist once.
|
|
59
|
+
CI now runs ruff and mypy.
|
|
60
|
+
* Add ``Match``, a composable response loss that extracts a feature from the
|
|
61
|
+
model response and the reference (waveform, magnitude, phase, mel
|
|
62
|
+
magnitude, multi-resolution spectrogram, octave-band EDC, cumulative energy),
|
|
63
|
+
compares them with a distance (squared, absolute, circular, ...) and reduces
|
|
64
|
+
the result to a scalar. The reference feature is cached across steps.
|
|
65
|
+
``FlatMagnitude``, ``FlatSpectrogram``, ``MatchMagnitude``,
|
|
66
|
+
``MatchImpulseResponse``, ``MatchEnergyDecay`` and ``MatchCumulativeEnergy``
|
|
67
|
+
are now built on it, with unchanged values.
|
|
68
|
+
* Add the losses ``SpectralFlatness`` (geometric over arithmetic mean of
|
|
69
|
+
``|H|``, gain-invariant), ``MatchPhase`` and ``MatchPhaseSpectrogram``
|
|
70
|
+
(circular phase distance, whole-response and multi-resolution STFT) and
|
|
71
|
+
``MatchMelMagnitude`` (mel-filterbank magnitude).
|
|
72
|
+
* Add the differentiable features ``energy_decay_curve`` (Schroeder EDC) and
|
|
73
|
+
``mimo_rir_eigenvalues_per_frequency`` (eigenvalues of a square MIMO
|
|
74
|
+
transfer matrix per frequency bin).
|
|
75
|
+
* Add the Kronecker feedback matrix of Coppola (DAFx26): ``kronecker_matrix``
|
|
76
|
+
builds a lossless ``2**M x 2**M`` matrix from ``M`` two-by-two rotation or
|
|
77
|
+
reflection kernels, one angle each, and ``kronecker_transform`` applies it in
|
|
78
|
+
``O(N log2 N)`` with the paper's in-place butterfly instead of a dense
|
|
79
|
+
product. Every kernel angle addresses one bit of the delay-line index, so a
|
|
80
|
+
single angle cuts or re-couples the network along one partition -- the
|
|
81
|
+
outermost across the two stereo halves, the innermost between the even- and
|
|
82
|
+
odd-indexed lines -- and the matrix stays orthogonal at every setting. All
|
|
83
|
+
reflection kernels at ``pi/4`` recover the normalised Hadamard matrix, so the
|
|
84
|
+
usual FDN mixing matrix is one point in the family. Reachable from the
|
|
85
|
+
gallery as ``fdn_matrix_gallery(N, "kronecker")``, with ``kronecker_angles``
|
|
86
|
+
for naming the angles to move.
|
|
87
|
+
* Add the ``td.KroneckerMatrix`` and ``td.TimeVaryingKroneckerMatrix``
|
|
88
|
+
operators. The latter modulates chosen kernel angles by a sine or triangle,
|
|
89
|
+
which breaks up fixed modal resonances by moving the poles without the
|
|
90
|
+
chorusing that modulating the delay lengths brings; since only one two-by-two
|
|
91
|
+
kernel changes per moving angle, per-sample modulation costs no more than the
|
|
92
|
+
static matrix. Both go straight into the ``post_matrix`` hook of
|
|
93
|
+
``process_dss``.
|
|
94
|
+
* Add the ``example_kronecker_matrix`` notebook, which reproduces the
|
|
95
|
+
configurations from the paper's companion site: the construction and its
|
|
96
|
+
Hadamard special case, the fast transform, the stereo cross-coupling sweep on
|
|
97
|
+
the outermost angle with its interchannel-balance and IACC analysis, and
|
|
98
|
+
matrix modulation on the next angle in, with the pole-frequency histogram
|
|
99
|
+
that shows why it reduces coloration.
|
|
100
|
+
* **Breaking:** the ten-band graphic EQ's command grid is now the octave
|
|
101
|
+
centres 31.25 Hz through 16 kHz, with nearest-neighbour hold below 31.25 Hz
|
|
102
|
+
and above 16 kHz, instead of dummy DC and Nyquist anchors at 1 Hz and
|
|
103
|
+
``fs``. The 10-vector of ``gain_to_geq`` / ``decay_to_geq`` /
|
|
104
|
+
``AttenuationFilter`` / ``OutputEQ`` targets is ordered on
|
|
105
|
+
``pyFDN.eq.COMMAND_FREQUENCIES``. The 11-section cascade itself is
|
|
106
|
+
unchanged.
|
|
107
|
+
* Fix the first-order shelf bilinear prewarp: ``first_order_shelf_biquad``
|
|
108
|
+
used ``tan(ω)`` rather than ``tan(ω/2)``, so a requested crossover sat at
|
|
109
|
+
twice the named frequency. High crossovers are now clamped at ``fs/2.1``
|
|
110
|
+
(Nyquist-safe for the corrected prewarp) instead of ``fs/5``. The default
|
|
111
|
+
midpoint is ``fs/4``. ``example_reverberation_enhancement`` uses a
|
|
112
|
+
challenge gain of 1.6.
|
|
113
|
+
* ``example_train_fdn_to_rir`` now fits on a shorter FFT grid than it measures
|
|
114
|
+
on. The loss only needs enough of the decay to steer on, while the octave-band
|
|
115
|
+
estimators need a longer measurement window, so the notebook trains at
|
|
116
|
+
``nfft=2**16`` (1.37 s) and switches to ``2**17`` (2.73 s) with FLAMO's new
|
|
117
|
+
``Shell.set_nfft`` before rendering. The step cost is linear in ``nfft``, so
|
|
118
|
+
shorter grid reduces training time. Each training-cell run resets the grid
|
|
119
|
+
before fitting. Requires ``flamo>=0.2.18``, where ``set_nfft`` was added.
|
|
120
|
+
The walkthrough now focuses on the implemented workflow and ends with
|
|
121
|
+
octave-band validation.
|
|
122
|
+
Keep a CPU/CUDA float32 selector and use first-order shelves for absorption
|
|
123
|
+
and output EQ. Cite the filter-learning paper with a TODO for publication.
|
|
124
|
+
|
|
125
|
+
* Type every DSS matrix parameter (``A``/``B``/``C``/``D`` and the ``b``/``c``/``d``
|
|
126
|
+
gains in ``dss_to_ss``) as ``ArrayLike`` instead of ``ndarray`` across
|
|
127
|
+
``dss_to_flamo``, ``dss_to_impz``, ``dss_to_td``, ``dss_to_tf``, ``dss_to_ss``,
|
|
128
|
+
``general_char_poly``, and ``loop_tf`` -- matching what these functions
|
|
129
|
+
already do internally (``np.asarray(...)``) and how ``delays`` was already
|
|
130
|
+
typed. Also fixes ``dss_to_ss`` silently returning a non-array ``dd`` when
|
|
131
|
+
``d`` was passed as a list rather than an ``ndarray``.
|
|
132
|
+
* Add ``dss_to_td``, the raw delay state-space (DSS) counterpart of
|
|
133
|
+
``build_to_td`` -- matching the ``dss_to_*``/``build_to_*`` pattern already
|
|
134
|
+
used by ``dss_to_flamo``/``build_to_flamo`` and ``dss_to_impz``/
|
|
135
|
+
``build_to_impz``.
|
|
136
|
+
* **Breaking:** rename the ``m`` parameter to ``delays`` in ``dss_to_ss`` and
|
|
137
|
+
``dss_to_flamo``, matching every other DSS-related function.
|
|
138
|
+
* Clarify docs and docstrings on the relationship between a delay state-space
|
|
139
|
+
(DSS) system and an ``FDNBuild``: a build is a DSS system plus ``fs`` and
|
|
140
|
+
baked filter hooks.
|
|
141
|
+
* Fix ``dss_to_ss`` raising a dimension-mismatch error for delays at the
|
|
142
|
+
documented minimum of 3 samples.
|
|
143
|
+
* **Breaking:** ``process_fdn`` now takes an ``FDNBuild`` and assembles a
|
|
144
|
+
stateful ``td`` graph (new ``build_to_td``) instead of taking raw DSS
|
|
145
|
+
arguments; the old signature is renamed to ``process_dss``. ``td`` operators
|
|
146
|
+
rename ``filter(block)``/``process(signal)`` to
|
|
147
|
+
``process_block(block)``/``process_signal(signal)``.
|
|
148
|
+
|
|
149
|
+
0.4.2 (2026-08-27)
|
|
150
|
+
------------------
|
|
151
|
+
|
|
152
|
+
* Add the ``example_multislope_rir_to_fdn`` notebook: a measured room-transition
|
|
153
|
+
response is fitted with two decay slopes per octave band using DecayFitNet
|
|
154
|
+
from the ``multislope`` package, and each slope is resynthesised by its own
|
|
155
|
+
FDN. The response it uses ships with the package as the
|
|
156
|
+
``meetingroom_to_hallway_290cm`` audio resource, taken from the coupled-rooms
|
|
157
|
+
transition dataset.
|
|
158
|
+
* Add nonlinear and pitch-shifting time-domain operators for shimmer
|
|
159
|
+
reverberation -- ``DCBlocker``, ``ControllableFullWaveRect``, ``SDFD``,
|
|
160
|
+
``RingModulator``, ``PitchShift`` and ``GranularPitchShift`` -- all usable as
|
|
161
|
+
``process_dss`` hooks, plus the ``example_shimmer_fdn`` notebook that walks
|
|
162
|
+
through each one inside the feedback loop of the same 8-line FDN.
|
|
163
|
+
* ``is_uniallpass`` no longer solves a singular Lyapunov equation when ``A`` is
|
|
164
|
+
itself lossless (as in the allpass-in-FDN structure). The spectral radius is
|
|
165
|
+
checked first and such a system is reported as not uniallpass, instead of the
|
|
166
|
+
result depending on whether LAPACK chose to warn or raise on the ill-
|
|
167
|
+
conditioned solve.
|
|
168
|
+
* Fix a device mismatch when a loss built for one run is used in another: every
|
|
169
|
+
loss that holds a reference impulse response (``MatchCumulativeEnergy``,
|
|
170
|
+
``MatchEnergyDecay``, ``MatchMagnitude``, ``MatchImpulseResponse``,
|
|
171
|
+
``MatchSpectrogram``, ``MatchMelSpectrogram``) aligned its reference once, on
|
|
172
|
+
the first response it saw, and then handed that CPU tensor to a later CUDA
|
|
173
|
+
step -- the way a notebook cell that builds the loss but does not re-run on a
|
|
174
|
+
runtime switch would hit it. The aligned reference is now keyed on the
|
|
175
|
+
response's shape, device, dtype and sample rate, and rebuilt when any of them
|
|
176
|
+
changes. ``MatchSpectrogram`` and ``MatchMelSpectrogram`` also default their
|
|
177
|
+
``device`` to the response's rather than to the CPU, so FLAMO builds its
|
|
178
|
+
filterbanks where the model is.
|
|
179
|
+
|
|
180
|
+
0.4.1 (2026-08-24)
|
|
181
|
+
------------------
|
|
182
|
+
|
|
183
|
+
* Let ``fdn_build_gallery`` and the target-to-EQ functions optionally return
|
|
184
|
+
the design choices used to produce their coefficients, ready to store in an
|
|
185
|
+
``FDNPreset``. Build generation now also exposes the delay distribution and
|
|
186
|
+
coprimality options and lives separately from the matrix galleries.
|
|
187
|
+
* **Breaking:** rename the ``Fs`` parameter to ``fs`` everywhere it is still
|
|
188
|
+
spelled with a capital -- ``dss_to_flamo``, ``dss_to_pr``, ``delay_module``
|
|
189
|
+
and ``SDN``. Every other sampling-rate argument in the package was already
|
|
190
|
+
``fs``, and the odd one out forced callers to remember which spelling each
|
|
191
|
+
function wanted. ``SDN`` also renames its ``fs`` attribute and the ``"fs"``
|
|
192
|
+
key of the dictionary ``SDN.compute()`` returns.
|
|
193
|
+
|
|
194
|
+
0.4.0 (2026-08-23)
|
|
195
|
+
------------------
|
|
196
|
+
|
|
197
|
+
* Add ``FDNPreset`` JSON documents: a baked ``FDNBuild`` plus catalog
|
|
198
|
+
metadata and a controlled vocabulary for delays, matrices, and the three
|
|
199
|
+
filter hooks. ``trainable_from_preset`` restores filter targets as meaningful
|
|
200
|
+
FLAMO parameters only when they reproduce the baked coefficients.
|
|
201
|
+
* **Breaking:** replace ``train_fdn``'s ``mode`` string, and the ``target``,
|
|
202
|
+
``criteria``, ``sparsity_alpha`` and ``mss_nfft`` arguments that went with
|
|
203
|
+
it, with a composed loss object. An objective is now written out --
|
|
204
|
+
``FlatMagnitude() + 0.2 * Sparsity(param(model, "feedback"))`` -- and every
|
|
205
|
+
loss is a function of the impulse response, carried as a ``Response``, so
|
|
206
|
+
losses own their reference data and one objective can fit two different
|
|
207
|
+
references. ``pyFDN.train.objectives`` and ``build_objective`` are gone.
|
|
208
|
+
* **Breaking:** collect every EQ design in ``pyFDN.eq`` (formerly
|
|
209
|
+
``pyFDN.graphicEQ``) behind one ``EQDesign`` interface, with ``GraphicEQ``,
|
|
210
|
+
``FirstOrderShelf`` and ``OnePole`` sharing a single implementation across
|
|
211
|
+
the numpy and torch backends.
|
|
212
|
+
* **Breaking:** remove ``absorption_filters`` and ``absorption_to_rt``; the FIR
|
|
213
|
+
absorption path they served has no callers left.
|
|
214
|
+
* **Breaking:** name the three filter hooks ``post_delay``, ``post_matrix`` and
|
|
215
|
+
``post_output`` everywhere -- on ``FDNBuild``, in the FLAMO graph, in the
|
|
216
|
+
plots and in the JSON schema -- and add the slot for the third. The build
|
|
217
|
+
schema is version 2; version 1 files no longer load.
|
|
218
|
+
* Fix colorless training on a lossless FDN, whose poles sit on the unit circle
|
|
219
|
+
and leave ``|H|`` unbounded. ``build_fdn`` now defaults ``alias_decay_db``
|
|
220
|
+
from ``rt`` (``LOSSLESS_ALIAS_DECAY_DB`` when ``rt`` is None) and
|
|
221
|
+
``trainable_from_build`` threads it into every module, so a magnitude
|
|
222
|
+
objective sees a bounded response.
|
|
223
|
+
* Train the decay: ``AttenuationFilter`` parametrizes the in-loop absorption filter
|
|
224
|
+
by reverberation time per band, so the loop stays contractive for every value
|
|
225
|
+
the parameter can take, and takes either one RT curve for the network or one
|
|
226
|
+
per delay line. ``OutputEQ`` trains the output filter outside the recursion,
|
|
227
|
+
the only part of an FDN that shapes the spectral envelope without touching
|
|
228
|
+
the decay. Both are passed as the ``post_delay`` and ``post_output`` hooks of
|
|
229
|
+
``trainable_from_build``.
|
|
230
|
+
* Add the losses that go with it: ``AsymmetricFlatMagnitude``,
|
|
231
|
+
``FlatSpectrogram``, ``MatchEnergyDecay``, ``MatchCumulativeEnergy``,
|
|
232
|
+
``MatchMagnitude``, ``MatchSpectrogram``, ``MatchMelSpectrogram``,
|
|
233
|
+
``MatchImpulseResponse``, ``Energy``, ``Sparsity``, ``L1`` and ``L2``.
|
|
234
|
+
* Resolve trainable parameters by name: ``param(model, "feedback")`` fails
|
|
235
|
+
where you write it with the list of available names, and ``params(model)``
|
|
236
|
+
enumerates them.
|
|
237
|
+
* Export the FLAMO graph builders (``assemble_fdn_core``, ``wrap_fdn_shell``,
|
|
238
|
+
``gain_module``, ``delay_module``, ``matrix_module``, ``fir_matrix_module``,
|
|
239
|
+
``sos_filter_module``, ``hook_module``, ``AttenuationFilter``, ``OutputEQ``) from
|
|
240
|
+
the top-level namespace.
|
|
241
|
+
* Make ``build_to_impz`` apply all three hooks, so it no longer rejects builds
|
|
242
|
+
that carry an output EQ, and make ``extract_build`` refuse a hook it cannot
|
|
243
|
+
bake rather than silently dropping it.
|
|
244
|
+
* Add an example notebook that fits every parameter of an FDN, decay included,
|
|
245
|
+
to a measured concert-hall RIR, and document the loss rationale and
|
|
246
|
+
measurements in ``docs/training_losses.rst``.
|
|
247
|
+
* Fix stereo orientation in ``labeled_audio``, which decoded a stereo render as
|
|
248
|
+
thousands of channels.
|
|
249
|
+
* Check packaging metadata in CI and fail the documentation build on notebook
|
|
250
|
+
cell errors.
|
|
251
|
+
|
|
252
|
+
0.3.0 (2026-08-17)
|
|
253
|
+
------------------
|
|
254
|
+
|
|
255
|
+
* **Breaking:** replace the ``pyFDN.dsp`` subpackage with ``pyFDN.td``. The
|
|
256
|
+
top-level ``FeedbackDelay``, ``FIRMatrixFilter`` and ``SOSFilterBank``
|
|
257
|
+
exports are gone; use ``pyFDN.td`` operators instead.
|
|
258
|
+
* **Breaking:** ship the packaged colorless-FDN presets as JSON rather than
|
|
259
|
+
MATLAB ``.mat`` files.
|
|
260
|
+
* Add ``pyFDN.td``, a time-domain block-based processing graph built on NumPy
|
|
261
|
+
alone (no torch, no FFT), with the ``Series``, ``Parallel`` and
|
|
262
|
+
``Recursion`` connectors and stateful ``Gain``, ``Delay``, ``SOSBank``,
|
|
263
|
+
``MatrixFIR``, ``MatrixConvolver`` and ``TimeVaryingMatrix`` operators.
|
|
264
|
+
* Add ``load_fdn_build``, ``save_fdn_build``, ``fdn_build_from_dict`` and
|
|
265
|
+
``fdn_build_to_dict`` for reading and writing FDN builds as JSON.
|
|
266
|
+
* Add an FDN-to-FAUST example that compiles a pyFDN design with adac, and a
|
|
267
|
+
reverberation-enhancement example.
|
|
268
|
+
* Improve the example gallery and stop tracking generated documentation in the
|
|
269
|
+
repository.
|
|
270
|
+
* Test on Python 3.14 in CI and the documentation build.
|
|
271
|
+
|
|
272
|
+
0.2.0 (2026-08-10)
|
|
273
|
+
------------------
|
|
274
|
+
|
|
275
|
+
* Package compact audio examples and predefined colorless-FDN coefficients so
|
|
276
|
+
browser-hosted tutorials work without repository-relative files.
|
|
277
|
+
* Add public APIs for packaged audio, FDN presets, and paper references.
|
|
278
|
+
* Add generated documentation galleries and wheel-content checks.
|
|
279
|
+
* Keep decay-estimation dependencies optional for a smaller core installation.
|
|
280
|
+
|
|
281
|
+
0.1.0 (2025-07-02)
|
|
282
|
+
------------------
|
|
283
|
+
|
|
284
|
+
* First release on PyPI.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pyFDN
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.5.0
|
|
4
4
|
Summary: Python library for Feedback Delay Networks
|
|
5
5
|
Author: Sebastian J. Schlecht, Facundo Franchino, Jeremy Bai
|
|
6
6
|
Maintainer: Facundo Franchino, Sebastian J. Schlecht
|
|
@@ -22,20 +22,17 @@ License-File: src/pyFDN/resources/licenses/diff-fdn-colorless-MIT.txt
|
|
|
22
22
|
Requires-Dist: numpy
|
|
23
23
|
Requires-Dist: soundfile
|
|
24
24
|
Requires-Dist: scipy
|
|
25
|
-
Requires-Dist: flamo>=0.2.
|
|
26
|
-
Requires-Dist: flareverb
|
|
25
|
+
Requires-Dist: flamo>=0.2.20
|
|
27
26
|
Provides-Extra: examples
|
|
28
27
|
Requires-Dist: marimo; extra == "examples"
|
|
29
28
|
Requires-Dist: adac; extra == "examples"
|
|
30
29
|
Requires-Dist: matplotlib>=3.5.0; extra == "examples"
|
|
31
|
-
Requires-Dist: plotly>=5.0.0; extra == "examples"
|
|
32
30
|
Requires-Dist: multislope>=0.1.1; extra == "examples"
|
|
33
31
|
Requires-Dist: pyroomacoustics; extra == "examples"
|
|
34
32
|
Provides-Extra: test
|
|
35
33
|
Requires-Dist: marimo; extra == "test"
|
|
36
34
|
Requires-Dist: adac; extra == "test"
|
|
37
35
|
Requires-Dist: matplotlib>=3.5.0; extra == "test"
|
|
38
|
-
Requires-Dist: plotly>=5.0.0; extra == "test"
|
|
39
36
|
Requires-Dist: multislope>=0.1.1; extra == "test"
|
|
40
37
|
Requires-Dist: pyroomacoustics; extra == "test"
|
|
41
38
|
Requires-Dist: pytest>=7.0.0; extra == "test"
|
|
@@ -62,7 +59,6 @@ Requires-Dist: sphinx-marimo; extra == "docs"
|
|
|
62
59
|
Requires-Dist: nbsphinx>=0.9.0; extra == "docs"
|
|
63
60
|
Requires-Dist: ipykernel>=6.0.0; extra == "docs"
|
|
64
61
|
Requires-Dist: pandoc>=2.0; extra == "docs"
|
|
65
|
-
Requires-Dist: plotly>=5.0.0; extra == "docs"
|
|
66
62
|
Requires-Dist: matplotlib>=3.5.0; extra == "docs"
|
|
67
63
|
Requires-Dist: multislope>=0.1.1; extra == "docs"
|
|
68
64
|
Requires-Dist: pyroomacoustics; extra == "docs"
|
|
@@ -114,7 +110,7 @@ Highlights
|
|
|
114
110
|
|
|
115
111
|
* Matrix polynomial helpers for evaluating, differentiating, and convolving FIR/IIR blocks.
|
|
116
112
|
* Loop analysis utilities including pole boundary estimation and curve bounding checks.
|
|
117
|
-
* Acoustic absorption design tools that translate RT targets into one-pole loop filters.
|
|
113
|
+
* Acoustic absorption design tools that translate RT targets into one-pole and first-order shelf loop filters.
|
|
118
114
|
* Echo density (Abel & Huang 2006) for analysing reverberation and mixing time.
|
|
119
115
|
* Random orthogonal matrix generation to prototype energy-preserving feedback networks.
|
|
120
116
|
|
|
@@ -43,7 +43,7 @@ Highlights
|
|
|
43
43
|
|
|
44
44
|
* Matrix polynomial helpers for evaluating, differentiating, and convolving FIR/IIR blocks.
|
|
45
45
|
* Loop analysis utilities including pole boundary estimation and curve bounding checks.
|
|
46
|
-
* Acoustic absorption design tools that translate RT targets into one-pole loop filters.
|
|
46
|
+
* Acoustic absorption design tools that translate RT targets into one-pole and first-order shelf loop filters.
|
|
47
47
|
* Echo density (Abel & Huang 2006) for analysing reverberation and mixing time.
|
|
48
48
|
* Random orthogonal matrix generation to prototype energy-preserving feedback networks.
|
|
49
49
|
|
|
@@ -40,6 +40,11 @@ Matrix Generators
|
|
|
40
40
|
pyFDN.construct_velvet_feedback_matrix
|
|
41
41
|
pyFDN.tiny_rotation_matrix
|
|
42
42
|
pyFDN.rotation_matrix_from_angles
|
|
43
|
+
pyFDN.rotation_kernel
|
|
44
|
+
pyFDN.reflection_kernel
|
|
45
|
+
pyFDN.kronecker_angles
|
|
46
|
+
pyFDN.kronecker_matrix
|
|
47
|
+
pyFDN.kronecker_transform
|
|
43
48
|
pyFDN.fdn_matrix_gallery
|
|
44
49
|
pyFDN.fdn_system_gallery
|
|
45
50
|
pyFDN.filter_matrix_gallery
|
|
@@ -130,7 +135,7 @@ Time-Domain Graph (``pyFDN.td``)
|
|
|
130
135
|
--------------------------------
|
|
131
136
|
|
|
132
137
|
Stateful block-processing operators, wired into a graph by the connectors and
|
|
133
|
-
rendered with ``.
|
|
138
|
+
rendered with ``.process_signal(signal)``. See :mod:`pyFDN.td`.
|
|
134
139
|
|
|
135
140
|
.. autosummary::
|
|
136
141
|
:toctree: generated/
|
|
@@ -150,7 +155,9 @@ rendered with ``.process(signal)``. See :mod:`pyFDN.td`.
|
|
|
150
155
|
pyFDN.td.SOSBank
|
|
151
156
|
pyFDN.td.MatrixFIR
|
|
152
157
|
pyFDN.td.MatrixConvolver
|
|
158
|
+
pyFDN.td.KroneckerMatrix
|
|
153
159
|
pyFDN.td.TimeVaryingMatrix
|
|
160
|
+
pyFDN.td.TimeVaryingKroneckerMatrix
|
|
154
161
|
pyFDN.td.RecursionState
|
|
155
162
|
pyFDN.td.Series
|
|
156
163
|
pyFDN.td.Parallel
|
|
@@ -175,7 +182,8 @@ Building a FLAMO Graph
|
|
|
175
182
|
An FDN as FLAMO modules, assembled from numpy values. The three filter hooks --
|
|
176
183
|
``post_delay`` inside the loop, ``post_matrix`` on the feedback path,
|
|
177
184
|
``post_output`` on the wet signal -- are the same three
|
|
178
|
-
:func:`pyFDN.
|
|
185
|
+
:func:`pyFDN.process_dss` takes, in the same positions and under the same
|
|
186
|
+
names.
|
|
179
187
|
|
|
180
188
|
.. autosummary::
|
|
181
189
|
:toctree: generated/
|
|
@@ -269,6 +277,11 @@ Build Files, Packaged Examples & References
|
|
|
269
277
|
State-Space Translators
|
|
270
278
|
-----------------------
|
|
271
279
|
|
|
280
|
+
Convert a delay state-space (DSS) system -- ``A``, ``B``, ``C``, ``D``,
|
|
281
|
+
``delays`` -- to another representation. Each ``build_to_*`` function is a
|
|
282
|
+
thin wrapper over its ``dss_to_*`` counterpart that unpacks an
|
|
283
|
+
:class:`~pyFDN.FDNBuild` instead.
|
|
284
|
+
|
|
272
285
|
.. autosummary::
|
|
273
286
|
:toctree: generated/
|
|
274
287
|
:nosignatures:
|
|
@@ -276,6 +289,8 @@ State-Space Translators
|
|
|
276
289
|
pyFDN.dss_to_ss
|
|
277
290
|
pyFDN.dss_to_impz
|
|
278
291
|
pyFDN.build_to_impz
|
|
292
|
+
pyFDN.dss_to_td
|
|
293
|
+
pyFDN.build_to_td
|
|
279
294
|
pyFDN.dss_to_tf
|
|
280
295
|
pyFDN.dss_to_pr
|
|
281
296
|
pyFDN.dss_to_flamo
|
|
@@ -295,6 +310,7 @@ FDN Processing
|
|
|
295
310
|
:toctree: generated/
|
|
296
311
|
:nosignatures:
|
|
297
312
|
|
|
313
|
+
pyFDN.process_dss
|
|
298
314
|
pyFDN.process_fdn
|
|
299
315
|
pyFDN.flamo_process
|
|
300
316
|
|
|
@@ -331,10 +347,15 @@ parameter take a :class:`pyFDN.ParamRef` from :func:`pyFDN.param`.
|
|
|
331
347
|
pyFDN.params
|
|
332
348
|
pyFDN.ParamRef
|
|
333
349
|
pyFDN.Loss
|
|
350
|
+
pyFDN.Match
|
|
334
351
|
pyFDN.FlatMagnitude
|
|
335
352
|
pyFDN.AsymmetricFlatMagnitude
|
|
336
353
|
pyFDN.FlatSpectrogram
|
|
354
|
+
pyFDN.SpectralFlatness
|
|
337
355
|
pyFDN.MatchMagnitude
|
|
356
|
+
pyFDN.MatchPhase
|
|
357
|
+
pyFDN.MatchPhaseSpectrogram
|
|
358
|
+
pyFDN.MatchMelMagnitude
|
|
338
359
|
pyFDN.MatchSpectrogram
|
|
339
360
|
pyFDN.MatchMelSpectrogram
|
|
340
361
|
pyFDN.MatchImpulseResponse
|
|
@@ -344,6 +365,8 @@ parameter take a :class:`pyFDN.ParamRef` from :func:`pyFDN.param`.
|
|
|
344
365
|
pyFDN.Sparsity
|
|
345
366
|
pyFDN.L1
|
|
346
367
|
pyFDN.L2
|
|
368
|
+
pyFDN.mimo_rir_eigenvalues_per_frequency
|
|
369
|
+
pyFDN.energy_decay_curve
|
|
347
370
|
|
|
348
371
|
Plotting
|
|
349
372
|
--------
|
|
@@ -356,16 +379,14 @@ Plotting
|
|
|
356
379
|
pyFDN.plot_matrix_grid
|
|
357
380
|
pyFDN.plot_system_matrix
|
|
358
381
|
pyFDN.plot_fdn_parameter
|
|
359
|
-
pyFDN.
|
|
382
|
+
pyFDN.plot_fdn_build
|
|
360
383
|
pyFDN.plot_db_per_sample
|
|
361
384
|
pyFDN.plot_impulse_response
|
|
362
385
|
pyFDN.plot_impulse_response_matrix
|
|
363
386
|
pyFDN.plot_edc
|
|
364
387
|
pyFDN.plot_spectrogram
|
|
365
388
|
pyFDN.animate
|
|
366
|
-
pyFDN.downsampled_scatter
|
|
367
389
|
pyFDN.downsample_minmax
|
|
368
|
-
pyFDN.downsample_plotly_trace
|
|
369
390
|
|
|
370
391
|
Notebook Display
|
|
371
392
|
----------------
|
|
@@ -18,6 +18,16 @@ Or import specific functions::
|
|
|
18
18
|
|
|
19
19
|
feedback = random_orthogonal(4)
|
|
20
20
|
|
|
21
|
+
DSS and builds
|
|
22
|
+
---------------
|
|
23
|
+
|
|
24
|
+
A delay state-space (DSS) system is an FDN's feedback matrix ``A``, gains
|
|
25
|
+
``B``/``C``/``D``, and per-line ``delays``. An :class:`~pyFDN.FDNBuild` wraps a
|
|
26
|
+
DSS system with a sample rate and optional baked filter hooks, ready to render.
|
|
27
|
+
Functions named ``dss_to_*`` take the raw DSS arrays; ``build_to_*`` functions
|
|
28
|
+
take an :class:`~pyFDN.FDNBuild` and are thin wrappers around the matching
|
|
29
|
+
``dss_to_*`` call. Use whichever form fits the arguments you already have.
|
|
30
|
+
|
|
21
31
|
Packaged tutorial resources
|
|
22
32
|
---------------------------
|
|
23
33
|
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "pyFDN"
|
|
7
|
-
version = "0.
|
|
7
|
+
version = "0.5.0"
|
|
8
8
|
description = "Python library for Feedback Delay Networks"
|
|
9
9
|
readme = "README.rst"
|
|
10
10
|
authors = [
|
|
@@ -34,8 +34,7 @@ dependencies = [
|
|
|
34
34
|
"numpy",
|
|
35
35
|
"soundfile",
|
|
36
36
|
"scipy",
|
|
37
|
-
"flamo>=0.2.
|
|
38
|
-
"flareverb",
|
|
37
|
+
"flamo>=0.2.20", # canonical module devices (string "cpu"/"cuda" mix with .to())
|
|
39
38
|
]
|
|
40
39
|
|
|
41
40
|
[project.optional-dependencies]
|
|
@@ -43,7 +42,6 @@ examples = [
|
|
|
43
42
|
"marimo", # the example notebooks are marimo apps
|
|
44
43
|
"adac", # example_fdn_to_faust compiles a FLAMO model to FAUST
|
|
45
44
|
"matplotlib>=3.5.0", # examples build matplotlib figures
|
|
46
|
-
"plotly>=5.0.0", # examples build plotly figures
|
|
47
45
|
"multislope>=0.1.1", # multi-slope decay estimation (DecayFitNet), example only
|
|
48
46
|
"pyroomacoustics", # shoebox image-source RIRs for example_reverberation_enhancement
|
|
49
47
|
]
|
|
@@ -51,7 +49,6 @@ test = [
|
|
|
51
49
|
"marimo", # deps to run the example notebooks under test
|
|
52
50
|
"adac",
|
|
53
51
|
"matplotlib>=3.5.0",
|
|
54
|
-
"plotly>=5.0.0",
|
|
55
52
|
"multislope>=0.1.1",
|
|
56
53
|
"pyroomacoustics",
|
|
57
54
|
"pytest>=7.0.0", # testing
|
|
@@ -80,7 +77,6 @@ docs = [
|
|
|
80
77
|
"nbsphinx>=0.9.0",
|
|
81
78
|
"ipykernel>=6.0.0",
|
|
82
79
|
"pandoc>=2.0",
|
|
83
|
-
"plotly>=5.0.0",
|
|
84
80
|
"matplotlib>=3.5.0",
|
|
85
81
|
"multislope>=0.1.1", # rendered by the multi-slope example notebook
|
|
86
82
|
"pyroomacoustics", # rendered by the reverberation-enhancement notebook
|
|
@@ -113,7 +109,7 @@ include = ["pyFDN*"]
|
|
|
113
109
|
# triggers on. Usage: bump-my-version bump {major|minor|patch}
|
|
114
110
|
|
|
115
111
|
[tool.bumpversion]
|
|
116
|
-
current_version = "0.
|
|
112
|
+
current_version = "0.5.0"
|
|
117
113
|
allow_dirty = false
|
|
118
114
|
commit = true
|
|
119
115
|
message = "Bump version: {current_version} → {new_version}"
|
|
@@ -161,10 +157,12 @@ disable_error_code = ["no-any-return"]
|
|
|
161
157
|
# Third-party packages without complete PEP 561 typing metadata
|
|
162
158
|
module = [
|
|
163
159
|
"flamo.*",
|
|
160
|
+
"marimo.*",
|
|
161
|
+
"mpl_toolkits.*",
|
|
164
162
|
"multislope.*",
|
|
165
|
-
"plotly.*",
|
|
166
163
|
"scipy.*",
|
|
167
164
|
"soundfile",
|
|
165
|
+
"torchaudio.*",
|
|
168
166
|
]
|
|
169
167
|
ignore_missing_imports = true
|
|
170
168
|
|
|
@@ -213,24 +211,6 @@ module = "pyFDN.auxiliary.flamo"
|
|
|
213
211
|
allow_untyped_defs = true
|
|
214
212
|
disable_error_code = ["no-untyped-call", "no-untyped-def"]
|
|
215
213
|
|
|
216
|
-
[[tool.mypy.overrides]]
|
|
217
|
-
# FLAMO-based PR translation: annotation work in progress
|
|
218
|
-
module = "pyFDN.translate.dss_to_pr_flamo"
|
|
219
|
-
allow_untyped_defs = true
|
|
220
|
-
disable_error_code = ["no-untyped-call", "no-untyped-def", "unused-ignore"]
|
|
221
|
-
|
|
222
|
-
[[tool.mypy.overrides]]
|
|
223
|
-
# Coupled rooms: research code, annotation work in progress
|
|
224
|
-
module = "pyFDN.auxiliary.coupled_rooms"
|
|
225
|
-
allow_untyped_defs = true
|
|
226
|
-
disable_error_code = ["no-untyped-call", "no-untyped-def", "attr-defined"]
|
|
227
|
-
|
|
228
|
-
[[tool.mypy.overrides]]
|
|
229
|
-
# Recursive module: PyTorch-heavy, annotation work in progress
|
|
230
|
-
module = "pyFDN.recursive.*"
|
|
231
|
-
allow_untyped_defs = true
|
|
232
|
-
disable_error_code = ["no-untyped-call", "no-untyped-def", "override", "arg-type", "call-arg"]
|
|
233
|
-
|
|
234
214
|
[[tool.mypy.overrides]]
|
|
235
215
|
# Acoustics helpers: ArrayLike-heavy DSP code
|
|
236
216
|
module = "pyFDN.auxiliary.acoustics"
|