参考文献 (链接) Spitz S . Seismic trace interpolation in the F-X domain[J]. Geophysics, 1991, 56(6):785-794.
Spitz插值是最经典的插值方法,它利用了上一篇博客中提到的具有线性同相轴的地震数据可以在频率–空间域进行线性回归的理论。(回顾:线性回归滤波器的长度等于同相轴(不同斜率)的数目加一,实际应用中会采用更长的自回归滤波器,可以使算法更稳定。自回归的好处在于其只用到了地震数据到本身,而不需要知道斜率信息)
Spitz插值的思路是,首先利用低频无假频部分计算出自回归系数(回归),根据道加密后相邻道之间的相移为原来一半,可以推导出加密后数据的自回归系数,然后在利用自回归关系从已知数据推导出未知数据(预测)。回顾和预测都通过最小二乘实现,因此算法比较稳定。缺点是:1,只能用于线性同相轴;2,只能用于规则网格。
以下符号与Spitz论文中一致。
包含 L L L个同相轴和 N N N道的地震数据在频率域可以表示成:
g k ( f ) = ∑ j = 1 L a j ( f ) z j k − 1 ( f ) , k = 1 , . . . , N g_k(f)=\sum_{j=1}^La_j(f)z_j^{k-1}(f),k=1,...,N gk(f)=j=1∑Laj(f)zjk−1(f),k=1,...,N
其中 g k ( f ) g_k(f) gk(f)表示第 k k k道数据, a j ( f ) a_j(f) aj(f)为第 j j j个同相轴对应的子波频谱(第一道数据), z j ( f ) = e x p ( 2 π i f p j ) z_j(f)=exp(2\pi i f p_j) zj(f)=exp(2πifpj)对应于第 j j j个同相轴相邻道之间的相移 p j p_j pj(对应于斜率)。根据上一篇博客介绍的Canales方法,向前–向后单步预测滤波可以写成如下形式:
g k ( f ) = ∑ j = 1 L P j ( f ) g k − j ( f ) , k = L + 1 , . . . , N g_k(f)=\sum_{j=1}^L P_j(f)g_{k-j}(f),k=L+1,...,N gk(f)=j=1∑LPj(f)gk−j(f),k=L+1,...,N
g k ∗ ( f ) = ∑ j = 1 L P j ( f ) g k + j ∗ ( f ) , k = 1 , . . . , N − L g_k^*(f)=\sum_{j=1}^L P_j(f)g_{k+j}^*(f),k=1,...,N-L gk∗(f)=j=1∑LPj(f)gk+j∗(f),k=1,...,N−L
其中 P j ( f ) P_j(f) Pj(f)为预测滤波器的系数。(向前–向后滤波的共轭关系可以从附录中得到)
Spitz方法在原来的地震道中两道中间插入新的地震道,因此插值后的地震数据满足:
g k ′ ( f ) = ∑ j = 1 L a j ( f ) z ′ j k − 1 ( f ) , k = 1 , . . . , 2 N − 1 g_k'(f)=\sum_{j=1}^La_j(f){z'}_j^{k-1}(f),k=1,...,2N-1 gk′(f)=j=1∑Laj(f)z′jk−1(f),k=1,...,2N−1
可以再一次写出向前–向后单步预测滤波形式:
g k ′ ( f ) = ∑ j = 1 L P j ′ ( f ) g ′ k − j ( f ) , k = L + 1 , . . . , 2 N − 1 g'_k(f)=\sum_{j=1}^L P'_j(f){g'}_{k-j}(f),k=L+1,...,2N-1 gk′(f)=j=1∑LPj′(f)g′k−j(f),k=L+1,...,2N−1
g k ′ ( f ) = ∑ j = 1 L P ′ j ∗ ( f ) g ′ k + j ( f ) , k = 1 , . . . , 2 N − L − 1 g'_k(f)=\sum_{j=1}^L {P'}^*_j(f){g'}_{k+j}(f),k=1,...,2N-L-1 gk′(f)=j=1∑LP′j∗(f)g′k+j(f),k=1,...,2N−L−1
上述方程为关于 g j ′ g'_j gj′的线性方程组,系数为 P j ′ P'_j Pj′将已知值和未知值分别放到一块,整理得到:
A ( P ′ ( f ) ) [ g 2 ′ ( f ) g 4 ′ ( f ) . . . g 2 N − 2 ′ ( f ) ] T = B ( P ′ ( f ) ) [ g 1 ′ ( f ) g 3 ′ ( f ) . . . g 2 N − 1 ′ ( f ) ] T A(P'(f))[g'_2(f)\text{ }g'_4(f) \text{ }... \text{ }g'_{2N-2}(f)]^T=B(P'(f))[g'_1(f)\text{ }g'_3(f) \text{ }... \text{ }g'_{2N-1}(f)]^T A(P′(f))[g2′(f) g4′(f) ... g2N−2′(f)]T=B(P′(f))[g1′(f) g3′(f) ... g2N−1′(f)]T
如果 P ′ P' P′已知的话,以上表达式包含 2 ( 2 N − L − 1 ) 2(2N-L-1) 2(2N−L−1)个方程(向前向后滤波等式的个数)和 N − 1 N-1 N−1个未知数(文献中写成 2 N − 1 2N-1 2N−1,不知道是写错了,还是包括了所有道),可以用最小平方方法求解(等价于一个从已知到未知的滤波器):
( A + A ) − 1 A + B (A^+A)^{-1}A^+B (A+A)−1A+B
其中 A + A^+ A+为 A A A的复共轭转置。
虽然实际上 P ′ P' P′未知,但是可以用 P P P来推导。注意输出(包括已知点)和输入剖面的相移关系为 z j ′ ( f ) = z j ( f / 2 ) z'_j(f)=z_j(f/2) zj′(f)=zj(f/2)(注: z j ′ ( f ) = e x p ( 2 π i f p j / 2 ) = z j ( f / 2 ) z'_j(f)=exp(2\pi i f p_j/2)=z_j(f/2) zj′(f)=exp(2πifpj/2)=zj(f/2),插值后相邻道之间的相移为原来的一半)。
由 P P P与 z z z的关系可以得到:
P j ′ ( f ) = P j ( f / 2 ) P'_j(f)=P_j(f/2) Pj′(f)=Pj(f/2)
可以看到,只利用了无假频的低频部分。
以上推导由一些细节没有给出,待续。
Spitz用另外一种方法进行了Canales文章的推导。
附推导过程
对于地震数据 x T ( f ) = [ x 1 ( f ) , . . . , x N ( f ) ] x^T(f)=[x_1(f),...,x_N(f)] xT(f)=[x1(f),...,xN(f)],假设 x ( f ) = g ( f ) + n ( f ) x(f)=g(f)+n(f) x(f)=g(f)+n(f)。定义z变换 S j T ( f ) = [ 1 , z j ( f ) , . . . , z j N − 1 ( f ) ] S_j^T(f)=[1,z_j(f),...,z_j^{N-1}(f)] SjT(f)=[1,zj(f),...,zjN−1(f)],其中, z j ( f ) = e x p ( 2 π i f p i ) z_j(f)=exp(2\pi ifp_i) zj(f)=exp(2πifpi),则:
g ( f ) = ∑ j = 1 L a j ( f ) S j ( f ) g(f)=\sum_{j=1}^La_j(f)S_j(f) g(f)=j=1∑Laj(f)Sj(f)
其中 a j ( f ) a_j(f) aj(f)为第 j j j个同向轴对应的子波的傅里叶变换。分开写为:
g 1 = ∑ j = 1 L a j ⋅ 1 g 2 = ∑ j = 1 L a j ⋅ z j ⋯ g N = ∑ j = 1 L a j ⋅ z j N − 1 \begin{aligned} g_1&=&\sum_{j=1}^La_j\cdot 1 \\ g_2&=&\sum_{j=1}^La_j\cdot z_j \\ &\cdots& \\ g_N&=&\sum_{j=1}^La_j\cdot z_j^{N-1} \end{aligned} g1g2gN==⋯=j=1∑Laj⋅1j=1∑Laj⋅zjj=1∑Laj⋅zjN−1
写成矩阵的形式为:
(3) [ g 1 g 2 ⋮ g n ] = [ 1 1 ⋯ 1 z 1 z 2 ⋯ z L ⋮ z 1 N − 1 z 2 N − 1 ⋯ z L N − 1 ] × [ a 1 a 2 ⋮ a n ] \left[ \begin{matrix} g_1 \\ g_2 \\ \vdots \\ g_n \end{matrix} \right]= \left[ \begin{matrix} 1 & 1& \cdots & 1 \\ z_1 & z_2& \cdots & z_L \\ \vdots \\ z_1^{N-1} & z_2^{N-1}& \cdots & z_L^{N-1} \end{matrix} \right] \times \left[ \begin{matrix} a_1 \\ a_2 \\ \vdots \\ a_n \end{matrix} \right] \tag{3} ⎣⎢⎢⎢⎡g1g2⋮gn⎦⎥⎥⎥⎤=⎣⎢⎢⎢⎡1z1⋮z1N−11z2z2N−1⋯⋯⋯1zLzLN−1⎦⎥⎥⎥⎤×⎣⎢⎢⎢⎡a1a2⋮an⎦⎥⎥⎥⎤(3)
令其中的矩阵为 S S S,即 S = [ S 1 , ⋯   , S L ] S=[S_1, \cdots, S_L] S=[S1,⋯,SL]。将(3)记为矩阵形式:
x = S a + n x=Sa+n x=Sa+n
形为 S S S的矩阵称为范德蒙矩阵, S j S_j Sj之间是线性无关的,则 S S S的秩为 L L L( N > = L N>=L N>=L)。 S S S的任意一行都可以表示为其它 L L L行的线性组合。例如,第 L + 1 L+1 L+1行可以表示为前 L L L行的线性组合。写成如下形式:
(4) ( z 1 L , ⋯   , z L L ) = ( P L , ⋯   , P 1 ) × [ 1 1 ⋯ 1 z 1 z 2 ⋯ z L ⋮ z 1 L − 1 z 2 L − 1 ⋯ z L L − 1 ] (z_1^L,\cdots,z_L^L)=(P_L,\cdots,P_1)\times \left[ \begin{matrix} 1 & 1& \cdots & 1 \\ z_1 & z_2& \cdots & z_L \\ \vdots \\ z_1^{L-1} & z_2^{L-1}& \cdots & z_L^{L-1} \end{matrix} \right] \tag{4} (z1L,⋯,zLL)=(PL,⋯,P1)×⎣⎢⎢⎢⎡1z1⋮z1L−11z2z2L−1⋯⋯⋯1zLzLL−1⎦⎥⎥⎥⎤(4)
将上式右侧移到左侧,整理成关于 z j z_j zj的方程,发现对任意 z j z_j zj形式都一样,为:
Z L = z L − P 1 z L − 1 − ⋯ − P L = 0 Z_L=z^L-P_1z^{L-1}-\cdots-P_L=0 ZL=zL−P1zL−1−⋯−PL=0
又因为 z j z_j zj各不相同,上述方程有 L L L个解(零点),所以 z j z_j zj为上述方程的 K K K个零点,即可以写成如下形式:
Z L = ( z − z 1 ) ( z − z 2 ) ⋯ ( z − z L ) Z_L=(z-z_1)(z-z_2)\cdots(z-z_L) ZL=(z−z1)(z−z2)⋯(z−zL)
对比上述两式可以得到
P 1 = z 1 + ⋯ + z L P 2 = − ( z 1 z 2 + ⋯ + z L − 1 z L ) ⋯ P L = ( − 1 ) L + 1 z 1 z 2 ⋯ z L \begin{aligned} P_1&=&z_1+\cdots+z_L \\ P_2&=&-(z_1z_2+\cdots+z_{L-1}z_L)\\ &\cdots& \\ P_L&=&(-1)^{L+1}z_1z_2\cdots z_L \end{aligned} P1P2PL==⋯=z1+⋯+zL−(z1z2+⋯+zL−1zL)(−1)L+1z1z2⋯zL
上式即为我们之前没有推出来的通解。
核心代码:
PF = prediction_filter(x1,npf,pre1); #计算预测滤波器
[y] = interpolate_freq(x2,PF,pre2); # 插值
自回归代码:
for j=1:ns-np
C(j,:)=VEC(j+np:-1:j);
end
A = [C(:,2:np+1);conj(fliplr(C(:,1:np)))]; #向前向后(共轭)预测的输入
B = [C(:,1);conj(C(:,np+1))];# 向前向后预测的输出
R = A'*A;
g = A'*B;
mu = (pre/100.)*trace(R)/np;
PF = (R+mu*eye(np))\g; #最小平方求解
插值代码:
TMPF1 = [fliplr(PF.'),-1]; #向前预测
W1 = convmtx(TMPF1,ny-np);
TMPF2 = conj(fliplr(TMPF1)); # 向后预测
W2 = convmtx(TMPF2,ny-np);
WT = [W1;W2];
A = WT(:,2:2:ny); #未知数据
B = -1*WT(:,1:2:ny)*x.'; #已知数据,这里可以看到,是用已知数据预测未知数据
R= A'*A;
g = A'*B;
mu = (pre/100.)*trace(R)/(nx-1);
y1 = (R+mu*eye(nx-1))\g; #最小平方反演
y = zeros(1,ny);
y(1:2:ny)=x;
y(2:2:ny)=y1.';