【信号分解】基于LMD算法和ELMD算法实现管道泄漏信号处理附matlab代码

 1 内容介绍

在科技水平相当发达的今天,互联网+、大数据慢慢渗透进人们的生活当中,但

科技的进步不仅仅要体现在生活质量水平的提高、经济的快速发展,更应该体现在对社会资源的合理利用。自建国以来,我国管道运输得以迅速发展。从 1958 年至今,先后经历了 11 年的初始发展、17 年的快速发展、7 年的稳步发展,现在正处于加快发展阶段。管道总里程在 2008 年就已经达到 6.4 万千米,是管道运输最初发展阶段 0.02万千米的 3200 倍,可见管道运输在运输业的重要位置[1]。截至 2010 年底,全球管道干线总长度超过 200 万千米,到了 2013 年,全球运行的管道有 3559186 公里,其中8.4%为原油运输管线,80.5%为天然气运输管线,可见天然气运输在管道运输中具有较大比重。中国的油气管道长度在 2015 年也达到 10.87 万公里,其中天然气主干管道总里程也超过 2013 年的 5.5 万公里[2]。

管道运输通常伴随着能源的存储与使用,便会涉及到能源的可持续发展以及相应

的安全保护措施。合理的资源利用,有利于资源的再生及可持续发展;缜密的安保措施,有利于保护资源不被窃取和浪费。但随着油气管道运输的发展,管线的数量越来越多,管道的敷设距离也变得越来越长,而随着服役期的增长,加上环境和人为破坏,运行磨损,设备老化,腐蚀等多种因素,导致管道泄漏时有发生,进而引发许多重大泄漏事故。我国大部分管道目前已运行超过 40 年,且中国的管道事故率远远高于西方国家,数据显示,美国、欧洲、我国的管道事故率分别为 0.42,0.46 和 0.50[3]。我国运行超过 20 年的油气管道已经占总管道数的 60%。随着油气管道的控制日益复杂,运行形势复杂多变,应该把管道运输的安全保障问题视为首要防御任务。因此,为了节约一次能源、改善环境污染、提高人民生活水平,对城市现代化建设的便利、舒适、安全可靠性做出重要贡献,有效的降低危及居民生活安全的燃气管道漏损现象,对燃气管道实行在线运行的实时监测、精确检测定位管网泄漏具有十分重要的意义。​​

针对天然气管道泄漏检测过程中难以提取泄漏特征信息及泄漏定位精度低的问题,本文将局部均值分解(Local Mean Decomposition,LMD)算法应用于管道泄漏检测中,实现管道泄漏信号的分解、特征提取以及泄漏定位。首先,介绍了局部均值分解的理论算法,并将其应用在信号分解中。LMD作为处理非平稳随机信号的一种有效手段,其具备信号分解的自适应特性和完备性。但由于算法本身的影响,易产生模态混叠。针对模态混叠现象,本文利用总体局部均值分解算法(Ensemble Local Mean Decomposition,ELMD),借助辅助噪声技术,抑制LMD分解过程中模态混叠的问题。其次,有用信息在传输过程中往往会受到各种噪声的影响和干扰,使信号源中的有用信号被削减或混淆。为增强有用信号,抑制噪声干扰,保障后续提取的特征值能够代表信号特征,需要对采集的原始信号进行降噪预处理。同时为避免小波分解过程存在的技术漏洞,提出基于小波包的ELMD谱峭度联合降噪算法。该算法在ELMD分解出的各有效PF(Product Function)分量的基础上,利用谱峭度最优参数及小波包能量分布确定信号重构节点,完成对各PF分量的信号降噪。降噪后的各PF分量可表征原始信号在不同尺度下的特征。再次,通过分析管道信号的特点,对时频分析理论进行研究,提出基于时频域的自适应最优核(Adaptive Optimal Kernel,AOK)谱熵参数,定量描述信号的时频特性。对各PF分量中提取相应AOK参数用于初步判定管道是否发生泄漏及工况种类,其针对管道正常运行、管道泄漏、管道敲击具有很好的区分度,具有良好的识别准确率。最后,介绍了基于ELMD多尺度相关的管道泄漏检测算法。通过经ELMD分解得到的PF分量与互相关算法的融合,得到不同特征尺度下的时延差,从而完成对管道泄漏的定位。该算法相比直接利用原始信号进行相关计算得到的定位结果更加精确,有助于管道泄漏定位精度的提升。

2 仿真代码

% clear;
% clc;
% close all;
% x1=xlsread('3.xlsx');
% Ts = 11838 ;
% fs=1/Ts

% VarName2=x1(:,2);
% x=VarName2';
% Nstd =0.1;
% NR =100;

% N=length(x);
% t = linspace(0,1,N);
clc
clear all
close all
x1=xlsread('3.xlsx');
VarName2=x1(:,4);
x=VarName2';
plot(x, 'b');
Z=VarName2(1:8192,:);
z=Z';
% figure;
% plot(Z, 'b');
xlim([0 8192]);
N=length(x);
t = linspace(0,1,N);
Ts = 10324;
fs=1/Ts
Nstd =0.1;
NR =100

%绘制原始信号及频谱
figure
subplot(211)
plot(t,x)
subplot(212)
y2=x;
L=length(y2);
NFFT = 2^nextpow2(L);
Y = fft(y2,NFFT)/L;
f = fs/2*linspace(0,1,NFFT/2);
plot(f,2*abs(Y(1:NFFT/2)))

% LMD分解
[pf,a,si,u] = lmd(x);
line=size(pf,1)
NN = length(pf(1,:))
t = linspace(0,1,NN);
figure('Color',[1 1 1]);
for i=1:1:line
    subplot(line+1,1,i),plot(t,pf(i,:)),ylabel(sprintf('PF%d',i));
    xlabel('Time / s'); legend('LMD')
end

for i = 1:1:line
     cc(i)=min(min(corrcoef(pf(i,:), x)))
 end

figure
plot(cc,'-g<','LineWidth',1.5,'MarkerEdgeColor','b','MarkerFaceColor','b','MarkerSize',5);
set(gca,'XGrid', 'on', 'YGrid', 'on');
legend('CC'); 
xlabel('IMF');
ylabel('LMD相关系数');

%重构信号
cg_ev=pf(3,:)+pf(4,:)+pf(5,:)+pf(6,:);
figure;
plot(t,x,'-b');hold on 
plot(t,cg_ev,'-r');xlabel('t/s');ylabel('幅值');legend('原始信号','LMD重构信号'); 

%误差信号
err=x-cg_ev;
figure
plot(t,err);xlabel('t/s');ylabel('幅值');legend('LMD误差信号');

% ELMD分解
modes = mlmd(x,Nstd,NR);
[a, b]=size(modes);


% 绘制PF分量和其频谱图
PF=modes;
line=size(PF,1); 
NN = length(PF(1,:));
n = linspace(0,1,NN);
for k1=0:4:line-1
     figure('Color',[1 1 1]);
     for k2=1:min(4,line-k1)
        subplot(4,2,2*k2-1);
        plot(t,PF(k1+k2,:));
        title(sprintf('第%d个PF', k1+k2))
        xlabel('Time/s')
        ylabel(sprintf('PF%d',k1+k2));legend('ELMD');
        subplot(4,2,2*k2)
        [yf, f] = FFTAnalysis(PF(k1+k2,:), Ts);
        plot(f, yf)
        title(sprintf('第%d个PF的频谱', k1+k2))
        xlabel('f/Hz')
        ylabel('|PF(f)|');legend('ELMD');
     end
end;

for i = 1:1:line
     cc(i)=min(min(corrcoef(PF(i,:), x)))
 end

figure
plot(cc,'-g<','LineWidth',1.5,'MarkerEdgeColor','b','MarkerFaceColor','b','MarkerSize',5);
set(gca,'XGrid', 'on', 'YGrid', 'on');
legend('CC'); 
xlabel('IMF');
ylabel('ELMD相关系数');

%重构信号
cg_ev1=PF(4,:)+PF(5,:)+PF(6,:);
figure;
plot(t,x);
hold on 
plot(t,cg_ev1,'g');xlabel('t/s');ylabel('幅值')
legend('原始信号','ELMD重构信号'); 


%误差信号
err=x-cg_ev1;
figure
plot(t,err);xlabel('t/s');ylabel('幅值');legend('ELMD误差信号'); 

sigPower1 = sum(abs(cg_ev).^2)/length(cg_ev); 
sigPower2 = sum(abs(cg_ev1).^2)/length(cg_ev1); 
noisePower1 = sum(abs(cg_ev-x).^2)/length(cg_ev-x) ; 
noisePower2 = sum(abs(cg_ev1-x).^2)/length(cg_ev1-x) ;  

  %求出噪声功率
SNR1=10*log10(sigPower1/noisePower1)
SNR2=10*log10(sigPower2/noisePower2)


% 平均绝对误差mae
MAE_LMD = mae(abs(cg_ev-x))
MAE_ELMD = mae(abs(cg_ev1-x))

function snr=SNR_singlech(I,In)
% 计算信噪比函数
% I :original signal
% In:noisy signal(ie. original signal + noise signal)
snr=0;
Ps=sum(sum((I-mean(mean(I))).^2));%signal power
Pn=sum(sum((I-In).^2));           %noise power
snr=10*log10(Ps/Pn);


 

​​​​​​​

3 运行结果

4 参考文献

[1]李博健. 改进LMD算法在管道泄漏中的应用研究[D]. 东北石油大学.

博主简介:擅长智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,相关matlab代码问题可私信交流。

  • 1
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

matlab科研助手

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值