传统地震去噪算法实战(python代码)
本次课程我们选择了各个时期经典的算法给大家进行实战案例的讲解,给大家看看他们的处理效果如何。我们主要选择的算法包括FXDECON,MSSA,小波变换和KSVD。当然限于课程原理讲解,并未将各自算法调优到最好的性能,应该说仅发挥了他们的“常规”水平,去噪结果仅供大家参考。
1.去噪度量标准PSNR
为了横向对比去噪性能,我们除了定性对比——看去噪结果,另外一个方法就是定量对比。这里我们选择PSNR计算结果来进行定量的对比。
PSNR是最普遍,最广泛使用的评鉴画质的客观量测法。PSNR是“Peak Signal to Noise Ratio”的缩写,即峰值信噪比,是一种评价图像的客观标准,一般是用于最大值信号和背景噪音之间的一个工程项目。

其中,MSE是原图像(语音)与处理图像(语音)之间均方误差。Peak就是指整个目标数据的最大值。MSE指均方误差。PSNR的单位为dB。所以PSNR值越大,就代表失真越少。
2.测试数据准备
今天的测试数据使用64*64的一个仿真地震数据,如图所示。

加上了15%的随机噪声,就变成了图中这模样。可以看出,噪声对有效信号影响比较大的,特别在信号边缘,出现了很大的干扰。接下来,我们就来看看各大先进去噪算法各显神通了。

3. FXDECON去噪
地震同相轴在空间方向具有可预测性, 这种预测特征能够用于分离强随机噪声中的目标同相轴, 该类方法可以在频率-空间域(f-x域)或时间-空间域(t-x域)内实现。f-x域预测滤波技术由Canales(1984)提出并且由Gulunay(1986)进一步发展, 已经成为一种工业界标准的方法——FXDECON。
FXDECON主要原理是这样的:f−x反褶积基本假设是具有线性同向轴的地震数据在f−x 域中的每个频率切片都可以进行自回归表示。f − x反卷积方法是很多算法的基础。之所以称为反卷积,可以理解为求卷积系数,也可以理解为求降噪数据。(一般反卷积是指求数据,而不是系数)。
具体的公式推导就不细说了,大家自行到百度脑补。下面直接对关键代码讲解。

这里我们使用了torch程序库将数据转换为张量,并调用fxdecon函数进行处理。处理的结果再转换为二维的数组。fxdecon函数太复杂了,大神们写了近300行代码。

那么处理效果如何呢?

从处理结果来看,算法去除了一定的随机噪声,不过残留的随机噪声还是比较多。
4. MSSA去噪
多分量奇异谱分析(MSSA)去噪方法可以有效压制随机噪声。MSSA是在频率-空间域实施去噪,其理论基础为对于无噪声数据将频率切片转换为 Toeplitz 矩阵,矩阵的秩等于线性同相轴不同斜率的个数,噪声会增加矩阵的秩,去噪可近似看作矩阵的降秩问题。
整个算法具体步骤如下,
(1)通过离散傅里叶变换将地震数据由时间-空间(t-x)域变换到频率-空间(f-x)域;
(2)取出每一个频率切片构建 Toeplitz 矩阵,对其实施截断 SVD 降秩,然后沿对角线求平均;
(3)将降秩后的频率切片数据和原始频率切片数据做多次加权迭代,直到误差小于一定限定值或达到最大迭代次数;
(4)对降秩后的频率切片数据做傅立叶反变换到时间域,得到去噪之后的地震数据。
具体的公式也不赘述了。下面看程序是如何来写的:

程序的主要步骤包括:一是建立MSSA模型,二是使用噪声数据来训练模型,三是对每个道的数据进行去噪处理。

MSSA的函数也比较复杂,大神写了500多行代码,咱们只管调用就可以了。
下面我们来看看效果:

从这个结果来看,MSSA的处理效果比较强劲,除去了大部分的随机噪声。不足的是还有一些随机信号残留,有效信号的边缘也比较模糊。
5. 小波去噪
小波分析这种方法源于傅立叶分析,小波(wavelet),即小区域的波,仅仅在非常有限的一段区间有非零值,而不是像正弦波和余弦波那样无始无终。小波可以沿时间轴前后平移,也可按比例伸展和压缩以获取低频和高频小波,构造好的小波函数可以用于滤波或压缩信号,从而可以提取出已含噪声信号中的有用信号。

Donoho提出的小波阀值去噪的基本思想是将信号通过小波变换(采用Mallat算法)后,信号产生的小波系数含有信号的重要信息,将信号经小波分解后小波系数较大,噪声的小波系数较小,并且噪声的小波系数要小于信号的小波系数,通过选取一个合适的阀值,大于阀值的小波系数被认为是有信号产生的,应予以保留,小于阀值的则认为是噪声产生的,置为零,从而达到去噪的目的。
假设,e(k)为高斯白噪声,通常情况下有用信号表现为低频部分或是一些比较平稳的信号,而噪声信号则表现为高频的信号,我们对 s(k)信号进行小波分解的时候,则噪声部分通常包含在HL、LH、HH中,如下图所示,只要对HL、LH、HH作相应的小波系数处理,然后对信号进行重构即可以达到消噪的目的。
下面讲讲程序的编写。

我们调用DWT的函数来进行小波变换和逆变换,选择了haar小波基。

从处理结果来看,虽然去除了一部分随机噪声,但是对有效信号的恢复不太理想。
6. KSVD去噪

K-SVD算法由Aharon、Elad等根据误差最小原则提出利用基向量的线性组合表示输入信号的数据特征,通过数据训练不断更新字典基向量及其表示系数,将逼近误差调整到最小,完成对数据的充分表示。K-SVD算法包括稀疏编码和字典更新两个基本步骤。

最主要就是要解决下列矩阵等式的解:其中D是要训练的字典,X对应字典D的稀疏系数矩阵、Y是要训练的样本。当矩阵的维数很高时,即使使用计算机软件也很难求解矩阵方程,而K-SVD算法正是解决了高维矩阵求解的问题。
具体程序是这样写的:

首先KSVD函数有四个参数需要定义:字典所含原子个数,最大迭代次数,稀疏表示结果的容差和稀疏度。
降噪处理主要是以下几句:主要包括KSVD的字典数量,使用KSVD模型处理噪声和恢复数据。

具体效果是这样的,看来去噪效果不怎么样,留下的随机噪声较多,不过对原信号的损伤不大。

以上就是今天的全部内容,我们给大家逐一讲解了FXDECON,MSSA,小波变换和KSVD等业绩先进的去噪算法,并对比了去噪的效果。如果你想获取代码,或有问题讨论,都欢迎联系我交流。下节课再见。