Skip to content

Commit

Permalink
more efficient support function
Browse files Browse the repository at this point in the history
  • Loading branch information
vincentcp committed Jun 14, 2018
1 parent 71cc836 commit c33852e
Show file tree
Hide file tree
Showing 3 changed files with 18 additions and 11 deletions.
20 changes: 10 additions & 10 deletions src/dwt/wvlt.jl
Original file line number Diff line number Diff line change
Expand Up @@ -45,16 +45,16 @@ _vanishingmoments(::Prl, W, is_orthogonal::Type{True}) = vanishingmoments(Prl(),
###############################################################################
# support/support_length
###############################################################################
support{WT<:DiscreteWavelet}(side::Side, kind::Scl, ::Type{WT}, j::Int=0, k::Int=0) = (j == 0 && k == 0) ?
Sequences.support(filter(side, Scl(), WT)) :
Sequences.support(filter(side, Scl(), WT), j, k)

function support{WT<:DiscreteWavelet}(side::Side, kind::Wvl, ::Type{WT}, j::Int=0, k::Int=0)
supp1 = support(side, Scl(), WT)
supp2 = support(inv(side), Scl(), WT)
S1 = Int(1/2*(supp1[1]-supp2[2]+1))
S2 = Int(1/2*(supp1[2]-supp2[1]+1))
(j == 0 && k == 0) ? (S1,S2) : (1/(1<<j)*(S1[1]+k), 1/(1<<j)*(S2+k))
support{WT<:DiscreteWavelet}(side::Side, kind::Scl, ::Type{WT}) =
Sequences.support(filter(side, Scl(), WT))
function support{WT<:DiscreteWavelet}(side::Side, kind::Wvl, ::Type{WT})
l1, r1 = support(side, Scl(), WT)
l2, r2 = support(inv(side), Scl(), WT)
((l1-r2+1)>>1, (r1-l2+1)>>1)
end
function support{WT<:DiscreteWavelet}(side::Side, kind::Kind, ::Type{WT}, j::Int, k::Int)
l, r = support(side, kind, WT)
(1/(1<<j)*(l+k), 1/(1<<j)*(r+k))
end

support_length{WT<:DiscreteWavelet}(side::Side, kind::Kind, ::Type{WT}) = support(side, kind, WT)[2] - support(side, kind, WT)[1]
Expand Down
5 changes: 4 additions & 1 deletion src/dwt/wvlt_cdf.jl
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ cdf66_htilde = (16384, [-63, 378, -476, -1554, 4404, 1114, -13860, 4158, 28182,

# Determine the offset of the filter such that the filter is even symmetric w.r.t
# 0 (for filters of odd length) or 1/2 (for filters of even length).
symmetric_offset(n) = iseven(n) ? -n>>1+1 : -(n-1)>>1
symmetric_offset(n) = -((n-1)>>1)

# The coefficients of the primal scaling function are simply a binomial sequence for all n.
cdf_coef(n) = 1//(1<<(n-1))*[binomial(n,k) for k in 0:n]
Expand All @@ -95,11 +95,14 @@ for (p,q,htilde) in ( (1, 1, :cdf11_htilde), (1, 3, :cdf13_htilde), (1, 5, :cdf1
(6, 2, :cdf62_htilde), (6, 4, :cdf64_htilde), (6, 6, :cdf66_htilde) )
@eval filter{T}(side::Dul, kind::Cof, ::Type{CDFWavelet{$p,$q,T}}) = CompactSequence(2//$htilde[1]*$htilde[2], symmetric_offset(length($htilde[2])))
@eval filter{T}(side::Dul, kind::Scl, ::Type{CDFWavelet{$p,$q,T}}) = CompactSequence(sqrt(T(2))/$htilde[1]*convert(Array{T,1}, $htilde[2]), symmetric_offset(length($htilde[2])))
@eval support{T}(side::Dul, kind::Scl, ::Type{CDFWavelet{$p,$q,T}}) = (symmetric_offset(length($htilde[2])),symmetric_offset(length($htilde[2]))+length($htilde[2])-1)
@eval support_length{T}(side::Dul, kind::Scl, ::Type{CDFWavelet{$p,$q,T}}) = length($htilde[2])-1
end

vanishingmoments{N1,N2,T}(::Prl, ::Type{CDFWavelet{N1,N2,T}}) = N1
vanishingmoments{N1,N2,T}(::Dul, ::Type{CDFWavelet{N1,N2,T}}) = N2
support{N1,N2,T}(::Prl, ::Scl, ::Type{CDFWavelet{N1,N2,T}}) = (symmetric_offset(N1+1), symmetric_offset(N1+1) + N1)
support_length(::Prl, ::Scl, ::Type{CDFWavelet{N1,N2,T}}) where {N1,N2,T} = N1

evaluate{N1,N2,T,S<:Real}(side::Prl, kind::Scl, w::CDFWavelet{N1,N2,T}, j::Int, k::Int, x::S; options...) =
T(2)^(j/2)*evaluate_Bspline(N1-1, T(2)^j*x-T(k)-T(DWT.symmetric_offset(N1+1)), promote_type(T, eltype(x)))
Expand Down
4 changes: 4 additions & 0 deletions src/dwt/wvlt_daubechies.jl
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,11 @@ name{N,T}(::Type{DaubechiesWavelet{N,T}}) = string("db",N,"_",T)
name{N}(::Type{DaubechiesWavelet{N,Float64}}) = string("db",N)

support{N,T}(::Prl, ::Scl, ::Type{DaubechiesWavelet{N,T}}) = (0,2N-1)
support_length(::Prl, ::Scl, ::Type{DaubechiesWavelet{N,T}}) where {N,T} = 2N-1
support{N,T}(::Dul, ::Scl, ::Type{DaubechiesWavelet{N,T}}) = (0,2N-1)
support_length(::Dul, ::Scl, ::Type{DaubechiesWavelet{N,T}}) where {N,T} = 2N-1
vanishingmoments{N,T}(::Prl, ::Type{DaubechiesWavelet{N,T}}) = N
vanishingmoments{N,T}(::Dul, ::Type{DaubechiesWavelet{N,T}}) = N

# Commented for testing purposes
# evaluate{T,S<:Real}(::Prl, ::Scl, w::DWT.HaarWavelet{T}, j, k, x::Number; options...) =
Expand Down

0 comments on commit c33852e

Please sign in to comment.