pyFDN 0.1.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 (183) hide show
  1. pyfdn-0.1.0/AUTHORS.rst +11 -0
  2. pyfdn-0.1.0/CONTRIBUTING.rst +207 -0
  3. pyfdn-0.1.0/HISTORY.rst +8 -0
  4. pyfdn-0.1.0/LICENSE +22 -0
  5. pyfdn-0.1.0/MANIFEST.in +11 -0
  6. pyfdn-0.1.0/PKG-INFO +158 -0
  7. pyfdn-0.1.0/README.rst +98 -0
  8. pyfdn-0.1.0/docs/Makefile +20 -0
  9. pyfdn-0.1.0/docs/api_reference.rst +265 -0
  10. pyfdn-0.1.0/docs/authors.rst +1 -0
  11. pyfdn-0.1.0/docs/conf.py +198 -0
  12. pyfdn-0.1.0/docs/contributing.rst +1 -0
  13. pyfdn-0.1.0/docs/examples_gallery.rst +131 -0
  14. pyfdn-0.1.0/docs/generated/pyFDN.DFiltMatrix.rst +23 -0
  15. pyfdn-0.1.0/docs/generated/pyFDN.FeedbackDelay.rst +25 -0
  16. pyfdn-0.1.0/docs/generated/pyFDN.FilterMatrix.rst +36 -0
  17. pyfdn-0.1.0/docs/generated/pyFDN.TFMatrix.rst +25 -0
  18. pyfdn-0.1.0/docs/generated/pyFDN.ZFIR.rst +32 -0
  19. pyfdn-0.1.0/docs/generated/pyFDN.ZSOS.rst +32 -0
  20. pyfdn-0.1.0/docs/generated/pyFDN.ZScalar.rst +32 -0
  21. pyfdn-0.1.0/docs/generated/pyFDN.ZTF.rst +38 -0
  22. pyfdn-0.1.0/docs/generated/pyFDN.absorption_filters.rst +6 -0
  23. pyfdn-0.1.0/docs/generated/pyFDN.absorption_to_rt.rst +6 -0
  24. pyfdn-0.1.0/docs/generated/pyFDN.construct_cascaded_paraunitary_matrix.rst +6 -0
  25. pyfdn-0.1.0/docs/generated/pyFDN.construct_velvet_feedback_matrix.rst +6 -0
  26. pyfdn-0.1.0/docs/generated/pyFDN.db_to_lin.rst +6 -0
  27. pyfdn-0.1.0/docs/generated/pyFDN.db_to_sq.rst +6 -0
  28. pyfdn-0.1.0/docs/generated/pyFDN.det_polynomial.rst +6 -0
  29. pyfdn-0.1.0/docs/generated/pyFDN.dss_to_impz.rst +6 -0
  30. pyfdn-0.1.0/docs/generated/pyFDN.dss_to_ss.rst +6 -0
  31. pyfdn-0.1.0/docs/generated/pyFDN.echo_density.rst +6 -0
  32. pyfdn-0.1.0/docs/generated/pyFDN.edc.rst +6 -0
  33. pyfdn-0.1.0/docs/generated/pyFDN.ensure_3d.rst +6 -0
  34. pyfdn-0.1.0/docs/generated/pyFDN.hertz_to_unit.rst +6 -0
  35. pyfdn-0.1.0/docs/generated/pyFDN.interpolate_orthogonal.rst +6 -0
  36. pyfdn-0.1.0/docs/generated/pyFDN.is_almost_zero.rst +6 -0
  37. pyfdn-0.1.0/docs/generated/pyFDN.is_bounding_curve.rst +6 -0
  38. pyfdn-0.1.0/docs/generated/pyFDN.is_orthogonal.rst +6 -0
  39. pyfdn-0.1.0/docs/generated/pyFDN.last_nonzero_indices.rst +6 -0
  40. pyfdn-0.1.0/docs/generated/pyFDN.lin_to_db.rst +6 -0
  41. pyfdn-0.1.0/docs/generated/pyFDN.matrix_convolution.rst +6 -0
  42. pyfdn-0.1.0/docs/generated/pyFDN.matrix_delay_approximation.rst +6 -0
  43. pyfdn-0.1.0/docs/generated/pyFDN.matrix_polyder.rst +6 -0
  44. pyfdn-0.1.0/docs/generated/pyFDN.matrix_polyval.rst +6 -0
  45. pyfdn-0.1.0/docs/generated/pyFDN.matrix_sqrt.rst +6 -0
  46. pyfdn-0.1.0/docs/generated/pyFDN.mgrpdelay.rst +6 -0
  47. pyfdn-0.1.0/docs/generated/pyFDN.ms_to_smp.rst +6 -0
  48. pyfdn-0.1.0/docs/generated/pyFDN.mulaw_decode.rst +6 -0
  49. pyfdn-0.1.0/docs/generated/pyFDN.mulaw_encode.rst +6 -0
  50. pyfdn-0.1.0/docs/generated/pyFDN.negpolyder.rst +6 -0
  51. pyfdn-0.1.0/docs/generated/pyFDN.one_pole_absorption.rst +6 -0
  52. pyfdn-0.1.0/docs/generated/pyFDN.outer_sum_approximation.rst +6 -0
  53. pyfdn-0.1.0/docs/generated/pyFDN.peak_normalize.rst +6 -0
  54. pyfdn-0.1.0/docs/generated/pyFDN.plot_impulse_response_matrix.rst +6 -0
  55. pyfdn-0.1.0/docs/generated/pyFDN.plot_system_matrix.rst +6 -0
  56. pyfdn-0.1.0/docs/generated/pyFDN.pole_boundaries.rst +6 -0
  57. pyfdn-0.1.0/docs/generated/pyFDN.poly_degree.rst +6 -0
  58. pyfdn-0.1.0/docs/generated/pyFDN.polyder_rational.rst +6 -0
  59. pyfdn-0.1.0/docs/generated/pyFDN.polydiag.rst +6 -0
  60. pyfdn-0.1.0/docs/generated/pyFDN.process_fdn.rst +6 -0
  61. pyfdn-0.1.0/docs/generated/pyFDN.random_matrix_shift.rst +6 -0
  62. pyfdn-0.1.0/docs/generated/pyFDN.random_orthogonal.rst +6 -0
  63. pyfdn-0.1.0/docs/generated/pyFDN.rt_to_gain_per_sample.rst +6 -0
  64. pyfdn-0.1.0/docs/generated/pyFDN.rt_to_slope.rst +6 -0
  65. pyfdn-0.1.0/docs/generated/pyFDN.shift_matrix.rst +6 -0
  66. pyfdn-0.1.0/docs/generated/pyFDN.shift_matrix_distribute.rst +6 -0
  67. pyfdn-0.1.0/docs/generated/pyFDN.skew.rst +6 -0
  68. pyfdn-0.1.0/docs/generated/pyFDN.slope_to_rt.rst +6 -0
  69. pyfdn-0.1.0/docs/generated/pyFDN.sq_to_db.rst +6 -0
  70. pyfdn-0.1.0/docs/generated/pyFDN.tiny_rotation_matrix.rst +6 -0
  71. pyfdn-0.1.0/docs/history.rst +1 -0
  72. pyfdn-0.1.0/docs/index.rst +58 -0
  73. pyfdn-0.1.0/docs/installation.rst +51 -0
  74. pyfdn-0.1.0/docs/logo/logo_pyFDN_3.png +0 -0
  75. pyfdn-0.1.0/docs/logo/logo_pyFDN_4.png +0 -0
  76. pyfdn-0.1.0/docs/logo/pyfdn_logo_basic.png +0 -0
  77. pyfdn-0.1.0/docs/logo/pyfdn_logo_wave.png +0 -0
  78. pyfdn-0.1.0/docs/make.bat +36 -0
  79. pyfdn-0.1.0/docs/readme.rst +7 -0
  80. pyfdn-0.1.0/docs/usage.rst +17 -0
  81. pyfdn-0.1.0/pyproject.toml +223 -0
  82. pyfdn-0.1.0/setup.cfg +4 -0
  83. pyfdn-0.1.0/setup.py +7 -0
  84. pyfdn-0.1.0/src/pyFDN/__init__.py +380 -0
  85. pyfdn-0.1.0/src/pyFDN/audio/example_process_fdn_output.wav +0 -0
  86. pyfdn-0.1.0/src/pyFDN/audio/s3_r4_o.wav +0 -0
  87. pyfdn-0.1.0/src/pyFDN/audio/synth_dry.wav +0 -0
  88. pyfdn-0.1.0/src/pyFDN/auxiliary/__init__.py +59 -0
  89. pyfdn-0.1.0/src/pyFDN/auxiliary/acoustics.py +545 -0
  90. pyfdn-0.1.0/src/pyFDN/auxiliary/allpass.py +311 -0
  91. pyfdn-0.1.0/src/pyFDN/auxiliary/audio.py +54 -0
  92. pyfdn-0.1.0/src/pyFDN/auxiliary/coupled_rooms.py +193 -0
  93. pyfdn-0.1.0/src/pyFDN/auxiliary/delay.py +132 -0
  94. pyfdn-0.1.0/src/pyFDN/auxiliary/flamo.py +648 -0
  95. pyfdn-0.1.0/src/pyFDN/auxiliary/flamo_graph.py +754 -0
  96. pyfdn-0.1.0/src/pyFDN/auxiliary/math.py +515 -0
  97. pyfdn-0.1.0/src/pyFDN/auxiliary/plot.py +1352 -0
  98. pyfdn-0.1.0/src/pyFDN/auxiliary/poles.py +104 -0
  99. pyfdn-0.1.0/src/pyFDN/auxiliary/tiny_rotation_matrix.py +109 -0
  100. pyfdn-0.1.0/src/pyFDN/auxiliary/utils.py +296 -0
  101. pyfdn-0.1.0/src/pyFDN/dsp/__init__.py +3 -0
  102. pyfdn-0.1.0/src/pyFDN/dsp/dfilt_matrix.py +53 -0
  103. pyfdn-0.1.0/src/pyFDN/dsp/feedback_delay.py +47 -0
  104. pyfdn-0.1.0/src/pyFDN/dsp/sos_filter_bank.py +57 -0
  105. pyfdn-0.1.0/src/pyFDN/dsp/time_varying_matrix.py +144 -0
  106. pyfdn-0.1.0/src/pyFDN/generate/SDN.py +718 -0
  107. pyfdn-0.1.0/src/pyFDN/generate/allpass_FDN/__init__.py +11 -0
  108. pyfdn-0.1.0/src/pyFDN/generate/allpass_FDN/allpass_completion.py +630 -0
  109. pyfdn-0.1.0/src/pyFDN/generate/allpass_FDN/homogeneous_allpass_fdn.py +116 -0
  110. pyfdn-0.1.0/src/pyFDN/generate/allpass_FDN/rand_admissible_homogeneous_allpass.py +57 -0
  111. pyfdn-0.1.0/src/pyFDN/generate/allpass_in_fdn.py +78 -0
  112. pyfdn-0.1.0/src/pyFDN/generate/anderson_matrix.py +46 -0
  113. pyfdn-0.1.0/src/pyFDN/generate/complete_orthogonal.py +56 -0
  114. pyfdn-0.1.0/src/pyFDN/generate/construct_cascaded_paraunitary_matrix.py +58 -0
  115. pyfdn-0.1.0/src/pyFDN/generate/construct_paraunitary_from_elementals.py +52 -0
  116. pyfdn-0.1.0/src/pyFDN/generate/construct_velvet_feedback_matrix.py +17 -0
  117. pyfdn-0.1.0/src/pyFDN/generate/degree_one_lossless.py +31 -0
  118. pyfdn-0.1.0/src/pyFDN/generate/fdn_matrix_gallery.py +560 -0
  119. pyfdn-0.1.0/src/pyFDN/generate/householder_matrix.py +24 -0
  120. pyfdn-0.1.0/src/pyFDN/generate/is_almost_zero.py +18 -0
  121. pyfdn-0.1.0/src/pyFDN/generate/nearest_orthogonal.py +24 -0
  122. pyfdn-0.1.0/src/pyFDN/generate/nearest_sign_agnostic_orthogonal.py +82 -0
  123. pyfdn-0.1.0/src/pyFDN/generate/random_matrix_shift.py +42 -0
  124. pyfdn-0.1.0/src/pyFDN/generate/random_orthogonal.py +10 -0
  125. pyfdn-0.1.0/src/pyFDN/generate/sample_delay_lengths.py +149 -0
  126. pyfdn-0.1.0/src/pyFDN/generate/schroeder_reverberator.py +85 -0
  127. pyfdn-0.1.0/src/pyFDN/generate/shift_matrix.py +45 -0
  128. pyfdn-0.1.0/src/pyFDN/generate/shift_matrix_distribute.py +24 -0
  129. pyfdn-0.1.0/src/pyFDN/graphicEQ/__init__.py +17 -0
  130. pyfdn-0.1.0/src/pyFDN/graphicEQ/absorption_geq.py +54 -0
  131. pyfdn-0.1.0/src/pyFDN/graphicEQ/bandpass_filter.py +34 -0
  132. pyfdn-0.1.0/src/pyFDN/graphicEQ/design_geq.py +73 -0
  133. pyfdn-0.1.0/src/pyFDN/graphicEQ/graphic_eq.py +74 -0
  134. pyfdn-0.1.0/src/pyFDN/graphicEQ/probe_sos.py +52 -0
  135. pyfdn-0.1.0/src/pyFDN/graphicEQ/shelving_filter.py +55 -0
  136. pyfdn-0.1.0/src/pyFDN/process.py +106 -0
  137. pyfdn-0.1.0/src/pyFDN/pyFDN.py +1 -0
  138. pyfdn-0.1.0/src/pyFDN/train/__init__.py +29 -0
  139. pyfdn-0.1.0/src/pyFDN/train/build.py +321 -0
  140. pyfdn-0.1.0/src/pyFDN/train/engine.py +186 -0
  141. pyfdn-0.1.0/src/pyFDN/train/objectives.py +207 -0
  142. pyfdn-0.1.0/src/pyFDN/translate/dss_to_flamo.py +215 -0
  143. pyfdn-0.1.0/src/pyFDN/translate/dss_to_impz.py +48 -0
  144. pyfdn-0.1.0/src/pyFDN/translate/dss_to_pr.py +222 -0
  145. pyfdn-0.1.0/src/pyFDN/translate/dss_to_ss.py +101 -0
  146. pyfdn-0.1.0/src/pyFDN/translate/dss_to_tf.py +92 -0
  147. pyfdn-0.1.0/src/pyFDN/translate/flamo_to_pr.py +893 -0
  148. pyfdn-0.1.0/src/pyFDN/translate/impz_to_res.py +53 -0
  149. pyfdn-0.1.0/src/pyFDN/translate/mtf_to_impz.py +51 -0
  150. pyfdn-0.1.0/src/pyFDN/translate/pr_to_impz.py +70 -0
  151. pyfdn-0.1.0/src/pyFDN.egg-info/PKG-INFO +158 -0
  152. pyfdn-0.1.0/src/pyFDN.egg-info/SOURCES.txt +181 -0
  153. pyfdn-0.1.0/src/pyFDN.egg-info/dependency_links.txt +1 -0
  154. pyfdn-0.1.0/src/pyFDN.egg-info/requires.txt +44 -0
  155. pyfdn-0.1.0/src/pyFDN.egg-info/top_level.txt +1 -0
  156. pyfdn-0.1.0/tests/__init__.py +1 -0
  157. pyfdn-0.1.0/tests/conftest.py +18 -0
  158. pyfdn-0.1.0/tests/matloader.py +384 -0
  159. pyfdn-0.1.0/tests/reference/README.md +28 -0
  160. pyfdn-0.1.0/tests/reference/example_onePoleAbsorption.mat +0 -0
  161. pyfdn-0.1.0/tests/reference/onePoleAbsorption_reference.mat +0 -0
  162. pyfdn-0.1.0/tests/test_api_reference.py +90 -0
  163. pyfdn-0.1.0/tests/test_auxiliary_acoustics.py +101 -0
  164. pyfdn-0.1.0/tests/test_auxiliary_delay.py +98 -0
  165. pyfdn-0.1.0/tests/test_auxiliary_flamo.py +133 -0
  166. pyfdn-0.1.0/tests/test_auxiliary_math.py +285 -0
  167. pyfdn-0.1.0/tests/test_auxiliary_plot.py +261 -0
  168. pyfdn-0.1.0/tests/test_auxiliary_utils.py +275 -0
  169. pyfdn-0.1.0/tests/test_coupled_rooms.py +229 -0
  170. pyfdn-0.1.0/tests/test_dss_to_pr.py +178 -0
  171. pyfdn-0.1.0/tests/test_example_gallery.py +35 -0
  172. pyfdn-0.1.0/tests/test_flamo_graph.py +44 -0
  173. pyfdn-0.1.0/tests/test_flamo_one_pole_absorption.py +191 -0
  174. pyfdn-0.1.0/tests/test_flamo_to_pr.py +138 -0
  175. pyfdn-0.1.0/tests/test_generate.py +465 -0
  176. pyfdn-0.1.0/tests/test_graphic_eq.py +129 -0
  177. pyfdn-0.1.0/tests/test_marimo_examples_run.py +46 -0
  178. pyfdn-0.1.0/tests/test_process_extensions.py +211 -0
  179. pyfdn-0.1.0/tests/test_pyFDN.py +23 -0
  180. pyfdn-0.1.0/tests/test_sdn.py +52 -0
  181. pyfdn-0.1.0/tests/test_time_varying_matrix.py +70 -0
  182. pyfdn-0.1.0/tests/test_train.py +256 -0
  183. pyfdn-0.1.0/tests/test_translate.py +150 -0
@@ -0,0 +1,11 @@
1
+ =======
2
+ Credits
3
+ =======
4
+
5
+
6
+ Core Contributors
7
+ -----------------
8
+
9
+ * Sebastian J. Schlecht
10
+ * Facundo Franchino
11
+ * Jeremy Bai
@@ -0,0 +1,207 @@
1
+ ============
2
+ Contributing
3
+ ============
4
+
5
+ Contributions are welcome! This guide covers how to report issues, request features, set up your development environment, and run tests.
6
+
7
+
8
+ Issues and Requests
9
+ -------------------
10
+
11
+ Report bugs or request features on the `GitHub issue tracker <https://github.com/artificial-audio/pyFDN/issues>`_.
12
+
13
+ Reporting Bugs
14
+ ^^^^^^^^^^^^^^
15
+
16
+ Please include:
17
+
18
+ * Operating system name and version
19
+ * Python version
20
+ * Detailed steps to reproduce
21
+ * Expected vs actual behavior
22
+
23
+ Requesting Features
24
+ ^^^^^^^^^^^^^^^^^^^
25
+
26
+ Please include:
27
+
28
+ * Clear description of the feature
29
+ * Use case and motivation
30
+ * Proposed implementation approach (if applicable)
31
+
32
+ Pull Requests
33
+ ^^^^^^^^^^^^^
34
+
35
+ * Include tests for new functionality
36
+ * Update documentation as needed
37
+ * Ensure all tests pass before submitting
38
+
39
+
40
+ Development Installation
41
+ ------------------------
42
+
43
+ 1. **Fork and clone the repository**:
44
+
45
+ .. code-block:: console
46
+
47
+ $ git clone git@github.com:your_name_here/pyFDN.git
48
+ $ cd pyFDN
49
+
50
+ 2. **Create a virtual environment**:
51
+
52
+ .. code-block:: console
53
+
54
+ $ python -m venv .venv
55
+ $ source .venv/bin/activate
56
+
57
+ 3. **Install pyFDN in editable mode with development dependencies**:
58
+
59
+ .. code-block:: console
60
+
61
+ $ pip install -e ".[dev]"
62
+
63
+ 4. **Install and activate pre-commit hooks**:
64
+
65
+ .. code-block:: console
66
+
67
+ $ pre-commit install
68
+
69
+ This installs git hooks that automatically run Ruff (lint + format) and mypy
70
+ on every commit. To run them manually on all files:
71
+
72
+ .. code-block:: console
73
+
74
+ $ pre-commit run --all-files
75
+
76
+ 5. **Install FLAMO locally** (required for development):
77
+
78
+ FLAMO is under active development alongside pyFDN. You are recommended to install it locally in editable mode:
79
+
80
+ .. code-block:: console
81
+
82
+ $ git clone <flamo-repository-url>
83
+ $ cd flamo
84
+ $ pip install -e .
85
+
86
+ Then return to the pyFDN directory. The local FLAMO installation will be used
87
+ by pyFDN during development and testing.
88
+
89
+ 6. **Verify installation**:
90
+
91
+ .. code-block:: console
92
+
93
+ $ pytest tests/ -v
94
+
95
+
96
+ Building the Documentation
97
+ --------------------------
98
+
99
+ 1. **Install docs dependencies** (if not already):
100
+
101
+ .. code-block:: console
102
+
103
+ $ pip install -e ".[docs]"
104
+
105
+ 2. **Install pandoc** (system dependency required by ``nbsphinx``):
106
+
107
+ .. code-block:: console
108
+
109
+ $ brew install pandoc # macOS
110
+ $ sudo apt install pandoc # Ubuntu / Debian
111
+
112
+ 3. **Build the HTML docs**:
113
+
114
+ .. code-block:: console
115
+
116
+ $ make docs
117
+
118
+ This runs ``sphinx-apidoc``, builds all pages (including executing the
119
+ example notebooks), and opens the result in your browser.
120
+
121
+ Alternatively, build only the HTML without opening a browser:
122
+
123
+ .. code-block:: console
124
+
125
+ $ cd docs
126
+ $ make html
127
+
128
+ 4. **Preview**: Open ``docs/_build/html/index.html`` in your browser.
129
+
130
+ .. note::
131
+
132
+ The example notebooks are executed at build time by ``nbsphinx``. The
133
+ first build may take a few minutes. Subsequent builds are faster because
134
+ Sphinx caches the executed notebooks.
135
+
136
+
137
+ Repository Index
138
+ ----------------
139
+
140
+ .. note::
141
+ This section will be filled out later with the goal structure of the repository.
142
+
143
+
144
+ Testing Pipeline
145
+ ----------------
146
+
147
+ **Configuration**
148
+
149
+ Tests are configured via ``pytest`` and ``tox.ini``. The test suite includes:
150
+
151
+ * Unit tests for individual functions
152
+ * Regression tests against MATLAB reference implementations
153
+ * Integration tests with FLAMO
154
+
155
+ **Running Tests**
156
+
157
+ Run all tests:
158
+
159
+ .. code-block:: console
160
+
161
+ $ pytest
162
+
163
+ Run specific test file:
164
+
165
+ .. code-block:: console
166
+
167
+ $ pytest tests/test_one_pole_absorption_regression.py
168
+
169
+ Run with coverage:
170
+
171
+ .. code-block:: console
172
+
173
+ $ pytest --cov=pyFDN --cov-report=html
174
+
175
+ Run tests across multiple Python versions (requires tox):
176
+
177
+ .. code-block:: console
178
+
179
+ $ tox
180
+
181
+ **Cross-Validation Example**
182
+
183
+ The regression test suite validates pyFDN outputs against MATLAB reference data.
184
+ Example: ``test_one_pole_absorption_regression.py`` compares Python-generated absorption filter coefficients and impulse responses with MATLAB FDN Toolbox results.
185
+
186
+ To run a specific cross-validation test:
187
+
188
+ .. code-block:: console
189
+
190
+ $ pytest tests/test_one_pole_absorption_regression.py::test_one_pole_absorption_coefficients -v
191
+
192
+ The test loads MATLAB reference data from ``tests/reference/``, generates equivalent Python outputs, and validates numerical agreement within specified tolerances.
193
+
194
+ **Test Structure**
195
+
196
+ * ``tests/conftest.py``: Shared fixtures (e.g., ``loadmat`` for loading MATLAB files)
197
+ * ``tests/reference/``: MATLAB reference data files (``.mat`` format)
198
+ * ``tests/test_*.py``: Test modules organized by functionality
199
+
200
+
201
+ Code of Conduct
202
+ ---------------
203
+
204
+ Please note that this project is released with a `Contributor Code of Conduct`_.
205
+ By participating in this project you agree to abide by its terms.
206
+
207
+ .. _`Contributor Code of Conduct`: CODE_OF_CONDUCT.rst
@@ -0,0 +1,8 @@
1
+ =======
2
+ History
3
+ =======
4
+
5
+ 0.1.0 (2025-07-02)
6
+ ------------------
7
+
8
+ * First release on PyPI.
pyfdn-0.1.0/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026, Artificial Audio Lab
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
22
+
@@ -0,0 +1,11 @@
1
+ include AUTHORS.rst
2
+ include CONTRIBUTING.rst
3
+ include HISTORY.rst
4
+ include LICENSE
5
+ include README.rst
6
+
7
+ recursive-include tests *
8
+ recursive-exclude * __pycache__
9
+ recursive-exclude * *.py[co]
10
+
11
+ recursive-include docs *.rst conf.py Makefile make.bat *.jpg *.png *.gif
pyfdn-0.1.0/PKG-INFO ADDED
@@ -0,0 +1,158 @@
1
+ Metadata-Version: 2.4
2
+ Name: pyFDN
3
+ Version: 0.1.0
4
+ Summary: Python library for Feedback Delay Networks
5
+ Author: Sebastian J. Schlecht, Facundo Franchino, Jeremy Bai
6
+ Maintainer: Facundo Franchino, Sebastian J. Schlecht
7
+ License-Expression: MIT
8
+ Project-URL: bugs, https://github.com/artificial-audio/pyFDN/issues
9
+ Project-URL: changelog, https://github.com/artificial-audio/pyFDN/releases
10
+ Project-URL: homepage, https://github.com/artificial-audio/pyFDN
11
+ Classifier: Development Status :: 3 - Alpha
12
+ Classifier: Intended Audience :: Science/Research
13
+ Classifier: Programming Language :: Python :: 3
14
+ Classifier: Programming Language :: Python :: 3.10
15
+ Classifier: Programming Language :: Python :: 3.11
16
+ Requires-Python: >=3.10
17
+ Description-Content-Type: text/x-rst
18
+ License-File: LICENSE
19
+ Requires-Dist: numpy
20
+ Requires-Dist: soundfile
21
+ Requires-Dist: scipy
22
+ Requires-Dist: flamo>=0.2.14
23
+ Requires-Dist: flareverb
24
+ Requires-Dist: pyroomacoustics
25
+ Provides-Extra: examples
26
+ Requires-Dist: marimo; extra == "examples"
27
+ Requires-Dist: matplotlib>=3.5.0; extra == "examples"
28
+ Requires-Dist: plotly>=5.0.0; extra == "examples"
29
+ Provides-Extra: test
30
+ Requires-Dist: marimo; extra == "test"
31
+ Requires-Dist: matplotlib>=3.5.0; extra == "test"
32
+ Requires-Dist: plotly>=5.0.0; extra == "test"
33
+ Requires-Dist: pytest>=7.0.0; extra == "test"
34
+ Requires-Dist: pytest-cov>=4.0.0; extra == "test"
35
+ Requires-Dist: coverage>=7.0.0; extra == "test"
36
+ Provides-Extra: dev
37
+ Requires-Dist: pyFDN[test]; extra == "dev"
38
+ Requires-Dist: tox>=4.0.0; extra == "dev"
39
+ Requires-Dist: ruff>=0.1.0; extra == "dev"
40
+ Requires-Dist: mypy>=1.0.0; extra == "dev"
41
+ Requires-Dist: twine>=4.0.0; extra == "dev"
42
+ Requires-Dist: wheel>=0.40.0; extra == "dev"
43
+ Requires-Dist: build>=0.10.0; extra == "dev"
44
+ Requires-Dist: bump-my-version>=1.0.0; extra == "dev"
45
+ Requires-Dist: watchdog>=3.0.0; extra == "dev"
46
+ Requires-Dist: pre-commit>=3.0.0; extra == "dev"
47
+ Provides-Extra: docs
48
+ Requires-Dist: Sphinx>=6.0.0; extra == "docs"
49
+ Requires-Dist: pydata-sphinx-theme>=0.15.0; extra == "docs"
50
+ Requires-Dist: sphinx-autodoc-typehints>=1.0.0; extra == "docs"
51
+ Requires-Dist: sphinx-design>=0.5.0; extra == "docs"
52
+ Requires-Dist: sphinx-copybutton>=0.5.0; extra == "docs"
53
+ Requires-Dist: sphinx-marimo; extra == "docs"
54
+ Requires-Dist: nbsphinx>=0.9.0; extra == "docs"
55
+ Requires-Dist: ipykernel>=6.0.0; extra == "docs"
56
+ Requires-Dist: pandoc>=2.0; extra == "docs"
57
+ Requires-Dist: plotly>=5.0.0; extra == "docs"
58
+ Requires-Dist: matplotlib>=3.5.0; extra == "docs"
59
+ Dynamic: license-file
60
+
61
+ =====
62
+ pyFDN
63
+ =====
64
+
65
+ .. image:: docs/logo/logo_pyFDN_4.png
66
+ :alt: pyFDN
67
+ :align: center
68
+ :width: 300px
69
+
70
+ .. image:: https://img.shields.io/badge/python-3.10%20%7C%203.11-blue
71
+ :target: https://www.python.org/downloads/
72
+ :alt: Python versions
73
+
74
+ .. image:: https://img.shields.io/badge/license-MIT-blue.svg
75
+ :target: https://opensource.org/licenses/MIT
76
+ :alt: License
77
+
78
+ .. image:: https://img.shields.io/badge/coverage-68%25-brightgreen
79
+ :target: https://github.com/artificial-audio/pyFDN/actions/workflows/ci.yml
80
+ :alt: Test coverage
81
+
82
+ `Documentation <https://artificial-audio.github.io/pyFDN/>`_ |
83
+ `Examples <https://artificial-audio.github.io/pyFDN/examples_gallery.html>`_ |
84
+ `Report a bug <https://github.com/artificial-audio/pyFDN/issues>`_
85
+
86
+
87
+ Overview
88
+ --------
89
+
90
+ ``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.
91
+
92
+
93
+ Highlights
94
+ ----------
95
+
96
+ * Matrix polynomial helpers for evaluating, differentiating, and convolving FIR/IIR blocks.
97
+ * Loop analysis utilities including pole boundary estimation and curve bounding checks.
98
+ * Acoustic absorption design tools that translate RT targets into one-pole loop filters.
99
+ * Echo density (Abel & Huang 2006) for analysing reverberation and mixing time.
100
+ * Random orthogonal matrix generation to prototype energy-preserving feedback networks.
101
+
102
+
103
+ Installation
104
+ ------------
105
+
106
+ Install the current release from PyPI::
107
+
108
+ pip install pyFDN
109
+
110
+ For local development, create a virtual environment and install the package in
111
+ editable mode together with the optional tooling::
112
+
113
+ python -m venv .venv
114
+ source .venv/bin/activate
115
+ pip install -e .
116
+
117
+
118
+ Quick start
119
+ -----------
120
+
121
+ All main functions are accessible directly from the top-level ``pyFDN`` namespace::
122
+
123
+ import numpy as np
124
+ import pyFDN
125
+
126
+ fs = 48_000
127
+ delays = np.array([331, 347, 359, 373], dtype=int)
128
+
129
+ # energy-preserving feedback matrix
130
+ feedback = pyFDN.random_orthogonal(len(delays))
131
+
132
+ # one-pole absorption filters targeting RT of 1.2 s at DC and 0.9 s at Nyquist
133
+ absorption = pyFDN.one_pole_absorption(1.2, 0.9, delays, fs)
134
+
135
+ # convert delay state-space to standard state-space (A_ss, b, c, d)
136
+ A_ss, b, c, d = pyFDN.dss_to_ss(delays, feedback)
137
+
138
+ Alternatively, import specific functions directly::
139
+
140
+ from pyFDN import random_orthogonal, one_pole_absorption, lin_to_db
141
+
142
+ feedback = random_orthogonal(4)
143
+ absorption = one_pole_absorption(1.2, 0.9, [100, 150, 200, 250], 48_000)
144
+
145
+
146
+ Development
147
+ -----------
148
+
149
+ Run the test suite (the configuration mirrors CI and emits coverage details)::
150
+
151
+ tox -e py311
152
+
153
+ Or, inside an activated virtual environment::
154
+
155
+ pytest --cov=src/pyFDN --cov-report=term-missing
156
+
157
+ For linting and packaging helpers see ``Makefile`` (``make lint``/``make docs``)
158
+ and ``tox.ini`` for multi-environment testing.
pyfdn-0.1.0/README.rst ADDED
@@ -0,0 +1,98 @@
1
+ =====
2
+ pyFDN
3
+ =====
4
+
5
+ .. image:: docs/logo/logo_pyFDN_4.png
6
+ :alt: pyFDN
7
+ :align: center
8
+ :width: 300px
9
+
10
+ .. image:: https://img.shields.io/badge/python-3.10%20%7C%203.11-blue
11
+ :target: https://www.python.org/downloads/
12
+ :alt: Python versions
13
+
14
+ .. image:: https://img.shields.io/badge/license-MIT-blue.svg
15
+ :target: https://opensource.org/licenses/MIT
16
+ :alt: License
17
+
18
+ .. image:: https://img.shields.io/badge/coverage-68%25-brightgreen
19
+ :target: https://github.com/artificial-audio/pyFDN/actions/workflows/ci.yml
20
+ :alt: Test coverage
21
+
22
+ `Documentation <https://artificial-audio.github.io/pyFDN/>`_ |
23
+ `Examples <https://artificial-audio.github.io/pyFDN/examples_gallery.html>`_ |
24
+ `Report a bug <https://github.com/artificial-audio/pyFDN/issues>`_
25
+
26
+
27
+ Overview
28
+ --------
29
+
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
+
32
+
33
+ Highlights
34
+ ----------
35
+
36
+ * Matrix polynomial helpers for evaluating, differentiating, and convolving FIR/IIR blocks.
37
+ * Loop analysis utilities including pole boundary estimation and curve bounding checks.
38
+ * Acoustic absorption design tools that translate RT targets into one-pole loop filters.
39
+ * Echo density (Abel & Huang 2006) for analysing reverberation and mixing time.
40
+ * Random orthogonal matrix generation to prototype energy-preserving feedback networks.
41
+
42
+
43
+ Installation
44
+ ------------
45
+
46
+ Install the current release from PyPI::
47
+
48
+ pip install pyFDN
49
+
50
+ For local development, create a virtual environment and install the package in
51
+ editable mode together with the optional tooling::
52
+
53
+ python -m venv .venv
54
+ source .venv/bin/activate
55
+ pip install -e .
56
+
57
+
58
+ Quick start
59
+ -----------
60
+
61
+ All main functions are accessible directly from the top-level ``pyFDN`` namespace::
62
+
63
+ import numpy as np
64
+ import pyFDN
65
+
66
+ fs = 48_000
67
+ delays = np.array([331, 347, 359, 373], dtype=int)
68
+
69
+ # energy-preserving feedback matrix
70
+ feedback = pyFDN.random_orthogonal(len(delays))
71
+
72
+ # one-pole absorption filters targeting RT of 1.2 s at DC and 0.9 s at Nyquist
73
+ absorption = pyFDN.one_pole_absorption(1.2, 0.9, delays, fs)
74
+
75
+ # convert delay state-space to standard state-space (A_ss, b, c, d)
76
+ A_ss, b, c, d = pyFDN.dss_to_ss(delays, feedback)
77
+
78
+ Alternatively, import specific functions directly::
79
+
80
+ from pyFDN import random_orthogonal, one_pole_absorption, lin_to_db
81
+
82
+ feedback = random_orthogonal(4)
83
+ absorption = one_pole_absorption(1.2, 0.9, [100, 150, 200, 250], 48_000)
84
+
85
+
86
+ Development
87
+ -----------
88
+
89
+ Run the test suite (the configuration mirrors CI and emits coverage details)::
90
+
91
+ tox -e py311
92
+
93
+ Or, inside an activated virtual environment::
94
+
95
+ pytest --cov=src/pyFDN --cov-report=term-missing
96
+
97
+ For linting and packaging helpers see ``Makefile`` (``make lint``/``make docs``)
98
+ and ``tox.ini`` for multi-environment testing.
@@ -0,0 +1,20 @@
1
+ # Minimal makefile for Sphinx documentation
2
+ #
3
+
4
+ # You can set these variables from the command line.
5
+ SPHINXOPTS =
6
+ SPHINXBUILD = python -msphinx
7
+ SPHINXPROJ = pyFDN
8
+ SOURCEDIR = .
9
+ BUILDDIR = _build
10
+
11
+ # Put it first so that "make" without argument is like "make help".
12
+ help:
13
+ @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
14
+
15
+ .PHONY: help Makefile
16
+
17
+ # Catch-all target: route all unknown targets to Sphinx using the new
18
+ # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
19
+ %: Makefile
20
+ @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)