Skip to content

Commit 6e9a930

Browse files
committed
Add vectorized flmn generator implementation
1 parent bd76a11 commit 6e9a930

File tree

1 file changed

+41
-21
lines changed

1 file changed

+41
-21
lines changed

s2fft/utils/signal_generator.py

Lines changed: 41 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -153,26 +153,46 @@ def generate_flmn(
153153
154154
"""
155155
flmn = np.zeros(wigner_samples.flmn_shape(L, N), dtype=np.complex128)
156-
157156
for n in range(-N + 1, N):
158-
for el in range(max(L_lower, abs(n)), L):
159-
if reality:
160-
flmn[N - 1 + n, el, 0 + L - 1] = rng.normal()
161-
flmn[N - 1 - n, el, 0 + L - 1] = (-1) ** n * flmn[
162-
N - 1 + n,
163-
el,
164-
0 + L - 1,
165-
]
166-
else:
167-
flmn[N - 1 + n, el, 0 + L - 1] = rng.normal() + 1j * rng.normal()
168-
169-
for m in range(1, el + 1):
170-
flmn[N - 1 + n, el, m + L - 1] = rng.normal() + 1j * rng.normal()
171-
if reality:
172-
flmn[N - 1 - n, el, -m + L - 1] = (-1) ** (m + n) * np.conj(
173-
flmn[N - 1 + n, el, m + L - 1]
174-
)
175-
else:
176-
flmn[N - 1 + n, el, -m + L - 1] = rng.normal() + 1j * rng.normal()
177-
157+
min_el = max(L_lower, abs(n))
158+
# Separately deal with m = 0 case
159+
if reality:
160+
if n == 0:
161+
# For m = n = 0
162+
# flmn[N - 1, el, L - 1] = flmn[N - 1, el, L - 1].conj (real-valued)
163+
# Generate independent real coefficients for n = 0
164+
flmn[N - 1, min_el:L, L - 1] = rng.standard_normal(L - min_el)
165+
elif n > 0:
166+
# Generate independent complex coefficients for positive n
167+
flmn[N - 1 + n, min_el:L, L - 1] = complex_normal(
168+
rng, L - min_el, var=2
169+
)
170+
# For m = 0, n > 0
171+
# flmn[N - 1 - n, el, L - 1] = (-1)**n * flmn[N - 1 + n, el, L - 1].conj
172+
flmn[N - 1 - n, min_el:L, L - 1] = (-1) ** n * (
173+
flmn[N - 1 + n, min_el:L, L - 1].conj()
174+
)
175+
else:
176+
flmn[N - 1 + n, min_el:L, L - 1] = complex_normal(rng, L - min_el, var=2)
177+
# Construct arrays of m and el indices for entries in flmn slices for n
178+
# corresponding to complex-valued coefficients (m > 0)
179+
el_indices, m_indices = complex_el_and_m_indices(L, min_el)
180+
len_indices = len(m_indices)
181+
# Generate independent complex coefficients for positive m
182+
flmn[N - 1 + n, el_indices, L - 1 + m_indices] = complex_normal(
183+
rng, len_indices, var=2
184+
)
185+
if reality:
186+
# Real-valued signal so set complex coefficients for negative m using
187+
# conjugate symmetry relationship
188+
# flmn[N - 1 - n, el, L - 1 - m] =
189+
# (-1)**(m + n) * flmn[N - 1 + n, el, L - 1 + m].conj
190+
flmn[N - 1 - n, el_indices, L - 1 - m_indices] = (-1) ** (m_indices + n) * (
191+
flmn[N - 1 + n, el_indices, L - 1 + m_indices].conj()
192+
)
193+
else:
194+
# Complex signal so generate independent complex coefficients for negative m
195+
flmn[N - 1 + n, el_indices, L - 1 - m_indices] = complex_normal(
196+
rng, len_indices, var=2
197+
)
178198
return torch.from_numpy(flmn) if using_torch else flmn

0 commit comments

Comments
 (0)