我一直在使用同一篇论文研究这个主题。我使用示例数据集向您展示代码,详细说明如何实现小波分解和重构的过程。
# Lets first write a function for Wavelet decomposition as in formula (1):
mo<-function(t,trans=0,omega=6,j=0){
dial<-2*2^(j*.125)
sqrt((1/dial))*pi^(-1/4)*exp(1i*omega*((t-trans)/dial))*exp(-((t-trans)/dial)^2/2)
}
# An example time series data:
y<-as.numeric(LakeHuron)
从我的经验,正确重建你应该做两件事情:第一个主题的平均获得零均值数据集。然后我增加最大比例。我主要使用110(虽然在托伦斯公式和康波建议71)
# subtract mean from data:
y.m<-mean(y)
y.madj<-y-y.m
# increase the scale:
J<-110
wt<-matrix(rep(NA,(length(y.madj))*(J+1)),ncol=(J+1))
# Wavelet decomposition:
for(j in 0:J){
for(k in 1:length(y.madj)){
wt[k,j+1]<-mo(t=1:(length(y.madj)),j=j,trans=k)%*%y.madj
}
}
#Extract the real part for the reconstruction:
wt.r<-Re(wt)
# Reconstruct as in formula (11):
dial<-2*2^(0:J*.125)
rec<-rep(NA,(length(y.madj)))
for(l in 1:(length(y.madj))){
rec[l]<-0.2144548*sum(wt.r[l,]/sqrt(dial))
}
rec<-rec+y.m
plot(y,type="l")
lines(rec,col=2)
正如你可以在剧情看,它看起来像一个完美的重构:
非常感谢Rstudent,代码工作正常。我仍然想知道为什么Rwave中的cwt函数不会产生相同的结果,但是现在您的代码对我来说已经足够了。 – user3369539
这将是很好,如果你接受我的答案... – DatamineR
这个答案是我发现在stackoverflow上最有用的之一。我发现R/matlab上的大多数软件包都没有提供结合到身份函数的小波/逆小波变换。谢谢! –