Skip to content

Commit de3e168

Browse files
committed
Fixes issue #382: Room.add_microphone_array discards MicrophoneArray directivity.
1 parent 1f1d644 commit de3e168

File tree

2 files changed

+52
-6
lines changed

2 files changed

+52
-6
lines changed

pyroomacoustics/room.py

+13-2
Original file line numberDiff line numberDiff line change
@@ -1980,7 +1980,7 @@ def add(self, obj):
19801980
).format(self.dim, obj.dim)
19811981
)
19821982

1983-
if "mic_array" not in self.__dict__ or self.mic_array is None:
1983+
if not hasattr(self, "mic_array") or self.mic_array is None:
19841984
self.mic_array = obj
19851985
else:
19861986
self.mic_array.append(obj)
@@ -2046,6 +2046,12 @@ def add_microphone_array(self, mic_array, directivity=None):
20462046
As an alternative, a
20472047
:py:obj:`~pyroomacoustics.beamforming.MicrophoneArray` can be
20482048
provided.
2049+
directivity: list of Directivity objects, optional
2050+
If ``mic_array`` is provided as a numpy array, an optional
2051+
:py:obj:`~pyroomacoustics.directivities.Directivity` object or
2052+
list thereof can be provided.
2053+
If ``mic_array`` is a MicrophoneArray object, passing an argument here
2054+
will result in an error.
20492055
20502056
Returns
20512057
-------
@@ -2064,7 +2070,12 @@ def add_microphone_array(self, mic_array, directivity=None):
20642070
mic_array = MicrophoneArray(mic_array, self.fs, directivity)
20652071
else:
20662072
# if the type is microphone array
2067-
mic_array.set_directivity(directivity)
2073+
if directivity is not None:
2074+
raise ValueError(
2075+
"When providing a MicrophoneArray object, the directivities should "
2076+
"be provided in the object, not via the `directivity` parameter "
2077+
"of this method."
2078+
)
20682079

20692080
if self.simulator_state["rt_needed"] and mic_array.is_directive:
20702081
raise NotImplementedError("Directivity not supported with ray tracing.")

pyroomacoustics/tests/test_room_add.py

+39-4
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import numpy as np
2+
import pytest
23

34
import pyroomacoustics as pra
45

@@ -8,6 +9,18 @@
89
source_loc1 = [3.5, 7.7, 2.1]
910
mic0 = [7, 8, 3.9]
1011
mic1 = [7.87, 3.6, 6.1]
12+
mic_dir0 = pra.FigureEight(
13+
orientation=pra.DirectionVector(azimuth=90, colatitude=15, degrees=True)
14+
)
15+
mic_dir1 = pra.FigureEight(
16+
orientation=pra.DirectionVector(azimuth=180, colatitude=15, degrees=True)
17+
)
18+
src_dir0 = pra.FigureEight(
19+
orientation=pra.DirectionVector(azimuth=270, colatitude=15, degrees=True)
20+
)
21+
src_dir1 = pra.FigureEight(
22+
orientation=pra.DirectionVector(azimuth=0, colatitude=15, degrees=True)
23+
)
1124

1225

1326
def test_add_source_mic():
@@ -56,12 +69,21 @@ def test_add_source_mic_obj():
5669
assert room.mic_array.R.shape == (3, 2)
5770

5871

59-
def test_add_source_mic_obj_2():
72+
@pytest.mark.parametrize("with_dir", ((True,), (False,)))
73+
def test_add_source_mic_obj_2(with_dir):
6074
room = pra.ShoeBox(room_size)
6175

62-
source0 = pra.SoundSource(source_loc0, signal=sig)
63-
source1 = pra.SoundSource(source_loc1, signal=sig)
64-
mic_array = pra.MicrophoneArray(np.c_[mic0, mic1], fs=room.fs)
76+
if with_dir:
77+
sdir0 = src_dir0
78+
sdir1 = src_dir1
79+
mdir = [mic_dir0, mic_dir1]
80+
else:
81+
sdir0 = sdir1 = None
82+
mdir = [None, None]
83+
84+
source0 = pra.SoundSource(source_loc0, signal=sig, directivity=sdir0)
85+
source1 = pra.SoundSource(source_loc1, signal=sig, directivity=sdir1)
86+
mic_array = pra.MicrophoneArray(np.c_[mic0, mic1], fs=room.fs, directivity=mdir)
6587

6688
room.add(source0).add(source1).add(mic_array)
6789

@@ -72,6 +94,19 @@ def test_add_source_mic_obj_2():
7294
assert np.allclose(room.mic_array.R[:, 0], mic0)
7395
assert np.allclose(room.mic_array.R[:, 1], mic1)
7496
assert room.mic_array.R.shape == (3, 2)
97+
# Test directivities.
98+
assert room.sources[0].directivity is sdir0
99+
assert room.sources[1].directivity is sdir1
100+
assert all(d is md for d, md in zip(room.mic_array.directivity, mdir))
101+
102+
103+
def test_add_source_mic_obj_with_dir_error():
104+
room = pra.ShoeBox(room_size)
105+
106+
mic_array = pra.MicrophoneArray(np.c_[mic0, mic1], fs=room.fs)
107+
108+
with pytest.raises(ValueError):
109+
room.add_microphone_array(mic_array, directivity=[mic_dir0, mic_dir1])
75110

76111

77112
def test_add_source_mic_ndarray():

0 commit comments

Comments
 (0)