Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- def scattering2d(x, pad, unpad, backend, J, L, phi, psi, max_order,
- out_type='array'):
- subsample_fourier = backend.subsample_fourier
- modulus = backend.modulus
- rfft = backend.rfft
- ifft = backend.ifft
- irfft = backend.irfft
- cdgmm = backend.cdgmm
- concatenate = backend.concatenate
- # Define lists for output.
- out_S_0, out_S_1, out_S_2 = [], [], []
- U_r = pad(x)
- U_0_c = rfft(U_r)
- # First low pass filter
- U_1_c = cdgmm(U_0_c, phi[0])
- # U_1_c = subsample_fourier(U_1_c, k=2 ** J)
- S_0 = irfft(U_1_c)
- S_0 = unpad(S_0)
- out_S_0.append({'coef': S_0,
- 'j': (),
- 'theta': ()})
- for n1 in range(len(psi)):
- j1 = psi[n1]['j']
- theta1 = psi[n1]['theta']
- U_1_c = cdgmm(U_0_c, psi[n1][0])
- # if j1 > 0:
- # U_1_c = subsample_fourier(U_1_c, k=2 ** j1)
- U_1_c = ifft(U_1_c)
- U_1_c = modulus(U_1_c)
- U_1_c = rfft(U_1_c)
- # Second low pass filter
- # S_1_c = cdgmm(U_1_c, phi[j1])
- S_1_c = U_1_c
- # S_1_c = subsample_fourier(S_1_c, k=2 ** (J - j1))
- S_1_r = irfft(S_1_c)
- S_1_r = unpad(S_1_r)
- out_S_1.append({'coef': S_1_r,
- 'j': (j1,),
- 'theta': (theta1,)})
- if max_order < 2:
- continue
- for n2 in range(len(psi)):
- j2 = psi[n2]['j']
- theta2 = psi[n2]['theta']
- if j2 <= j1:
- continue
- U_2_c = cdgmm(U_1_c, psi[n2][0])
- # U_2_c = subsample_fourier(U_2_c, k=2 ** (j2 - j1))
- U_2_c = ifft(U_2_c)
- U_2_c = modulus(U_2_c)
- U_2_c = rfft(U_2_c)
- # Third low pass filter
- # S_2_c = cdgmm(U_2_c, phi[j2])
- # S_2_c = subsample_fourier(S_2_c, k=2 ** (J - j2))
- S_2_c = U_2_c
- S_2_r = irfft(S_2_c)
- S_2_r = unpad(S_2_r)
- out_S_2.append({'coef': S_2_r,
- 'j': (j1, j2),
- 'theta': (theta1, theta2)})
- out_S = []
- out_S.extend(out_S_0)
- out_S.extend(out_S_1)
- out_S.extend(out_S_2)
- if out_type == 'array':
- out_S = concatenate([x['coef'] for x in out_S])
- return out_S
- __all__ = ['scattering2d']
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement