"NeighBlock" <- function(y, wavelet = "s8", j0 = NULL, extension = NULL) { n <- length(y) J <- ceiling(log(n, 2)) L0 <- floor(log(2^J)/2) L1 <- max(1, floor(L0/2)) L <- L0 + 2 * L1 if(is.null(j0)) j0 <- ceiling(log(log(2^J), 2)) + 1 j0 <- max(j0, floor(log(log(2^J), 2))) #Use MAD to estimate the noise level of the signal. noise.level <- median(abs(diff(y) - median(diff(y))))/(sqrt(2) * 0.6745 ) thresh <- 4.505241 * L * noise.level^2 #check the boundary. nlevels <- J - j0 if(2^J > n) { add.left_floor((2^J - n)/2); add.right_ceiling((2^J - n)/2) if(is.null(extension)) extension <- "reflection" if(extension == "reflection"){ if(add.left==0) y <- c(y, y[n:(n - add.right + 1)]) else y <- c(y[add.left:1], y, y[n:(n - add.right + 1)]) } else if(extension == "periodic"){ if(add.left==0) y <- c(y, y[1:add.right]) else y <- c(y[(n-add.left+1):n], y, y[1:add.right]) } else if(extension == "zero"){ add.left_0; add.right_2^J - n y <- c(y, rep(0, add.right)) } else stop("Available extension rule: periodic, reflection, zero") } ydwt <- dwt(y, wavelet, n.levels = nlevels) for(level in 1:nlevels) { y <- as.vector(ydwt[[paste("d", level, sep = "")]]) m <- length(y) nb <- floor(m/L0) yy <- c(y[(m - L1 + 1):m], y, y[1:L1]) SS <- rep(0, nb) for(b in 1:nb) { SS[b] <- sum(yy[((b - 1) * L0 + 1):((b - 1) * L0 + L)]^ 2) } factor <- pmax(0, 1 - thresh/SS) factor <- rep(factor, rep(L0, nb)) y[1:(nb * L0)] <- y[1:(nb * L0)] * factor if(m > nb * L0) { Lb_floor((L-(m-nb*L0))/2) SSL <- sum(c(y[(m - L+ Lb + 1):m], y[1:Lb])^2) y[(nb * L0 + 1):m] <- y[(nb * L0 + 1):m] * max(0, 1 - thresh/SSL) } ydwt[[paste("d", level, sep = "")]] <- y } if(2^J >n) output_reconstruct(ydwt)[(add.left+1):(add.left+n)] else output_reconstruct(ydwt) output }