pyFDN 0.2.0__tar.gz → 0.3.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/AUTHORS.rst +17 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/CONTRIBUTING.rst +29 -2
- pyfdn-0.3.0/HISTORY.rst +37 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/PKG-INFO +20 -2
- {pyfdn-0.2.0 → pyfdn-0.3.0}/README.rst +12 -0
- pyfdn-0.3.0/docs/Makefile +39 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/docs/api_reference.rst +24 -7
- {pyfdn-0.2.0 → pyfdn-0.3.0}/docs/audio_gallery.py +2 -2
- {pyfdn-0.2.0 → pyfdn-0.3.0}/docs/conf.py +8 -1
- {pyfdn-0.2.0 → pyfdn-0.3.0}/docs/example_gallery.py +14 -23
- pyfdn-0.3.0/docs/patch_rst.py +35 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/docs/usage.rst +5 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/pyproject.toml +10 -4
- {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/__init__.py +16 -10
- {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/auxiliary/plot.py +4 -4
- pyfdn-0.3.0/src/pyFDN/build_io.py +151 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/generate/allpass_FDN/allpass_completion.py +3 -1
- {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/generate/allpass_FDN/homogeneous_allpass_fdn.py +9 -10
- pyfdn-0.3.0/src/pyFDN/presets.py +50 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/process.py +6 -5
- {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/resources/ATTRIBUTION.md +2 -1
- pyfdn-0.3.0/src/pyFDN/resources/presets/colorless_FDN/colorless_N16_d1.json +395 -0
- pyfdn-0.3.0/src/pyFDN/resources/presets/colorless_FDN/colorless_N16_d2.json +395 -0
- pyfdn-0.3.0/src/pyFDN/resources/presets/colorless_FDN/colorless_N4_d1.json +71 -0
- pyfdn-0.3.0/src/pyFDN/resources/presets/colorless_FDN/colorless_N4_d2.json +71 -0
- pyfdn-0.3.0/src/pyFDN/resources/presets/colorless_FDN/colorless_N6_d1.json +105 -0
- pyfdn-0.3.0/src/pyFDN/resources/presets/colorless_FDN/colorless_N6_d2.json +105 -0
- pyfdn-0.3.0/src/pyFDN/resources/presets/colorless_FDN/colorless_N8_d1.json +147 -0
- pyfdn-0.3.0/src/pyFDN/resources/presets/colorless_FDN/colorless_N8_d2.json +147 -0
- pyfdn-0.3.0/src/pyFDN/resources/presets/colorless_FDN/colorless_init_N16_d1.json +395 -0
- pyfdn-0.3.0/src/pyFDN/resources/presets/colorless_FDN/colorless_init_N16_d2.json +395 -0
- pyfdn-0.3.0/src/pyFDN/resources/presets/colorless_FDN/colorless_init_N4_d1.json +71 -0
- pyfdn-0.3.0/src/pyFDN/resources/presets/colorless_FDN/colorless_init_N4_d2.json +71 -0
- pyfdn-0.3.0/src/pyFDN/resources/presets/colorless_FDN/colorless_init_N6_d1.json +105 -0
- pyfdn-0.3.0/src/pyFDN/resources/presets/colorless_FDN/colorless_init_N6_d2.json +105 -0
- pyfdn-0.3.0/src/pyFDN/resources/presets/colorless_FDN/colorless_init_N8_d1.json +147 -0
- pyfdn-0.3.0/src/pyFDN/resources/presets/colorless_FDN/colorless_init_N8_d2.json +147 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/resources/references.bib +9 -0
- pyfdn-0.3.0/src/pyFDN/td/__init__.py +58 -0
- pyfdn-0.3.0/src/pyFDN/td/connectors.py +300 -0
- pyfdn-0.3.0/src/pyFDN/td/operators.py +508 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/train/build.py +2 -2
- {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/train/objectives.py +7 -7
- {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/translate/dss_to_impz.py +4 -9
- {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN.egg-info/PKG-INFO +20 -2
- {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN.egg-info/SOURCES.txt +24 -80
- {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN.egg-info/requires.txt +6 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/tests/test_api_reference.py +1 -0
- pyfdn-0.3.0/tests/test_audio_gallery.py +24 -0
- pyfdn-0.3.0/tests/test_build_io.py +50 -0
- pyfdn-0.3.0/tests/test_example_gallery.py +37 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/tests/test_generate.py +14 -2
- {pyfdn-0.2.0 → pyfdn-0.3.0}/tests/test_packaged_resources.py +4 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/tests/test_process_extensions.py +7 -7
- pyfdn-0.3.0/tests/test_td_connectors.py +288 -0
- pyfdn-0.3.0/tests/test_td_graph_processing.py +674 -0
- pyfdn-0.3.0/tests/test_td_operators.py +418 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/tests/test_time_varying_matrix.py +7 -3
- pyfdn-0.2.0/AUTHORS.rst +0 -11
- pyfdn-0.2.0/HISTORY.rst +0 -17
- pyfdn-0.2.0/docs/Makefile +0 -20
- pyfdn-0.2.0/docs/audio_gallery.rst +0 -99
- pyfdn-0.2.0/docs/examples_gallery.rst +0 -133
- pyfdn-0.2.0/docs/generated/pyFDN.DFiltMatrix.rst +0 -23
- pyfdn-0.2.0/docs/generated/pyFDN.FeedbackDelay.rst +0 -25
- pyfdn-0.2.0/docs/generated/pyFDN.FilterMatrix.rst +0 -36
- pyfdn-0.2.0/docs/generated/pyFDN.TFMatrix.rst +0 -25
- pyfdn-0.2.0/docs/generated/pyFDN.ZFIR.rst +0 -32
- pyfdn-0.2.0/docs/generated/pyFDN.ZSOS.rst +0 -32
- pyfdn-0.2.0/docs/generated/pyFDN.ZScalar.rst +0 -32
- pyfdn-0.2.0/docs/generated/pyFDN.ZTF.rst +0 -38
- pyfdn-0.2.0/docs/generated/pyFDN.absorption_filters.rst +0 -6
- pyfdn-0.2.0/docs/generated/pyFDN.absorption_to_rt.rst +0 -6
- pyfdn-0.2.0/docs/generated/pyFDN.construct_cascaded_paraunitary_matrix.rst +0 -6
- pyfdn-0.2.0/docs/generated/pyFDN.construct_velvet_feedback_matrix.rst +0 -6
- pyfdn-0.2.0/docs/generated/pyFDN.db_to_lin.rst +0 -6
- pyfdn-0.2.0/docs/generated/pyFDN.db_to_sq.rst +0 -6
- pyfdn-0.2.0/docs/generated/pyFDN.det_polynomial.rst +0 -6
- pyfdn-0.2.0/docs/generated/pyFDN.dss_to_impz.rst +0 -6
- pyfdn-0.2.0/docs/generated/pyFDN.dss_to_ss.rst +0 -6
- pyfdn-0.2.0/docs/generated/pyFDN.echo_density.rst +0 -6
- pyfdn-0.2.0/docs/generated/pyFDN.edc.rst +0 -6
- pyfdn-0.2.0/docs/generated/pyFDN.ensure_3d.rst +0 -6
- pyfdn-0.2.0/docs/generated/pyFDN.hertz_to_unit.rst +0 -6
- pyfdn-0.2.0/docs/generated/pyFDN.interpolate_orthogonal.rst +0 -6
- pyfdn-0.2.0/docs/generated/pyFDN.is_almost_zero.rst +0 -6
- pyfdn-0.2.0/docs/generated/pyFDN.is_bounding_curve.rst +0 -6
- pyfdn-0.2.0/docs/generated/pyFDN.is_orthogonal.rst +0 -6
- pyfdn-0.2.0/docs/generated/pyFDN.last_nonzero_indices.rst +0 -6
- pyfdn-0.2.0/docs/generated/pyFDN.lin_to_db.rst +0 -6
- pyfdn-0.2.0/docs/generated/pyFDN.matrix_convolution.rst +0 -6
- pyfdn-0.2.0/docs/generated/pyFDN.matrix_delay_approximation.rst +0 -6
- pyfdn-0.2.0/docs/generated/pyFDN.matrix_polyder.rst +0 -6
- pyfdn-0.2.0/docs/generated/pyFDN.matrix_polyval.rst +0 -6
- pyfdn-0.2.0/docs/generated/pyFDN.matrix_sqrt.rst +0 -6
- pyfdn-0.2.0/docs/generated/pyFDN.mgrpdelay.rst +0 -6
- pyfdn-0.2.0/docs/generated/pyFDN.ms_to_smp.rst +0 -6
- pyfdn-0.2.0/docs/generated/pyFDN.mulaw_decode.rst +0 -6
- pyfdn-0.2.0/docs/generated/pyFDN.mulaw_encode.rst +0 -6
- pyfdn-0.2.0/docs/generated/pyFDN.negpolyder.rst +0 -6
- pyfdn-0.2.0/docs/generated/pyFDN.one_pole_absorption.rst +0 -6
- pyfdn-0.2.0/docs/generated/pyFDN.outer_sum_approximation.rst +0 -6
- pyfdn-0.2.0/docs/generated/pyFDN.peak_normalize.rst +0 -6
- pyfdn-0.2.0/docs/generated/pyFDN.plot_impulse_response_matrix.rst +0 -6
- pyfdn-0.2.0/docs/generated/pyFDN.plot_system_matrix.rst +0 -6
- pyfdn-0.2.0/docs/generated/pyFDN.pole_boundaries.rst +0 -6
- pyfdn-0.2.0/docs/generated/pyFDN.poly_degree.rst +0 -6
- pyfdn-0.2.0/docs/generated/pyFDN.polyder_rational.rst +0 -6
- pyfdn-0.2.0/docs/generated/pyFDN.polydiag.rst +0 -6
- pyfdn-0.2.0/docs/generated/pyFDN.process_fdn.rst +0 -6
- pyfdn-0.2.0/docs/generated/pyFDN.random_matrix_shift.rst +0 -6
- pyfdn-0.2.0/docs/generated/pyFDN.random_orthogonal.rst +0 -6
- pyfdn-0.2.0/docs/generated/pyFDN.rt_to_gain_per_sample.rst +0 -6
- pyfdn-0.2.0/docs/generated/pyFDN.rt_to_slope.rst +0 -6
- pyfdn-0.2.0/docs/generated/pyFDN.shift_matrix.rst +0 -6
- pyfdn-0.2.0/docs/generated/pyFDN.shift_matrix_distribute.rst +0 -6
- pyfdn-0.2.0/docs/generated/pyFDN.skew.rst +0 -6
- pyfdn-0.2.0/docs/generated/pyFDN.slope_to_rt.rst +0 -6
- pyfdn-0.2.0/docs/generated/pyFDN.sq_to_db.rst +0 -6
- pyfdn-0.2.0/docs/generated/pyFDN.tiny_rotation_matrix.rst +0 -6
- pyfdn-0.2.0/docs/patch_rst.py +0 -41
- pyfdn-0.2.0/src/pyFDN/dsp/__init__.py +0 -3
- pyfdn-0.2.0/src/pyFDN/dsp/dfilt_matrix.py +0 -53
- pyfdn-0.2.0/src/pyFDN/dsp/feedback_delay.py +0 -47
- pyfdn-0.2.0/src/pyFDN/dsp/sos_filter_bank.py +0 -57
- pyfdn-0.2.0/src/pyFDN/dsp/time_varying_matrix.py +0 -144
- pyfdn-0.2.0/src/pyFDN/presets.py +0 -60
- pyfdn-0.2.0/src/pyFDN/resources/presets/colorless_FDN/param_N16_d1.mat +0 -0
- pyfdn-0.2.0/src/pyFDN/resources/presets/colorless_FDN/param_N16_d2.mat +0 -0
- pyfdn-0.2.0/src/pyFDN/resources/presets/colorless_FDN/param_N4_d1.mat +0 -0
- pyfdn-0.2.0/src/pyFDN/resources/presets/colorless_FDN/param_N4_d2.mat +0 -0
- pyfdn-0.2.0/src/pyFDN/resources/presets/colorless_FDN/param_N6_d1.mat +0 -0
- pyfdn-0.2.0/src/pyFDN/resources/presets/colorless_FDN/param_N6_d2.mat +0 -0
- pyfdn-0.2.0/src/pyFDN/resources/presets/colorless_FDN/param_N8_d1.mat +0 -0
- pyfdn-0.2.0/src/pyFDN/resources/presets/colorless_FDN/param_N8_d2.mat +0 -0
- pyfdn-0.2.0/src/pyFDN/resources/presets/colorless_FDN/param_init_N16_d1.mat +0 -0
- pyfdn-0.2.0/src/pyFDN/resources/presets/colorless_FDN/param_init_N16_d2.mat +0 -0
- pyfdn-0.2.0/src/pyFDN/resources/presets/colorless_FDN/param_init_N4_d1.mat +0 -0
- pyfdn-0.2.0/src/pyFDN/resources/presets/colorless_FDN/param_init_N4_d2.mat +0 -0
- pyfdn-0.2.0/src/pyFDN/resources/presets/colorless_FDN/param_init_N6_d1.mat +0 -0
- pyfdn-0.2.0/src/pyFDN/resources/presets/colorless_FDN/param_init_N6_d2.mat +0 -0
- pyfdn-0.2.0/src/pyFDN/resources/presets/colorless_FDN/param_init_N8_d1.mat +0 -0
- pyfdn-0.2.0/src/pyFDN/resources/presets/colorless_FDN/param_init_N8_d2.mat +0 -0
- pyfdn-0.2.0/tests/test_audio_gallery.py +0 -17
- pyfdn-0.2.0/tests/test_example_gallery.py +0 -29
- {pyfdn-0.2.0 → pyfdn-0.3.0}/LICENSE +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/MANIFEST.in +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/docs/__init__.py +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/docs/authors.rst +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/docs/contributing.rst +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/docs/history.rst +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/docs/index.rst +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/docs/installation.rst +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/docs/logo/logo_pyFDN_3.png +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/docs/logo/logo_pyFDN_4.png +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/docs/logo/pyfdn_logo_basic.png +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/docs/logo/pyfdn_logo_wave.png +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/docs/make.bat +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/docs/readme.rst +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/docs/references.py +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/setup.cfg +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/setup.py +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/auxiliary/__init__.py +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/auxiliary/acoustics.py +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/auxiliary/allpass.py +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/auxiliary/audio.py +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/auxiliary/coupled_rooms.py +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/auxiliary/delay.py +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/auxiliary/flamo.py +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/auxiliary/flamo_graph.py +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/auxiliary/marimo_utils.py +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/auxiliary/math.py +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/auxiliary/poles.py +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/auxiliary/tiny_rotation_matrix.py +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/auxiliary/utils.py +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/generate/SDN.py +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/generate/allpass_FDN/__init__.py +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/generate/allpass_FDN/rand_admissible_homogeneous_allpass.py +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/generate/allpass_in_fdn.py +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/generate/anderson_matrix.py +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/generate/complete_orthogonal.py +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/generate/construct_cascaded_paraunitary_matrix.py +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/generate/construct_paraunitary_from_elementals.py +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/generate/construct_velvet_feedback_matrix.py +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/generate/degree_one_lossless.py +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/generate/fdn_matrix_gallery.py +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/generate/householder_matrix.py +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/generate/is_almost_zero.py +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/generate/nearest_orthogonal.py +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/generate/nearest_sign_agnostic_orthogonal.py +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/generate/random_matrix_shift.py +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/generate/random_orthogonal.py +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/generate/sample_delay_lengths.py +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/generate/schroeder_reverberator.py +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/generate/shift_matrix.py +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/generate/shift_matrix_distribute.py +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/graphicEQ/__init__.py +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/graphicEQ/absorption_geq.py +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/graphicEQ/bandpass_filter.py +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/graphicEQ/design_geq.py +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/graphicEQ/graphic_eq.py +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/graphicEQ/probe_sos.py +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/graphicEQ/shelving_filter.py +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/references.py +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/resources/__init__.py +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/resources/audio/drums/drums.wav +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/resources/audio/general/synth_dry.wav +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/resources/audio/metadata.json +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/resources/audio/rir/s3_r4_o.wav +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/resources/audio/speech/P1_Set1_8.wav +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/resources/audio/speech/P20_Set1_8.wav +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/resources/audio/strings/Kleiderschrank_Taylor_DI.wav +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/resources/audio/strings/Sommerhit2016_Taylor_DI.wav +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/resources/licenses/diff-fdn-colorless-MIT.txt +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/train/__init__.py +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/train/engine.py +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/translate/dss_to_flamo.py +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/translate/dss_to_pr.py +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/translate/dss_to_ss.py +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/translate/dss_to_tf.py +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/translate/flamo_to_pr.py +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/translate/impz_to_res.py +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/translate/mtf_to_impz.py +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/translate/pr_to_impz.py +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN.egg-info/dependency_links.txt +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN.egg-info/top_level.txt +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/tests/__init__.py +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/tests/conftest.py +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/tests/matloader.py +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/tests/reference/README.md +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/tests/reference/example_onePoleAbsorption.mat +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/tests/reference/onePoleAbsorption_reference.mat +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/tests/test_auxiliary_acoustics.py +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/tests/test_auxiliary_delay.py +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/tests/test_auxiliary_flamo.py +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/tests/test_auxiliary_math.py +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/tests/test_auxiliary_plot.py +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/tests/test_auxiliary_utils.py +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/tests/test_coupled_rooms.py +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/tests/test_dss_to_pr.py +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/tests/test_flamo_graph.py +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/tests/test_flamo_one_pole_absorption.py +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/tests/test_flamo_to_pr.py +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/tests/test_graphic_eq.py +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/tests/test_marimo_examples_run.py +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/tests/test_pyFDN.py +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/tests/test_sdn.py +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/tests/test_train.py +0 -0
- {pyfdn-0.2.0 → pyfdn-0.3.0}/tests/test_translate.py +0 -0
pyfdn-0.3.0/AUTHORS.rst
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
=======
|
|
2
|
+
Credits
|
|
3
|
+
=======
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
Core Contributors
|
|
7
|
+
-----------------
|
|
8
|
+
|
|
9
|
+
* Sebastian J. Schlecht
|
|
10
|
+
* Facundo Franchino
|
|
11
|
+
* Jeremy Bai
|
|
12
|
+
* Alma Hova
|
|
13
|
+
* Cristóbal Andrade
|
|
14
|
+
* Gloria Dal Santo
|
|
15
|
+
* Bharadwaj Lakuduva Suresh Babu
|
|
16
|
+
* Gian Marco De Bortoli
|
|
17
|
+
* Kalyan Pandey
|
|
@@ -137,8 +137,35 @@ Building the Documentation
|
|
|
137
137
|
Repository Index
|
|
138
138
|
----------------
|
|
139
139
|
|
|
140
|
-
|
|
141
|
-
|
|
140
|
+
The repository separates the installable package, executable examples,
|
|
141
|
+
documentation sources, and tests:
|
|
142
|
+
|
|
143
|
+
* ``src/pyFDN/`` contains the library. The top-level ``__init__.py`` defines
|
|
144
|
+
the public API, while ``process.py``, ``build_io.py``, and ``presets.py``
|
|
145
|
+
provide the main processing and persistence entry points.
|
|
146
|
+
* ``src/pyFDN/generate/`` contains feedback-matrix and FDN construction
|
|
147
|
+
algorithms, including the allpass and scattering-delay-network builders.
|
|
148
|
+
* ``src/pyFDN/td/`` contains stateful block-processing operators and the
|
|
149
|
+
connectors (``Series``, ``Parallel``, ``Recursion``) that wire them into a
|
|
150
|
+
time-domain graph. ``process_fdn`` uses ``MatrixFIR`` for polynomial feedback
|
|
151
|
+
matrices; ``SOSBank`` implements per-delay-line filter cascades used for
|
|
152
|
+
frequency-dependent absorption.
|
|
153
|
+
* ``src/pyFDN/graphicEQ/`` contains graphic-EQ and absorption-filter design,
|
|
154
|
+
while ``src/pyFDN/translate/`` converts between delay state-space, transfer
|
|
155
|
+
function, pole-residue, impulse-response, and FLAMO representations.
|
|
156
|
+
* ``src/pyFDN/train/`` contains the trainable FDN construction, objectives,
|
|
157
|
+
and optimization loop. ``src/pyFDN/auxiliary/`` holds shared analysis,
|
|
158
|
+
plotting, audio, delay, and numerical helpers.
|
|
159
|
+
* ``examples/`` contains executable Marimo notebooks. Metadata at the top of
|
|
160
|
+
each ``example_*.py`` file drives the generated documentation gallery.
|
|
161
|
+
* ``tests/`` mirrors the public feature areas with unit, regression, and
|
|
162
|
+
integration coverage; ``tests/reference/`` stores reference data and its
|
|
163
|
+
provenance notes.
|
|
164
|
+
* ``docs/`` contains authored Sphinx pages and the scripts that generate API
|
|
165
|
+
stubs and galleries. Generated pages and HTML output are intentionally not
|
|
166
|
+
committed.
|
|
167
|
+
* ``.github/`` contains the continuous-integration, packaging, and GitHub
|
|
168
|
+
Pages workflows.
|
|
142
169
|
|
|
143
170
|
|
|
144
171
|
Testing Pipeline
|
pyfdn-0.3.0/HISTORY.rst
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
=======
|
|
2
|
+
History
|
|
3
|
+
=======
|
|
4
|
+
|
|
5
|
+
0.3.0 (2026-08-17)
|
|
6
|
+
------------------
|
|
7
|
+
|
|
8
|
+
* **Breaking:** replace the ``pyFDN.dsp`` subpackage with ``pyFDN.td``. The
|
|
9
|
+
top-level ``FeedbackDelay``, ``FIRMatrixFilter`` and ``SOSFilterBank``
|
|
10
|
+
exports are gone; use ``pyFDN.td`` operators instead.
|
|
11
|
+
* **Breaking:** ship the packaged colorless-FDN presets as JSON rather than
|
|
12
|
+
MATLAB ``.mat`` files.
|
|
13
|
+
* Add ``pyFDN.td``, a time-domain block-based processing graph built on NumPy
|
|
14
|
+
alone (no torch, no FFT), with the ``Series``, ``Parallel`` and
|
|
15
|
+
``Recursion`` connectors and stateful ``Gain``, ``Delay``, ``SOSBank``,
|
|
16
|
+
``MatrixFIR``, ``MatrixConvolver`` and ``TimeVaryingMatrix`` operators.
|
|
17
|
+
* Add ``load_fdn_build``, ``save_fdn_build``, ``fdn_build_from_dict`` and
|
|
18
|
+
``fdn_build_to_dict`` for reading and writing FDN builds as JSON.
|
|
19
|
+
* Add an FDN-to-FAUST example that compiles a pyFDN design with adac, and a
|
|
20
|
+
reverberation-enhancement example.
|
|
21
|
+
* Improve the example gallery and stop tracking generated documentation in the
|
|
22
|
+
repository.
|
|
23
|
+
* Test on Python 3.14 in CI and the documentation build.
|
|
24
|
+
|
|
25
|
+
0.2.0 (2026-08-10)
|
|
26
|
+
------------------
|
|
27
|
+
|
|
28
|
+
* Package compact audio examples and predefined colorless-FDN coefficients so
|
|
29
|
+
browser-hosted tutorials work without repository-relative files.
|
|
30
|
+
* Add public APIs for packaged audio, FDN presets, and paper references.
|
|
31
|
+
* Add generated documentation galleries and wheel-content checks.
|
|
32
|
+
* Keep decay-estimation dependencies optional for a smaller core installation.
|
|
33
|
+
|
|
34
|
+
0.1.0 (2025-07-02)
|
|
35
|
+
------------------
|
|
36
|
+
|
|
37
|
+
* First release on PyPI.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pyFDN
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.3.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
|
|
@@ -12,7 +12,7 @@ Classifier: Development Status :: 3 - Alpha
|
|
|
12
12
|
Classifier: Intended Audience :: Science/Research
|
|
13
13
|
Classifier: Programming Language :: Python :: 3
|
|
14
14
|
Classifier: Programming Language :: Python :: 3.10
|
|
15
|
-
Classifier: Programming Language :: Python :: 3.
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
16
16
|
Requires-Python: >=3.10
|
|
17
17
|
Description-Content-Type: text/x-rst
|
|
18
18
|
License-File: LICENSE
|
|
@@ -25,14 +25,18 @@ Requires-Dist: flamo>=0.2.14
|
|
|
25
25
|
Requires-Dist: flareverb
|
|
26
26
|
Provides-Extra: examples
|
|
27
27
|
Requires-Dist: marimo; extra == "examples"
|
|
28
|
+
Requires-Dist: adac; extra == "examples"
|
|
28
29
|
Requires-Dist: matplotlib>=3.5.0; extra == "examples"
|
|
29
30
|
Requires-Dist: plotly>=5.0.0; extra == "examples"
|
|
30
31
|
Requires-Dist: multislope>=0.1.1; extra == "examples"
|
|
32
|
+
Requires-Dist: pyroomacoustics; extra == "examples"
|
|
31
33
|
Provides-Extra: test
|
|
32
34
|
Requires-Dist: marimo; extra == "test"
|
|
35
|
+
Requires-Dist: adac; extra == "test"
|
|
33
36
|
Requires-Dist: matplotlib>=3.5.0; extra == "test"
|
|
34
37
|
Requires-Dist: plotly>=5.0.0; extra == "test"
|
|
35
38
|
Requires-Dist: multislope>=0.1.1; extra == "test"
|
|
39
|
+
Requires-Dist: pyroomacoustics; extra == "test"
|
|
36
40
|
Requires-Dist: pytest>=7.0.0; extra == "test"
|
|
37
41
|
Requires-Dist: pytest-cov>=4.0.0; extra == "test"
|
|
38
42
|
Requires-Dist: coverage>=7.0.0; extra == "test"
|
|
@@ -60,6 +64,8 @@ Requires-Dist: pandoc>=2.0; extra == "docs"
|
|
|
60
64
|
Requires-Dist: plotly>=5.0.0; extra == "docs"
|
|
61
65
|
Requires-Dist: matplotlib>=3.5.0; extra == "docs"
|
|
62
66
|
Requires-Dist: multislope>=0.1.1; extra == "docs"
|
|
67
|
+
Requires-Dist: pyroomacoustics; extra == "docs"
|
|
68
|
+
Requires-Dist: adac; extra == "docs"
|
|
63
69
|
Dynamic: license-file
|
|
64
70
|
|
|
65
71
|
=====
|
|
@@ -93,6 +99,9 @@ Overview
|
|
|
93
99
|
|
|
94
100
|
``pyFDN`` provides building blocks for designing, simulating, and analysing Feedback Delay Networks (FDNs). The package focuses on reusable, tested helper functions that simplify typical FDN workflows such as creating orthogonal feedback matrices, designing loop filters, and inspecting pole locations. Using ``flamo`` as a dependency, ``pyFDN`` allows modular design of advanced FDN structure with DSP operations in time and frequency domain.
|
|
95
101
|
|
|
102
|
+
The `pyFDN tutorial
|
|
103
|
+
<https://artificial-audio.github.io/pyfdn-tutorial-2026/>`_ provides an introduction to the package.
|
|
104
|
+
|
|
96
105
|
The source code is MIT-licensed. Small packaged tutorial resources retain the
|
|
97
106
|
separate terms recorded in ``src/pyFDN/resources/ATTRIBUTION.md``; in
|
|
98
107
|
particular, the Pori concert-hall impulse response is limited to
|
|
@@ -165,3 +174,12 @@ Or, inside an activated virtual environment::
|
|
|
165
174
|
|
|
166
175
|
For linting and packaging helpers see ``Makefile`` (``make lint``/``make docs``)
|
|
167
176
|
and ``tox.ini`` for multi-environment testing.
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
Helpful links
|
|
180
|
+
-------------
|
|
181
|
+
|
|
182
|
+
* `List of papers on Feedback Delay Networks <https://github.com/gdalsanto/delay-network-reverbs>`_ .
|
|
183
|
+
* `Multislope Estimation library <https://github.com/artificial-audio/multislope>`_ .
|
|
184
|
+
* `FLAMO (An Open-Source Library for Frequency-Domain Differentiable Audio Processing) <https://github.com/gdalsanto/flamo>`_ .
|
|
185
|
+
* `ADAC (Automatic Differentiable Audio Compilation) library <https://github.com/cucuwritescode/adac>`_ .
|
|
@@ -29,6 +29,9 @@ Overview
|
|
|
29
29
|
|
|
30
30
|
``pyFDN`` provides building blocks for designing, simulating, and analysing Feedback Delay Networks (FDNs). The package focuses on reusable, tested helper functions that simplify typical FDN workflows such as creating orthogonal feedback matrices, designing loop filters, and inspecting pole locations. Using ``flamo`` as a dependency, ``pyFDN`` allows modular design of advanced FDN structure with DSP operations in time and frequency domain.
|
|
31
31
|
|
|
32
|
+
The `pyFDN tutorial
|
|
33
|
+
<https://artificial-audio.github.io/pyfdn-tutorial-2026/>`_ provides an introduction to the package.
|
|
34
|
+
|
|
32
35
|
The source code is MIT-licensed. Small packaged tutorial resources retain the
|
|
33
36
|
separate terms recorded in ``src/pyFDN/resources/ATTRIBUTION.md``; in
|
|
34
37
|
particular, the Pori concert-hall impulse response is limited to
|
|
@@ -101,3 +104,12 @@ Or, inside an activated virtual environment::
|
|
|
101
104
|
|
|
102
105
|
For linting and packaging helpers see ``Makefile`` (``make lint``/``make docs``)
|
|
103
106
|
and ``tox.ini`` for multi-environment testing.
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
Helpful links
|
|
110
|
+
-------------
|
|
111
|
+
|
|
112
|
+
* `List of papers on Feedback Delay Networks <https://github.com/gdalsanto/delay-network-reverbs>`_ .
|
|
113
|
+
* `Multislope Estimation library <https://github.com/artificial-audio/multislope>`_ .
|
|
114
|
+
* `FLAMO (An Open-Source Library for Frequency-Domain Differentiable Audio Processing) <https://github.com/gdalsanto/flamo>`_ .
|
|
115
|
+
* `ADAC (Automatic Differentiable Audio Compilation) library <https://github.com/cucuwritescode/adac>`_ .
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# Minimal makefile for Sphinx documentation
|
|
2
|
+
#
|
|
3
|
+
|
|
4
|
+
# You can set these variables from the command line.
|
|
5
|
+
PYTHON ?= python
|
|
6
|
+
SPHINXOPTS =
|
|
7
|
+
SPHINXBUILD ?= $(PYTHON) -msphinx
|
|
8
|
+
SPHINXPROJ = pyFDN
|
|
9
|
+
SOURCEDIR = .
|
|
10
|
+
BUILDDIR = _build
|
|
11
|
+
SPHINXAPIDOC ?= $(PYTHON) -msphinx.ext.apidoc
|
|
12
|
+
|
|
13
|
+
# Put it first so that "make" without argument is like "make help".
|
|
14
|
+
help:
|
|
15
|
+
@$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
|
|
16
|
+
|
|
17
|
+
.PHONY: help Makefile clean clean-generated generate-rst html
|
|
18
|
+
|
|
19
|
+
# API stubs and autosummary pages are reproducible build inputs. Remove them
|
|
20
|
+
# before every build so deleted or renamed public objects cannot leave stale
|
|
21
|
+
# documentation behind.
|
|
22
|
+
clean-generated:
|
|
23
|
+
$(RM) modules.rst pyFDN.rst pyFDN.*.rst
|
|
24
|
+
$(RM) -r generated
|
|
25
|
+
|
|
26
|
+
generate-rst: clean-generated
|
|
27
|
+
$(SPHINXAPIDOC) -f -o "$(SOURCEDIR)" ../src/pyFDN
|
|
28
|
+
$(PYTHON) patch_rst.py
|
|
29
|
+
|
|
30
|
+
clean: clean-generated
|
|
31
|
+
@$(SPHINXBUILD) -M clean "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
|
|
32
|
+
|
|
33
|
+
html: generate-rst
|
|
34
|
+
@$(SPHINXBUILD) -M html "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
|
|
35
|
+
|
|
36
|
+
# Catch-all target: route all unknown targets to Sphinx using the new
|
|
37
|
+
# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
|
|
38
|
+
%: Makefile
|
|
39
|
+
@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
|
|
@@ -114,16 +114,29 @@ Graphic EQ
|
|
|
114
114
|
pyFDN.shelving_filter
|
|
115
115
|
pyFDN.bandpass_filter
|
|
116
116
|
|
|
117
|
-
|
|
118
|
-
|
|
117
|
+
Time-Domain Graph (``pyFDN.td``)
|
|
118
|
+
--------------------------------
|
|
119
|
+
|
|
120
|
+
Stateful block-processing operators, wired into a graph by the connectors and
|
|
121
|
+
rendered with ``.process(signal)``. See :mod:`pyFDN.td`.
|
|
119
122
|
|
|
120
123
|
.. autosummary::
|
|
121
124
|
:toctree: generated/
|
|
122
125
|
:nosignatures:
|
|
123
126
|
|
|
124
|
-
pyFDN.
|
|
125
|
-
pyFDN.
|
|
126
|
-
pyFDN.
|
|
127
|
+
pyFDN.td.TimeOperator
|
|
128
|
+
pyFDN.td.Identity
|
|
129
|
+
pyFDN.td.Gain
|
|
130
|
+
pyFDN.td.Delay
|
|
131
|
+
pyFDN.td.AbsoluteValue
|
|
132
|
+
pyFDN.td.SOSBank
|
|
133
|
+
pyFDN.td.MatrixFIR
|
|
134
|
+
pyFDN.td.MatrixConvolver
|
|
135
|
+
pyFDN.td.TimeVaryingMatrix
|
|
136
|
+
pyFDN.td.RecursionState
|
|
137
|
+
pyFDN.td.Series
|
|
138
|
+
pyFDN.td.Parallel
|
|
139
|
+
pyFDN.td.Recursion
|
|
127
140
|
|
|
128
141
|
Delay Utilities
|
|
129
142
|
---------------
|
|
@@ -188,8 +201,8 @@ General Utilities
|
|
|
188
201
|
pyFDN.pole_boundaries
|
|
189
202
|
pyFDN.skew
|
|
190
203
|
|
|
191
|
-
Packaged Examples & References
|
|
192
|
-
|
|
204
|
+
Build Files, Packaged Examples & References
|
|
205
|
+
--------------------------------------------
|
|
193
206
|
|
|
194
207
|
.. autosummary::
|
|
195
208
|
:toctree: generated/
|
|
@@ -200,6 +213,10 @@ Packaged Examples & References
|
|
|
200
213
|
pyFDN.load_audio
|
|
201
214
|
pyFDN.available_fdn_presets
|
|
202
215
|
pyFDN.load_fdn_preset
|
|
216
|
+
pyFDN.fdn_build_to_dict
|
|
217
|
+
pyFDN.fdn_build_from_dict
|
|
218
|
+
pyFDN.save_fdn_build
|
|
219
|
+
pyFDN.load_fdn_build
|
|
203
220
|
pyFDN.paper_reference
|
|
204
221
|
pyFDN.paper_link
|
|
205
222
|
|
|
@@ -66,9 +66,9 @@ def render_gallery(examples: list[AudioExample]) -> str:
|
|
|
66
66
|
lines = [
|
|
67
67
|
".. This file is generated by docs/audio_gallery.py. Do not edit it manually.",
|
|
68
68
|
"",
|
|
69
|
-
"
|
|
69
|
+
"=============",
|
|
70
70
|
"Audio Gallery",
|
|
71
|
-
"
|
|
71
|
+
"=============",
|
|
72
72
|
"",
|
|
73
73
|
"Audio examples demonstrating ``pyFDN``. The gallery is generated",
|
|
74
74
|
"automatically from every packaged ``.wav`` file, grouped by resource category.",
|
|
@@ -47,6 +47,11 @@ autosummary_imported_members = True
|
|
|
47
47
|
# Napoleon settings (Google / NumPy docstrings)
|
|
48
48
|
napoleon_google_docstring = True
|
|
49
49
|
napoleon_numpy_docstring = True
|
|
50
|
+
# Render "Attributes" sections as :ivar: fields instead of standalone
|
|
51
|
+
# ``.. attribute::`` directives. Without this, every documented attribute is
|
|
52
|
+
# registered twice (once by napoleon, once by autodoc's member scan) and Sphinx
|
|
53
|
+
# warns about duplicate object descriptions.
|
|
54
|
+
napoleon_use_ivar = True
|
|
50
55
|
|
|
51
56
|
|
|
52
57
|
# Intersphinx mapping
|
|
@@ -114,7 +119,9 @@ latex_documents = [
|
|
|
114
119
|
marimo_notebook_dir = "../examples"
|
|
115
120
|
marimo_default_height = "800px"
|
|
116
121
|
marimo_default_width = "100%"
|
|
117
|
-
|
|
122
|
+
# ``True`` is rendered as the extension's overlay mode. Keep this a boolean;
|
|
123
|
+
# sphinx-marimo declares the setting as such and Sphinx warns on string values.
|
|
124
|
+
marimo_click_to_load = True
|
|
118
125
|
marimo_load_button_text = "Load Interactive Notebook"
|
|
119
126
|
|
|
120
127
|
# Build notebooks serially in-process. The export-mode override below patches the
|
|
@@ -60,27 +60,18 @@ def _plain_text(markdown: str) -> str:
|
|
|
60
60
|
return text.strip()
|
|
61
61
|
|
|
62
62
|
|
|
63
|
-
def
|
|
63
|
+
def _inferred_title(path: Path) -> str:
|
|
64
64
|
blocks = _markdown_blocks(path)
|
|
65
65
|
for block in blocks:
|
|
66
66
|
lines = block.splitlines()
|
|
67
|
-
for
|
|
67
|
+
for line in lines:
|
|
68
68
|
if not line.startswith("# "):
|
|
69
69
|
continue
|
|
70
70
|
title = _plain_text(line[2:])
|
|
71
|
-
|
|
72
|
-
description = next(
|
|
73
|
-
(
|
|
74
|
-
_plain_text(paragraph)
|
|
75
|
-
for paragraph in paragraphs
|
|
76
|
-
if paragraph.strip() and not paragraph.lstrip().startswith("#")
|
|
77
|
-
),
|
|
78
|
-
"Open the rendered marimo notebook.",
|
|
79
|
-
)
|
|
80
|
-
return title, description
|
|
71
|
+
return title
|
|
81
72
|
|
|
82
73
|
fallback = path.stem.removeprefix("example_").replace("_", " ").title()
|
|
83
|
-
return fallback
|
|
74
|
+
return fallback
|
|
84
75
|
|
|
85
76
|
|
|
86
77
|
def _metadata(path: Path) -> dict[str, str]:
|
|
@@ -93,25 +84,25 @@ def _metadata(path: Path) -> dict[str, str]:
|
|
|
93
84
|
return metadata
|
|
94
85
|
|
|
95
86
|
|
|
96
|
-
def
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
return category
|
|
87
|
+
def _required_metadata(path: Path, metadata: dict[str, str], key: str) -> str:
|
|
88
|
+
value = metadata.get(key)
|
|
89
|
+
if value:
|
|
90
|
+
return value
|
|
101
91
|
relative = path.relative_to(PROJECT_ROOT)
|
|
102
|
-
raise ValueError(f"{relative} is missing a required '#
|
|
92
|
+
raise ValueError(f"{relative} is missing a required '# gallery_{key}: ...' tag")
|
|
103
93
|
|
|
104
94
|
|
|
105
95
|
def discover_examples() -> list[Example]:
|
|
106
96
|
examples = []
|
|
107
97
|
for path in sorted(EXAMPLES_DIR.rglob("example_*.py")):
|
|
108
|
-
|
|
98
|
+
metadata = _metadata(path)
|
|
99
|
+
inferred_title = _inferred_title(path)
|
|
109
100
|
examples.append(
|
|
110
101
|
Example(
|
|
111
102
|
path,
|
|
112
|
-
title,
|
|
113
|
-
description,
|
|
114
|
-
|
|
103
|
+
metadata.get("title", inferred_title),
|
|
104
|
+
_required_metadata(path, metadata, "description"),
|
|
105
|
+
_required_metadata(path, metadata, "category"),
|
|
115
106
|
)
|
|
116
107
|
)
|
|
117
108
|
return examples
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Patch generated RST files to avoid duplicate object descriptions with api_reference."""
|
|
3
|
+
|
|
4
|
+
import re
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
|
|
7
|
+
DOCS = Path(__file__).parent
|
|
8
|
+
|
|
9
|
+
# Replace pyFDN Module contents automodule with a link (avoids duplicates with api_reference)
|
|
10
|
+
pyfdn_rst = DOCS / "pyFDN.rst"
|
|
11
|
+
if pyfdn_rst.exists():
|
|
12
|
+
text = pyfdn_rst.read_text()
|
|
13
|
+
new = """Module contents
|
|
14
|
+
---------------
|
|
15
|
+
|
|
16
|
+
See :doc:`API Reference <api_reference>` for full documentation of all functions and classes."""
|
|
17
|
+
text = re.sub(
|
|
18
|
+
r"Module contents\n-+\n\n\.\. automodule:: pyFDN\n( :[^\n]+\n)+",
|
|
19
|
+
new + "\n",
|
|
20
|
+
text,
|
|
21
|
+
)
|
|
22
|
+
pyfdn_rst.write_text(text)
|
|
23
|
+
|
|
24
|
+
# Sub-package "Module contents" sections otherwise re-document every member
|
|
25
|
+
# their __init__ re-exports. Keep the package docstring, but omit those members;
|
|
26
|
+
# api_reference and the submodule sections remain the canonical targets.
|
|
27
|
+
for package_rst in sorted(DOCS.glob("pyFDN.*.rst")):
|
|
28
|
+
package = package_rst.stem # e.g. "pyFDN.graphicEQ"
|
|
29
|
+
text = package_rst.read_text()
|
|
30
|
+
pattern = rf"(\.\. automodule:: {re.escape(package)}\n( :[^\n]+\n)+)"
|
|
31
|
+
match = re.search(pattern, text)
|
|
32
|
+
if match:
|
|
33
|
+
block = f".. automodule:: {package}\n :no-index:\n :no-members:\n"
|
|
34
|
+
text = text[: match.start()] + block + text[match.end() :]
|
|
35
|
+
package_rst.write_text(text)
|
|
@@ -32,3 +32,8 @@ public API, independent of the current working directory::
|
|
|
32
32
|
Use ``pyFDN.available_audio()`` and ``pyFDN.available_fdn_presets()`` to list
|
|
33
33
|
the bundled choices. Attribution and license information for audio is returned
|
|
34
34
|
by ``pyFDN.audio_metadata(name)``.
|
|
35
|
+
|
|
36
|
+
FDN builds can also be exchanged as readable, versioned JSON files::
|
|
37
|
+
|
|
38
|
+
pyFDN.save_fdn_build("reverberator.json", reverberator)
|
|
39
|
+
restored = pyFDN.load_fdn_build("reverberator.json")
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "pyFDN"
|
|
7
|
-
version = "0.
|
|
7
|
+
version = "0.3.0"
|
|
8
8
|
description = "Python library for Feedback Delay Networks"
|
|
9
9
|
readme = "README.rst"
|
|
10
10
|
authors = [
|
|
@@ -21,7 +21,7 @@ classifiers = [
|
|
|
21
21
|
"Intended Audience :: Science/Research",
|
|
22
22
|
"Programming Language :: Python :: 3",
|
|
23
23
|
"Programming Language :: Python :: 3.10",
|
|
24
|
-
"Programming Language :: Python :: 3.
|
|
24
|
+
"Programming Language :: Python :: 3.14",
|
|
25
25
|
]
|
|
26
26
|
requires-python = ">=3.10"
|
|
27
27
|
license = "MIT"
|
|
@@ -41,15 +41,19 @@ dependencies = [
|
|
|
41
41
|
[project.optional-dependencies]
|
|
42
42
|
examples = [
|
|
43
43
|
"marimo", # the example notebooks are marimo apps
|
|
44
|
+
"adac", # example_fdn_to_faust compiles a FLAMO model to FAUST
|
|
44
45
|
"matplotlib>=3.5.0", # examples build matplotlib figures
|
|
45
46
|
"plotly>=5.0.0", # examples build plotly figures
|
|
46
47
|
"multislope>=0.1.1", # multi-slope decay estimation (DecayFitNet), example only
|
|
48
|
+
"pyroomacoustics", # shoebox image-source RIRs for example_reverberation_enhancement
|
|
47
49
|
]
|
|
48
50
|
test = [
|
|
49
51
|
"marimo", # deps to run the example notebooks under test
|
|
52
|
+
"adac",
|
|
50
53
|
"matplotlib>=3.5.0",
|
|
51
54
|
"plotly>=5.0.0",
|
|
52
55
|
"multislope>=0.1.1",
|
|
56
|
+
"pyroomacoustics",
|
|
53
57
|
"pytest>=7.0.0", # testing
|
|
54
58
|
"pytest-cov>=4.0.0", # coverage plugin for pytest
|
|
55
59
|
"coverage>=7.0.0", # coverage tooling
|
|
@@ -79,6 +83,8 @@ docs = [
|
|
|
79
83
|
"plotly>=5.0.0",
|
|
80
84
|
"matplotlib>=3.5.0",
|
|
81
85
|
"multislope>=0.1.1", # rendered by the multi-slope example notebook
|
|
86
|
+
"pyroomacoustics", # rendered by the reverberation-enhancement notebook
|
|
87
|
+
"adac", # example_fdn_to_faust is rendered into the docs
|
|
82
88
|
]
|
|
83
89
|
|
|
84
90
|
[project.urls]
|
|
@@ -97,7 +103,7 @@ include = ["pyFDN*"]
|
|
|
97
103
|
"licenses/*.txt",
|
|
98
104
|
"audio/metadata.json",
|
|
99
105
|
"audio/*/*.wav",
|
|
100
|
-
"presets/colorless_FDN/*.
|
|
106
|
+
"presets/colorless_FDN/*.json",
|
|
101
107
|
]
|
|
102
108
|
|
|
103
109
|
# Bump My Version
|
|
@@ -107,7 +113,7 @@ include = ["pyFDN*"]
|
|
|
107
113
|
# triggers on. Usage: bump-my-version bump {major|minor|patch}
|
|
108
114
|
|
|
109
115
|
[tool.bumpversion]
|
|
110
|
-
current_version = "0.
|
|
116
|
+
current_version = "0.3.0"
|
|
111
117
|
allow_dirty = false
|
|
112
118
|
commit = true
|
|
113
119
|
message = "Bump version: {current_version} → {new_version}"
|
|
@@ -3,13 +3,9 @@
|
|
|
3
3
|
from importlib import import_module
|
|
4
4
|
|
|
5
5
|
__author__ = "Facundo Franchino"
|
|
6
|
-
__version__ = "0.
|
|
6
|
+
__version__ = "0.3.0"
|
|
7
7
|
|
|
8
8
|
__all__ = [
|
|
9
|
-
# dsp
|
|
10
|
-
"FeedbackDelay",
|
|
11
|
-
"FIRMatrixFilter",
|
|
12
|
-
"SOSFilterBank",
|
|
13
9
|
# acoustics
|
|
14
10
|
"absorption_filters",
|
|
15
11
|
"echo_density",
|
|
@@ -44,6 +40,10 @@ __all__ = [
|
|
|
44
40
|
"paper_reference",
|
|
45
41
|
"available_fdn_presets",
|
|
46
42
|
"load_fdn_preset",
|
|
43
|
+
"fdn_build_from_dict",
|
|
44
|
+
"fdn_build_to_dict",
|
|
45
|
+
"load_fdn_build",
|
|
46
|
+
"save_fdn_build",
|
|
47
47
|
# matrix generators
|
|
48
48
|
"allpass_in_fdn",
|
|
49
49
|
"anderson_matrix",
|
|
@@ -159,6 +159,8 @@ __all__ = [
|
|
|
159
159
|
"flamo_nodes_flat",
|
|
160
160
|
"plot_flamo_graph",
|
|
161
161
|
"extract_build",
|
|
162
|
+
# time-domain graph engine
|
|
163
|
+
"td",
|
|
162
164
|
# SDN (scattering delay network)
|
|
163
165
|
"SDN",
|
|
164
166
|
# allpass FDN
|
|
@@ -299,11 +301,12 @@ from .auxiliary.utils import (
|
|
|
299
301
|
skew,
|
|
300
302
|
sq_to_db,
|
|
301
303
|
)
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
304
|
+
from .build_io import (
|
|
305
|
+
fdn_build_from_dict,
|
|
306
|
+
fdn_build_to_dict,
|
|
307
|
+
load_fdn_build,
|
|
308
|
+
save_fdn_build,
|
|
309
|
+
)
|
|
307
310
|
from .generate.allpass_FDN import allpass_completion
|
|
308
311
|
from .generate.allpass_FDN.allpass_completion import (
|
|
309
312
|
apply_diagonal_similarity,
|
|
@@ -399,3 +402,6 @@ from .translate.pr_to_impz import pr_to_impz
|
|
|
399
402
|
|
|
400
403
|
# Expose allpass submodule for pyFDN.allpass.is_uniallpass etc.
|
|
401
404
|
allpass = import_module(".auxiliary.allpass", __name__)
|
|
405
|
+
|
|
406
|
+
# Time-domain graph engine (pyFDN.td operators and connectors).
|
|
407
|
+
from . import td # noqa: E402
|
|
@@ -546,10 +546,10 @@ def _db_per_sample_traces(
|
|
|
546
546
|
import plotly.graph_objects as go
|
|
547
547
|
from scipy.signal import sosfreqz
|
|
548
548
|
|
|
549
|
-
from pyFDN.
|
|
549
|
+
from pyFDN.td.operators import SOSBank
|
|
550
550
|
|
|
551
551
|
N = delays_arr.size
|
|
552
|
-
sos_bank =
|
|
552
|
+
sos_bank = SOSBank(sos).sos # (N, n_sections, 6)
|
|
553
553
|
traces = []
|
|
554
554
|
for i in range(N):
|
|
555
555
|
w, h = sosfreqz(sos_bank[i], worN=nfft)
|
|
@@ -590,7 +590,7 @@ def plot_db_per_sample(
|
|
|
590
590
|
----------
|
|
591
591
|
sos : array-like
|
|
592
592
|
Per-delay-line SOS bank, same layout as
|
|
593
|
-
:class:`pyFDN.
|
|
593
|
+
:class:`pyFDN.td.SOSBank`: ``(n_sections, 6, N)``.
|
|
594
594
|
delays : array-like
|
|
595
595
|
Delay lengths in samples, shape (N,).
|
|
596
596
|
fs : float, optional
|
|
@@ -667,7 +667,7 @@ def plot_fdn_parameter(
|
|
|
667
667
|
Feedback matrix, input gains, output gains, direct gains.
|
|
668
668
|
attenuation_sos : array-like, optional
|
|
669
669
|
Per-delay-line SOS attenuation bank, same layout as
|
|
670
|
-
:class:`pyFDN.
|
|
670
|
+
:class:`pyFDN.td.SOSBank`: ``(n_sections, 6, N)``.
|
|
671
671
|
post_eq_sos : array-like, optional
|
|
672
672
|
Post EQ as an SOS cascade in scipy format, shape ``(n_sections, 6)``
|
|
673
673
|
(or ``(6,)`` for one section) for a single output, or
|