Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
import matplotlib.pyplot as plt
from spaudiopy import utils, IO, sig, decoder, sph, plots, grids
# %% User setup
setupname = "graz"
LISTEN = True
listener_position = [0, 0, 0]
if setupname == "frontal_partial":
ls_dirs = np.array([[-80, -45, 0, 45, 80, -60, -30, 30, 60],
[0, 0, 0, 0, 0, 60, 60, 60, 60]])
ls_dirs[1, :] = 90 - ls_dirs[1, :]
ls_x, ls_y, ls_z = utils.sph2cart(utils.deg2rad(ls_dirs[0, :]),
utils.deg2rad(ls_dirs[1, :]))
normal_limit = 85
aperture_limit = 90
opening_limit = 150
blacklist = None
ls_setup = decoder.LoudspeakerSetup(ls_x, ls_y, ls_z, listener_position)
ls_setup.pop_triangles(normal_limit, aperture_limit, opening_limit,
blacklist)
elif setupname == "graz":
normal_limit = 85
aperture_limit = 90
opening_limit = 135
blacklist = None
def decoder_performance(hull, renderer_type, azi_steps=5, ele_steps=3,
show_ls=True, **kwargs):
"""Currently shows rE_mag, E and spread measures on grid.
For renderer_type='VBAP', 'VBIP', 'ALLRAP' or 'NLS', kwargs forwarded.
Zotter, F., & Frank, M. (2019). Ambisonics.
Springer Topics in Signal Processing.
"""
azi_steps = np.deg2rad(azi_steps)
ele_steps = np.deg2rad(ele_steps)
phi_vec = np.arange(-np.pi, np.pi + 2*azi_steps, azi_steps)
theta_vec = np.arange(0., np.pi + 2*ele_steps, ele_steps)
phi_plot, theta_plot = np.meshgrid(phi_vec, theta_vec)
_grid_x, _grid_y, grid_z = utils.sph2cart(phi_plot.ravel(),
theta_plot.ravel())
# Switch renderer
if renderer_type.lower() == 'vbap':
G = decoder.vbap(np.c_[_grid_x, _grid_y, grid_z], hull, **kwargs)
elif renderer_type.lower() == 'vbip':
G = decoder.vbip(np.c_[_grid_x, _grid_y, grid_z], hull, **kwargs)
elif renderer_type.lower() == 'allrap':
G = decoder.allrap(np.c_[_grid_x, _grid_y, grid_z], hull,
**kwargs)
elif renderer_type.lower() == 'allrap2':
G = decoder.allrap2(np.c_[_grid_x, _grid_y, grid_z], hull,
**kwargs)
elif renderer_type.lower() == 'nls':
G = decoder.nearest_loudspeaker(np.c_[_grid_x, _grid_y, grid_z], hull,
**kwargs)
def spherical_function(f, azi, colat, title=None):
"""Plot function 1D vector f over azi and colat."""
f = utils.asarray_1d(np.real_if_close(f))
azi = utils.asarray_1d(azi)
colat = utils.asarray_1d(colat)
x, y, z = utils.sph2cart(azi, colat, r=abs(f))
# triangulate in the underlying parametrization
triang = tri.Triangulation(colat, azi)
fig = plt.figure()
ax = fig.gca(projection='3d')
p_tri = ax.plot_trisurf(x, y, z,
cmap=plt.cm.coolwarm,
# antialiased=False,
triangles=triang.triangles, shade=True,
edgecolor='none', linewidth=0.06, alpha=0.25)
# Draw axis lines
x0 = np.array([1, 0, 0])
y0 = np.array([0, 1, 0])
z0 = np.array([0, 0, 1])
fig = plt.figure(figsize=plt.figaspect(1 / N_plots),
constrained_layout=True)
ax_l = []
for i_p, ff in enumerate(F_l):
F_nm = utils.asarray_1d(ff)
F_nm = F_nm[:, np.newaxis]
if SH_type is None:
SH_type = 'complex' if np.iscomplexobj(F_nm) else 'real'
f_plot = sph.inverse_sht(F_nm, phi_plot.ravel(), theta_plot.ravel(),
SH_type)
f_r = np.abs(f_plot)
f_ang = np.angle(f_plot)
x_plot, y_plot, z_plot = utils.sph2cart(phi_plot.ravel(),
theta_plot.ravel(),
f_r.ravel())
ax = fig.add_subplot(1, N_plots, i_p + 1, projection='3d')
m = cm.ScalarMappable(cmap=cm.hsv,
norm=colors.Normalize(vmin=-np.pi, vmax=np.pi))
m.set_array(f_ang)
c = m.to_rgba(f_ang.reshape(phi_plot.shape))
ax.plot_surface(x_plot.reshape(phi_plot.shape),
y_plot.reshape(phi_plot.shape),
z_plot.reshape(phi_plot.shape),
facecolors=c,
edgecolor='none', linewidth=0.06, alpha=0.68,
shade=True)
if SH_type is None:
SH_type = 'complex' if np.iscomplexobj(F_nm) else 'real'
azi_steps = np.deg2rad(azi_steps)
el_steps = np.deg2rad(el_steps)
phi_plot, theta_plot = np.meshgrid(np.arange(0., 2 * np.pi + azi_steps,
azi_steps),
np.arange(10e-3, np.pi + el_steps,
el_steps))
f_plot = sph.inverse_sht(F_nm, phi_plot.ravel(), theta_plot.ravel(),
SH_type)
f_r = np.abs(f_plot)
f_ang = np.angle(f_plot)
x_plot, y_plot, z_plot = utils.sph2cart(phi_plot.ravel(),
theta_plot.ravel(),
f_r.ravel())
fig = plt.figure()
ax = fig.gca(projection='3d')
m = cm.ScalarMappable(cmap=cm.hsv,
norm=colors.Normalize(vmin=-np.pi, vmax=np.pi))
m.set_array(f_ang)
c = m.to_rgba(f_ang.reshape(phi_plot.shape))
ax.plot_surface(x_plot.reshape(phi_plot.shape),
y_plot.reshape(phi_plot.shape),
z_plot.reshape(phi_plot.shape),
facecolors=c,
edgecolor='none', linewidth=0.06, alpha=0.68, shade=True)
def project_on_sphere(x, y, z):
"""Little helper that projects x, y, z onto unit sphere."""
phi, theta, r = utils.cart2sph(x, y, z)
r = np.ones_like(r)
return utils.sph2cart(phi, theta, r)