2014-03-02 29 views
3

我想从Morlet的小波变换中重建原始时间序列。我在R工作,包Rwave,函数cwt。该函数的结果是包含复数值的n * m(n =周期,m =时间)的矩阵。时间序列的小波重构

重构信号我使用公式(11)在Torrence & Compo classic text中,但结果与原始信号无关。我特别关心小波变换的实部和尺度之间的划分,这一步完全扭曲了结果。另一方面,如果我只对所有尺度上的真实部分进行求和,结果与原始时间序列非常相似,但具有稍宽的值(原始序列范围〜[-0.2,0.5]),重构的序列范围〜[-0.4,0.7])。

我想知道是否有人可以告诉一些实际的程序,公式或算法来重建原始时间序列。我已经阅读了托伦斯和康博(1998年),法吉(1992年)和其他书籍的所有不同公式的文章,但没有人真正帮助我。

回答

5

我一直在使用同一篇论文研究这个主题。我使用示例数据集向您展示代码,详细说明如何实现小波分解和重构的过程。

# 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) 

正如你可以在剧情看,它看起来像一个完美的重构:

original series and wavelet reconstruction

+0

非常感谢Rstudent,代码工作正常。我仍然想知道为什么Rwave中的cwt函数不会产生相同的结果,但是现在您的代码对我来说已经足够了。 – user3369539

+0

这将是很好,如果你接受我的答案... – DatamineR

+0

这个答案是我发现在stackoverflow上最有用的之一。我发现R/matlab上的大多数软件包都没有提供结合到身份函数的小波/逆小波变换。谢谢! –