8000 Add util.max_order_circular_harmonics · sfstoolbox/sfs-python@ef78d76 · GitHub
[go: up one dir, main page]

Skip to content

Commit ef78d76

Browse files
committed
Add util.max_order_circular_harmonics
1 parent 1ceae38 commit ef78d76

File tree

3 files changed

+38
-20
lines changed

3 files changed

+38
-20
lines changed

sfs/mono/drivingfunction.py

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -254,7 +254,7 @@ def nfchoa_2d_plane(omega, x0, r0, n=[0, 1, 0], max_order=None, c=None):
254254
n = util.normalize_vector(n)
255255
phi, _, r = util.cart2sph(*n)
256256
phi0 = util.cart2sph(*x0.T)[0]
257-
M = _max_order_circular_harmonics(len(x0), max_order)
257+
M = util.max_order_circular_harmonics(len(x0), max_order)
258258
d = 0
259259
for m in range(-M, M + 1):
260260
d += 1j**-m / hankel2(m, k * r0) * np.exp(1j * m * (phi0 - phi))
@@ -280,7 +280,7 @@ def nfchoa_25d_point(omega, x0, r0, xs, max_order=None, c=None):
280280
xs = util.asarray_1d(xs)
281281
phi, _, r = util.cart2sph(*xs)
282282
phi0 = util.cart2sph(*x0.T)[0]
283-
M = _max_order_circular_harmonics(len(x0), max_order)
283+
M = util.< 8000 span class="pl-c1 x x-last">max_order_circular_harmonics(len(x0), max_order)
284284
hr = _sph_hn2(M, k * r)
285285
hr0 = _sph_hn2(M, k * r0)
286286
d = 0
@@ -308,7 +308,7 @@ def nfchoa_25d_plane(omega, x0, r0, n=[0, 1, 0], max_order=None, c=None):
308308
n = util.normalize_vector(n)
309309
phi, _, r = util.cart2sph(*n)
310310
phi0 = util.cart2sph(*x0.T)[0]
311-
M = _max_order_circular_harmonics(len(x0), max_order)
311+
M = util.max_order_circular_harmonics(len(x0), max_order)
312312
hn2 = _sph_hn2(M, k * r0)
313313
d = 0
314314
for m in range(-M, M + 1):
@@ -673,8 +673,3 @@ def _sph_hn2(n, z):
673673
"""Spherical Hankel function of 2nd kind."""
674674
jn, jnp, yn, ynp = sph_jnyn(n, z)
675675
return jn - 1j * yn
676-
677-
678-
def _max_order_circular_harmonics(N, max_order):
679-
"""Compute order of 2D HOA."""
680-
return N // 2 if max_order is None else max_order

sfs/time/drivingfunction.py

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -293,8 +293,7 @@ def nfchoa_25d_plane(x0, r0, npw, max_order=None, c=None, fs=44100, normalize=Tr
293293
294294
See Eq.(10)
295295
"""
296-
if max_order is None:
297-
max_order = _max_order_circular_harmonics(len(x0), max_order)
296+
max_order = util.max_order_circular_harmonics(len(x0), max_order)
298297
if c is None:
299298
c = defs.c
300299

@@ -359,8 +358,7 @@ def nfchoa_25d_point(x0, r0, xs, max_order=None, c=None, fs=44100, normalize=Tru
359358
360359
See Eq.(11)
361360
"""
362-
if max_order is None:
363-
max_order = _max_order_circular_harmonics(len(x0), max_order)
361+
max_order = util.max_order_circular_harmonics(len(x0), max_order)
364362
if c is None:
365363
c = defs.c
366364

@@ -416,8 +414,7 @@ def nfchoa_driving_signals(delay, weight, sos, phaseshift, signal, max_order=Non
416414
Simulation point in time offset (seconds).
417415
418416
"""
419-
if max_order is None:
420-
max_order = _max_order_circular_harmonics(len(phaseshift), max_order)
417+
max_order = util.max_order_circular_harmonics(len(phaseshift), max_order)
421418

422419
delay = util.asarray_1d(delay)
423420
weight = util.asarray_1d(weight)
@@ -438,11 +435,6 @@ def nfchoa_driving_signals(delay, weight, sos, phaseshift, signal, max_order=Non
438435
return np.real(d) * weight, fs, t_offset
439436

440437

441-
def _max_order_circular_harmonics(N, max_order):
442-
"""Compute order of 2D HOA."""
443-
return (N-1) // 2 if max_order is None else max_order
444-
445-
446438
def _normalize_digital_filter_gain(s0, sinf, z0, zinf, fs=44100):
447439
"""Match the digital filter gain at the Nyquist freuqneycy"""
448440

@@ -454,4 +446,4 @@ def _normalize_digital_filter_gain(s0, sinf, z0, zinf, fs=44100):
454446
omega = 1j*np.pi*fs
455447
k *= np.prod((omega-s0)/(omega-sinf))
456448
k *= np.prod((-1-zinf)/(-1-z0))
457-
return np.abs(k)
449+
return np.abs(k)

sfs/util.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -466,3 +466,34 @@ def _count_walls_1d(a):
466466
order = order[max_order_mask, :]
467467

468468
return xs, order
469+
470+
471+
def max_order_circular_harmonics(N, max_order):
472+
r"""Maximum order of 2D/2.5D HOA.
473+
474+
If ``max_order`` is ``None`` it returns the maximum order
475+
for which no spatial aliasing appears.
476+
It is given on page 132 of [Ahrens2012]_ as
477+
478+
.. math::
479+
\text{max_order} =
480+
\begin{cases}
481+
N/2 - 1 & \text{even}\;N \\
482+
(N-1)/2 & \text{odd}\;N
483+
\end{cases}
484+
485+
Parameters
486+
----------
487+
N : int
488+
Number of secondary sources.
489+
max_order : int
490+
Ambisonics order
491+
492+
Returns
493+
-------
494+
max_order : int
495+
Ambisonics order
496+
"""
497+
if max_order is None:
498+
max_order = (N-1) // 2
499+
return max_order

0 commit comments

Comments
 (0)
0