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.
Files changed (186) hide show
  1. {pyfdn-0.3.0 → pyfdn-0.4.0}/CONTRIBUTING.rst +4 -4
  2. pyfdn-0.4.0/HISTORY.rst +91 -0
  3. {pyfdn-0.3.0 → pyfdn-0.4.0}/PKG-INFO +1 -1
  4. {pyfdn-0.3.0 → pyfdn-0.4.0}/docs/api_reference.rst +72 -7
  5. {pyfdn-0.3.0 → pyfdn-0.4.0}/docs/conf.py +42 -3
  6. {pyfdn-0.3.0 → pyfdn-0.4.0}/docs/index.rst +1 -0
  7. pyfdn-0.4.0/docs/training_losses.rst +99 -0
  8. {pyfdn-0.3.0 → pyfdn-0.4.0}/pyproject.toml +2 -2
  9. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/__init__.py +99 -18
  10. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/auxiliary/__init__.py +2 -2
  11. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/auxiliary/acoustics.py +8 -209
  12. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/auxiliary/coupled_rooms.py +5 -5
  13. pyfdn-0.4.0/src/pyFDN/auxiliary/flamo.py +1103 -0
  14. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/auxiliary/flamo_graph.py +59 -24
  15. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/auxiliary/marimo_utils.py +25 -2
  16. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/auxiliary/plot.py +43 -30
  17. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/auxiliary/utils.py +1 -1
  18. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/build_io.py +45 -20
  19. pyfdn-0.4.0/src/pyFDN/eq/__init__.py +45 -0
  20. pyfdn-0.4.0/src/pyFDN/eq/_backend.py +34 -0
  21. {pyfdn-0.3.0/src/pyFDN/graphicEQ → pyfdn-0.4.0/src/pyFDN/eq}/absorption_geq.py +13 -15
  22. pyfdn-0.4.0/src/pyFDN/eq/bandpass_filter.py +42 -0
  23. pyfdn-0.4.0/src/pyFDN/eq/design_geq.py +175 -0
  24. pyfdn-0.4.0/src/pyFDN/eq/designs.py +177 -0
  25. pyfdn-0.4.0/src/pyFDN/eq/first_order.py +168 -0
  26. {pyfdn-0.3.0/src/pyFDN/graphicEQ → pyfdn-0.4.0/src/pyFDN/eq}/graphic_eq.py +26 -17
  27. pyfdn-0.4.0/src/pyFDN/eq/one_pole.py +76 -0
  28. pyfdn-0.4.0/src/pyFDN/eq/shelving_filter.py +64 -0
  29. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/generate/fdn_matrix_gallery.py +66 -27
  30. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/process.py +1 -1
  31. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/resources/presets/colorless_FDN/colorless_N16_d1.json +4 -3
  32. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/resources/presets/colorless_FDN/colorless_N16_d2.json +4 -3
  33. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/resources/presets/colorless_FDN/colorless_N4_d1.json +4 -3
  34. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/resources/presets/colorless_FDN/colorless_N4_d2.json +4 -3
  35. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/resources/presets/colorless_FDN/colorless_N6_d1.json +4 -3
  36. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/resources/presets/colorless_FDN/colorless_N6_d2.json +4 -3
  37. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/resources/presets/colorless_FDN/colorless_N8_d1.json +4 -3
  38. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/resources/presets/colorless_FDN/colorless_N8_d2.json +4 -3
  39. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/resources/presets/colorless_FDN/colorless_init_N16_d1.json +4 -3
  40. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/resources/presets/colorless_FDN/colorless_init_N16_d2.json +4 -3
  41. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/resources/presets/colorless_FDN/colorless_init_N4_d1.json +4 -3
  42. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/resources/presets/colorless_FDN/colorless_init_N4_d2.json +4 -3
  43. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/resources/presets/colorless_FDN/colorless_init_N6_d1.json +4 -3
  44. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/resources/presets/colorless_FDN/colorless_init_N6_d2.json +4 -3
  45. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/resources/presets/colorless_FDN/colorless_init_N8_d1.json +4 -3
  46. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/resources/presets/colorless_FDN/colorless_init_N8_d2.json +4 -3
  47. pyfdn-0.4.0/src/pyFDN/train/__init__.py +84 -0
  48. pyfdn-0.4.0/src/pyFDN/train/build.py +456 -0
  49. pyfdn-0.4.0/src/pyFDN/train/engine.py +207 -0
  50. pyfdn-0.4.0/src/pyFDN/train/losses/__init__.py +46 -0
  51. pyfdn-0.4.0/src/pyFDN/train/losses/_targets.py +63 -0
  52. pyfdn-0.4.0/src/pyFDN/train/losses/base.py +151 -0
  53. pyfdn-0.4.0/src/pyFDN/train/losses/parameter.py +66 -0
  54. pyfdn-0.4.0/src/pyFDN/train/losses/spectral.py +356 -0
  55. pyfdn-0.4.0/src/pyFDN/train/losses/temporal.py +347 -0
  56. pyfdn-0.4.0/src/pyFDN/train/params.py +152 -0
  57. pyfdn-0.4.0/src/pyFDN/train/response.py +148 -0
  58. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/translate/dss_to_flamo.py +55 -41
  59. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/translate/dss_to_impz.py +17 -21
  60. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/translate/impz_to_res.py +1 -1
  61. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN.egg-info/PKG-INFO +1 -1
  62. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN.egg-info/SOURCES.txt +21 -9
  63. {pyfdn-0.3.0 → pyfdn-0.4.0}/tests/test_api_reference.py +5 -0
  64. {pyfdn-0.3.0 → pyfdn-0.4.0}/tests/test_auxiliary_acoustics.py +0 -61
  65. {pyfdn-0.3.0 → pyfdn-0.4.0}/tests/test_auxiliary_flamo.py +3 -10
  66. {pyfdn-0.3.0 → pyfdn-0.4.0}/tests/test_auxiliary_plot.py +35 -14
  67. {pyfdn-0.3.0 → pyfdn-0.4.0}/tests/test_auxiliary_utils.py +39 -1
  68. {pyfdn-0.3.0 → pyfdn-0.4.0}/tests/test_build_io.py +14 -4
  69. pyfdn-0.4.0/tests/test_eq_designs.py +289 -0
  70. {pyfdn-0.3.0 → pyfdn-0.4.0}/tests/test_flamo_graph.py +4 -4
  71. {pyfdn-0.3.0 → pyfdn-0.4.0}/tests/test_flamo_to_pr.py +1 -1
  72. {pyfdn-0.3.0 → pyfdn-0.4.0}/tests/test_generate.py +22 -19
  73. {pyfdn-0.3.0 → pyfdn-0.4.0}/tests/test_process_extensions.py +51 -9
  74. pyfdn-0.4.0/tests/test_train.py +1408 -0
  75. pyfdn-0.3.0/HISTORY.rst +0 -37
  76. pyfdn-0.3.0/src/pyFDN/auxiliary/flamo.py +0 -648
  77. pyfdn-0.3.0/src/pyFDN/graphicEQ/__init__.py +0 -17
  78. pyfdn-0.3.0/src/pyFDN/graphicEQ/bandpass_filter.py +0 -34
  79. pyfdn-0.3.0/src/pyFDN/graphicEQ/design_geq.py +0 -73
  80. pyfdn-0.3.0/src/pyFDN/graphicEQ/shelving_filter.py +0 -55
  81. pyfdn-0.3.0/src/pyFDN/train/__init__.py +0 -35
  82. pyfdn-0.3.0/src/pyFDN/train/build.py +0 -321
  83. pyfdn-0.3.0/src/pyFDN/train/engine.py +0 -182
  84. pyfdn-0.3.0/src/pyFDN/train/objectives.py +0 -207
  85. pyfdn-0.3.0/tests/test_graphic_eq.py +0 -129
  86. pyfdn-0.3.0/tests/test_train.py +0 -269
  87. {pyfdn-0.3.0 → pyfdn-0.4.0}/AUTHORS.rst +0 -0
  88. {pyfdn-0.3.0 → pyfdn-0.4.0}/LICENSE +0 -0
  89. {pyfdn-0.3.0 → pyfdn-0.4.0}/MANIFEST.in +0 -0
  90. {pyfdn-0.3.0 → pyfdn-0.4.0}/README.rst +0 -0
  91. {pyfdn-0.3.0 → pyfdn-0.4.0}/docs/Makefile +0 -0
  92. {pyfdn-0.3.0 → pyfdn-0.4.0}/docs/__init__.py +0 -0
  93. {pyfdn-0.3.0 → pyfdn-0.4.0}/docs/audio_gallery.py +0 -0
  94. {pyfdn-0.3.0 → pyfdn-0.4.0}/docs/authors.rst +0 -0
  95. {pyfdn-0.3.0 → pyfdn-0.4.0}/docs/contributing.rst +0 -0
  96. {pyfdn-0.3.0 → pyfdn-0.4.0}/docs/example_gallery.py +0 -0
  97. {pyfdn-0.3.0 → pyfdn-0.4.0}/docs/history.rst +0 -0
  98. {pyfdn-0.3.0 → pyfdn-0.4.0}/docs/installation.rst +0 -0
  99. {pyfdn-0.3.0 → pyfdn-0.4.0}/docs/logo/logo_pyFDN_3.png +0 -0
  100. {pyfdn-0.3.0 → pyfdn-0.4.0}/docs/logo/logo_pyFDN_4.png +0 -0
  101. {pyfdn-0.3.0 → pyfdn-0.4.0}/docs/logo/pyfdn_logo_basic.png +0 -0
  102. {pyfdn-0.3.0 → pyfdn-0.4.0}/docs/logo/pyfdn_logo_wave.png +0 -0
  103. {pyfdn-0.3.0 → pyfdn-0.4.0}/docs/make.bat +0 -0
  104. {pyfdn-0.3.0 → pyfdn-0.4.0}/docs/patch_rst.py +0 -0
  105. {pyfdn-0.3.0 → pyfdn-0.4.0}/docs/readme.rst +0 -0
  106. {pyfdn-0.3.0 → pyfdn-0.4.0}/docs/references.py +0 -0
  107. {pyfdn-0.3.0 → pyfdn-0.4.0}/docs/usage.rst +0 -0
  108. {pyfdn-0.3.0 → pyfdn-0.4.0}/setup.cfg +0 -0
  109. {pyfdn-0.3.0 → pyfdn-0.4.0}/setup.py +0 -0
  110. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/auxiliary/allpass.py +0 -0
  111. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/auxiliary/audio.py +0 -0
  112. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/auxiliary/delay.py +0 -0
  113. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/auxiliary/math.py +0 -0
  114. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/auxiliary/poles.py +0 -0
  115. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/auxiliary/tiny_rotation_matrix.py +0 -0
  116. {pyfdn-0.3.0/src/pyFDN/graphicEQ → pyfdn-0.4.0/src/pyFDN/eq}/probe_sos.py +0 -0
  117. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/generate/SDN.py +0 -0
  118. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/generate/allpass_FDN/__init__.py +0 -0
  119. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/generate/allpass_FDN/allpass_completion.py +0 -0
  120. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/generate/allpass_FDN/homogeneous_allpass_fdn.py +0 -0
  121. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/generate/allpass_FDN/rand_admissible_homogeneous_allpass.py +0 -0
  122. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/generate/allpass_in_fdn.py +0 -0
  123. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/generate/anderson_matrix.py +0 -0
  124. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/generate/complete_orthogonal.py +0 -0
  125. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/generate/construct_cascaded_paraunitary_matrix.py +0 -0
  126. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/generate/construct_paraunitary_from_elementals.py +0 -0
  127. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/generate/construct_velvet_feedback_matrix.py +0 -0
  128. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/generate/degree_one_lossless.py +0 -0
  129. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/generate/householder_matrix.py +0 -0
  130. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/generate/is_almost_zero.py +0 -0
  131. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/generate/nearest_orthogonal.py +0 -0
  132. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/generate/nearest_sign_agnostic_orthogonal.py +0 -0
  133. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/generate/random_matrix_shift.py +0 -0
  134. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/generate/random_orthogonal.py +0 -0
  135. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/generate/sample_delay_lengths.py +0 -0
  136. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/generate/schroeder_reverberator.py +0 -0
  137. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/generate/shift_matrix.py +0 -0
  138. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/generate/shift_matrix_distribute.py +0 -0
  139. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/presets.py +0 -0
  140. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/references.py +0 -0
  141. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/resources/ATTRIBUTION.md +0 -0
  142. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/resources/__init__.py +0 -0
  143. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/resources/audio/drums/drums.wav +0 -0
  144. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/resources/audio/general/synth_dry.wav +0 -0
  145. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/resources/audio/metadata.json +0 -0
  146. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/resources/audio/rir/s3_r4_o.wav +0 -0
  147. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/resources/audio/speech/P1_Set1_8.wav +0 -0
  148. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/resources/audio/speech/P20_Set1_8.wav +0 -0
  149. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/resources/audio/strings/Kleiderschrank_Taylor_DI.wav +0 -0
  150. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/resources/audio/strings/Sommerhit2016_Taylor_DI.wav +0 -0
  151. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/resources/licenses/diff-fdn-colorless-MIT.txt +0 -0
  152. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/resources/references.bib +0 -0
  153. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/td/__init__.py +0 -0
  154. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/td/connectors.py +0 -0
  155. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/td/operators.py +0 -0
  156. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/translate/dss_to_pr.py +0 -0
  157. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/translate/dss_to_ss.py +0 -0
  158. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/translate/dss_to_tf.py +0 -0
  159. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/translate/flamo_to_pr.py +0 -0
  160. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/translate/mtf_to_impz.py +0 -0
  161. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN/translate/pr_to_impz.py +0 -0
  162. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN.egg-info/dependency_links.txt +0 -0
  163. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN.egg-info/requires.txt +0 -0
  164. {pyfdn-0.3.0 → pyfdn-0.4.0}/src/pyFDN.egg-info/top_level.txt +0 -0
  165. {pyfdn-0.3.0 → pyfdn-0.4.0}/tests/__init__.py +0 -0
  166. {pyfdn-0.3.0 → pyfdn-0.4.0}/tests/conftest.py +0 -0
  167. {pyfdn-0.3.0 → pyfdn-0.4.0}/tests/matloader.py +0 -0
  168. {pyfdn-0.3.0 → pyfdn-0.4.0}/tests/reference/README.md +0 -0
  169. {pyfdn-0.3.0 → pyfdn-0.4.0}/tests/reference/example_onePoleAbsorption.mat +0 -0
  170. {pyfdn-0.3.0 → pyfdn-0.4.0}/tests/reference/onePoleAbsorption_reference.mat +0 -0
  171. {pyfdn-0.3.0 → pyfdn-0.4.0}/tests/test_audio_gallery.py +0 -0
  172. {pyfdn-0.3.0 → pyfdn-0.4.0}/tests/test_auxiliary_delay.py +0 -0
  173. {pyfdn-0.3.0 → pyfdn-0.4.0}/tests/test_auxiliary_math.py +0 -0
  174. {pyfdn-0.3.0 → pyfdn-0.4.0}/tests/test_coupled_rooms.py +0 -0
  175. {pyfdn-0.3.0 → pyfdn-0.4.0}/tests/test_dss_to_pr.py +0 -0
  176. {pyfdn-0.3.0 → pyfdn-0.4.0}/tests/test_example_gallery.py +0 -0
  177. {pyfdn-0.3.0 → pyfdn-0.4.0}/tests/test_flamo_one_pole_absorption.py +0 -0
  178. {pyfdn-0.3.0 → pyfdn-0.4.0}/tests/test_marimo_examples_run.py +0 -0
  179. {pyfdn-0.3.0 → pyfdn-0.4.0}/tests/test_packaged_resources.py +0 -0
  180. {pyfdn-0.3.0 → pyfdn-0.4.0}/tests/test_pyFDN.py +0 -0
  181. {pyfdn-0.3.0 → pyfdn-0.4.0}/tests/test_sdn.py +0 -0
  182. {pyfdn-0.3.0 → pyfdn-0.4.0}/tests/test_td_connectors.py +0 -0
  183. {pyfdn-0.3.0 → pyfdn-0.4.0}/tests/test_td_graph_processing.py +0 -0
  184. {pyfdn-0.3.0 → pyfdn-0.4.0}/tests/test_td_operators.py +0 -0
  185. {pyfdn-0.3.0 → pyfdn-0.4.0}/tests/test_time_varying_matrix.py +0 -0
  186. {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/graphicEQ/`` contains graphic-EQ and absorption-filter design,
154
- while ``src/pyFDN/translate/`` converts between delay state-space, transfer
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, objectives,
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.
@@ -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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyFDN
3
- Version: 0.3.0
3
+ Version: 0.4.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
@@ -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
- Graphic EQ
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 log a warning and keep going rather than aborting the
177
- # whole docs build on one bad notebook.
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] WARNING: '{relative_path}' had cell errors during static "
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)
@@ -58,6 +58,7 @@ feedback matrices, designing loop filters, and inspecting pole locations.
58
58
  usage
59
59
  examples_gallery
60
60
  api_reference
61
+ training_losses
61
62
  modules
62
63
  contributing
63
64
  authors
@@ -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.3.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.3.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.3.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
- # graphicEQ
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 flamo_freq_response, flamo_process, flamo_time_response
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
- "output_layer",
43
+ "core_alias_decay_db",
44
44
  "flamo_time_response",
45
45
  "flamo_freq_response",
46
46
  "flamo_process",