1010# DWT
1111# 1-D
1212# writes to y
13- function _dwt! (y:: AbstractVector{T} , x:: AbstractVector{T} ,
14- filter:: OrthoFilter , L:: Integer , fw:: Bool ) where T<: Number
15- si = Vector {T} (undef, length (filter)- 1 ) # tmp filter vector
13+ function _dwt! (y:: AbstractVector{Ty} , x:: AbstractVector{Tx} ,
14+ filter:: OrthoFilter , L:: Integer , fw:: Bool ) where {Tx<: Number , Ty<: Number }
15+ T = promote_type (Tx, Ty)
16+ si = Vector {T} (undef, length (filter)- 1 ) # tmp filter vector
1617 scfilter, dcfilter = WT. makereverseqmfpair (filter, fw, T)
1718 return _dwt! (y, x, filter, L, fw, dcfilter, scfilter, si)
1819end
19- function _dwt! (y:: AbstractVector{T } , x:: AbstractVector{T } ,
20+ function _dwt! (y:: AbstractVector{<:Number } , x:: AbstractVector{<:Number } ,
2021 filter:: OrthoFilter , L:: Integer , fw:: Bool ,
2122 dcfilter:: Vector{T} , scfilter:: Vector{T} ,
2223 si:: Vector{T} , snew:: Vector{T} = Vector {T} (undef, ifelse (L> 1 , length (x)>> 1 , 0 ))) where T<: Number
@@ -35,7 +36,7 @@ function _dwt!(y::AbstractVector{T}, x::AbstractVector{T},
3536 if L == 0
3637 return copyto! (y,x)
3738 end
38- s = x # s is currect scaling coefs location
39+ s = x # s is current scaling coefs location
3940 filtlen = length (filter)
4041
4142 lrange = 1 : L
@@ -59,10 +60,10 @@ function _dwt!(y::AbstractVector{T}, x::AbstractVector{T},
5960 end
6061 return y
6162end
62- function unsafe_dwt1level! (y:: AbstractVector{T } , x:: AbstractVector{T } ,
63+ function unsafe_dwt1level! (y:: AbstractVector{<:Number } , x:: AbstractVector{<:Number } ,
6364 filter:: OrthoFilter , fw:: Bool ,
64- dcfilter:: Vector {T} , scfilter:: Vector {T} ,
65- si:: Vector {T} ) where T<: Number
65+ dcfilter:: FVector {T} , scfilter:: FVector {T} ,
66+ si:: FVector {T} ) where T<: Number
6667 n = length (x)
6768 l = 1
6869 filtlen = length (filter)
@@ -81,11 +82,11 @@ function unsafe_dwt1level!(y::AbstractVector{T}, x::AbstractVector{T},
8182 return y
8283end
8384
84- function dwt_transform_strided! (y:: Array{T } , x:: AbstractArray{T } ,
85+ function dwt_transform_strided! (y:: AbstractArray{<:Number } , x:: AbstractArray{<:Number } ,
8586 msub:: Int , nsub:: Int , stride:: Int , idx_func:: Function ,
86- tmpvec:: Vector {T} , tmpvec2:: Vector {T} ,
87+ tmpvec:: FVector {T} , tmpvec2:: FVector {T} ,
8788 filter:: OrthoFilter , fw:: Bool ,
88- dcfilter:: Vector {T} , scfilter:: Vector {T} , si:: Vector {T} ) where T<: Number
89+ dcfilter:: FVector {T} , scfilter:: FVector {T} , si:: FVector {T} ) where T<: Number
8990 for i= 1 : msub
9091 xi = idx_func (i)
9192 stridedcopy! (tmpvec, x, xi, stride, nsub)
@@ -94,11 +95,11 @@ function dwt_transform_strided!(y::Array{T}, x::AbstractArray{T},
9495 end
9596end
9697
97- function dwt_transform_cols! (y:: Array{T } , x:: AbstractArray{T } ,
98+ function dwt_transform_cols! (y:: AbstractArray{<:Number } , x:: AbstractArray{<:Number } ,
9899 msub:: Int , nsub:: Int , idx_func:: Function ,
99- tmpvec:: Vector {T} ,
100+ tmpvec:: FVector {T} ,
100101 filter:: OrthoFilter , fw:: Bool ,
101- dcfilter:: Vector {T} , scfilter:: Vector {T} , si:: Vector {T} ) where T<: Number
102+ dcfilter:: FVector {T} , scfilter:: FVector {T} , si:: FVector {T} ) where T<: Number
102103 for i= 1 : nsub
103104 xi = idx_func (i)
104105 copyto! (tmpvec, 1 , x, xi, msub)
@@ -109,16 +110,17 @@ end
109110
110111# 2-D
111112# writes to y
112- function _dwt! (y:: Matrix{T } , x:: AbstractMatrix{T } ,
113- filter:: OrthoFilter , L:: Integer , fw:: Bool ) where T <: Number
113+ function _dwt! (y:: AbstractMatrix{Ty } , x:: AbstractMatrix{Tx } ,
114+ filter:: OrthoFilter , L:: Integer , fw:: Bool ) where {Tx <: Number , Ty <: Number }
114115 m, n = size (x)
116+ T = promote_type (Tx, Ty)
115117 si = Vector {T} (undef, length (filter)- 1 ) # tmp filter vector
116118 tmpbuffer = Vector {T} (undef, max (n<< 1 , m)) # tmp storage vector
117119 scfilter, dcfilter = WT. makereverseqmfpair (filter, fw, T)
118120
119121 return _dwt! (y, x, filter, L, fw, dcfilter, scfilter, si, tmpbuffer)
120122end
121- function _dwt! (y:: Matrix{T } , x:: AbstractMatrix{T } ,
123+ function _dwt! (y:: AbstractMatrix{<:Number } , x:: AbstractMatrix{<:Number } ,
122124 filter:: OrthoFilter , L:: Integer , fw:: Bool ,
123125 dcfilter:: Vector{T} , scfilter:: Vector{T} ,
124126 si:: Vector{T} , tmpbuffer:: Vector{T} ) where T<: Number
@@ -187,16 +189,17 @@ end
187189
188190# 3-D
189191# writes to y
190- function _dwt! (y:: Array{T , 3} , x:: AbstractArray{T , 3} ,
191- filter:: OrthoFilter , L:: Integer , fw:: Bool ) where T <: Number
192+ function _dwt! (y:: AbstractArray{Ty , 3} , x:: AbstractArray{Tx , 3} ,
193+ filter:: OrthoFilter , L:: Integer , fw:: Bool ) where {Tx <: Number , Ty <: Number }
192194 m, n, d = size (x)
195+ T = promote_type (Tx, Ty)
193196 si = Vector {T} (undef, length (filter)- 1 ) # tmp filter vector
194197 tmpbuffer = Vector {T} (undef, max (m, n<< 1 , d<< 1 )) # tmp storage vector
195198 scfilter, dcfilter = WT. makereverseqmfpair (filter, fw, T)
196199
197200 return _dwt! (y, x, filter, L, fw, dcfilter, scfilter, si, tmpbuffer)
198201end
199- function _dwt! (y:: Array{T , 3} , x:: AbstractArray{T , 3} ,
202+ function _dwt! (y:: AbstractArray{<:Number , 3} , x:: AbstractArray{<:Number , 3} ,
200203 filter:: OrthoFilter , L:: Integer , fw:: Bool ,
201204 dcfilter:: Vector{T} , scfilter:: Vector{T} ,
202205 si:: Vector{T} , tmpbuffer:: Vector{T} ) where T<: Number
@@ -329,7 +332,7 @@ function _wpt!(y::AbstractVector{T}, x::AbstractVector{T}, filter::OrthoFilter,
329332 Lfw = (fw ? Lmax- L : L- 1 )
330333 nj = detailn (n, Lfw)
331334 treeind = 2 ^ (Lfw)- 1
332- dx = unsafe_vectorslice (snew, 1 , nj)
335+ dx = first ? x : unsafe_vectorslice (snew, 1 , nj) # dx will be overwritten if first
333336
334337 while ix <= n
335338 if tree[treeind+ k]
381384# x : filter convolved with x[ix:ix+nx-1], where nx=nout*2 (shifted by shift)
382385# ss : shift downsampling
383386# based on Base.filt
384- function filtdown! (f:: Vector {T} , si:: Vector {T} ,
385- out:: AbstractVector{T} , iout:: Integer , nout:: Integer ,
386- x:: AbstractVector{T } , ix:: Integer ,
387+ function filtdown! (f:: AbstractVector {T} , si:: AbstractVector {T} ,
388+ out:: AbstractVector{<:Number} , iout:: Integer , nout:: Integer ,
389+ x:: AbstractVector{<:Number } , ix:: Integer ,
387390 shift:: Integer = 0 , ss:: Bool = false ) where T<: Number
388391 nx = nout<< 1
389392 silen = length (si)
462465# ss : shift upsampling
463466# based on Base.filt
464467function filtup! (add2out:: Bool , f:: Vector{T} , si:: Vector{T} ,
465- out:: AbstractVector{T} , iout:: Integer , nout:: Integer ,
466- x:: AbstractVector{T } , ix:: Integer ,
468+ out:: AbstractVector{<:Number} , iout:: Integer , nout:: Integer ,
469+ x:: AbstractVector{<:Number } , ix:: Integer ,
467470 shift:: Integer = 0 , ss:: Bool = false ) where T<: Number
468471 nx = nout>> 1
469472 silen = length (si)
0 commit comments