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 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149
|
#' Dual-tree Complex 2D Discrete Wavelet Transform
#'
#' Dual-tree complex 2D discrete wavelet transform (DWT).
#'
#'
#' @usage cplxdual2D(x, J, Faf, af)
#' @usage icplxdual2D(w, J, Fsf, sf)
#' @aliases cplxdual2D icplxdual2D
#' @param x 2D array.
#' @param w wavelet coefficients.
#' @param J number of stages.
#' @param Faf first stage analysis filters for tree i.
#' @param af analysis filters for the remaining stages on tree i.
#' @param Fsf last stage synthesis filters for tree i.
#' @param sf synthesis filters for the preceeding stages.
#' @return For the analysis of \code{x}, the output is \item{w}{wavelet
#' coefficients indexed by \code{[[j]][[i]][[d1]][[d2]]}, where
#' \eqn{j=1,\ldots,J} (scale), \eqn{i=1} (real part) or \eqn{i=2} (imag part),
#' \eqn{d1=1,2} and \eqn{d2=1,2,3} (orientations).} For the synthesis of
#' \code{w}, the output is \item{y}{output signal.}
#' @author Matlab: S. Cai, K. Li and I. Selesnick; R port: B. Whitcher
#' @seealso \code{\link{FSfarras}}, \code{\link{farras}}, \code{\link{afb2D}},
#' \code{\link{sfb2D}}.
#' @keywords ts
#' @examples
#'
#' \dontrun{
#' ## EXAMPLE: cplxdual2D
#' x = matrix(rnorm(32*32), 32, 32)
#' J = 5
#' Faf = FSfarras()$af
#' Fsf = FSfarras()$sf
#' af = dualfilt1()$af
#' sf = dualfilt1()$sf
#' w = cplxdual2D(x, J, Faf, af)
#' y = icplxdual2D(w, J, Fsf, sf)
#' err = x - y
#' max(abs(err))
#' }
#'
cplxdual2D <- function(x, J, Faf, af) {
## Dual-Tree Complex 2D Discrete Wavelet Transform
##
## USAGE:
## w = cplxdual2D(x, J, Faf, af)
## INPUT:
## x - 2-D array
## J - number of stages
## Faf{i}: first stage filters for tree i
## af{i}: filters for remaining stages on tree i
## OUTPUT:
## w{j}{i}{d1}{d2} - wavelet coefficients
## j = 1..J (scale)
## i = 1 (real part); i = 2 (imag part)
## d1 = 1,2; d2 = 1,2,3 (orientations)
## w{J+1}{m}{n} - lowpass coefficients
## d1 = 1,2; d2 = 1,2
## EXAMPLE:
## x = rand(256);
## J = 5;
## [Faf, Fsf] = FSfarras;
## [af, sf] = dualfilt1;
## w = cplxdual2D(x, J, Faf, af);
## y = icplxdual2D(w, J, Fsf, sf);
## err = x - y;
## max(max(abs(err)))
##
## WAVELET SOFTWARE AT POLYTECHNIC UNIVERSITY, BROOKLYN, NY
## http://eeweb.poly.edu/iselesni/WaveletSoftware/
## normalization
x <- x/2
w <- vector("list", J+1)
for (m in 1:2) {
w[[1]][[m]] <- vector("list", 2)
for (n in 1:2) {
w[[1]][[m]][[n]] <- vector("list", 2)
temp <- afb2D(x, Faf[[m]], Faf[[n]])
lo <- temp$lo
w[[1]][[m]][[n]] <- temp$hi
if (J > 1) {
for (j in 2:J) {
temp <- afb2D(lo, af[[m]], af[[n]])
lo <- temp$lo
w[[j]][[m]][[n]] <- temp$hi
}
w[[J+1]][[m]][[n]] <- lo
}
}
}
for (j in 1:J) {
for (m in 1:3) {
w[[j]][[1]][[1]][[m]] <- pm(w[[j]][[1]][[1]][[m]])
w[[j]][[2]][[2]][[m]] <- pm(w[[j]][[2]][[2]][[m]])
w[[j]][[1]][[2]][[m]] <- pm(w[[j]][[1]][[2]][[m]])
w[[j]][[2]][[1]][[m]] <- pm(w[[j]][[2]][[1]][[m]])
}
}
return(w)
}
icplxdual2D <- function(w, J, Fsf, sf) {
## Inverse Dual-Tree Complex 2D Discrete Wavelet Transform
##
## USAGE:
## y = icplxdual2D(w, J, Fsf, sf)
## INPUT:
## w - wavelet coefficients
## J - number of stages
## Fsf - synthesis filters for final stage
## sf - synthesis filters for preceeding stages
## OUTPUT:
## y - output array
## See cplxdual2D
##
## WAVELET SOFTWARE AT POLYTECHNIC UNIVERSITY, BROOKLYN, NY
## http://eeweb.poly.edu/iselesni/WaveletSoftware/
for (j in 1:J) {
for (m in 1:3) {
w[[j]][[1]][[1]][[m]] <- pm(w[[j]][[1]][[1]][[m]])
w[[j]][[2]][[2]][[m]] <- pm(w[[j]][[2]][[2]][[m]])
w[[j]][[1]][[2]][[m]] <- pm(w[[j]][[1]][[2]][[m]])
w[[j]][[2]][[1]][[m]] <- pm(w[[j]][[2]][[1]][[m]])
}
}
y <- matrix(0, 2*nrow(w[[1]][[1]][[1]][[1]]), 2*ncol(w[[1]][[1]][[1]][[1]]))
for (m in 1:2) {
for (n in 1:2) {
lo <- w[[J+1]][[m]][[n]]
if (J > 1) {
for (j in J:2) {
lo <- sfb2D(lo, w[[j]][[m]][[n]], sf[[m]], sf[[n]])
}
lo <- sfb2D(lo, w[[1]][[m]][[n]], Fsf[[m]], Fsf[[n]])
y <- y + lo
}
}
}
## normalization
return(y/2)
}
|