Source code for spharpy.indexing.channel_indexing

"""
Commonly used channel indexing functions used in Ambisonics
"""

import numpy as np
import spharpy


[docs]def sid(n_max): """Calculates the SID indices up to spherical harmonic order n_max. TODO: Add citation Daniel Parameters ---------- n_max : int Returns ------- sid : numpy array """ n_sh = (n_max+1)**2 sid_n = sph_identity_matrix(n_max, 'n-nm').T @ np.arange(0, n_max+1) sid_m = np.zeros(n_sh, dtype=int) idx_n = 0 for n in range(1, n_max+1): for m in range(1, n+1): sid_m[idx_n + 2*m-1] = n-m+1 sid_m[idx_n + 2*m] = -(n-m+1) sid_m[idx_n + 2*n + 1] = 0 idx_n += 2*n+1 return sid_n, sid_m
[docs]def sid2acn(n_max): """Convert from SID channel indexing as proposed by Daniel in TODO: add citation Returns the indices to achieve a corresponding linear acn indexing. Parameters ---------- sid : numpy array Returns ------- acn : numpy array """ sid_n, sid_m = spharpy.indexing.sid(n_max) linear_sid = spharpy.spherical.nm2acn(sid_n, sid_m) return np.argsort(linear_sid)
[docs]def sph_identity_matrix(n_max, type='n-nm'): """Calculate a spherical harmonic identity matrix. TODO: Implement the other identity matrices Parameters ---------- n_max : TODO type : TODO, optional Returns ------- identity_matrix : numpy array """ n_sh = (n_max+1)**2 if type != 'n-nm': raise NotImplementedError identity_matrix = np.zeros((n_max+1, n_sh), dtype=int) # linear_n0 = np.cumsum(np.arange(0, 2*(n_max+1), 2)) for n in range(n_max+1): m = np.arange(-n, n+1) linear_nm = spharpy.spherical.nm2acn(np.tile(n, m.shape), m) identity_matrix[n, linear_nm] = 1 return identity_matrix