@@ -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