1

Wei Cheng发了一篇文章,提出了一种可以用于模板匹配的波形相似性比较方法,道爷让咱学习一下,乍一听还是挺有用的,如果这个方法好用,我还是可以直接拿来写两篇文章的。

2

前言

1
2
3
4
We propose a new correlation function called the similarity coefficient (SC) based on the normal time–frequency transform (NTFT) to evaluate the similarity between two non-stationary seismic signals as a function of the delay time. The SC is defined in the time–frequency spectrum of the NTFT, and the instantaneous phase and amplitude of each frequency component in a signal are used to calculate the SC. Our simulation experiments demonstrate that the SC method can effectively recognize similar signals compared to the conventional normalized cross-correlation coefficient (NCC) under high background noise conditions. The SC presents good robustness in identifying similar signals and performs well in the case of an extremely low signal-to-noise ratio (SNR), which makes it suitable for detecting weak seismic signals concealed by noise.

我们提出了一种基于正常时频变换 (NTFT) 的称为相似系数 (SC) 的新相关函数,以评估两个非平稳地震信号之间的相似性作为延迟时间的函数。 SC 定义在 NTFT 的时间频谱中,信号中每个频率分量的瞬时相位和幅度用于计算 SC。 我们的仿真实验表明,在高背景噪声条件下,与传统的归一化互相关系数 (NCC) 相比,SC 方法可以有效地识别相似的信号。 SC在识别相似信号方面表现出良好的鲁棒性,在信噪比(SNR)极低的情况下表现良好,适用于检测微弱的地震信号
被噪音掩盖。

正文

老的cc

作者表示这是在时域中计算,相当于在频率域做个交叉谱,然后傅里叶反变换回去;认为对高信噪比的信号效果好,但是对于信噪比比较低的信号常常会有误检测按照在DAS中的结果,我认为是对检测模板要求高,对待检测目标要求比较低作者又提到GCC,觉得这玩意儿对非高斯的噪声(风、交通和风暴)没啥用,而且地震信号是非平稳信号,经典傅里叶变换不包含时间信息。之后是小波,小波可以用于非平稳信号的处理,但是很依赖小波基小波没用过

A stationary signal is a signal wave that is generated by keeping the time period and spectral content value constant. In simple terms

NTFT

过程太复杂了,我看看有没有其他地方有解释

找到了稍早前的文章,是作者的导师写的,中文好耶!!!

啊,太麻烦了,我放弃了,直接重构代码吧

3

NTFT matlab

略,不知道有没有开源

NTFT python

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import math
import scipy
import numpy


def conv(a):
return scipy.signal.convolve2d(a)


def conj(a):
return numpy.conj(a)


def fliplr(a):
if a.ndim == 1:
return numpy.flipud(a)
else:
return numpy.fliplr(a)

def wkeep(array, l):
begin = (len(array) - l) // 2
return array[begin:begin + l]

def ntft(sig, angfrqs, l, t0):
lens = len(sig)
EdgeEffect = angfrqs.copy()
coefs = []
for i in range(len(angfrqs)):
AngleFrq = angfrqs[i]
EdgeEffect[i] = math.ceil(l / 10 / abs(AngleFrq) * 1.643)
kernel = TFKerFun_Gaussian(AngleFrq, l, t0)
coefs.append(
abs(AngleFrq) * t0 * wkeep(conv(sig, conj(fliplr(kernel))), lens))
return numpy.array(coefs), EdgeEffect
啊我要气死了,我连接ps手柄后,steam进入了桌面系统,然后我想退出,结果直接关机了,导致我写好的博客没了。我做好的时间统计也没了气死我了,算了,这就随便水一水得了

实际测试

基础信号测试

单色正弦函数

对于一个正弦函数,我通过左右补齐来构建测试序列,然后用这个正弦函数当作模板信号。这里添加高斯噪声来模拟含噪信号,噪声大小通过sigma函数来控制。为了表征这种方法的检测能力与传统互相关函数的检测能力,我使用两个标量:

1:互相关序列(valid)的最大值

2:李泽锋在2018年pushing….那篇文章中提到的:

测试结果中,这两个量越大越好:1表示互相关程度高,2表示在序列中有一部分显著高。

这里可以看出,虽然在不加噪声时,二者的最大互相关值都是1,但是随着噪声的添加,STFT的最大相关值急速下降,但是传统cc表现出缓慢下降的趋势。同时按照李泽锋的计算方法,也说明传统互相关方法能够更好的区分开目标信号和噪声信号,以下各个信号基本都是一样的结果,我就不再解释了

低频雷克子波

高频雷克子波

这里还是很有意思的,对于高频的雷克子波,stft的劣势就不太明显了

但是我突然想起来,这个结果是否与高低频存在着关联

复合波形

真实波形

其实在真实波形这里,很能说明问题,stft的表现没有传统cc强

速度测试

在应对一定同等长度信号时,STFT(左)的效率不及传统CC的千分之一,这是传统CC的巨大优势。也表明了STFT的利用前景堪忧

结语

虽然测试还没做完,应该添加各个频率的测试,但是目前来看,这个方法很可能利用前景堪忧

把代码就放在这里了,因为是通过别人的matlab改的,就加个密码了

分享名称:stft.txt
分享链接:https://files.gemini-hao.top/#s/8H0NNRPA
访问密码:*