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.
Files changed (197) hide show
  1. {pyfdn-0.4.2 → pyfdn-0.5.0}/CONTRIBUTING.rst +12 -6
  2. pyfdn-0.5.0/HISTORY.rst +284 -0
  3. {pyfdn-0.4.2 → pyfdn-0.5.0}/PKG-INFO +3 -7
  4. {pyfdn-0.4.2 → pyfdn-0.5.0}/README.rst +1 -1
  5. {pyfdn-0.4.2 → pyfdn-0.5.0}/docs/api_reference.rst +26 -5
  6. {pyfdn-0.4.2 → pyfdn-0.5.0}/docs/usage.rst +10 -0
  7. {pyfdn-0.4.2 → pyfdn-0.5.0}/pyproject.toml +6 -26
  8. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/__init__.py +166 -77
  9. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/auxiliary/acoustics.py +24 -5
  10. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/auxiliary/allpass.py +11 -152
  11. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/auxiliary/flamo.py +51 -60
  12. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/auxiliary/flamo_graph.py +4 -10
  13. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/auxiliary/math.py +10 -12
  14. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/auxiliary/plot.py +345 -479
  15. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/auxiliary/poles.py +49 -0
  16. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/auxiliary/utils.py +71 -55
  17. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/build.py +15 -4
  18. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/eq/__init__.py +2 -0
  19. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/eq/biquads.py +2 -2
  20. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/eq/design.py +8 -4
  21. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/eq/graphic_eq.py +8 -8
  22. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/generate/SDN.py +64 -106
  23. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/generate/allpass_FDN/allpass_completion.py +11 -28
  24. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/generate/allpass_FDN/homogeneous_allpass_fdn.py +1 -1
  25. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/generate/fdn_build_gallery.py +5 -72
  26. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/generate/fdn_matrix_gallery.py +77 -43
  27. pyfdn-0.5.0/src/pyFDN/generate/kronecker_matrix.py +284 -0
  28. pyfdn-0.5.0/src/pyFDN/generate/orthogonal.py +273 -0
  29. pyfdn-0.5.0/src/pyFDN/generate/paraunitary.py +227 -0
  30. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/generate/sample_delay_lengths.py +3 -8
  31. pyfdn-0.5.0/src/pyFDN/generate/structures.py +300 -0
  32. pyfdn-0.5.0/src/pyFDN/process.py +98 -0
  33. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/resources/references.bib +31 -0
  34. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/td/__init__.py +5 -1
  35. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/td/connectors.py +22 -31
  36. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/td/operators.py +217 -39
  37. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/train/__init__.py +17 -0
  38. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/train/build.py +34 -128
  39. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/train/engine.py +5 -2
  40. pyfdn-0.5.0/src/pyFDN/train/features/__init__.py +7 -0
  41. pyfdn-0.5.0/src/pyFDN/train/features/spatial.py +64 -0
  42. pyfdn-0.5.0/src/pyFDN/train/features/temporal.py +60 -0
  43. pyfdn-0.5.0/src/pyFDN/train/filters.py +271 -0
  44. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/train/losses/__init__.py +21 -0
  45. pyfdn-0.5.0/src/pyFDN/train/losses/distances.py +156 -0
  46. pyfdn-0.5.0/src/pyFDN/train/losses/features.py +366 -0
  47. pyfdn-0.5.0/src/pyFDN/train/losses/match.py +80 -0
  48. pyfdn-0.5.0/src/pyFDN/train/losses/reductions.py +72 -0
  49. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/train/losses/spectral.py +211 -79
  50. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/train/losses/temporal.py +40 -157
  51. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/train/response.py +4 -1
  52. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/translate/dss_to_flamo.py +91 -63
  53. pyfdn-0.5.0/src/pyFDN/translate/dss_to_impz.py +93 -0
  54. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/translate/dss_to_pr.py +29 -53
  55. pyfdn-0.5.0/src/pyFDN/translate/dss_to_ss.py +113 -0
  56. pyfdn-0.5.0/src/pyFDN/translate/dss_to_td.py +219 -0
  57. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/translate/dss_to_tf.py +7 -3
  58. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/translate/flamo_to_pr.py +32 -82
  59. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN.egg-info/PKG-INFO +3 -7
  60. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN.egg-info/SOURCES.txt +16 -22
  61. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN.egg-info/requires.txt +1 -5
  62. {pyfdn-0.4.2 → pyfdn-0.5.0}/tests/test_api_reference.py +2 -0
  63. {pyfdn-0.4.2 → pyfdn-0.5.0}/tests/test_auxiliary_allpass.py +2 -2
  64. {pyfdn-0.4.2 → pyfdn-0.5.0}/tests/test_auxiliary_flamo.py +5 -5
  65. {pyfdn-0.4.2 → pyfdn-0.5.0}/tests/test_auxiliary_plot.py +64 -63
  66. {pyfdn-0.4.2 → pyfdn-0.5.0}/tests/test_auxiliary_utils.py +5 -7
  67. {pyfdn-0.4.2 → pyfdn-0.5.0}/tests/test_dss_to_pr.py +5 -5
  68. {pyfdn-0.4.2 → pyfdn-0.5.0}/tests/test_eq_designs.py +45 -2
  69. pyfdn-0.5.0/tests/test_features.py +108 -0
  70. {pyfdn-0.4.2 → pyfdn-0.5.0}/tests/test_flamo_to_pr.py +4 -4
  71. {pyfdn-0.4.2 → pyfdn-0.5.0}/tests/test_generate.py +71 -24
  72. pyfdn-0.5.0/tests/test_import.py +23 -0
  73. pyfdn-0.5.0/tests/test_kronecker_matrix.py +383 -0
  74. pyfdn-0.5.0/tests/test_losses_features.py +346 -0
  75. {pyfdn-0.4.2 → pyfdn-0.5.0}/tests/test_marimo_examples_run.py +3 -8
  76. {pyfdn-0.4.2 → pyfdn-0.5.0}/tests/test_process_extensions.py +108 -12
  77. {pyfdn-0.4.2 → pyfdn-0.5.0}/tests/test_sdn.py +6 -8
  78. {pyfdn-0.4.2 → pyfdn-0.5.0}/tests/test_td_graph_processing.py +17 -15
  79. {pyfdn-0.4.2 → pyfdn-0.5.0}/tests/test_td_operators.py +41 -30
  80. {pyfdn-0.4.2 → pyfdn-0.5.0}/tests/test_time_varying_matrix.py +8 -6
  81. {pyfdn-0.4.2 → pyfdn-0.5.0}/tests/test_train.py +328 -6
  82. {pyfdn-0.4.2 → pyfdn-0.5.0}/tests/test_translate.py +35 -9
  83. pyfdn-0.4.2/HISTORY.rst +0 -140
  84. pyfdn-0.4.2/docs/references.py +0 -8
  85. pyfdn-0.4.2/setup.py +0 -7
  86. pyfdn-0.4.2/src/pyFDN/auxiliary/coupled_rooms.py +0 -193
  87. pyfdn-0.4.2/src/pyFDN/auxiliary/tiny_rotation_matrix.py +0 -109
  88. pyfdn-0.4.2/src/pyFDN/eq/_backend.py +0 -34
  89. pyfdn-0.4.2/src/pyFDN/generate/allpass_in_fdn.py +0 -78
  90. pyfdn-0.4.2/src/pyFDN/generate/anderson_matrix.py +0 -46
  91. pyfdn-0.4.2/src/pyFDN/generate/complete_orthogonal.py +0 -56
  92. pyfdn-0.4.2/src/pyFDN/generate/construct_cascaded_paraunitary_matrix.py +0 -58
  93. pyfdn-0.4.2/src/pyFDN/generate/construct_paraunitary_from_elementals.py +0 -52
  94. pyfdn-0.4.2/src/pyFDN/generate/construct_velvet_feedback_matrix.py +0 -17
  95. pyfdn-0.4.2/src/pyFDN/generate/degree_one_lossless.py +0 -31
  96. pyfdn-0.4.2/src/pyFDN/generate/householder_matrix.py +0 -24
  97. pyfdn-0.4.2/src/pyFDN/generate/is_almost_zero.py +0 -18
  98. pyfdn-0.4.2/src/pyFDN/generate/nearest_orthogonal.py +0 -24
  99. pyfdn-0.4.2/src/pyFDN/generate/nearest_sign_agnostic_orthogonal.py +0 -82
  100. pyfdn-0.4.2/src/pyFDN/generate/random_matrix_shift.py +0 -42
  101. pyfdn-0.4.2/src/pyFDN/generate/random_orthogonal.py +0 -10
  102. pyfdn-0.4.2/src/pyFDN/generate/schroeder_reverberator.py +0 -85
  103. pyfdn-0.4.2/src/pyFDN/generate/shift_matrix.py +0 -45
  104. pyfdn-0.4.2/src/pyFDN/generate/shift_matrix_distribute.py +0 -24
  105. pyfdn-0.4.2/src/pyFDN/process.py +0 -115
  106. pyfdn-0.4.2/src/pyFDN/train/filters.py +0 -304
  107. pyfdn-0.4.2/src/pyFDN/translate/dss_to_impz.py +0 -119
  108. pyfdn-0.4.2/src/pyFDN/translate/dss_to_ss.py +0 -101
  109. pyfdn-0.4.2/tests/test_coupled_rooms.py +0 -229
  110. {pyfdn-0.4.2 → pyfdn-0.5.0}/AUTHORS.rst +0 -0
  111. {pyfdn-0.4.2 → pyfdn-0.5.0}/LICENSE +0 -0
  112. {pyfdn-0.4.2 → pyfdn-0.5.0}/MANIFEST.in +0 -0
  113. {pyfdn-0.4.2 → pyfdn-0.5.0}/docs/Makefile +0 -0
  114. {pyfdn-0.4.2 → pyfdn-0.5.0}/docs/__init__.py +0 -0
  115. {pyfdn-0.4.2 → pyfdn-0.5.0}/docs/audio_gallery.py +0 -0
  116. {pyfdn-0.4.2 → pyfdn-0.5.0}/docs/authors.rst +0 -0
  117. {pyfdn-0.4.2 → pyfdn-0.5.0}/docs/conf.py +0 -0
  118. {pyfdn-0.4.2 → pyfdn-0.5.0}/docs/contributing.rst +0 -0
  119. {pyfdn-0.4.2 → pyfdn-0.5.0}/docs/example_gallery.py +0 -0
  120. {pyfdn-0.4.2 → pyfdn-0.5.0}/docs/history.rst +0 -0
  121. {pyfdn-0.4.2 → pyfdn-0.5.0}/docs/index.rst +0 -0
  122. {pyfdn-0.4.2 → pyfdn-0.5.0}/docs/installation.rst +0 -0
  123. {pyfdn-0.4.2 → pyfdn-0.5.0}/docs/logo/logo_pyFDN_3.png +0 -0
  124. {pyfdn-0.4.2 → pyfdn-0.5.0}/docs/logo/logo_pyFDN_4.png +0 -0
  125. {pyfdn-0.4.2 → pyfdn-0.5.0}/docs/logo/pyfdn_logo_basic.png +0 -0
  126. {pyfdn-0.4.2 → pyfdn-0.5.0}/docs/logo/pyfdn_logo_wave.png +0 -0
  127. {pyfdn-0.4.2 → pyfdn-0.5.0}/docs/make.bat +0 -0
  128. {pyfdn-0.4.2 → pyfdn-0.5.0}/docs/patch_rst.py +0 -0
  129. {pyfdn-0.4.2 → pyfdn-0.5.0}/docs/readme.rst +0 -0
  130. {pyfdn-0.4.2 → pyfdn-0.5.0}/docs/training_losses.rst +0 -0
  131. {pyfdn-0.4.2 → pyfdn-0.5.0}/setup.cfg +0 -0
  132. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/auxiliary/__init__.py +0 -0
  133. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/auxiliary/audio.py +0 -0
  134. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/auxiliary/delay.py +0 -0
  135. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/auxiliary/marimo_utils.py +0 -0
  136. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/eq/_design_record.py +0 -0
  137. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/eq/probe_sos.py +0 -0
  138. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/generate/allpass_FDN/__init__.py +0 -0
  139. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/generate/allpass_FDN/rand_admissible_homogeneous_allpass.py +0 -0
  140. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/preset.py +0 -0
  141. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/references.py +0 -0
  142. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/resources/ATTRIBUTION.md +0 -0
  143. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/resources/__init__.py +0 -0
  144. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/resources/audio/drums/drums.wav +0 -0
  145. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/resources/audio/general/synth_dry.wav +0 -0
  146. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/resources/audio/metadata.json +0 -0
  147. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/resources/audio/rir/meetingroom_to_hallway_290cm.wav +0 -0
  148. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/resources/audio/rir/s3_r4_o.wav +0 -0
  149. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/resources/audio/speech/P1_Set1_8.wav +0 -0
  150. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/resources/audio/speech/P20_Set1_8.wav +0 -0
  151. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/resources/audio/strings/Kleiderschrank_Taylor_DI.wav +0 -0
  152. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/resources/audio/strings/Sommerhit2016_Taylor_DI.wav +0 -0
  153. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/resources/licenses/coupled-rooms-CC-BY-4.0.txt +0 -0
  154. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/resources/licenses/diff-fdn-colorless-MIT.txt +0 -0
  155. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/resources/presets/colorless_FDN/colorless_N16_d1.json +0 -0
  156. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/resources/presets/colorless_FDN/colorless_N16_d2.json +0 -0
  157. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/resources/presets/colorless_FDN/colorless_N4_d1.json +0 -0
  158. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/resources/presets/colorless_FDN/colorless_N4_d2.json +0 -0
  159. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/resources/presets/colorless_FDN/colorless_N6_d1.json +0 -0
  160. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/resources/presets/colorless_FDN/colorless_N6_d2.json +0 -0
  161. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/resources/presets/colorless_FDN/colorless_N8_d1.json +0 -0
  162. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/resources/presets/colorless_FDN/colorless_N8_d2.json +0 -0
  163. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/resources/presets/colorless_FDN/colorless_init_N16_d1.json +0 -0
  164. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/resources/presets/colorless_FDN/colorless_init_N16_d2.json +0 -0
  165. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/resources/presets/colorless_FDN/colorless_init_N4_d1.json +0 -0
  166. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/resources/presets/colorless_FDN/colorless_init_N4_d2.json +0 -0
  167. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/resources/presets/colorless_FDN/colorless_init_N6_d1.json +0 -0
  168. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/resources/presets/colorless_FDN/colorless_init_N6_d2.json +0 -0
  169. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/resources/presets/colorless_FDN/colorless_init_N8_d1.json +0 -0
  170. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/resources/presets/colorless_FDN/colorless_init_N8_d2.json +0 -0
  171. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/train/losses/_targets.py +0 -0
  172. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/train/losses/base.py +0 -0
  173. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/train/losses/parameter.py +0 -0
  174. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/train/params.py +0 -0
  175. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/translate/impz_to_res.py +0 -0
  176. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/translate/mtf_to_impz.py +0 -0
  177. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN/translate/pr_to_impz.py +0 -0
  178. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN.egg-info/dependency_links.txt +0 -0
  179. {pyfdn-0.4.2 → pyfdn-0.5.0}/src/pyFDN.egg-info/top_level.txt +0 -0
  180. {pyfdn-0.4.2 → pyfdn-0.5.0}/tests/__init__.py +0 -0
  181. {pyfdn-0.4.2 → pyfdn-0.5.0}/tests/conftest.py +0 -0
  182. {pyfdn-0.4.2 → pyfdn-0.5.0}/tests/matloader.py +0 -0
  183. {pyfdn-0.4.2 → pyfdn-0.5.0}/tests/reference/README.md +0 -0
  184. {pyfdn-0.4.2 → pyfdn-0.5.0}/tests/reference/example_onePoleAbsorption.mat +0 -0
  185. {pyfdn-0.4.2 → pyfdn-0.5.0}/tests/reference/onePoleAbsorption_reference.mat +0 -0
  186. {pyfdn-0.4.2 → pyfdn-0.5.0}/tests/test_audio_gallery.py +0 -0
  187. {pyfdn-0.4.2 → pyfdn-0.5.0}/tests/test_auxiliary_acoustics.py +0 -0
  188. {pyfdn-0.4.2 → pyfdn-0.5.0}/tests/test_auxiliary_delay.py +1 -1
  189. {pyfdn-0.4.2 → pyfdn-0.5.0}/tests/test_auxiliary_math.py +0 -0
  190. {pyfdn-0.4.2 → pyfdn-0.5.0}/tests/test_build.py +0 -0
  191. {pyfdn-0.4.2 → pyfdn-0.5.0}/tests/test_example_gallery.py +0 -0
  192. {pyfdn-0.4.2 → pyfdn-0.5.0}/tests/test_flamo_graph.py +1 -1
  193. {pyfdn-0.4.2 → pyfdn-0.5.0}/tests/test_flamo_one_pole_absorption.py +0 -0
  194. {pyfdn-0.4.2 → pyfdn-0.5.0}/tests/test_packaged_resources.py +0 -0
  195. {pyfdn-0.4.2 → pyfdn-0.5.0}/tests/test_preset.py +0 -0
  196. {pyfdn-0.4.2 → pyfdn-0.5.0}/tests/test_pyFDN.py +0 -0
  197. {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``, ``build_io.py``, and ``presets.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, including the allpass and scattering-delay-network builders.
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. ``process_fdn`` uses ``MatrixFIR`` for polynomial feedback
151
- matrices; ``SOSBank`` implements per-delay-line filter cascades used for
152
- frequency-dependent absorption.
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.
@@ -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.4.2
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.14
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 ``.process(signal)``. See :mod:`pyFDN.td`.
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.process_fdn` takes, in the same positions and under the same names.
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.plot_FDN_build
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.4.2"
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.14",
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.4.2"
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"