脉冲涡流信号的大数据分析技术

最近经一朋友介绍揽下某油下面一个小项目,算是挣点外快。该项目主要是运用脉冲涡流检测原理实现对管道或其它铁磁材料等的缺陷检测,厚度测量等;而我要做的是根据海量的脉冲涡流信号数据和厚度标定数据建立/学习一个从信号到厚度的映射。大概花了两周时间:第一周调研脉冲涡流相关的资料和技术;第二周提想法并编码解决问题。截至今使用比较风靡的深度学习技术达到了不错的效果,后续会协助公司撰写/申请专利。

脉冲涡流检测原理

当金属材质的导体在磁场中进行切割磁力线运动或者直接摆放在 一个变化的磁场中的时候,由法拉第电磁感应定理可知, 金属导体内部会感生出类似水流漩涡形状的电流, 该感应电流因其漩涡状被称为涡电流。相对于传统的涡流检测技术,脉冲涡流检测技术是将频率丰富的具有一定占空比的脉冲电流信号加载到激励线圈上,当激励电流信号瞬间关断时,激励线圈由于电流信号的瞬间变化而感应出一个随时间快速衰减的脉冲磁场该磁场称为一次场,快速变化的一次场会在导体试件内部感应出旋涡状的脉冲电流,该脉冲涡流信号随着时间在导体中传播衰减而感应出一个新的变化的磁场,称为二次场,如下图所示。根据电磁感应原理在使用检测探头对导体材料进行检测时,检测线圈上输出的为线圈周围磁场随时间衰减感应出的瞬态电压。
在这里插入图片描述
脉冲涡流检测技术正是利用了涡流效应这一物理现象,在被测金属试件中存在有缺陷的时候,试件中的感应涡流以及磁场的分布必定会受到缺陷的影响而发生相应的改变,借助分析这些变化来掌握试件中缺陷的有关情况。所以检测试件的导电性能、腐蚀状况或者厚度等信息会对检测线圈接收的感应信号直接产生影响,通过对感应电压信号进行数据采集、处理、分析就可以掌握被检测试件的相应的缺陷信息。
在这里插入图片描述
如上图所示,当金属试件中存在有缺陷的时候,涡流的传播被缺陷所阻碍,而由于电流总是会沿着阻抗较低的路径传播,所以其传播路径势必会发生相应的改变,而试件的缺陷处为空气,而空气的阻抗明显高于金属的阻抗,因此可以看到传播到缺陷所在位置的涡流改变了其原先的传播路线,均在缺陷处进行了“绕行”,进而继续在金属试件中流动。随着金属试件中涡流分布的改变,该涡流所感生的磁场分布也已经与无缺陷时的分布情况有所区别,而这些分布上的变化与试件中存在的缺陷之间存在着若干的对应关系,借助对这些关系所进行的分析,从而实现对金属试件中存在缺陷的情况进行研究。

方法

为了解决这个映射问题,开始大量从知网上调研文献。发现比较常规的做法是,从脉冲涡流信号中提取特征,并于相对应的厚度信息进行可视化,再人为的去拟合出这个函数映射。特征比较普遍的是采用末段信号的斜率,或利用傅里叶变换对脉冲信号进行谐波分析提取振幅等信息。本人照着文献里的方法进行尝试,发现要么操作起来很难,要么就是可视化后没有一定的规律从而难以拟合。因此得出的结论是,文献里的方法也许只实用于对应的场景,通用性不够强;当面临新的场景检测任务,也许整个数据分析方法都得推翻重来。

鉴于此,开始发挥本人的专业所长,利用大数据模型去拟合这些海量数据。

读取数据:数据的目录结构是各个月份的采集数据成一个目录,而在月份目录下又有具体天的采集信号,因此在编码中采用递归进行读取。比如在某一天的目录下有文件:“2017101601_1.txt“ 和 ”2017101601_1_dep.txt“分别是脉冲涡流信号数据文件和对应的厚度数据,当然还有其它数据(该项目中没有利用);其中脉冲涡流数据最主要的信息包含每一个测点的随着时间衰减的涡流电压信号-31维。注意,由于脉冲涡流这种电磁感应的测量方式,前后各6个测点的数据进行了舍弃。

import os
import numpy as np
import matplotlib.pyplot as plt
from pylab import mpl

mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False

foldPath='D:\\Data'
eddyDataSets=np.empty((0,31))
yDataSets=[]
timeData=np.zeros(31)

def readTxt(txtPath):
    with open(txtPath) as datFile: 
        eddyData=np.empty((0,31))
        onePlaceData=np.zeros((1,31))
        for txtLine in datFile.readlines():
            cls=txtLine.strip().split()
            if cls:
                str0=cls[0]
                if str0.isdigit():
                    timeData[int(str0)-1]=float(cls[1])
                    try:
                        onePlaceData[0,int(str0)-1]=float(cls[2])
                    except ValueError:
                        onePlaceData[0,int(str0)-1]=float('NaN')
                    if int(str0)==31:
                       eddyData=np.r_[eddyData,onePlaceData] 
    return eddyData[6:eddyData.shape[0]-6,:]
    
def readFolders(foldPath): 
    global  eddyDataSets    
    filelist=os.listdir(foldPath)
    for files in filelist:
        filePath=os.path.join(foldPath,files)
        if os.path.isfile(filePath):
            #is file
            filename=os.path.splitext(files)[0]
            filetype=os.path.splitext(files)[1]
            
            if filename[-4:]!='_dep' and filetype =='.txt':  
                print(filePath)
                eddyData=readTxt(filePath)
                eddyDataSets=np.r_[eddyDataSets,eddyData]
                
                filePath=os.path.join(foldPath,filename+'_dep.txt')
                print(filePath)
                with open(filePath) as datFile:
                    lines=datFile.readlines()
                    lines.pop(0)
                    lines.pop()
                    vfloats=[line.strip().split() for line in lines]
                    yDataSets.extend([float(n) for vf in vfloats for n in vf])
        else:
            #is fold
            readFolders(filePath)
 
readFolders(foldPath)
yDataSets=np.asarray(yDataSets)

读取预处理:数据的可视化如下图所示,展示了其中10个测点位置的涡流信号-电压衰减曲线。由于电压值的变化范围较大,下图进行了双对数坐标展示。从下图分析,不同测点位置的电压衰减在前半部分基本相同,不同之处在于末段部分,呈现不同程度的波形抖动(这也解释了斜率法在这种场景中无法操作);对于不同测点的波形图,比如厚度为19.7712的波形图后段的谷值和峰值有一定的区分度,但值得注意的是在其它测点处并没有呈现类似的倾向,因此简单分析这种底层特征很难找到一个合适的先验特征。因此,我们采用机器学习模型的强拟合能力来拟合这些数据。由于电压值的变换差异,我们对信号采用对数变换,并取后续15维特征;另外,由于给的标定数据中有’inf’,对数据进行了清洗。最后的数据总量为170,983条,并划分训练集(0.9)/测试集(0.1):(eddyDataSets,yDataSets),(eddyDataSets_test,yDataSets_test)。

def show2Darray(eddyDataSets,yDataSets):
	#绘图函数
    num_data=eddyDataSets.shape[0]
    myColor=np.random.rand(num_data,3)
    plt.figure(figsize=(10,10))    
    plt.title('各测点的电压衰减曲线', fontsize=36)
    for i in range(num_data):
        plt.loglog(timeData,eddyDataSets[i],color=myColor[i],label='thickness: {}'.format(yDataSets[i]),marker='o')
    plt.legend()
    plt
  • 6
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
MATLAB可以用来分析脉冲信号的周期。脉冲信号是一个离散的信号,其中包含了短暂的信号脉冲。要分析脉冲信号的周期,可以使用MATLAB中的信号处理工具箱或编写自定义的算法。 一种常用的方法是使用自相关函数。自相关函数是信号与其自身的延迟版本之间的相关性。对于一个周期性的脉冲信号,它与自身的延迟版本之间应该存在一个峰值,该峰值对应于信号的周期。 在MATLAB中,可以使用自相关函数来分析脉冲信号的周期。首先,需要将脉冲信号输入到MATLAB中,并将其表示为一个向量。然后,使用MATLAB的autocorr函数计算信号的自相关函数。这将返回一个自相关函数的向量,其中包含信号与其自身的各个延迟版本之间的相关性。 在得到自相关函数之后,可以使用MATLAB的findpeaks函数来寻找峰值。findpeaks函数可以识别自相关函数中的局部最大值,并返回其位置和幅度。找到峰值之后,可以计算相邻峰值之间的差异,从而得到脉冲信号的周期。 除了自相关函数之外,还可以使用其他方法来分析脉冲信号的周期,例如傅里叶变换或周期性估计方法。这些方法可以在MATLAB的信号处理工具箱中找到相应的函数。 综上所述,MATLAB提供了多种方法来分析脉冲信号的周期。使用自相关函数是一种常用的方法,通过计算自相关函数并寻找峰值,可以确定脉冲信号的周期。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值