2014-06-01 18:07:44 +02:00
|
|
|
import numpy as np
|
|
|
|
|
|
|
|
def fourier_analysis(borg_vol):
|
|
|
|
L = (borg_vol.ranges[1]-borg_vol.ranges[0])
|
|
|
|
N = borg_vol.density.shape[0]
|
|
|
|
|
|
|
|
return np.fft.rfftn(borg_vol.density)*(L/N)**3, L, N
|
|
|
|
|
2014-06-12 09:45:46 +02:00
|
|
|
def borg_upgrade_sampling(dhat, supersample):
|
|
|
|
N = dhat.shape[0]
|
|
|
|
N2 = N * supersample
|
|
|
|
dhat_new = np.zeros((N2, N2, N2/2+1), dtype=np.complex128)
|
|
|
|
|
|
|
|
hN = N/2
|
|
|
|
dhat_new[:hN, :hN, :hN+1] = dhat[:hN, :hN, :]
|
|
|
|
dhat_new[:hN, (N2-hN):N2, :hN+1] = dhat[:hN, hN:, :]
|
|
|
|
dhat_new[(N2-hN):N2, (N2-hN):N2, :hN+1] = dhat[hN:, hN:, :]
|
|
|
|
dhat_new[(N2-hN):N2, :hN, :hN+1] = dhat[hN:, :hN, :]
|
|
|
|
|
|
|
|
return dhat_new, N2
|
|
|
|
|
2014-06-04 09:13:34 +02:00
|
|
|
def half_pixel_shift(borg, doshift=False):
|
2014-06-01 18:07:44 +02:00
|
|
|
|
|
|
|
dhat,L,N = fourier_analysis(borg)
|
2014-06-04 09:13:34 +02:00
|
|
|
if not doshift:
|
|
|
|
return dhat, L
|
2014-06-01 18:07:44 +02:00
|
|
|
|
2014-06-12 09:45:46 +02:00
|
|
|
return bare_half_pixel_shift(dhat, L, N)
|
|
|
|
|
|
|
|
def bare_half_pixel_shift(dhat, L, N, doshift=False):
|
|
|
|
|
|
|
|
# dhat_new,N2 = borg_upgrade_sampling(dhat, 2)
|
|
|
|
# d = (np.fft.irfftn(dhat_new)*(N2/L)**3)[1::2,1::2,1::2]
|
|
|
|
# del dhat_new
|
|
|
|
# dhat = np.fft.rfftn(d)*(L/N)**3
|
|
|
|
# return dhat, L
|
|
|
|
|
|
|
|
# dhat2 = np.zeros((N,N,N),dtype=np.complex128)
|
|
|
|
# dhat2[:,:,:N/2+1] = dhat
|
|
|
|
# dhat2[N:0:-1, N:0:-1, N:N/2:-1] = np.conj(dhat[1:,1:,1:N/2])
|
|
|
|
# dhat2[0, N:0:-1, N:N/2:-1] = np.conj(dhat[0, 1:, 1:N/2])
|
|
|
|
# dhat2[N:0:-1, 0, N:N/2:-1] = np.conj(dhat[1:, 0, 1:N/2])
|
|
|
|
# dhat2[0,0,N:N/2:-1] = np.conj(dhat[0, 0, 1:N/2])
|
|
|
|
|
2014-06-01 18:07:44 +02:00
|
|
|
ik = np.fft.fftfreq(N,d=L/N)*2*np.pi
|
|
|
|
phi = 0.5*L/N*(ik[:,None,None]+ik[None,:,None]+ik[None,None,:(N/2+1)])
|
2014-06-12 09:45:46 +02:00
|
|
|
# phi %= 2*np.pi
|
2014-06-01 18:07:44 +02:00
|
|
|
phase = np.cos(phi)+1j*np.sin(phi)
|
2014-06-12 09:45:46 +02:00
|
|
|
dhat = dhat*phase
|
|
|
|
dhat[N/2,:,:] = 0
|
|
|
|
dhat[:,N/2,:] = 0
|
|
|
|
dhat[:,:,N/2] = 0
|
2014-06-01 18:07:44 +02:00
|
|
|
|
2014-06-12 09:45:46 +02:00
|
|
|
return dhat, L
|
2014-06-01 18:07:44 +02:00
|
|
|
|