@@ -61,73 +61,71 @@ function legendre_ϕ_ψ(k)
61
61
return ϕ, ψ1, ψ2
62
62
end
63
63
64
- # function chebyshev_ϕ_ψ(k)
65
- # ϕ_coefs = zeros(k, k)
66
- # ϕ_2x_coefs = zeros(k, k)
67
-
68
- # p = Polynomial([-1, 2]) # 2x-1
69
- # p2 = Polynomial([-1, 4]) # 4x-1
70
-
71
- # for ki in 0:(k-1)
72
- # if ki == 0
73
- # ϕ_coefs[ki+1, 1:(ki+1)] .= sqrt(2/π)
74
- # ϕ_2x_coefs[ki+1, 1:(ki+1)] .= sqrt(4/π)
75
- # else
76
- # c = convert(Polynomial, gen_poly(Chebyshev, ki)) # Chebyshev of n=ki
77
- # ϕ_coefs[ki+1, 1:(ki+1)] .= 2/sqrt(π) .* coeffs(c(p))
78
- # ϕ_2x_coefs[ki+1, 1:(ki+1)] .= sqrt(2) * 2/sqrt(π) .* coeffs(c(p2))
79
- # end
80
- # end
81
-
82
- # ϕ = [ϕ_(ϕ_coefs[i, :]) for i in 1:k]
83
-
84
- # k_use = 2k
85
-
86
- # # phi = [partial(phi_, phi_coeff[i,:]) for i in range(k)]
64
+ function chebyshev_ϕ_ψ (k)
65
+ ϕ_coefs = zeros (k, k)
66
+ ϕ_2x_coefs = zeros (k, k)
67
+
68
+ p = Polynomial ([- 1 , 2 ]) # 2x-1
69
+ p2 = Polynomial ([- 1 , 4 ]) # 4x-1
70
+
71
+ for ki in 0 : (k- 1 )
72
+ if ki == 0
73
+ ϕ_coefs[ki+ 1 , 1 : (ki+ 1 )] .= sqrt (2 / π)
74
+ ϕ_2x_coefs[ki+ 1 , 1 : (ki+ 1 )] .= sqrt (4 / π)
75
+ else
76
+ c = convert (Polynomial, gen_poly (Chebyshev, ki)) # Chebyshev of n=ki
77
+ ϕ_coefs[ki+ 1 , 1 : (ki+ 1 )] .= 2 / sqrt (π) .* coeffs (c (p))
78
+ ϕ_2x_coefs[ki+ 1 , 1 : (ki+ 1 )] .= sqrt (2 ) * 2 / sqrt (π) .* coeffs (c (p2))
79
+ end
80
+ end
81
+
82
+ ϕ = [ϕ_ (ϕ_coefs[i, :]) for i in 1 : k]
83
+
84
+ k_use = 2 k
85
+ c = convert (Polynomial, gen_poly (Chebyshev, k_use))
86
+ x_m = roots (c (p))
87
+ # x_m[x_m==0.5] = 0.5 + 1e-8 # add small noise to avoid the case of 0.5 belonging to both phi(2x) and phi(2x-1)
88
+ # not needed for our purpose here, we use even k always to avoid
89
+ wm = π / k_use / 2
90
+
91
+ ψ1_coefs = zeros (k, k)
92
+ ψ2_coefs = zeros (k, k)
93
+
94
+ ψ1 = Array {Any,1} (undef, k)
95
+ ψ2 = Array {Any,1} (undef, k)
96
+
97
+ for ki in 0 : (k- 1 )
98
+ ψ1_coefs[ki+ 1 , :] .= ϕ_2x_coefs[ki+ 1 , :]
99
+ for i in 0 : (k- 1 )
100
+ proj_ = sum (wm .* ϕ[i+ 1 ]. (x_m) .* sqrt (2 ) .* ϕ[ki+ 1 ]. (2 * x_m))
101
+ ψ1_coefs[ki+ 1 , :] .- = proj_ .* view (ϕ_coefs, i+ 1 , :)
102
+ ψ2_coefs[ki+ 1 , :] .- = proj_ .* view (ϕ_coefs, i+ 1 , :)
103
+ end
104
+
105
+ for j in 0 : (ki- 1 )
106
+ proj_ = sum (wm .* ψ1[j+ 1 ]. (x_m) .* sqrt (2 ) .* ϕ[ki+ 1 ]. (2 * x_m))
107
+ ψ1_coefs[ki+ 1 , :] .- = proj_ .* view (ψ1_coefs, j+ 1 , :)
108
+ ψ2_coefs[ki+ 1 , :] .- = proj_ .* view (ψ2_coefs, j+ 1 , :)
109
+ end
110
+
111
+ ψ1[ki+ 1 ] = ϕ_ (ψ1_coefs[ki+ 1 ,:]; lb= 0. , ub= 0.5 )
112
+ ψ2[ki+ 1 ] = ϕ_ (ψ2_coefs[ki+ 1 ,:]; lb= 0.5 , ub= 1. )
87
113
88
- # # x = Symbol('x')
89
- # # kUse = 2*k
90
- # # roots = Poly(chebyshevt(kUse, 2*x-1)).all_roots()
91
- # # x_m = np.array([rt.evalf(20) for rt in roots]).astype(np.float64)
92
- # # # x_m[x_m==0.5] = 0.5 + 1e-8 # add small noise to avoid the case of 0.5 belonging to both phi(2x) and phi(2x-1)
93
- # # # not needed for our purpose here, we use even k always to avoid
94
- # # wm = np.pi / kUse / 2
114
+ norm1 = sum (wm .* ψ1[ki+ 1 ]. (x_m) .* ψ1[ki+ 1 ]. (x_m))
115
+ norm2 = sum (wm .* ψ2[ki+ 1 ]. (x_m) .* ψ2[ki+ 1 ]. (x_m))
95
116
96
- # # psi1_coeff = np.zeros((k, k))
97
- # # psi2_coeff = np.zeros((k, k))
98
-
99
- # # psi1 = [[] for _ in range(k)]
100
- # # psi2 = [[] for _ in range(k)]
101
-
102
- # # for ki in range(k):
103
- # # psi1_coeff[ki,:] = phi_2x_coeff[ki,:]
104
- # # for i in range(k):
105
- # # proj_ = (wm * phi[i](x_m) * np.sqrt(2)* phi[ki](2*x_m)).sum()
106
- # # psi1_coeff[ki,:] -= proj_ * phi_coeff[i,:]
107
- # # psi2_coeff[ki,:] -= proj_ * phi_coeff[i,:]
108
-
109
- # # for j in range(ki):
110
- # # proj_ = (wm * psi1[j](x_m) * np.sqrt(2) * phi[ki](2*x_m)).sum()
111
- # # psi1_coeff[ki,:] -= proj_ * psi1_coeff[j,:]
112
- # # psi2_coeff[ki,:] -= proj_ * psi2_coeff[j,:]
113
-
114
- # # psi1[ki] = partial(phi_, psi1_coeff[ki,:], lb = 0, ub = 0.5)
115
- # # psi2[ki] = partial(phi_, psi2_coeff[ki,:], lb = 0.5, ub = 1)
116
-
117
- # # norm1 = (wm * psi1[ki](x_m) * psi1[ki](x_m)).sum()
118
- # # norm2 = (wm * psi2[ki](x_m) * psi2[ki](x_m)).sum()
119
-
120
- # # norm_ = np.sqrt(norm1 + norm2)
121
- # # psi1_coeff[ki,:] /= norm_
122
- # # psi2_coeff[ki,:] /= norm_
123
- # # psi1_coeff[np.abs(psi1_coeff)<1e-8] = 0
124
- # # psi2_coeff[np.abs(psi2_coeff)<1e-8] = 0
125
-
126
- # # psi1[ki] = partial(phi_, psi1_coeff[ki,:], lb = 0, ub = 0.5+1e-16)
127
- # # psi2[ki] = partial(phi_, psi2_coeff[ki,:], lb = 0.5+1e-16, ub = 1)
117
+ norm_ = sqrt (norm1 + norm2)
118
+ ψ1_coefs[ki+ 1 , :] ./= norm_
119
+ ψ2_coefs[ki+ 1 , :] ./= norm_
120
+ zero_out! (ψ1_coefs)
121
+ zero_out! (ψ2_coefs)
128
122
129
- # # return phi, psi1, psi2
130
- # end
123
+ ψ1[ki+ 1 ] = ϕ_ (ψ1_coefs[ki+ 1 ,:]; lb= 0. , ub= 0.5 + 1e-16 )
124
+ ψ2[ki+ 1 ] = ϕ_ (ψ2_coefs[ki+ 1 ,:]; lb= 0.5 + 1e-16 , ub= 1. )
125
+ end
126
+
127
+ return ϕ, ψ1, ψ2
128
+ end
131
129
132
130
function legendre_filter (k)
133
131
H0 = zeros (k, k)legendre
0 commit comments