acoular 24.10__py3-none-any.whl → 25.3__py3-none-any.whl
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.
- acoular/__init__.py +5 -2
- acoular/aiaa/__init__.py +12 -0
- acoular/{tools → aiaa}/aiaa.py +23 -28
- acoular/base.py +75 -55
- acoular/calib.py +129 -34
- acoular/configuration.py +11 -9
- acoular/demo/__init__.py +1 -0
- acoular/demo/acoular_demo.py +31 -18
- acoular/deprecation.py +85 -0
- acoular/environments.py +481 -229
- acoular/fastFuncs.py +90 -84
- acoular/fbeamform.py +203 -411
- acoular/fprocess.py +233 -123
- acoular/grids.py +793 -424
- acoular/h5cache.py +29 -40
- acoular/h5files.py +2 -6
- acoular/microphones.py +197 -74
- acoular/process.py +660 -149
- acoular/sdinput.py +23 -20
- acoular/signals.py +461 -159
- acoular/sources.py +1311 -489
- acoular/spectra.py +328 -352
- acoular/tbeamform.py +79 -202
- acoular/tfastfuncs.py +21 -21
- acoular/tools/__init__.py +2 -8
- acoular/tools/helpers.py +216 -2
- acoular/tools/metrics.py +4 -4
- acoular/tools/utils.py +106 -200
- acoular/tprocess.py +348 -309
- acoular/traitsviews.py +10 -10
- acoular/trajectory.py +126 -53
- acoular/version.py +2 -2
- {acoular-24.10.dist-info → acoular-25.3.dist-info}/METADATA +39 -17
- acoular-25.3.dist-info/RECORD +56 -0
- {acoular-24.10.dist-info → acoular-25.3.dist-info}/WHEEL +1 -1
- acoular-24.10.dist-info/RECORD +0 -54
- {acoular-24.10.dist-info → acoular-25.3.dist-info}/licenses/AUTHORS.rst +0 -0
- {acoular-24.10.dist-info → acoular-25.3.dist-info}/licenses/LICENSE +0 -0
acoular/traitsviews.py
CHANGED
|
@@ -39,7 +39,7 @@ MicGeom.class_trait_view(
|
|
|
39
39
|
'traits_view',
|
|
40
40
|
View(
|
|
41
41
|
[
|
|
42
|
-
'
|
|
42
|
+
'file',
|
|
43
43
|
'num_mics~',
|
|
44
44
|
'|[Microphone geometry]',
|
|
45
45
|
],
|
|
@@ -70,7 +70,7 @@ Calib.class_trait_view(
|
|
|
70
70
|
'traits_view',
|
|
71
71
|
View(
|
|
72
72
|
[
|
|
73
|
-
'
|
|
73
|
+
'file{File name}',
|
|
74
74
|
[
|
|
75
75
|
'num_mics~{Number of microphones}',
|
|
76
76
|
'|[Properties]',
|
|
@@ -307,8 +307,8 @@ TimeSamples.class_trait_view(
|
|
|
307
307
|
'name{File name}',
|
|
308
308
|
[
|
|
309
309
|
'sample_freq~{Sampling frequency}',
|
|
310
|
-
'
|
|
311
|
-
'
|
|
310
|
+
'num_channels~{Number of channels}',
|
|
311
|
+
'num_samples~{Number of samples}',
|
|
312
312
|
'|[Properties]',
|
|
313
313
|
],
|
|
314
314
|
'|',
|
|
@@ -327,8 +327,8 @@ MaskedTimeSamples.class_trait_view(
|
|
|
327
327
|
'invalid_channels{Invalid channels}',
|
|
328
328
|
[
|
|
329
329
|
'sample_freq~{Sampling frequency}',
|
|
330
|
-
'
|
|
331
|
-
'
|
|
330
|
+
'num_channels~{Number of channels}',
|
|
331
|
+
'num_samples~{Number of samples}',
|
|
332
332
|
'|[Properties]',
|
|
333
333
|
],
|
|
334
334
|
'|',
|
|
@@ -441,7 +441,7 @@ BeamformerDamasPlus.class_trait_view(
|
|
|
441
441
|
[
|
|
442
442
|
[Item('beamformer{}', style='custom')],
|
|
443
443
|
[Item('method{Solver}')],
|
|
444
|
-
[Item('
|
|
444
|
+
[Item('n_iter{Max. number of iterations}')],
|
|
445
445
|
[Item('alpha', label='Lasso weight factor')],
|
|
446
446
|
[Item('calcmode{How to calculate PSF}')],
|
|
447
447
|
'|',
|
|
@@ -473,7 +473,7 @@ BeamformerCleansc.class_trait_view(
|
|
|
473
473
|
[
|
|
474
474
|
# [Item('mpos{}', style='custom')],
|
|
475
475
|
# [Item('grid', style='custom'), '-<>'],
|
|
476
|
-
[Item('
|
|
476
|
+
[Item('n_iter', label='No. of iterations', style='simple')],
|
|
477
477
|
[Item('r_diag', label='Diagonal removed')],
|
|
478
478
|
# [Item('env{}', style='custom')],
|
|
479
479
|
'|',
|
|
@@ -505,7 +505,7 @@ BeamformerCMF.class_trait_view(
|
|
|
505
505
|
# [Item('mpos{}', style='custom')],
|
|
506
506
|
# [Item('grid', style='custom'), '-<>'],
|
|
507
507
|
[Item('method', label='Fit method')],
|
|
508
|
-
[Item('
|
|
508
|
+
[Item('n_iter', label='(Max.) no. of iterations')],
|
|
509
509
|
[Item('alpha', label='Lasso weight factor')],
|
|
510
510
|
[Item('c', label='Speed of sound')],
|
|
511
511
|
# [Item('env{}', style='custom')],
|
|
@@ -523,7 +523,7 @@ BeamformerGIB.class_trait_view(
|
|
|
523
523
|
# [Item('mpos{}', style='custom')],
|
|
524
524
|
# [Item('grid', style='custom'), '-<>'],
|
|
525
525
|
[Item('method', label='Fit method')],
|
|
526
|
-
[Item('
|
|
526
|
+
[Item('n_iter', label='(Max.) no. of iterations')],
|
|
527
527
|
[Item('alpha', label='Lasso weight factor')],
|
|
528
528
|
[Item('c', label='Speed of sound')],
|
|
529
529
|
# [Item('env{}', style='custom')],
|
acoular/trajectory.py
CHANGED
|
@@ -12,50 +12,98 @@
|
|
|
12
12
|
# imports from other packages
|
|
13
13
|
from numpy import arange, array, r_, sort
|
|
14
14
|
from scipy.interpolate import splev, splprep
|
|
15
|
-
from traits.api import Dict, Float,
|
|
15
|
+
from traits.api import Dict, Float, HasStrictTraits, Property, Tuple, cached_property, property_depends_on
|
|
16
16
|
|
|
17
17
|
# acoular imports
|
|
18
18
|
from .internal import digest
|
|
19
19
|
|
|
20
20
|
|
|
21
|
-
class Trajectory(
|
|
22
|
-
"""Describes a trajectory from sampled points.
|
|
23
|
-
|
|
24
|
-
Based on a discrete number of points in space and time, a
|
|
25
|
-
continuous trajectory is calculated using spline interpolation
|
|
26
|
-
of positions between samples.
|
|
21
|
+
class Trajectory(HasStrictTraits):
|
|
27
22
|
"""
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
23
|
+
Represents a trajectory as a continuous curve derived from sampled points.
|
|
24
|
+
|
|
25
|
+
The :class:`Trajectory` class computes a smooth, continuous path through a set of discrete
|
|
26
|
+
points in space and time using spline interpolation. It also supports evaluating the trajectory
|
|
27
|
+
and its derivatives at arbitrary time instants.
|
|
28
|
+
|
|
29
|
+
It can be used to:
|
|
30
|
+
- define the traveling path of a moving sound source, e.g. for microphone array data
|
|
31
|
+
simulation (see :class:`~acoular.sources.MovingPointSource`)
|
|
32
|
+
- move a source grid along a certain path to create a fixed focus
|
|
33
|
+
(see :class:`~acoular.tbeamform.BeamformerTimeTraj`
|
|
34
|
+
and :class:`~acoular.tbeamform.BeamformerCleantTraj`)
|
|
35
|
+
|
|
36
|
+
Exemplary use can also be seen in the
|
|
37
|
+
:ref:`rotating point source example<rotating_point_source>`.
|
|
38
|
+
|
|
39
|
+
See Also
|
|
40
|
+
--------
|
|
41
|
+
:class:`~acoular.sources.MovingPointSource` : Model a point source moving along a trajectory.
|
|
42
|
+
:class:`~acoular.sources.MovingPointSourceDipole` :
|
|
43
|
+
Model a point source dipole moving along a trajectory.
|
|
44
|
+
:class:`~acoular.sources.MovingLineSource` : Model a line source moving along a trajectory.
|
|
45
|
+
:class:`~acoular.tbeamform.BeamformerCleantTraj` :
|
|
46
|
+
Beamformer implementing the CLEAN method :cite:`Kujawski2020` in time domain
|
|
47
|
+
for moving sources with known trajectory.
|
|
48
|
+
:class:`~acoular.tbeamform.BeamformerTimeTraj` :
|
|
49
|
+
Basic time domain beamformer with time signal output for a grid moving along a trajectory.
|
|
50
|
+
:func:`scipy.interpolate.splprep` : Underlying spline generation function.
|
|
51
|
+
:func:`scipy.interpolate.splev` : Used for evaluating the spline.
|
|
52
|
+
|
|
53
|
+
Notes
|
|
54
|
+
-----
|
|
55
|
+
- Spline interpolation provides a smooth trajectory that passes through all sampled points.
|
|
56
|
+
The interpolation order is adjusted automatically based on the number of points.
|
|
57
|
+
- The trajectory can be used in simulations where a source's motion must be modeled
|
|
58
|
+
continuously.
|
|
59
|
+
|
|
60
|
+
Examples
|
|
61
|
+
--------
|
|
62
|
+
Create a trajectory and evaluate positions and velocities:
|
|
63
|
+
|
|
64
|
+
>>> from acoular import Trajectory
|
|
65
|
+
>>> points = {0.0: (0.0, 0.0, 0.0), 1.0: (1.0, 0.0, 0.0), 2.0: (2.0, 1.0, 0.0)}
|
|
66
|
+
>>> tr = Trajectory(points=points)
|
|
67
|
+
>>>
|
|
68
|
+
>>> tr.location(1.5) # Position at t=1.5
|
|
69
|
+
[array(1.5), array(0.375), array(0.)]
|
|
70
|
+
>>>
|
|
71
|
+
>>> for pos in tr.traj(0.0, 2.0, 0.5): # Positions every 0.5 seconds
|
|
72
|
+
... print(pos)
|
|
73
|
+
(np.float64(0.0), np.float64(0.0), np.float64(0.0))
|
|
74
|
+
(np.float64(0.5), np.float64(-0.125), np.float64(0.0))
|
|
75
|
+
(np.float64(1.0), np.float64(0.0), np.float64(0.0))
|
|
76
|
+
(np.float64(1.5), np.float64(0.375), np.float64(0.0))
|
|
77
|
+
""" # noqa W505
|
|
78
|
+
|
|
79
|
+
#: Dictionary mapping time instants (keys, as floats) to sampled ``(x, y, z)`` positions
|
|
80
|
+
#: (values, as tuples of floats) along the trajectory.
|
|
31
81
|
points = Dict(
|
|
32
82
|
key_trait=Float,
|
|
33
83
|
value_trait=Tuple(Float, Float, Float),
|
|
34
84
|
desc='sampled positions along the trajectory',
|
|
35
85
|
)
|
|
36
86
|
|
|
37
|
-
#:
|
|
38
|
-
#:
|
|
87
|
+
#: Automatically determined tuple ``(t_min, t_max)`` representing the start and end times of the
|
|
88
|
+
#: trajectory, based on the keys in :attr:`points`.
|
|
39
89
|
interval = Property()
|
|
40
90
|
# t_min, t_max tuple
|
|
41
91
|
|
|
42
|
-
#:
|
|
92
|
+
#: Internal representation of the spline, generated using :func:`scipy.interpolate.splprep`.
|
|
43
93
|
tck = Property()
|
|
44
94
|
|
|
45
|
-
|
|
46
|
-
digest = Property(
|
|
47
|
-
depends_on=['points[]'],
|
|
48
|
-
)
|
|
95
|
+
#: A unique identifier for the trajectory, based on its points. (read-only)
|
|
96
|
+
digest = Property(depends_on=['points[]'])
|
|
49
97
|
|
|
50
98
|
@cached_property
|
|
51
99
|
def _get_digest(self):
|
|
52
100
|
return digest(self)
|
|
53
101
|
|
|
54
|
-
@property_depends_on('points[]')
|
|
102
|
+
@property_depends_on(['points[]'])
|
|
55
103
|
def _get_interval(self):
|
|
56
104
|
return sort(list(self.points.keys()))[r_[0, -1]]
|
|
57
105
|
|
|
58
|
-
@property_depends_on('points[]')
|
|
106
|
+
@property_depends_on(['points[]'])
|
|
59
107
|
def _get_tck(self):
|
|
60
108
|
t = sort(list(self.points.keys()))
|
|
61
109
|
xp = array([self.points[i] for i in t]).T
|
|
@@ -64,61 +112,86 @@ class Trajectory(HasPrivateTraits):
|
|
|
64
112
|
return tcku[0]
|
|
65
113
|
|
|
66
114
|
def location(self, t, der=0):
|
|
67
|
-
"""
|
|
115
|
+
"""
|
|
116
|
+
Compute the trajectory's position or derivatives at specified times.
|
|
68
117
|
|
|
69
118
|
Parameters
|
|
70
119
|
----------
|
|
71
|
-
t : array of floats
|
|
72
|
-
|
|
73
|
-
der :
|
|
74
|
-
|
|
120
|
+
t : :class:`float` or array of :class:`floats<float>`
|
|
121
|
+
Time instant(s) at which to compute the position(s) or derivative(s).
|
|
122
|
+
der : :class:`int`, optional
|
|
123
|
+
Order of the derivative to compute:
|
|
124
|
+
- ``0`` for positions (default),
|
|
125
|
+
- ``1`` for velocities,
|
|
126
|
+
- ``2`` for accelerations, etc.
|
|
75
127
|
|
|
76
128
|
Returns
|
|
77
129
|
-------
|
|
78
|
-
|
|
79
|
-
|
|
130
|
+
:class:`numpy.ndarray`
|
|
131
|
+
``(x, y, z)`` arrays representing the trajectory's position (or derivative) at the given
|
|
132
|
+
time(s). The shape matches that of ``t``.
|
|
80
133
|
|
|
134
|
+
Examples
|
|
135
|
+
--------
|
|
136
|
+
>>> import acoular as ac
|
|
137
|
+
>>>
|
|
138
|
+
>>> points = {0.0: (0.0, 0.0, 0.0), 1.0: (1.0, 2.0, 0.0), 2.0: (2.0, 4.0, 0.0)}
|
|
139
|
+
>>> tr = ac.Trajectory(points=points)
|
|
140
|
+
>>> tr.location(1.0) # Position at t=1.0
|
|
141
|
+
[array(1.), array(2.), array(0.)]
|
|
142
|
+
>>> tr.location([0.5, 1.5], der=1) # Velocity at t=0.5 and t=1.5
|
|
143
|
+
[array([1., 1.]), array([2., 2.]), array([0., 0.])]
|
|
81
144
|
"""
|
|
82
145
|
return splev(t, self.tck, der)
|
|
83
146
|
|
|
84
147
|
def traj(self, t_start, t_end=None, delta_t=None, der=0):
|
|
85
|
-
"""
|
|
148
|
+
"""
|
|
149
|
+
Interate through trajectory positions or derivatives at specified intervals.
|
|
86
150
|
|
|
87
151
|
Parameters
|
|
88
152
|
----------
|
|
89
|
-
t_start : float
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
153
|
+
t_start : :class:`float`
|
|
154
|
+
Start time for the trajectory. Default is earliest key in :attr:`points`.
|
|
155
|
+
t_end : :class:`float`, optional
|
|
156
|
+
End time of the trajectory. Default is the latest key in :attr:`points`.
|
|
157
|
+
delta_t : :class:`float`, optional
|
|
158
|
+
Time interval between consecutive points to yield. Default is the value of ``t_start``.
|
|
159
|
+
der : int, optional
|
|
160
|
+
Order of the derivative to compute:
|
|
161
|
+
- ``0`` for positions (default),
|
|
162
|
+
- ``1`` for velocities,
|
|
163
|
+
- ``2`` for accelerations, etc.
|
|
164
|
+
|
|
165
|
+
Yields
|
|
166
|
+
------
|
|
167
|
+
:class:`tuple` of :class:`floats<float>`
|
|
168
|
+
``(x, y, z)`` positions or derivatives at the specified time intervals.
|
|
169
|
+
|
|
170
|
+
Notes
|
|
171
|
+
-----
|
|
172
|
+
The function precomputes all interpolated locations for efficiency and yields them
|
|
173
|
+
sequentially.
|
|
103
174
|
|
|
104
175
|
Examples
|
|
105
176
|
--------
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
177
|
+
Create a trajectory and iterate through the positions in the :attr:`interval`:
|
|
178
|
+
|
|
179
|
+
>>> import acoular as ac
|
|
180
|
+
>>>
|
|
181
|
+
>>> points = {0.0: (0.0, 0.0, 0.0), 1.0: (1.0, 0.0, 0.0), 2.0: (2.0, 1.0, 0.0)}
|
|
182
|
+
>>> tr = ac.Trajectory(points=points)
|
|
183
|
+
>>> for pos in tr.traj(0.0, 2.0, 0.5):
|
|
184
|
+
... print(pos)
|
|
185
|
+
(np.float64(0.0), np.float64(0.0), np.float64(0.0))
|
|
186
|
+
(np.float64(0.5), np.float64(-0.125), np.float64(0.0))
|
|
187
|
+
(np.float64(1.0), np.float64(0.0), np.float64(0.0))
|
|
188
|
+
(np.float64(1.5), np.float64(0.375), np.float64(0.0))
|
|
115
189
|
"""
|
|
116
190
|
if not delta_t:
|
|
117
191
|
delta_t = t_start
|
|
118
192
|
t_start, t_end = self.interval
|
|
119
193
|
if not t_end:
|
|
120
194
|
t_end = self.interval[1]
|
|
121
|
-
# all locations are fetched in one go because
|
|
122
|
-
#
|
|
123
|
-
# in blocks
|
|
195
|
+
# all locations are fetched in one go because that is much faster further improvement could
|
|
196
|
+
# be possible if interpolated locations are fetched in blocks
|
|
124
197
|
yield from zip(*self.location(arange(t_start, t_end, delta_t), der))
|
acoular/version.py
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: acoular
|
|
3
|
-
Version:
|
|
3
|
+
Version: 25.3
|
|
4
4
|
Summary: Python library for acoustic beamforming
|
|
5
5
|
Project-URL: homepage, https://acoular.org
|
|
6
6
|
Project-URL: documentation, https://acoular.org
|
|
@@ -45,8 +45,9 @@ Classifier: License :: OSI Approved :: BSD License
|
|
|
45
45
|
Classifier: Programming Language :: Python :: 3.10
|
|
46
46
|
Classifier: Programming Language :: Python :: 3.11
|
|
47
47
|
Classifier: Programming Language :: Python :: 3.12
|
|
48
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
48
49
|
Classifier: Topic :: Scientific/Engineering :: Physics
|
|
49
|
-
Requires-Python:
|
|
50
|
+
Requires-Python: <3.14,>=3.10
|
|
50
51
|
Requires-Dist: numba
|
|
51
52
|
Requires-Dist: numpy
|
|
52
53
|
Requires-Dist: scikit-learn
|
|
@@ -63,9 +64,14 @@ Requires-Dist: numpydoc; extra == 'dev'
|
|
|
63
64
|
Requires-Dist: pickleshare; extra == 'dev'
|
|
64
65
|
Requires-Dist: pylops; extra == 'dev'
|
|
65
66
|
Requires-Dist: pytest; extra == 'dev'
|
|
67
|
+
Requires-Dist: pytest-cases; extra == 'dev'
|
|
66
68
|
Requires-Dist: pytest-cov; extra == 'dev'
|
|
69
|
+
Requires-Dist: pytest-env; extra == 'dev'
|
|
70
|
+
Requires-Dist: pytest-mock; extra == 'dev'
|
|
71
|
+
Requires-Dist: pytest-profiling; extra == 'dev'
|
|
72
|
+
Requires-Dist: pytest-regtest; extra == 'dev'
|
|
67
73
|
Requires-Dist: pyyaml; extra == 'dev'
|
|
68
|
-
Requires-Dist: ruff==0.
|
|
74
|
+
Requires-Dist: ruff==0.8.1; extra == 'dev'
|
|
69
75
|
Requires-Dist: setuptools; extra == 'dev'
|
|
70
76
|
Requires-Dist: sounddevice; extra == 'dev'
|
|
71
77
|
Requires-Dist: sphinx; extra == 'dev'
|
|
@@ -89,8 +95,14 @@ Requires-Dist: pylops; extra == 'full'
|
|
|
89
95
|
Requires-Dist: sounddevice; extra == 'full'
|
|
90
96
|
Provides-Extra: tests
|
|
91
97
|
Requires-Dist: h5py; extra == 'tests'
|
|
98
|
+
Requires-Dist: pylops; extra == 'tests'
|
|
92
99
|
Requires-Dist: pytest; extra == 'tests'
|
|
100
|
+
Requires-Dist: pytest-cases; extra == 'tests'
|
|
93
101
|
Requires-Dist: pytest-cov; extra == 'tests'
|
|
102
|
+
Requires-Dist: pytest-env; extra == 'tests'
|
|
103
|
+
Requires-Dist: pytest-mock; extra == 'tests'
|
|
104
|
+
Requires-Dist: pytest-profiling; extra == 'tests'
|
|
105
|
+
Requires-Dist: pytest-regtest; extra == 'tests'
|
|
94
106
|
Requires-Dist: pyyaml; extra == 'tests'
|
|
95
107
|
Requires-Dist: sounddevice; extra == 'tests'
|
|
96
108
|
Requires-Dist: traitsui; extra == 'tests'
|
|
@@ -185,35 +197,45 @@ If you are interested in contributing, have a look at the [CONTRIBUTING.md](CONT
|
|
|
185
197
|
This reads data from 64 microphone channels and computes a beamforming map for the 8kHz third octave band:
|
|
186
198
|
|
|
187
199
|
```python
|
|
188
|
-
from
|
|
189
|
-
|
|
190
|
-
|
|
200
|
+
from pathlib import Path
|
|
201
|
+
|
|
202
|
+
import acoular as ac
|
|
203
|
+
import matplotlib.pylab as plt
|
|
191
204
|
|
|
192
205
|
# this file contains the microphone coordinates
|
|
193
|
-
micgeofile =
|
|
206
|
+
micgeofile = Path(ac.__file__).parent / 'xml' / 'array_64.xml'
|
|
194
207
|
# set up object managing the microphone coordinates
|
|
195
|
-
mg =
|
|
208
|
+
mg = ac.MicGeom( file=micgeofile )
|
|
209
|
+
# generate test data, in real life this would come from an array measurement
|
|
210
|
+
p = ac.demo.create_three_sources(mg, h5savefile='three_sources.h5')
|
|
196
211
|
# set up object managing the microphone array data (usually from measurement)
|
|
197
|
-
ts =
|
|
212
|
+
ts = ac.TimeSamples( file='three_sources.h5')
|
|
198
213
|
# set up object managing the cross spectral matrix computation
|
|
199
|
-
ps =
|
|
214
|
+
ps = ac.PowerSpectra( source=ts, block_size=128, window='Hanning' )
|
|
215
|
+
# alternatively, you can use the in-memory Mixer object directly:
|
|
216
|
+
# ps = ac.PowerSpectra( source=p, block_size=128, window='Hanning' )
|
|
200
217
|
# set up object managing the mapping grid
|
|
201
|
-
rg =
|
|
218
|
+
rg = ac.RectGrid( x_min=-0.2, x_max=0.2, y_min=-0.2, y_max=0.2, z=-0.3, \
|
|
202
219
|
increment=0.01 )
|
|
203
220
|
# set up steering vector, implicitely contains also the standard quiescent
|
|
204
221
|
# environment with standard speed of sound
|
|
205
|
-
st =
|
|
222
|
+
st = ac.SteeringVector( grid = rg, mics=mg )
|
|
206
223
|
# set up the object managing the delay & sum beamformer
|
|
207
|
-
bb =
|
|
224
|
+
bb = ac.BeamformerBase( freq_data=ps, steer=st )
|
|
208
225
|
# request the result in the 8kHz third octave band from approriate FFT-Lines
|
|
209
226
|
# this starts the actual computation (data intake, FFT, Welch CSM, beamforming)
|
|
210
227
|
pm = bb.synthetic( 8000, 3 )
|
|
211
228
|
# compute the sound pressure level
|
|
212
|
-
Lm =
|
|
229
|
+
Lm = ac.L_p( pm )
|
|
213
230
|
# plot the map
|
|
214
|
-
imshow( Lm.T, origin='lower', vmin=Lm.max()-10, extent=rg.extend(), \
|
|
231
|
+
plt.imshow( Lm.T, origin='lower', vmin=Lm.max()-10, extent=rg.extend(), \
|
|
215
232
|
interpolation='bicubic')
|
|
216
|
-
|
|
233
|
+
plt.title('Beamformer (base) for 3 sources measured for 8000 Hz')
|
|
234
|
+
plt.xlabel('x in m')
|
|
235
|
+
plt.ylabel('y in m')
|
|
236
|
+
plt.colorbar(label=r'$L_p$')
|
|
237
|
+
plt.savefig('three_sources.png', dpi=300, bbox_inches='tight')
|
|
238
|
+
plt.show()
|
|
217
239
|
```
|
|
218
240
|
|
|
219
241
|

|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
acoular/__init__.py,sha256=mbNHGVcWp6aSs9dZ22rEJGX11Kw4S8Mr_CELLsfOBNU,3284
|
|
2
|
+
acoular/base.py,sha256=gqFsfgSG1YrS-BAmV44ao6ckXo7v5B2VMX86QH3QowE,10717
|
|
3
|
+
acoular/calib.py,sha256=P46L1U8Lk0_BSY3AQz0KO4g8rsZmi47j3YaQOlHK64A,7133
|
|
4
|
+
acoular/configuration.py,sha256=QQU5HWjXEDMuMU3LEoaDnDszhqeJzCGhZ5oGbsW2qFY,8630
|
|
5
|
+
acoular/deprecation.py,sha256=lfmCRvwYu_tXSEk5HfYDmagPCVBL7082m3oq5kvxOZ8,3810
|
|
6
|
+
acoular/environments.py,sha256=tWRJSCzIa0eSBX2AGjrWciz12mq2nPzs0AAQc9yFGqk,35998
|
|
7
|
+
acoular/fastFuncs.py,sha256=6Iqm-xy2T7qBaYpdpgUquup6JkAwdURhSXfAEkgqVOs,37362
|
|
8
|
+
acoular/fbeamform.py,sha256=IY7RlM_7Yl8UjCgnDPVmAEmBASS83yGsefg6OAcWFCk,99057
|
|
9
|
+
acoular/fprocess.py,sha256=NK3Nt2jD0Dvq5kPLWvodFRGKd9oIpk6Rgy_U48R49Yg,20706
|
|
10
|
+
acoular/grids.py,sha256=Mcc9lmh5qXLfAxu5mpImPNkUuEcd2wEas74ovlarmuY,58981
|
|
11
|
+
acoular/h5cache.py,sha256=tHCJjHs26ZnRtPO6uj9PqJ2xMEEJup-A8FoiiojkkLw,4166
|
|
12
|
+
acoular/h5files.py,sha256=RKMBfbFX8d_d4JEnyMyHQQjN74EhW6W4CE-drmDZakY,7553
|
|
13
|
+
acoular/internal.py,sha256=qgluN_4Br7U74keTiavbmxRMkcNkoHcL1TihKTcMEBs,829
|
|
14
|
+
acoular/microphones.py,sha256=IrPDPB4v4mM2ONLkwODjgOVPTMZSSPoMAFXjAMp4QEw,10591
|
|
15
|
+
acoular/process.py,sha256=86wfR87RsSpYqa7ZmC4FtmEmp4zPDL0ICq8QdiTYLeI,41043
|
|
16
|
+
acoular/sdinput.py,sha256=93uQaO5Zt2DV83iyeoFMaPXww1rp0PP4HB6M-C2FDak,5109
|
|
17
|
+
acoular/signals.py,sha256=ue_KtTbrcMUzX_aUM8pqhm3jviNGeh32Nk-wXrCVw_g,24416
|
|
18
|
+
acoular/sources.py,sha256=7-XHQMeiE2D4NSxgbGpFDwZL08Xb92New6lsTxDwbfs,97225
|
|
19
|
+
acoular/spectra.py,sha256=oU5m124tlvlIaN3MbqZarHw9hO6hMowpg3WY6FFqRXo,28837
|
|
20
|
+
acoular/tbeamform.py,sha256=-CAvutAY4VK4cILq1GOu7oTjwNh_R0gjVCLjLmM-5U0,30857
|
|
21
|
+
acoular/tfastfuncs.py,sha256=q2ZbDoWmFbGMZw1TT_h-21hn24qGi2of_ZqJVoLMYhc,7901
|
|
22
|
+
acoular/tprocess.py,sha256=gm6lvIJogR0_S17StsXe4e_y2dssTLyaPH0mb-6ykN0,77502
|
|
23
|
+
acoular/traitsviews.py,sha256=VO-i509WAMQG7KuJatlCWeexZeTAFEjmjbNDkGSfzX4,13773
|
|
24
|
+
acoular/trajectory.py,sha256=cOawITHARdcsBwpHfBleosltDwU-31xtOlZ7clrcbvA,7910
|
|
25
|
+
acoular/version.py,sha256=G10HLGx_t9fD3x7HMmmPoYx8REcItCTTVwu8YXjN1MA,378
|
|
26
|
+
acoular/aiaa/__init__.py,sha256=5RhoERGQmLBf6uosr9hYHWy_MruKiyR5x-8cMRX4hT4,420
|
|
27
|
+
acoular/aiaa/aiaa.py,sha256=WvQFr7D37QhdUVgrBOifE76zX9FFe1eexumQd1_3_2M,6310
|
|
28
|
+
acoular/demo/__init__.py,sha256=fxf0-D7Pxepi0bmxPwCj3Yo-vgCC37faTLlPaotMkB0,380
|
|
29
|
+
acoular/demo/acoular_demo.py,sha256=HDANP1vA5OXBkuolpCeWRt8hr_jFKnu_sQRbCtbApPo,3513
|
|
30
|
+
acoular/tools/__init__.py,sha256=z8RHRQhcmqkUKwD8v3pInpAMN8csPcN5J4Z9QXu_GjQ,511
|
|
31
|
+
acoular/tools/helpers.py,sha256=L9Bi6WmGBiyF_Xz5L5wtIgk0tobd4FX8gG6mfGA8z2k,13468
|
|
32
|
+
acoular/tools/metrics.py,sha256=y6TsavywfnuMScBcFxIrcKcDuC55WfIGkNFnCuuuj3Y,6136
|
|
33
|
+
acoular/tools/utils.py,sha256=5KNj-hJNOLlU3oIGamqOK6bfSaPxNvjUMAh4fkyE1Nk,3192
|
|
34
|
+
acoular/xml/HW90D240_f10.xml,sha256=WvowIe8aYJaeHSExjwaY9fjpYukLxX6A-H7fD1PW2g8,5127
|
|
35
|
+
acoular/xml/W90_D105_f10.xml,sha256=f8NHPoOYjEnRsstYDa_4E65EBR5m5BVzlg87jpCgckA,5283
|
|
36
|
+
acoular/xml/acousticam_2c.xml,sha256=xcVlKQhGbRqMQHLKuTAyXTt3SM3aLZEAfGqbuFaWx4k,1993
|
|
37
|
+
acoular/xml/acousticam_4c.xml,sha256=P8wAP5_GT0HS40VV3f7_88xQXwTLN1YRxI7MudnwIqw,1949
|
|
38
|
+
acoular/xml/array38.xml,sha256=FrbC-1yVHNfWTamEJPiJhhdPtVYVfGbPXJ3TLljBKx0,2363
|
|
39
|
+
acoular/xml/array92x.xml,sha256=65Wf2xbA6Dt_k98C3q4MfTtwPzceT8B2vKvK77hO9Yc,5874
|
|
40
|
+
acoular/xml/array_56.xml,sha256=qe8CAcRP7-3MLpPn919XKHB8hMb9G5JUPFzP1qOA4IM,3428
|
|
41
|
+
acoular/xml/array_56_10_9.xml,sha256=2G-KZSwvAtIuxyC6JKW2Hv2IWXVFd4Sux1tLxizJ5Z4,4432
|
|
42
|
+
acoular/xml/array_56_bomb.xml,sha256=tAdhLzvUrhMh7DMrbXU7skAEAlCvQ6GLbJXAU7Z2JxE,4193
|
|
43
|
+
acoular/xml/array_56_v2.xml,sha256=x4OTI77Fttfaqu-Kl7uWmslg8rZAuw2Y-RUa21MqzXk,3458
|
|
44
|
+
acoular/xml/array_64.xml,sha256=1ZHuQEHhFhz9EhBcNbXkVT-9tnAr6T9cHH5Xb1gHL7Y,4039
|
|
45
|
+
acoular/xml/array_84_10_9.xml,sha256=jzvMYZlQqo8y6jt3yllGOL7vk8bxMVpISexkZL0uquA,6558
|
|
46
|
+
acoular/xml/array_84_bomb_v3.xml,sha256=Mv8nvqSOUezrdIjrCHZt4gZpJ-Z3BzF2wIYPawHZjlA,6248
|
|
47
|
+
acoular/xml/calib_vw_ring32.xml,sha256=9chpz0O3e__oIs4ZuJTvUJNIuawjDqEnkdRbfyUBBxU,1341
|
|
48
|
+
acoular/xml/gfai_ring32.xml,sha256=liKaGpfgUn8R1psDmiw6qqpZi5SwtPWBRhwhqy7YuOc,1831
|
|
49
|
+
acoular/xml/minidsp_uma-16.xml,sha256=oBj7J96RTDZufsQ7S4rw0jAvLOoykJaIGgl6_2gMON4,1140
|
|
50
|
+
acoular/xml/minidsp_uma-16_mirrored.xml,sha256=l6LUPIsEVg7HPMbs9NbnqZyFhpCSYS70glsbyH3IUOE,1418
|
|
51
|
+
acoular/xml/tub_vogel64.xml,sha256=PixVMx5hMJjgBOekH46uu6D3ODqYVOLlk82zkYl4EBM,4424
|
|
52
|
+
acoular-25.3.dist-info/METADATA,sha256=M_4x0wwsiPt3Pi93mMs1ryK-v3MrqiVT5R50bgo7PMM,12769
|
|
53
|
+
acoular-25.3.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
54
|
+
acoular-25.3.dist-info/licenses/AUTHORS.rst,sha256=445q_Us_TnQx8s_GP2yringU2DMTk3-ycrk2REtSsx0,382
|
|
55
|
+
acoular-25.3.dist-info/licenses/LICENSE,sha256=tbw7-nx204gXCo8p-NwwR7w8oKvNMWB4H07FTT6V9p8,1505
|
|
56
|
+
acoular-25.3.dist-info/RECORD,,
|
acoular-24.10.dist-info/RECORD
DELETED
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
acoular/__init__.py,sha256=Y-bkeQCE1Jo9he1Ps61a7lH43uXXleOz-RJLVQOQPaU,3200
|
|
2
|
-
acoular/base.py,sha256=qIY6oOyuwX41vXZlxZjR4TlM2huwxxtTEI1SxFuXLxE,10078
|
|
3
|
-
acoular/calib.py,sha256=7hyas42kn33qvvO4Is2nxkyQEnL8MTo6mIq1VZ56vOQ,2509
|
|
4
|
-
acoular/configuration.py,sha256=vRjyibxKjhm3n8jjY3Cl3WF2vV0GpyYp8F5SxtV9ngQ,8516
|
|
5
|
-
acoular/environments.py,sha256=Ps8EAP1Fveb6r40XCnILeWVSX6Z572VUoc4xW509KOk,22441
|
|
6
|
-
acoular/fastFuncs.py,sha256=UHIVLsog5U4urV5h8_0Sh5xT8no7guE4Q6amRRZiib0,38863
|
|
7
|
-
acoular/fbeamform.py,sha256=lw1vPW-pAjF-SS0628SYif75uyuudooF1QLpS3b-AYA,106870
|
|
8
|
-
acoular/fprocess.py,sha256=D_vDLNZXeCvJULry2ixeqa_SzsHCkTKOlhD5_SSzIWo,14394
|
|
9
|
-
acoular/grids.py,sha256=DFY4bSwgmB0tduwzeLPccVC2RXrhlflV19kHr1JswD8,41113
|
|
10
|
-
acoular/h5cache.py,sha256=87OU9sVw96j5Hvj5Xtk21_k2PoqG5e3yl8FruqJqPPQ,4214
|
|
11
|
-
acoular/h5files.py,sha256=YlnHOAr3ePOs6-AJcN_eNun0XBws-cSNGCj3U2jhJP0,7653
|
|
12
|
-
acoular/internal.py,sha256=qgluN_4Br7U74keTiavbmxRMkcNkoHcL1TihKTcMEBs,829
|
|
13
|
-
acoular/microphones.py,sha256=Pn4pKZtr82LRE3TkBfLyWQZnnLyppIVhoqJjhiHhdOk,5113
|
|
14
|
-
acoular/process.py,sha256=QDAtuNbg_tSnKCb3LqRBsG8pI5aQI17KPKlces_NR-w,17598
|
|
15
|
-
acoular/sdinput.py,sha256=23Gek414D0Oyd4YpMyPU-AEn9kuTnL7koSAdVO-WeqI,4919
|
|
16
|
-
acoular/signals.py,sha256=VQHH02cI0wWOEM2SuHdMuGnymcuTKD7RX5aP0vdj9m4,11942
|
|
17
|
-
acoular/sources.py,sha256=_gEwlZEihK_k0jM8JikG_PuUPPnxOxCta6gpdfDELAM,56369
|
|
18
|
-
acoular/spectra.py,sha256=8feistmN0w0R1Lyy2i7cxdTWebCrYGiFDBVixH7Czf4,27669
|
|
19
|
-
acoular/tbeamform.py,sha256=248tlFOJ81ycT-ree-c9ls4FfRJKs_TUtg33cyXo3gE,35559
|
|
20
|
-
acoular/tfastfuncs.py,sha256=YtLvz-WAW9SY9zNLYBzkLTj8da9ibCsjPOGWe9ZLFEg,7880
|
|
21
|
-
acoular/tprocess.py,sha256=pwosxIYq-rdnP7Y03cu_f9BifUXlY60O32jCGujB-Ck,76011
|
|
22
|
-
acoular/traitsviews.py,sha256=g0dLZII3WThAitI1cNMz_gtPorC6e3qwjzvAEhER-m4,13766
|
|
23
|
-
acoular/trajectory.py,sha256=I3Ve08IlritHcG7iOBt-jjjRY7bCGWwOjTwD4rorTi8,3964
|
|
24
|
-
acoular/version.py,sha256=fgoZRTXp0NwB1POzd5Nj4EiKbhE1X-5sYLK_3l12SBs,380
|
|
25
|
-
acoular/demo/__init__.py,sha256=ejn5L3j0M3BwsaxQNSAAFdBNU1kr0LpVFxtONtj9dP8,332
|
|
26
|
-
acoular/demo/acoular_demo.py,sha256=BWNZdwIEUFs9VdXe4eTOL4doNqgx7FPuPs0qlJwVkOA,3273
|
|
27
|
-
acoular/tools/__init__.py,sha256=-SQy1ZhFVZ36tn4rkCARwS71Ko2D5Pp4EBElgEXckZg,618
|
|
28
|
-
acoular/tools/aiaa.py,sha256=3pSZkjkkPpGEKUfuU6IUA3-bb4jFy83mR6bJDSONVmw,6447
|
|
29
|
-
acoular/tools/helpers.py,sha256=ySgeIiIOA-TTmcjtbqe6zjI-ZJjC8E9N_uiBddIEXRo,6284
|
|
30
|
-
acoular/tools/metrics.py,sha256=gyceQywoL7fNo-XdZwGSz3z0x_Pze5720egP2QYkn3s,6140
|
|
31
|
-
acoular/tools/utils.py,sha256=hWNWdUYfS_YC0hkXm2v6g9sUWQYT5devdMBmI9iEiRs,7677
|
|
32
|
-
acoular/xml/HW90D240_f10.xml,sha256=WvowIe8aYJaeHSExjwaY9fjpYukLxX6A-H7fD1PW2g8,5127
|
|
33
|
-
acoular/xml/W90_D105_f10.xml,sha256=f8NHPoOYjEnRsstYDa_4E65EBR5m5BVzlg87jpCgckA,5283
|
|
34
|
-
acoular/xml/acousticam_2c.xml,sha256=xcVlKQhGbRqMQHLKuTAyXTt3SM3aLZEAfGqbuFaWx4k,1993
|
|
35
|
-
acoular/xml/acousticam_4c.xml,sha256=P8wAP5_GT0HS40VV3f7_88xQXwTLN1YRxI7MudnwIqw,1949
|
|
36
|
-
acoular/xml/array38.xml,sha256=FrbC-1yVHNfWTamEJPiJhhdPtVYVfGbPXJ3TLljBKx0,2363
|
|
37
|
-
acoular/xml/array92x.xml,sha256=65Wf2xbA6Dt_k98C3q4MfTtwPzceT8B2vKvK77hO9Yc,5874
|
|
38
|
-
acoular/xml/array_56.xml,sha256=qe8CAcRP7-3MLpPn919XKHB8hMb9G5JUPFzP1qOA4IM,3428
|
|
39
|
-
acoular/xml/array_56_10_9.xml,sha256=2G-KZSwvAtIuxyC6JKW2Hv2IWXVFd4Sux1tLxizJ5Z4,4432
|
|
40
|
-
acoular/xml/array_56_bomb.xml,sha256=tAdhLzvUrhMh7DMrbXU7skAEAlCvQ6GLbJXAU7Z2JxE,4193
|
|
41
|
-
acoular/xml/array_56_v2.xml,sha256=x4OTI77Fttfaqu-Kl7uWmslg8rZAuw2Y-RUa21MqzXk,3458
|
|
42
|
-
acoular/xml/array_64.xml,sha256=1ZHuQEHhFhz9EhBcNbXkVT-9tnAr6T9cHH5Xb1gHL7Y,4039
|
|
43
|
-
acoular/xml/array_84_10_9.xml,sha256=jzvMYZlQqo8y6jt3yllGOL7vk8bxMVpISexkZL0uquA,6558
|
|
44
|
-
acoular/xml/array_84_bomb_v3.xml,sha256=Mv8nvqSOUezrdIjrCHZt4gZpJ-Z3BzF2wIYPawHZjlA,6248
|
|
45
|
-
acoular/xml/calib_vw_ring32.xml,sha256=9chpz0O3e__oIs4ZuJTvUJNIuawjDqEnkdRbfyUBBxU,1341
|
|
46
|
-
acoular/xml/gfai_ring32.xml,sha256=liKaGpfgUn8R1psDmiw6qqpZi5SwtPWBRhwhqy7YuOc,1831
|
|
47
|
-
acoular/xml/minidsp_uma-16.xml,sha256=oBj7J96RTDZufsQ7S4rw0jAvLOoykJaIGgl6_2gMON4,1140
|
|
48
|
-
acoular/xml/minidsp_uma-16_mirrored.xml,sha256=l6LUPIsEVg7HPMbs9NbnqZyFhpCSYS70glsbyH3IUOE,1418
|
|
49
|
-
acoular/xml/tub_vogel64.xml,sha256=PixVMx5hMJjgBOekH46uu6D3ODqYVOLlk82zkYl4EBM,4424
|
|
50
|
-
acoular-24.10.dist-info/METADATA,sha256=-jhuw-l14NoGYtmYEuv6s7mHNsUAIpPCCFjOb0C56OM,11821
|
|
51
|
-
acoular-24.10.dist-info/WHEEL,sha256=1yFddiXMmvYK7QYTqtRNtX66WJ0Mz8PYEiEUoOUUxRY,87
|
|
52
|
-
acoular-24.10.dist-info/licenses/AUTHORS.rst,sha256=445q_Us_TnQx8s_GP2yringU2DMTk3-ycrk2REtSsx0,382
|
|
53
|
-
acoular-24.10.dist-info/licenses/LICENSE,sha256=tbw7-nx204gXCo8p-NwwR7w8oKvNMWB4H07FTT6V9p8,1505
|
|
54
|
-
acoular-24.10.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|