NeighCoeff <- function(y, wavelet = "s8", shrink.rule = "soft", j0 = NULL, extension = NULL) { n <- length(y) J <- ceiling(log(n, 2)) if(is.null(j0)) j0 <- ceiling(log(log(2^J), 2)) + 1 j0 <- max(j0, 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 <- 2 * log(n) * noise.level^2 nlevels <- J - j0 add <- 2^J - n if(add > 0) { add.left_floor(add/2); add.right_add-add.left 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.right+1):n], y, y[1:add.left]) } 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) yy <- c(y[m], y, y[1]) SS <- rep(0, m) for(b in 1:m) { SS[b] <- sum((yy[b:(b + 2)])^2) } if(shrink.rule == "soft") { ydwt[[paste("d", level, sep = "")]] <- y * pmax(0, 1 - thresh/SS) } else if(shrink.rule == "hard") { y[SS <= thresh] <- 0 ydwt[[paste("d", level, sep = "")]] <- y } else stop("Available shrink.rule: soft, hard") } if(2^J >n) output_reconstruct(ydwt)[(add.left+1):(add.left+n)] else output_reconstruct(ydwt) output }