-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathperiodicKernel.py
More file actions
108 lines (82 loc) · 2.86 KB
/
periodicKernel.py
File metadata and controls
108 lines (82 loc) · 2.86 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
import numpy as np
from interp1DKernels import *
from functools import partial
# Approx of the Sinc periodic Eq 10 of
# Gary M. Bernstein & Daniel Gruen 2014 article
# https://arxiv.org/pdf/1401.2636v2.pdf
###
# "sinc periodic kernel" aka the "ideal" kernel
# In practice N is the length of the DFT (1D)
###
def KuSincWrapped(u,N):
return np.exp(1j * np.pi * u) * np.sinc(N*u)/np.sinc(u) # Eq. 10
###
# Approx using the Lanczos-m (non renormalized) kernel
###
def lanczos_p(x,m,N):
x = np.abs(x)
th=m/N
return np.piecewise(x, [x<th,x>=th],[lambda x: lanczos(N*x,m)/lanczos(x,m), lambda x:0])
def rlanczosWrapped(u,N,m=3):
return np.sign(0.5-np.floor(u+0.5)%2) * lanczos_p(u-np.floor(u+0.5),m,N)
def lanczosWrapped(u,N,m=3):
return np.exp(1j * np.pi * u) * rlanczosWrapped(u,N,m)
lanczos3Wrapped = partial(lanczosWrapped,m=3)
lanczos5Wrapped = partial(lanczosWrapped,m=5)
###
# Approx 1st order of Lanczos-m (renormalized) kernel
###
def lanczosRenorm_p(x,m,N):
x = np.abs(x)
th=m/N
return np.piecewise(x, [x<th,x>=th],[lambda x: lanczos_norm(N*x,m)/lanczos_norm(x,m), lambda x:0])
def rlanczosRenormWrapped(u,N,m=3):
return np.sign(0.5-np.floor(u+0.5)%2) * lanczosRenorm_p(u-np.floor(u+0.5),m,N)
def lanczosRenormWrapped(u,N,m=3):
return np.exp(1j * np.pi * u) * rlanczosRenormWrapped(u,N,m)
lanczosRenorm3Wrapped = partial(lanczosRenormWrapped,m=3)
lanczosRenorm5Wrapped = partial(lanczosRenormWrapped,m=5)
###
# Approx using the Cubic kernel
###
def cubic_p(x,N):
x = np.abs(x)
th=2./N
return np.piecewise(x, [x<th,x>=th],[lambda x: h3(N*x)/h3(x), lambda x:0])
def rcubicWrapped(u,N):
return np.sign(0.5-np.floor(u+0.5)%2)*cubic_p(u-np.floor(u+0.5),N)
def cubicWrapped(u,N):
return np.exp(1j * np.pi * u) * rcubicWrapped(u,N)
###
# Approx using the Quintic kernel proposed by Bernstein & Gruen
###
def quinticBG_p(x,N):
x = np.abs(x)
th=3./N
return np.piecewise(x, [x<th,x>=th],[lambda x: h5Gary(N*x)/h5Gary(x), lambda x:0])
def rquinticBGWrapped(u,N):
return np.sign(0.5-np.floor(u+0.5)%2)*quinticBG_p(u-np.floor(u+0.5),N)
def quinticBGWrapped(u,N):
return np.exp(1j * np.pi * u) * rquinticBGWrapped(u,N)
###
# Approx using the Quintic kernel proposed by JE
###
def quinticJE_p(x,N):
x = np.abs(x)
th=3./N
return np.piecewise(x, [x<th,x>=th],[lambda x: h5JE(N*x)/h5JE(x), lambda x:0])
def rquinticJEWrapped(u,N):
return np.sign(0.5-np.floor(u+0.5)%2)*quinticJE_p(u-np.floor(u+0.5),N)
def quinticJEWrapped(u,N):
return np.exp(1j * np.pi * u) * rquinticJEWrapped(u,N)
##
#Generic NOT YET VALIDATED
##
def k_p(x,N,ker,xmax):
x = np.abs(x)
th=xmax/N
return np.piecewise(x, [x<th,x>=th],[lambda x: h5JE(N*x)/h5JE(x), lambda x:0])
def rkWrapped(u,N,ker,xmax):
return np.sign(0.5-np.floor(u+0.5)%2)*k_p(u-np.floor(u+0.5),N,ker,xmax)
def kernelWrapped(u,N,ker,umax):
return np.exp(1j * np.pi * u) * kWrapped(u,N,ker,xmax)