Title: | A Nondecimated Lifting Transform for Signal Denoising |
---|---|
Description: | Uses a modified lifting algorithm on which it builds the nondecimated lifting transform. It has applications in wavelet shrinkage. |
Authors: | Marina Knight, Matt Nunes |
Maintainer: | Matt Nunes <[email protected]> |
License: | GPL |
Version: | 2.2-1 |
Built: | 2024-11-17 06:43:08 UTC |
Source: | CRAN |
Denoises an input signal contaminated by noise. First the signal is decomposed using the modified lifting scheme (coded in fwtnpperm
) using a prespecified order, known as path or trajectory, of point removal. Once the signal is decomposed into wavelet coefficients (or details), these are subjected to an empirical Bayes shrinkage procedure in order to remove the noise, the transform is inverted and an estimate of the noisy signal is obtained.
denoiseperm(x, f, pred=LinearPred, neigh=1, int=TRUE, clo=FALSE, keep=2, rule = "median", per = sample(1:length(x),(length(x)-keep),FALSE),returnall=FALSE)
denoiseperm(x, f, pred=LinearPred, neigh=1, int=TRUE, clo=FALSE, keep=2, rule = "median", per = sample(1:length(x),(length(x)-keep),FALSE),returnall=FALSE)
x |
Vector of any length (not necessarily equally spaced) that gives the grid on which the signal is observed. |
f |
Vector of the same length as |
pred |
The type of regression to be used in the prediction step of the modified lifting algorithm. Choices are linear, quadratic or cubic (respectively, |
neigh |
Number of neighbours to be used in order to construct the neighbourhood of each point that has to be removed. If ' |
int |
Specifies whether ( |
clo |
If ( |
keep |
Number of scaling points we want at the end of the transform. The usual choice is |
rule |
The type of Bayesian shrinkage technique, with possible choices posterior median ( |
per |
Vector of length (length( |
returnall |
Indicates whether the function returns useful variables or just the denoised datapoints. |
Once the modified lifting transform is applied, the wavelet coeficients are divided into artificial levels. The details obtained by means of a lifting scheme have different variances, and will therefore be normalized to have the same variance as the noise. Those normalized details falling into the finest artificial level will be used for estimating the standard deviation of the noise that contaminated the signal. Using this estimate, the normalized details can then be shrunk and un-normalized (using package 'EbayesThresh'), and the transform inverted (using the function invtnp
of package 'adlift') to give an estimate of the signal. The choices for pred
can be found in the package 'adlift'.
If returnall=FALSE, the estimate of the function after denoising. If returnall=TRUE, a list with components:
fhat |
Estimated signal after removing the noise. |
w |
This is the matrix associated to the modified lifting transform. |
indsd |
Vector giving the standard deviations of the detail and scaling coefficients. |
al |
List giving the split of points between the artificial levels. |
sd |
Estimated standard deviation of the noise. |
Use this function together with the "adlift" and "EbayesThresh" packages available from CRAN.
Marina Knight ([email protected])
See the paper 'A "nondecimated" lifting transform' by Knight, M.I. and Nason, G.P. (2008) for further details.
fwtnpperm
, fwtnpperm
, and also invtnp
of package 'adlift'
# construct a grid x<-runif(256) # construct a true, normally unknown, signal g<-make.signal2("bumps",x=x) # now generate noise (here with mean 0 and signal-to-noise ratio 3) noise<-rnorm(256,mean=0,sd=sqrt(var(g))/3) # obtain a noisy version of the true signal g f<-g+noise # construct the trajectory which will indicate the order of point removal that will be followed by # the modified lifting algorithm # vec below gives the first (length(x)-keep) entries of a random permutation of (1:length(x)) vec<-sample(1:256,254,FALSE) # denoise the signal (x,f) by applying the modified lifting transform following the removal order # in vec and using adaptive prediction # and neighbourhoods of size 2 in symmetrical configuration # the details are then thresholded using posterior medians and the algorithm inverted # the proposed estimate of g is given by out$fhat$coeff out<-denoiseperm(x,f,pred=AdaptPred,neigh=1,int=TRUE,clo=FALSE,keep=2,rule="median",per=vec)
# construct a grid x<-runif(256) # construct a true, normally unknown, signal g<-make.signal2("bumps",x=x) # now generate noise (here with mean 0 and signal-to-noise ratio 3) noise<-rnorm(256,mean=0,sd=sqrt(var(g))/3) # obtain a noisy version of the true signal g f<-g+noise # construct the trajectory which will indicate the order of point removal that will be followed by # the modified lifting algorithm # vec below gives the first (length(x)-keep) entries of a random permutation of (1:length(x)) vec<-sample(1:256,254,FALSE) # denoise the signal (x,f) by applying the modified lifting transform following the removal order # in vec and using adaptive prediction # and neighbourhoods of size 2 in symmetrical configuration # the details are then thresholded using posterior medians and the algorithm inverted # the proposed estimate of g is given by out$fhat$coeff out<-denoiseperm(x,f,pred=AdaptPred,neigh=1,int=TRUE,clo=FALSE,keep=2,rule="median",per=vec)
Performs the lifting transform on a signal with grid input and corresponding function values f. There is a unique correspondence between the grid values and the function values. Can also cope with length vector input instead of gridpoint vector input.
fwtnpperm (input, f, LocalPred = LinearPred, neighbours = 1, intercept = TRUE,closest = FALSE, nkeep = 2, initboundhandl = "reflect", mod = sample(1:length(input), (length(input) - nkeep), FALSE), do.W = FALSE, varonly = FALSE)
fwtnpperm (input, f, LocalPred = LinearPred, neighbours = 1, intercept = TRUE,closest = FALSE, nkeep = 2, initboundhandl = "reflect", mod = sample(1:length(input), (length(input) - nkeep), FALSE), do.W = FALSE, varonly = FALSE)
input |
A vector of grid values. Can be of any length, not necessarily equally spaced. |
f |
A vector of function values corresponding to input. Must be of the same length as input. |
LocalPred |
The type of regression to be performed. Possible options are |
neighbours |
The number of neighbours over which the regression is performed at each step. If closest is false, then this in fact denotes the number of neighbours on each side of the removed point. |
intercept |
Indicates whether or not the regression curve includes an intercept. |
closest |
Refers to the configuration of the chosen neighbours. If closest is false, the neighbours will be chosen symmetrically around the removed point. Otherwise, the closest neighbours will be chosen. |
nkeep |
The number of scaling coefficients to be kept in the final representation of the initial signal. This must be at least two. |
initboundhandl |
variable specifying how to handle the boundary at the start of the transform. Possible values are |
mod |
Vector of length (length( |
do.W |
A boolean indicating whether the transform matrix should be computed and returned. |
varonly |
A boolean indicating whether only the coefficient
variances should be returned (if |
Given points on a line, input, each with a corresponding envf value this algorithm computes a lifting transform of the (input,f) data. If lengths are inputted (inputtype="lengths"), then the gridpoints are taken to be the left endpoints of the intervals defined by the lengths inputted.
Step One. Order the grid values so that corresponding intervals can be constructed.
Step Two. Compute "integrals" for each point. For each point its integral is the length of the interval associated to the gridpoint.
Step Three. Identify the point to remove as that with the smallest integral. Generally, we remove points in order of smallest to largest integral. The integrals of neighbours of removed points change at each step.
Step Four(a). The neighbours of the removed point are identified using the specified neighbour configuration. The value of f at the removed point is predicted using the specified regression curve over the neighbours, unless an adaptive procedure is chosen. In this case, the algorithm adjusts itself. The difference between the removed point's f value and the prediction is computed: this is the wavelet coefficient for the removed point. The difference replaces the function value in the vector coeff at the removed point's location. In this way wavelet coefficients gradually overwrite (scaling) function values in coeff.
Step Four(b). The integrals and the scaling function values (other coeff values) of neighbours of the removed point are updated. The values of the rest of the scaling coefficients are unaffected.
Step Five. Return to step 3 but in the identification of a point to remove the updated integrals are used.
The algorithm continues until as many points as desired are removed. If
do.W=TRUE
, the predict and update lifting steps are used to
propogate coefficient contributions to the transform matrix W
.
If varonly=TRUE
, only the (detail and scaling) coefficient
variances are returned. After each lifting step, the
coefficient variance is computed and the transform matrix
row corresponding to the lifted coefficient is deleted for the
next stage (minimal storage efficiency). The transform matrix is not
returned (i.e. W=NULL
).
X |
data vector of the grid used in the transform. |
coeff |
vector of detail and scaling coefficients in the wavelet decomposition of the signal. |
origlengths |
vector of initial interval lengths corresponding to the gridpoints. |
lengths |
vector of (updated) interval lengths at the end of the transform. This is of length nkeep. |
lengthsremove |
vector of interval lengths corresponding to the points removed during the transform (in removelist). |
pointsin |
indices into X of the scaling coefficients in the wavelet decomposition. These are the indices of the X values which remain after all points in removelist have been predicted and removed. This has length nkeep. |
removelist |
a vector of indices into X of the lifted coefficients during the transform (in the order of removal). |
neighbrs |
a list of indices into X. Each list entry gives the indices of the neighbours of the removed point used at that particular step of the transform. |
neighbours |
the user-specified number of neighbours used in the prediction step of the transform. |
gamlist |
a list of all the prediction weights used at each step of the transform. |
alphalist |
a list of the update coefficients used in the update step of the decomposition. |
schemehist |
a vector of character strings indicating the type of regression used at each step of the transform. |
interhist |
a boolean vector indicating whether or not an intercept was used in the regression curve at each step. |
clolist |
a boolean vector showing whether or not the neighbours were symmetrical (FALSE) about the removed point during the transform. This is NULL except when |
Matt Nunes ([email protected]), Marina.Knight
AdaptNeigh
, AdaptPred
, CubicPred
, fwtnpmp
, invtnp
, LinearPred
, QuadPred
# # Generate some one-dimensional data: 100 observations. # input <- runif(100) f <- input^2 - 3*input # # Compute fwtnp function on this data # vec<-sample(1:100,98,FALSE) out <- fwtnpperm(input,f,LocalPred=AdaptPred,neighbours=2,closest=TRUE,mod=vec) # # That's it. #
# # Generate some one-dimensional data: 100 observations. # input <- runif(100) f <- input^2 - 3*input # # Compute fwtnp function on this data # vec<-sample(1:100,98,FALSE) out <- fwtnpperm(input,f,LocalPred=AdaptPred,neighbours=2,closest=TRUE,mod=vec) # # That's it. #
Starting with a noise-contaminated signal, we decompose it using a 'nondecimated' lifting algorithm (i.e. by applying the modified lifting transform following several random paths), shrink all the obtained detail coefficients and invert each transform to give an estimated signal. The average of all these estimates is the final proposal for estimating the true (unknown) signal.
nlt(x, f, J, Pred = AdaptPred, neighbours = 1, closest = FALSE, intercept = TRUE, nkeep = 2, trule = "median",verbose = TRUE,do.orig = FALSE, returnall = FALSE)
nlt(x, f, J, Pred = AdaptPred, neighbours = 1, closest = FALSE, intercept = TRUE, nkeep = 2, trule = "median",verbose = TRUE,do.orig = FALSE, returnall = FALSE)
x |
Vector of any length (possibly irregularly spaced) that gives the grid locations where the signal is observed. |
f |
Vector of the same length as |
J |
Number of trajectories to be used by the nondecimated lifting algorithm. |
Pred |
The type of regression to be used in the prediction step of the modified lifting algorithm. Choices are linear, quadratic or cubic (respectively, |
neighbours |
Number of neighbours to be used for defining the neighbourhood of each point that has to be removed. If ( |
closest |
If ( |
intercept |
Specifies whether ( |
nkeep |
Number of scaling points we want at the end of the application of the transform. The usual choice is |
trule |
The type of Bayesian shrinkage technique, with possible choices posterior median ( |
verbose |
A boolean indicating whether extra information should be printed. |
do.orig |
A boolean indicating whether the original |
returnall |
A boolean indicating whether the function returns useful variables or just the denoised datapoints. |
Essentially, this function applies J
times the modified lifting algorithm (that can be found in fwtnpperm
), and removes the noise from all sets of detail coefficients by using empirical Bayes shrinkage (of package 'EbayesThresh'). Inverting (by means of the function invtnp
of the package 'adlift') each transform consequently results in J
estimates of the (unknown) true signal. The average of these estimators is our proposed estimator. The functions that appear as choices for Pred
can be found in the package 'adlift'.
vec |
Matrix whose rows give the trajectories to be used by the nondecimated lifting algorithm. |
ghatnat |
Vector that gives the estimated true signal given by denoising using the lifting scheme that establishes its own order for removing the points (but with the same specification for prediction stage and neighbourhood as the modified algorithm), rather than a randomly generated order. |
aveghat |
Estimated signal, obtained as the average of the individual estimates from the random trajectory runs. |
Use this function together with the "adlift" and "EbayesThresh" packages available from CRAN.
Marina Knight ([email protected])
See the paper 'A "nondecimated" lifting transform.' by Knight, M.I. and Nason, G.P. (2009) for further details.
denoiseperm
, fwtnpperm
, fwtnpperm
, and also invtnp
of package 'adlift'
# construct the grid x<-runif(256) # construct the true, normally unknown, signal g<-make.signal2("blocks",x=x) # generate noise with mean 0 and signal-to-noise ratio 5 noise<-rnorm(256,mean=0,sd=sqrt(var(g))/5) # generate a noisy version of g f<-g+noise # decide on a number of random trajectories to be used (below J=100, in paper J=20,30), and apply # the nondecimated lifting transform to the noisy signal (x,f) # # below we apply the modified lifting transform J times, each time following a different path, # and using adaptive prediction with neighbourhoods of size 2 in closest configuration; # all details are then thresholded using posterior medians and the algorithms inverted # the aggregate estimator of g proposed by our method is found in out$aveghat out<-nlt(x,f,J=10,Pred=AdaptPred,neighbours=2,closest=TRUE,intercept=TRUE,nkeep=2,trule="median")
# construct the grid x<-runif(256) # construct the true, normally unknown, signal g<-make.signal2("blocks",x=x) # generate noise with mean 0 and signal-to-noise ratio 5 noise<-rnorm(256,mean=0,sd=sqrt(var(g))/5) # generate a noisy version of g f<-g+noise # decide on a number of random trajectories to be used (below J=100, in paper J=20,30), and apply # the nondecimated lifting transform to the noisy signal (x,f) # # below we apply the modified lifting transform J times, each time following a different path, # and using adaptive prediction with neighbourhoods of size 2 in closest configuration; # all details are then thresholded using posterior medians and the algorithms inverted # the aggregate estimator of g proposed by our method is found in out$aveghat out<-nlt(x,f,J=10,Pred=AdaptPred,neighbours=2,closest=TRUE,intercept=TRUE,nkeep=2,trule="median")
Works out the transform matrix for a particular prediction scheme and neighbourhood structure.
transmatdualperm(x, f, Pred = AdaptNeigh, neigh = 1, int = TRUE, clo = TRUE, keep = 2,perm = sample(1:length(x),(length(x)-keep),FALSE),varonly=FALSE)
transmatdualperm(x, f, Pred = AdaptNeigh, neigh = 1, int = TRUE, clo = TRUE, keep = 2,perm = sample(1:length(x),(length(x)-keep),FALSE),varonly=FALSE)
x |
A vector of grid values. Can be of any length, not necessarily equally spaced. |
f |
A vector of function values corresponding to x. Must be of the same length as x. |
Pred |
The type of regression to be performed. Possible options are |
neigh |
The number of neighbours over which the regression is performed at each step. If clo is false, then this in fact denotes the number of neighbours on each side of the removed point. |
int |
Indicates whether or not the regression curve includes an intercept. |
clo |
Refers to the configuration of the chosen neighbours. If clo is false, the neighbours will be chosen symmetrically around the removed point. Otherwise, the closest neighbours will be chosen. |
keep |
The number of scaling coefficients to be kept in the final representation of the initial signal. This must be at least two. |
perm |
Vector of length (length( |
varonly |
A boolean variable indicating whether only the
coefficient variances should be returned, i.e. just the diagonal of
the transform matrix |
The function uses Amatdual
to form the refinement matrices , from which the augmented matrices
are constructed. This process is iterated, to find the transform matrix (the top level augmented matrix). The rows and columns of this matrix are then reordered to be in the order of
out$coeff
, i.e. so that the columns correspond to .
out |
the output from the forward transform. |
Wnew |
the matrix associated to the wavelet transform. |
x |
the original gridpoint vector. |
This function has been left in the package for completeness. However, the transform matrix is (optionally) computed within the forward lifting
transform function fwtnp
.
Matt Nunes ([email protected]), Marina Knight
x1<-runif(10) y1<-make.signal2("doppler",x=x1) # vec<-sample(1:10,8,FALSE) a<-transmatdualperm(x1,y1,AdaptNeigh,2,TRUE,TRUE,2,perm=vec) # a$Wnew # #the transform matrix for this adaptive lifting scheme
x1<-runif(10) y1<-make.signal2("doppler",x=x1) # vec<-sample(1:10,8,FALSE) a<-transmatdualperm(x1,y1,AdaptNeigh,2,TRUE,TRUE,2,perm=vec) # a$Wnew # #the transform matrix for this adaptive lifting scheme