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.
Files changed (249) hide show
  1. pyfdn-0.3.0/AUTHORS.rst +17 -0
  2. {pyfdn-0.2.0 → pyfdn-0.3.0}/CONTRIBUTING.rst +29 -2
  3. pyfdn-0.3.0/HISTORY.rst +37 -0
  4. {pyfdn-0.2.0 → pyfdn-0.3.0}/PKG-INFO +20 -2
  5. {pyfdn-0.2.0 → pyfdn-0.3.0}/README.rst +12 -0
  6. pyfdn-0.3.0/docs/Makefile +39 -0
  7. {pyfdn-0.2.0 → pyfdn-0.3.0}/docs/api_reference.rst +24 -7
  8. {pyfdn-0.2.0 → pyfdn-0.3.0}/docs/audio_gallery.py +2 -2
  9. {pyfdn-0.2.0 → pyfdn-0.3.0}/docs/conf.py +8 -1
  10. {pyfdn-0.2.0 → pyfdn-0.3.0}/docs/example_gallery.py +14 -23
  11. pyfdn-0.3.0/docs/patch_rst.py +35 -0
  12. {pyfdn-0.2.0 → pyfdn-0.3.0}/docs/usage.rst +5 -0
  13. {pyfdn-0.2.0 → pyfdn-0.3.0}/pyproject.toml +10 -4
  14. {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/__init__.py +16 -10
  15. {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/auxiliary/plot.py +4 -4
  16. pyfdn-0.3.0/src/pyFDN/build_io.py +151 -0
  17. {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/generate/allpass_FDN/allpass_completion.py +3 -1
  18. {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/generate/allpass_FDN/homogeneous_allpass_fdn.py +9 -10
  19. pyfdn-0.3.0/src/pyFDN/presets.py +50 -0
  20. {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/process.py +6 -5
  21. {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/resources/ATTRIBUTION.md +2 -1
  22. pyfdn-0.3.0/src/pyFDN/resources/presets/colorless_FDN/colorless_N16_d1.json +395 -0
  23. pyfdn-0.3.0/src/pyFDN/resources/presets/colorless_FDN/colorless_N16_d2.json +395 -0
  24. pyfdn-0.3.0/src/pyFDN/resources/presets/colorless_FDN/colorless_N4_d1.json +71 -0
  25. pyfdn-0.3.0/src/pyFDN/resources/presets/colorless_FDN/colorless_N4_d2.json +71 -0
  26. pyfdn-0.3.0/src/pyFDN/resources/presets/colorless_FDN/colorless_N6_d1.json +105 -0
  27. pyfdn-0.3.0/src/pyFDN/resources/presets/colorless_FDN/colorless_N6_d2.json +105 -0
  28. pyfdn-0.3.0/src/pyFDN/resources/presets/colorless_FDN/colorless_N8_d1.json +147 -0
  29. pyfdn-0.3.0/src/pyFDN/resources/presets/colorless_FDN/colorless_N8_d2.json +147 -0
  30. pyfdn-0.3.0/src/pyFDN/resources/presets/colorless_FDN/colorless_init_N16_d1.json +395 -0
  31. pyfdn-0.3.0/src/pyFDN/resources/presets/colorless_FDN/colorless_init_N16_d2.json +395 -0
  32. pyfdn-0.3.0/src/pyFDN/resources/presets/colorless_FDN/colorless_init_N4_d1.json +71 -0
  33. pyfdn-0.3.0/src/pyFDN/resources/presets/colorless_FDN/colorless_init_N4_d2.json +71 -0
  34. pyfdn-0.3.0/src/pyFDN/resources/presets/colorless_FDN/colorless_init_N6_d1.json +105 -0
  35. pyfdn-0.3.0/src/pyFDN/resources/presets/colorless_FDN/colorless_init_N6_d2.json +105 -0
  36. pyfdn-0.3.0/src/pyFDN/resources/presets/colorless_FDN/colorless_init_N8_d1.json +147 -0
  37. pyfdn-0.3.0/src/pyFDN/resources/presets/colorless_FDN/colorless_init_N8_d2.json +147 -0
  38. {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/resources/references.bib +9 -0
  39. pyfdn-0.3.0/src/pyFDN/td/__init__.py +58 -0
  40. pyfdn-0.3.0/src/pyFDN/td/connectors.py +300 -0
  41. pyfdn-0.3.0/src/pyFDN/td/operators.py +508 -0
  42. {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/train/build.py +2 -2
  43. {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/train/objectives.py +7 -7
  44. {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/translate/dss_to_impz.py +4 -9
  45. {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN.egg-info/PKG-INFO +20 -2
  46. {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN.egg-info/SOURCES.txt +24 -80
  47. {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN.egg-info/requires.txt +6 -0
  48. {pyfdn-0.2.0 → pyfdn-0.3.0}/tests/test_api_reference.py +1 -0
  49. pyfdn-0.3.0/tests/test_audio_gallery.py +24 -0
  50. pyfdn-0.3.0/tests/test_build_io.py +50 -0
  51. pyfdn-0.3.0/tests/test_example_gallery.py +37 -0
  52. {pyfdn-0.2.0 → pyfdn-0.3.0}/tests/test_generate.py +14 -2
  53. {pyfdn-0.2.0 → pyfdn-0.3.0}/tests/test_packaged_resources.py +4 -0
  54. {pyfdn-0.2.0 → pyfdn-0.3.0}/tests/test_process_extensions.py +7 -7
  55. pyfdn-0.3.0/tests/test_td_connectors.py +288 -0
  56. pyfdn-0.3.0/tests/test_td_graph_processing.py +674 -0
  57. pyfdn-0.3.0/tests/test_td_operators.py +418 -0
  58. {pyfdn-0.2.0 → pyfdn-0.3.0}/tests/test_time_varying_matrix.py +7 -3
  59. pyfdn-0.2.0/AUTHORS.rst +0 -11
  60. pyfdn-0.2.0/HISTORY.rst +0 -17
  61. pyfdn-0.2.0/docs/Makefile +0 -20
  62. pyfdn-0.2.0/docs/audio_gallery.rst +0 -99
  63. pyfdn-0.2.0/docs/examples_gallery.rst +0 -133
  64. pyfdn-0.2.0/docs/generated/pyFDN.DFiltMatrix.rst +0 -23
  65. pyfdn-0.2.0/docs/generated/pyFDN.FeedbackDelay.rst +0 -25
  66. pyfdn-0.2.0/docs/generated/pyFDN.FilterMatrix.rst +0 -36
  67. pyfdn-0.2.0/docs/generated/pyFDN.TFMatrix.rst +0 -25
  68. pyfdn-0.2.0/docs/generated/pyFDN.ZFIR.rst +0 -32
  69. pyfdn-0.2.0/docs/generated/pyFDN.ZSOS.rst +0 -32
  70. pyfdn-0.2.0/docs/generated/pyFDN.ZScalar.rst +0 -32
  71. pyfdn-0.2.0/docs/generated/pyFDN.ZTF.rst +0 -38
  72. pyfdn-0.2.0/docs/generated/pyFDN.absorption_filters.rst +0 -6
  73. pyfdn-0.2.0/docs/generated/pyFDN.absorption_to_rt.rst +0 -6
  74. pyfdn-0.2.0/docs/generated/pyFDN.construct_cascaded_paraunitary_matrix.rst +0 -6
  75. pyfdn-0.2.0/docs/generated/pyFDN.construct_velvet_feedback_matrix.rst +0 -6
  76. pyfdn-0.2.0/docs/generated/pyFDN.db_to_lin.rst +0 -6
  77. pyfdn-0.2.0/docs/generated/pyFDN.db_to_sq.rst +0 -6
  78. pyfdn-0.2.0/docs/generated/pyFDN.det_polynomial.rst +0 -6
  79. pyfdn-0.2.0/docs/generated/pyFDN.dss_to_impz.rst +0 -6
  80. pyfdn-0.2.0/docs/generated/pyFDN.dss_to_ss.rst +0 -6
  81. pyfdn-0.2.0/docs/generated/pyFDN.echo_density.rst +0 -6
  82. pyfdn-0.2.0/docs/generated/pyFDN.edc.rst +0 -6
  83. pyfdn-0.2.0/docs/generated/pyFDN.ensure_3d.rst +0 -6
  84. pyfdn-0.2.0/docs/generated/pyFDN.hertz_to_unit.rst +0 -6
  85. pyfdn-0.2.0/docs/generated/pyFDN.interpolate_orthogonal.rst +0 -6
  86. pyfdn-0.2.0/docs/generated/pyFDN.is_almost_zero.rst +0 -6
  87. pyfdn-0.2.0/docs/generated/pyFDN.is_bounding_curve.rst +0 -6
  88. pyfdn-0.2.0/docs/generated/pyFDN.is_orthogonal.rst +0 -6
  89. pyfdn-0.2.0/docs/generated/pyFDN.last_nonzero_indices.rst +0 -6
  90. pyfdn-0.2.0/docs/generated/pyFDN.lin_to_db.rst +0 -6
  91. pyfdn-0.2.0/docs/generated/pyFDN.matrix_convolution.rst +0 -6
  92. pyfdn-0.2.0/docs/generated/pyFDN.matrix_delay_approximation.rst +0 -6
  93. pyfdn-0.2.0/docs/generated/pyFDN.matrix_polyder.rst +0 -6
  94. pyfdn-0.2.0/docs/generated/pyFDN.matrix_polyval.rst +0 -6
  95. pyfdn-0.2.0/docs/generated/pyFDN.matrix_sqrt.rst +0 -6
  96. pyfdn-0.2.0/docs/generated/pyFDN.mgrpdelay.rst +0 -6
  97. pyfdn-0.2.0/docs/generated/pyFDN.ms_to_smp.rst +0 -6
  98. pyfdn-0.2.0/docs/generated/pyFDN.mulaw_decode.rst +0 -6
  99. pyfdn-0.2.0/docs/generated/pyFDN.mulaw_encode.rst +0 -6
  100. pyfdn-0.2.0/docs/generated/pyFDN.negpolyder.rst +0 -6
  101. pyfdn-0.2.0/docs/generated/pyFDN.one_pole_absorption.rst +0 -6
  102. pyfdn-0.2.0/docs/generated/pyFDN.outer_sum_approximation.rst +0 -6
  103. pyfdn-0.2.0/docs/generated/pyFDN.peak_normalize.rst +0 -6
  104. pyfdn-0.2.0/docs/generated/pyFDN.plot_impulse_response_matrix.rst +0 -6
  105. pyfdn-0.2.0/docs/generated/pyFDN.plot_system_matrix.rst +0 -6
  106. pyfdn-0.2.0/docs/generated/pyFDN.pole_boundaries.rst +0 -6
  107. pyfdn-0.2.0/docs/generated/pyFDN.poly_degree.rst +0 -6
  108. pyfdn-0.2.0/docs/generated/pyFDN.polyder_rational.rst +0 -6
  109. pyfdn-0.2.0/docs/generated/pyFDN.polydiag.rst +0 -6
  110. pyfdn-0.2.0/docs/generated/pyFDN.process_fdn.rst +0 -6
  111. pyfdn-0.2.0/docs/generated/pyFDN.random_matrix_shift.rst +0 -6
  112. pyfdn-0.2.0/docs/generated/pyFDN.random_orthogonal.rst +0 -6
  113. pyfdn-0.2.0/docs/generated/pyFDN.rt_to_gain_per_sample.rst +0 -6
  114. pyfdn-0.2.0/docs/generated/pyFDN.rt_to_slope.rst +0 -6
  115. pyfdn-0.2.0/docs/generated/pyFDN.shift_matrix.rst +0 -6
  116. pyfdn-0.2.0/docs/generated/pyFDN.shift_matrix_distribute.rst +0 -6
  117. pyfdn-0.2.0/docs/generated/pyFDN.skew.rst +0 -6
  118. pyfdn-0.2.0/docs/generated/pyFDN.slope_to_rt.rst +0 -6
  119. pyfdn-0.2.0/docs/generated/pyFDN.sq_to_db.rst +0 -6
  120. pyfdn-0.2.0/docs/generated/pyFDN.tiny_rotation_matrix.rst +0 -6
  121. pyfdn-0.2.0/docs/patch_rst.py +0 -41
  122. pyfdn-0.2.0/src/pyFDN/dsp/__init__.py +0 -3
  123. pyfdn-0.2.0/src/pyFDN/dsp/dfilt_matrix.py +0 -53
  124. pyfdn-0.2.0/src/pyFDN/dsp/feedback_delay.py +0 -47
  125. pyfdn-0.2.0/src/pyFDN/dsp/sos_filter_bank.py +0 -57
  126. pyfdn-0.2.0/src/pyFDN/dsp/time_varying_matrix.py +0 -144
  127. pyfdn-0.2.0/src/pyFDN/presets.py +0 -60
  128. pyfdn-0.2.0/src/pyFDN/resources/presets/colorless_FDN/param_N16_d1.mat +0 -0
  129. pyfdn-0.2.0/src/pyFDN/resources/presets/colorless_FDN/param_N16_d2.mat +0 -0
  130. pyfdn-0.2.0/src/pyFDN/resources/presets/colorless_FDN/param_N4_d1.mat +0 -0
  131. pyfdn-0.2.0/src/pyFDN/resources/presets/colorless_FDN/param_N4_d2.mat +0 -0
  132. pyfdn-0.2.0/src/pyFDN/resources/presets/colorless_FDN/param_N6_d1.mat +0 -0
  133. pyfdn-0.2.0/src/pyFDN/resources/presets/colorless_FDN/param_N6_d2.mat +0 -0
  134. pyfdn-0.2.0/src/pyFDN/resources/presets/colorless_FDN/param_N8_d1.mat +0 -0
  135. pyfdn-0.2.0/src/pyFDN/resources/presets/colorless_FDN/param_N8_d2.mat +0 -0
  136. pyfdn-0.2.0/src/pyFDN/resources/presets/colorless_FDN/param_init_N16_d1.mat +0 -0
  137. pyfdn-0.2.0/src/pyFDN/resources/presets/colorless_FDN/param_init_N16_d2.mat +0 -0
  138. pyfdn-0.2.0/src/pyFDN/resources/presets/colorless_FDN/param_init_N4_d1.mat +0 -0
  139. pyfdn-0.2.0/src/pyFDN/resources/presets/colorless_FDN/param_init_N4_d2.mat +0 -0
  140. pyfdn-0.2.0/src/pyFDN/resources/presets/colorless_FDN/param_init_N6_d1.mat +0 -0
  141. pyfdn-0.2.0/src/pyFDN/resources/presets/colorless_FDN/param_init_N6_d2.mat +0 -0
  142. pyfdn-0.2.0/src/pyFDN/resources/presets/colorless_FDN/param_init_N8_d1.mat +0 -0
  143. pyfdn-0.2.0/src/pyFDN/resources/presets/colorless_FDN/param_init_N8_d2.mat +0 -0
  144. pyfdn-0.2.0/tests/test_audio_gallery.py +0 -17
  145. pyfdn-0.2.0/tests/test_example_gallery.py +0 -29
  146. {pyfdn-0.2.0 → pyfdn-0.3.0}/LICENSE +0 -0
  147. {pyfdn-0.2.0 → pyfdn-0.3.0}/MANIFEST.in +0 -0
  148. {pyfdn-0.2.0 → pyfdn-0.3.0}/docs/__init__.py +0 -0
  149. {pyfdn-0.2.0 → pyfdn-0.3.0}/docs/authors.rst +0 -0
  150. {pyfdn-0.2.0 → pyfdn-0.3.0}/docs/contributing.rst +0 -0
  151. {pyfdn-0.2.0 → pyfdn-0.3.0}/docs/history.rst +0 -0
  152. {pyfdn-0.2.0 → pyfdn-0.3.0}/docs/index.rst +0 -0
  153. {pyfdn-0.2.0 → pyfdn-0.3.0}/docs/installation.rst +0 -0
  154. {pyfdn-0.2.0 → pyfdn-0.3.0}/docs/logo/logo_pyFDN_3.png +0 -0
  155. {pyfdn-0.2.0 → pyfdn-0.3.0}/docs/logo/logo_pyFDN_4.png +0 -0
  156. {pyfdn-0.2.0 → pyfdn-0.3.0}/docs/logo/pyfdn_logo_basic.png +0 -0
  157. {pyfdn-0.2.0 → pyfdn-0.3.0}/docs/logo/pyfdn_logo_wave.png +0 -0
  158. {pyfdn-0.2.0 → pyfdn-0.3.0}/docs/make.bat +0 -0
  159. {pyfdn-0.2.0 → pyfdn-0.3.0}/docs/readme.rst +0 -0
  160. {pyfdn-0.2.0 → pyfdn-0.3.0}/docs/references.py +0 -0
  161. {pyfdn-0.2.0 → pyfdn-0.3.0}/setup.cfg +0 -0
  162. {pyfdn-0.2.0 → pyfdn-0.3.0}/setup.py +0 -0
  163. {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/auxiliary/__init__.py +0 -0
  164. {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/auxiliary/acoustics.py +0 -0
  165. {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/auxiliary/allpass.py +0 -0
  166. {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/auxiliary/audio.py +0 -0
  167. {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/auxiliary/coupled_rooms.py +0 -0
  168. {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/auxiliary/delay.py +0 -0
  169. {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/auxiliary/flamo.py +0 -0
  170. {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/auxiliary/flamo_graph.py +0 -0
  171. {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/auxiliary/marimo_utils.py +0 -0
  172. {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/auxiliary/math.py +0 -0
  173. {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/auxiliary/poles.py +0 -0
  174. {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/auxiliary/tiny_rotation_matrix.py +0 -0
  175. {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/auxiliary/utils.py +0 -0
  176. {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/generate/SDN.py +0 -0
  177. {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/generate/allpass_FDN/__init__.py +0 -0
  178. {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/generate/allpass_FDN/rand_admissible_homogeneous_allpass.py +0 -0
  179. {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/generate/allpass_in_fdn.py +0 -0
  180. {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/generate/anderson_matrix.py +0 -0
  181. {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/generate/complete_orthogonal.py +0 -0
  182. {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/generate/construct_cascaded_paraunitary_matrix.py +0 -0
  183. {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/generate/construct_paraunitary_from_elementals.py +0 -0
  184. {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/generate/construct_velvet_feedback_matrix.py +0 -0
  185. {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/generate/degree_one_lossless.py +0 -0
  186. {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/generate/fdn_matrix_gallery.py +0 -0
  187. {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/generate/householder_matrix.py +0 -0
  188. {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/generate/is_almost_zero.py +0 -0
  189. {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/generate/nearest_orthogonal.py +0 -0
  190. {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/generate/nearest_sign_agnostic_orthogonal.py +0 -0
  191. {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/generate/random_matrix_shift.py +0 -0
  192. {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/generate/random_orthogonal.py +0 -0
  193. {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/generate/sample_delay_lengths.py +0 -0
  194. {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/generate/schroeder_reverberator.py +0 -0
  195. {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/generate/shift_matrix.py +0 -0
  196. {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/generate/shift_matrix_distribute.py +0 -0
  197. {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/graphicEQ/__init__.py +0 -0
  198. {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/graphicEQ/absorption_geq.py +0 -0
  199. {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/graphicEQ/bandpass_filter.py +0 -0
  200. {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/graphicEQ/design_geq.py +0 -0
  201. {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/graphicEQ/graphic_eq.py +0 -0
  202. {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/graphicEQ/probe_sos.py +0 -0
  203. {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/graphicEQ/shelving_filter.py +0 -0
  204. {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/references.py +0 -0
  205. {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/resources/__init__.py +0 -0
  206. {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/resources/audio/drums/drums.wav +0 -0
  207. {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/resources/audio/general/synth_dry.wav +0 -0
  208. {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/resources/audio/metadata.json +0 -0
  209. {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/resources/audio/rir/s3_r4_o.wav +0 -0
  210. {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/resources/audio/speech/P1_Set1_8.wav +0 -0
  211. {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/resources/audio/speech/P20_Set1_8.wav +0 -0
  212. {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/resources/audio/strings/Kleiderschrank_Taylor_DI.wav +0 -0
  213. {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/resources/audio/strings/Sommerhit2016_Taylor_DI.wav +0 -0
  214. {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/resources/licenses/diff-fdn-colorless-MIT.txt +0 -0
  215. {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/train/__init__.py +0 -0
  216. {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/train/engine.py +0 -0
  217. {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/translate/dss_to_flamo.py +0 -0
  218. {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/translate/dss_to_pr.py +0 -0
  219. {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/translate/dss_to_ss.py +0 -0
  220. {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/translate/dss_to_tf.py +0 -0
  221. {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/translate/flamo_to_pr.py +0 -0
  222. {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/translate/impz_to_res.py +0 -0
  223. {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/translate/mtf_to_impz.py +0 -0
  224. {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN/translate/pr_to_impz.py +0 -0
  225. {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN.egg-info/dependency_links.txt +0 -0
  226. {pyfdn-0.2.0 → pyfdn-0.3.0}/src/pyFDN.egg-info/top_level.txt +0 -0
  227. {pyfdn-0.2.0 → pyfdn-0.3.0}/tests/__init__.py +0 -0
  228. {pyfdn-0.2.0 → pyfdn-0.3.0}/tests/conftest.py +0 -0
  229. {pyfdn-0.2.0 → pyfdn-0.3.0}/tests/matloader.py +0 -0
  230. {pyfdn-0.2.0 → pyfdn-0.3.0}/tests/reference/README.md +0 -0
  231. {pyfdn-0.2.0 → pyfdn-0.3.0}/tests/reference/example_onePoleAbsorption.mat +0 -0
  232. {pyfdn-0.2.0 → pyfdn-0.3.0}/tests/reference/onePoleAbsorption_reference.mat +0 -0
  233. {pyfdn-0.2.0 → pyfdn-0.3.0}/tests/test_auxiliary_acoustics.py +0 -0
  234. {pyfdn-0.2.0 → pyfdn-0.3.0}/tests/test_auxiliary_delay.py +0 -0
  235. {pyfdn-0.2.0 → pyfdn-0.3.0}/tests/test_auxiliary_flamo.py +0 -0
  236. {pyfdn-0.2.0 → pyfdn-0.3.0}/tests/test_auxiliary_math.py +0 -0
  237. {pyfdn-0.2.0 → pyfdn-0.3.0}/tests/test_auxiliary_plot.py +0 -0
  238. {pyfdn-0.2.0 → pyfdn-0.3.0}/tests/test_auxiliary_utils.py +0 -0
  239. {pyfdn-0.2.0 → pyfdn-0.3.0}/tests/test_coupled_rooms.py +0 -0
  240. {pyfdn-0.2.0 → pyfdn-0.3.0}/tests/test_dss_to_pr.py +0 -0
  241. {pyfdn-0.2.0 → pyfdn-0.3.0}/tests/test_flamo_graph.py +0 -0
  242. {pyfdn-0.2.0 → pyfdn-0.3.0}/tests/test_flamo_one_pole_absorption.py +0 -0
  243. {pyfdn-0.2.0 → pyfdn-0.3.0}/tests/test_flamo_to_pr.py +0 -0
  244. {pyfdn-0.2.0 → pyfdn-0.3.0}/tests/test_graphic_eq.py +0 -0
  245. {pyfdn-0.2.0 → pyfdn-0.3.0}/tests/test_marimo_examples_run.py +0 -0
  246. {pyfdn-0.2.0 → pyfdn-0.3.0}/tests/test_pyFDN.py +0 -0
  247. {pyfdn-0.2.0 → pyfdn-0.3.0}/tests/test_sdn.py +0 -0
  248. {pyfdn-0.2.0 → pyfdn-0.3.0}/tests/test_train.py +0 -0
  249. {pyfdn-0.2.0 → pyfdn-0.3.0}/tests/test_translate.py +0 -0
@@ -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
- .. note::
141
- This section will be filled out later with the goal structure of the repository.
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
@@ -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.2.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.11
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
- DSP Components
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.FeedbackDelay
125
- pyFDN.FIRMatrixFilter
126
- pyFDN.SOSFilterBank
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
- marimo_click_to_load = "overlay" # Use overlay mode for better performance
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 _title_and_description(path: Path) -> tuple[str, str]:
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 index, line in enumerate(lines):
67
+ for line in lines:
68
68
  if not line.startswith("# "):
69
69
  continue
70
70
  title = _plain_text(line[2:])
71
- paragraphs = "\n".join(lines[index + 1 :]).strip().split("\n\n")
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, "Open the rendered marimo notebook."
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 _required_category(path: Path) -> str:
97
- metadata = _metadata(path)
98
- category = metadata.get("category")
99
- if category:
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 '# gallery_category: ...' tag")
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
- title, description = _title_and_description(path)
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
- _required_category(path),
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.2.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.11",
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/*.mat",
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.2.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.2.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
- # dsp components
304
- from .dsp.dfilt_matrix import FIRMatrixFilter
305
- from .dsp.feedback_delay import FeedbackDelay
306
- from .dsp.sos_filter_bank import SOSFilterBank
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.dsp.sos_filter_bank import SOSFilterBank
549
+ from pyFDN.td.operators import SOSBank
550
550
 
551
551
  N = delays_arr.size
552
- sos_bank = SOSFilterBank(sos, N).sos # (N, n_sections, 6)
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.dsp.SOSFilterBank`: ``(n_sections, 6, N)``.
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.dsp.SOSFilterBank`: ``(n_sections, 6, N)``.
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