Skip to content

Commit 723abdb

Browse files
committed
Enable flexible choice of the modal bandwidth in the examples
* The modal bandwidth of the incident sound field `Nsf` may differ from that of the modal beamforming `N` * For open circular arrays, the incident sound can have either a finite or an infinite modal bandwidth
1 parent e64bc4b commit 723abdb

File tree

2 files changed

+34
-25
lines changed

2 files changed

+34
-25
lines changed

examples/modal_beamforming_open_circular_array.py

Lines changed: 24 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -6,43 +6,51 @@
66
import numpy as np
77
import matplotlib.pyplot as plt
88
import micarray
9+
from micarray.util import db
910

10-
N = 90 # order of modal beamformer/microphone array
11+
Nsf = 50 # order of the incident sound field
12+
N = 30 # order of modal beamformer/microphone array
1113
pw_angle = 1.23 * np.pi # incidence angle of plane wave
12-
pol_pwd = np.linspace(0, 2*np.pi, 91, endpoint=False) # angles for plane wave decomposition
14+
pol_pwd = np.linspace(0, 2*np.pi, 180, endpoint=False) # angles for plane wave decomposition
1315
k = np.linspace(0.1, 20, 100) # wavenumber vector
1416
r = 1 # radius of array
1517

1618
# get uniform grid (microphone positions) of order N
1719
pol, weights = micarray.modal.angular.grid_equal_polar_angle(N)
18-
# get circular harmonics matrix for sensors
19-
Psi_p = micarray.modal.angular.cht_matrix(N, pol, weights)
20-
# get circular harmonics matrix for a source ensemble of azimuthal plane wave
21-
Psi_q = micarray.modal.angular.cht_matrix(N, pol_pwd)
22-
# get radial filters
20+
21+
# pressure on the surface of a rigid cylinder for an incident plane wave
22+
Bn = micarray.modal.radial.circular_pw(Nsf, k, r, setup='open')
23+
D = micarray.modal.radial.circ_diagonal_mode_mat(Bn)
24+
Psi_p = micarray.modal.angular.cht_matrix(Nsf, pol)
25+
Psi_pw = micarray.modal.angular.cht_matrix(Nsf, pw_angle)
26+
p = np.matmul(np.matmul(np.conj(Psi_p.T), D), Psi_pw)
27+
p = np.squeeze(p)
28+
29+
# incident plane wave exhibiting infinite spatial bandwidth
30+
# p = np.exp(1j * k[:, np.newaxis]*r * np.cos(pol - pw_angle))
31+
32+
# plane wave decomposition using modal beamforming
2333
Bn = micarray.modal.radial.circular_pw(N, k, r, setup='open')
24-
Dn, _ = micarray.modal.radial.regularize(1/Bn, 100, 'softclip')
34+
Dn, _ = micarray.modal.radial.regularize(1/Bn, 3000, 'softclip')
2535
D = micarray.modal.radial.circ_diagonal_mode_mat(Dn)
26-
27-
# compute microphone signals for an incident broad-band plane wave
28-
p = np.exp(1j * k[:, np.newaxis]*r * np.cos(pol - pw_angle))
29-
# compute plane wave decomposition
36+
Psi_p = micarray.modal.angular.cht_matrix(N, pol, weights)
37+
Psi_q = micarray.modal.angular.cht_matrix(N, pol_pwd)
3038
A_pwd = np.matmul(np.matmul(np.conj(Psi_q.T), D), Psi_p)
3139
q_pwd = np.squeeze(np.matmul(A_pwd, np.expand_dims(p, 2)))
3240
q_pwd_t = np.fft.fftshift(np.fft.irfft(q_pwd, axis=0), axes=0)
3341

3442
# visualize plane wave decomposition (aka beampattern)
3543
plt.figure()
36-
plt.pcolormesh(k, pol_pwd/np.pi, micarray.util.db(q_pwd.T), vmin=-40)
44+
plt.pcolormesh(k, pol_pwd/np.pi, db(q_pwd.T), vmin=-40)
3745
plt.colorbar()
3846
plt.xlabel(r'$kr$')
3947
plt.ylabel(r'$\phi / \pi$')
4048
plt.title('Plane wave docomposition by modal beamformer (frequency domain)')
41-
plt.savefig('modal_open_beamformer_pwd_fd.png')
49+
plt.savefig('modal_circ_open_beamformer_pwd_fd.png')
4250

4351
plt.figure()
44-
plt.pcolormesh(range(2*len(k)-2), pol_pwd/np.pi, micarray.util.db(q_pwd_t.T), vmin=-40)
52+
plt.pcolormesh(range(2*len(k)-2), pol_pwd/np.pi, db(q_pwd_t.T), vmin=-40)
4553
plt.colorbar()
4654
plt.ylabel(r'$\phi / \pi$')
4755
plt.title('Plane wave docomposition by modal beamformer (time domain)')
48-
plt.savefig('modal_open_beamformer_pwd_td.png')
56+
plt.savefig('modal_circ_open_beamformer_pwd_td.png')

examples/modal_beamforming_rigid_circular_array.py

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import numpy as np
77
import matplotlib.pyplot as plt
88
import micarray
9+
from micarray.util import db
910

1011
Nsf = 50 # order of the incident sound field
1112
N = 30 # order of modal beamformer/microphone array
@@ -18,15 +19,15 @@
1819
pol, weights = micarray.modal.angular.grid_equal_polar_angle(N)
1920

2021
# pressure on the surface of a rigid cylinder for an incident plane wave
21-
bn = micarray.modal.radial.circular_pw(Nsf, k, r, setup='rigid')
22-
D = micarray.modal.radial.circ_diagonal_mode_mat(bn)
23-
Psi_p = micarray.modal.angular.cht_matrix(Nsf, pol, weights)
22+
Bn = micarray.modal.radial.circular_pw(Nsf, k, r, setup='rigid')
23+
D = micarray.modal.radial.circ_diagonal_mode_mat(Bn)
24+
Psi_p = micarray.modal.angular.cht_matrix(Nsf, pol)
2425
Psi_pw = micarray.modal.angular.cht_matrix(Nsf, pw_angle)
25-
p = np.matmul(np.matmul(np.conj(Psi_pw.T), D), Psi_p)
26+
p = np.matmul(np.matmul(np.conj(Psi_p.T), D), Psi_pw)
2627
p = np.squeeze(p)
2728

2829
# plane wave decomposition using modal beamforming
29-
Psi_p = micarray.modal.angular.cht_matrix(N, pol)
30+
Psi_p = micarray.modal.angular.cht_matrix(N, pol, weights)
3031
Psi_q = micarray.modal.angular.cht_matrix(N, pol_pwd)
3132
Bn = micarray.modal.radial.circular_pw(N, k, r, setup='rigid')
3233
Dn, _ = micarray.modal.radial.regularize(1/Bn, 100, 'softclip')
@@ -37,16 +38,16 @@
3738

3839
# visualize plane wave decomposition (aka beampattern)
3940
plt.figure()
40-
plt.pcolormesh(k, pol_pwd/np.pi, micarray.util.db(q_pwd.T), vmin=-40)
41+
plt.pcolormesh(k, pol_pwd/np.pi, db(q_pwd.T), vmin=-40)
4142
plt.colorbar()
4243
plt.xlabel(r'$kr$')
4344
plt.ylabel(r'$\phi / \pi$')
4445
plt.title('Plane wave docomposition by modal beamformer (frequency domain)')
45-
plt.savefig('modal_open_beamformer_pwd_fd.png')
46+
plt.savefig('modal_circ_open_beamformer_pwd_fd.png')
4647

4748
plt.figure()
48-
plt.pcolormesh(range(2*len(k)-2), pol_pwd/np.pi, micarray.util.db(q_pwd_t.T), vmin=-40)
49+
plt.pcolormesh(range(2*len(k)-2), pol_pwd/np.pi, db(q_pwd_t.T), vmin=-40)
4950
plt.colorbar()
5051
plt.ylabel(r'$\phi / \pi$')
5152
plt.title('Plane wave docomposition by modal beamformer (time domain)')
52-
plt.savefig('modal_open_beamformer_pwd_td.png')
53+
plt.savefig('modal_circ_open_beamformer_pwd_td.png')

0 commit comments

Comments
 (0)