用Matlab处理TDMS数据(降噪+频谱分析)

信号处理 专栏收录该内容
2 篇文章 5 订阅

TDMS文件从导入到最终处理的整个过程

该过程是自己本科毕设的一部分内容,大学本科专业是电气工程及其自动化,本科毕业设计课题为《绝缘子沿面放电电流高频特征分析》,自己考研失利,颓废了几个月,差不多从4月底开始做毕设,5月底完成,5月29日本科答辩结束,本科毕设前前后后一个月算是混过去了,其中大部分时间都花在这么一段代码。

这里我需要用matlab提取泄漏电流的高频分量,进而得到我课题涉及到的一些结论。整个过程涉及三个部分:
1.把TDMS数据导入到matlab中
2.把matlab中的数据画出来
3.处理读入到的数据
Matlab处理泄漏电流实质就是处理TDMS文件,TDMS文件储存着泄漏电流,重点是怎么处理泄漏电流,即第三部分。鉴于在网上找代码时,没有一份满意的结果,还花了不少时间,现分享自己的历程,给需要的人节省一点时间。

把TDMS文件导入到matlab

总体说一下,打开tdms文件有4种方式

  1. 用Excel 。打开之前需要安装一个插件,安装好了后,无论用金山还是微软的,他都可以打开,打开的时候,tdms文件右键打开方式里面,就有你安装插件,选择你安装的插件打开该文件。如果不安装插件,用excel打开,就会出现乱码(该插件见我上传的资源,资源名称为:nitdmexcel_18-0-1l”)
  2. 用matlab。这里需要下载一个NI官网的程序“MATLAB TDM Example”,下载该程序后就可以进行读取TDMS文件。(这个文件见我上传的资源,MATLAB TDM Example)
  3. 使用ConventTDMS,这个文件也需要在NI官网下载,这个程序也可以打开。但不宜处理波形文件,我并不推荐。
  4. 使用LabView打开,利用其的csv文件,熟悉LabView的,可以试着打开,打开后,里面再调用matlab程序,也可以处理tdms文件。
    这里推荐使用第二种方法打开,打开后,自己在Matlab里面可以自行编程,自行处理。(注意:matlab本质是一个处理“数据”的“工具”,而这里“数据”是指广义上的,泛指我们从自然界获取的所有东西,这里TDMS文件是一种文件储存格式,储存着各种各样的数据,这里储存着泄漏电流数据,整个过程就是个怎么处理数据的过程。)

tdms文件一般由两个文件组成。一个文件名后缀为‘.tdms’,另外一个为‘.tdms-index’,前一个称之为主文件,后一个为头文件。文件信息不做过多介绍,对我们后续处理没用,感兴趣的可以百度一下。进入正题。matlab怎么读取TDMS文件?我们先用excel打开TDMS,看看里面有些什么内容,这对后续matlab处理有帮助。
打开的界面第二张表格
第二张表格
看到这里,我们就会对tdms文件有更深刻的理解,tdms文件本质就是ecel文件,但tdms文件储存的内容的比excel文件储存的多,相当于“excel+”的版本,这里显示出excel的缺点,工业上对其改进,tdms文件就应运而生了。从图中可以看到,有两幅图表,第二幅图表是我们的信息,一共显示了100w行左右,但实际上有268w行,后续我们在matlab里面可以查看到我们的数据有多少行。(拓展:工业上信息数据比较多,需要大容量的文件格式,后面做一些科研活动,tdms文件格式就比较常见了。)

matlab打开tdms文件

如图打开MATLAB TDM Example,里面有四个文件夹,在Matlab中打开sample的read file文件
sample文件界面
然后在matlab运行(这里需要matlab运行的基础),会连续蹦出来三个对话框。如图第一个对话框界面
第一个对话框让你选择“.dll”文件,这是一个动态库文件,我们在之前的文件(就是之前MATLAB TDM Example打开后,四个子文件之一)里选择第一个对话框
注意箭头所指的文件夹,双击之后,出现第二对话框
第二个对话框
这里选择动态库文件的头文件,注意箭头所指的文件地址,上述选择文件时,应该注意选择64位还是32位,这个没有定论,看你电脑是多少位的,就选择多少位的。然后出现第三个对话框
第三个对话框
第三个对话框,我们就是要选择打开的tdms文件,以我为例,我选择我的文件打开,如图采样图
我这里采集的就是人工污闪试验中,泄漏电流、电压的变化情况,蓝色的对应电压,红色的对应电流(从之前的EXCEL文件,蓝色数据对应里第一列,红色的对应第二列,图中横坐标为他们的采样点,即excel的行数,纵坐标就是他们的所在列的值数)。顺篇提一点,这里excel所记录的值不是电压、电流的实际值,我们还需要进行单位换算,这个你们自己做过试验的应该清楚。

我第一次在matlab运行时,是没有成功显示上述的图画的,一开始运行就报错,好像有一批问题吧!我记的不多,印象最深的就是显示缺少什么编码器,在下面的命令行里打开浏览器,matlab内置的浏览器死活装不了这个浏览器,后来手动下载才好(这里,我上传的资源即:tdm64-gcc-9.2.0.exe)或者改网站进行下载:matlab官方库允许的编译器及其下载
即如果Matlab出现以下代码

No supported compiler or SDK was found. You can install the freely available MinGW-w64 C/C++ compiler; see Install MinGW-w64 Compiler. For more
options, visit http://www.mathworks.com/support/compilers/R2017a/.

那么就是要你去安装这个编码器,但是安装这个编码器,也会陆陆续续碰到一些问题,经同窗提醒,介绍这片博客介绍怎么安装MinGW-w64 C/C++编译器下载和安装。我的安装好了以后,记住需要在Matlab的命令行敲几段代码,相应的网站有,不是安装好了就完事了。
有个人解决思路对我有点启发(我没有经过他那样的操作就解决了):网上一名网友的解决过程
如果还有问题,在下面评论,我有时间一定看看。我的博客不是看一遍就行了,有条件的话,需要多看几篇。

把Matlab的数据画出来

因为第一步已经把采集的数据给画出来。如果只需要这么做,下面这一步就不需要,但如果想进行单位换算,或着只显示泄漏电流的数据,要看看我的第二步。
就ReadFile.m文件打开,里面就这么几行代码

//   %Plot Data from channels in this group     191
    plot(chanvals);                             192
   % clear chanvals;                            193
   clear chanvals                               194
    legend(channames);                          195
end                                             196

把第194行的clear chanvals删除,再次运行,在工作区即可看到
如下情景。在这里插入图片描述
实际上,matlab里面储存的形式都是以矩阵形式,因为Matlab原名就是一个矩阵实验室嘛,画图,只是把矩阵的数据给画出来。
我们要处理的画,就是怎么处理这个矩阵,如我们只想显示泄漏电流、单位换算等
下面的注释是文档一些随笔,不一定与程序有关,自己认真看完就明白了。

%说一下整个流程,首先调用matlab中loadlibary载入动态库nilibddc.dll以及头文件nilibddc_m.h,接着调用uigetfile载入tdms文件,通过calllib调用nilibddc.dll和DDC.GetDataValue函数
%这样就可以把tdms文件的数据读取到matlab中,接着自己在编一个M文件处理这些数据即可。
%整个流程可以分为两个部分,一部分是把tdms数据读入matlab中(该文件‘ReadFile’就是这样,画出数据图,并把数据读入matlab中),另一个部分就是处理数据(自己编M函数,对波形图进行降噪,频谱分析等等。)
%该文件为第二部分,进行降噪、提取泄漏电流高频分量
%A(:,1)表示矩阵A的第一列  A(:,2)表示矩阵A的第二列
%数字指定:A([1 2 3 4][2 3]) 返回1 2 3 42 3 列的数据;
%步长指定:A(1:2:end,:) A(2:2:end,:)分别提取矩阵A的奇数行和偶数行数据;
%A(end:-1:1:) A(:,end:-1:1)分别返回A矩阵行倒序和列倒序的矩阵
%变量指定:A(B(:,1,:),其中B的第一列含有数据,用来指定取矩阵A的哪些行。
Fs = 120000;    %  采样率不是1w2,而是12w           % 这是测量仪器的采样率,已经采集好了,存在矩阵里面(26880002列)            
T1 = 1/Fs;                  % Sampling period  每两个采样点之间间隔0.00000833循环)
U1=206090;                   %电压换算系数;实际电压=测量电压*206090 单位为V
I1=5.57;                     %电流换算系数:实际电流=测量电流/5.57  单位为A
n1=length(chanvals(:,2));
x=[1:1:n1]*T1;          %这样每一个采样点所在的位置都代表每一个时刻 相当于从08.5s

y3=1000*chanvals(:,2)/I1;     %这样得到的实际电流,单位为毫安,泄漏电流数量级的毫安级别
plot(x,y3')
title('Leakage current ')
xlabel('Time/s')
ylabel('Leakage current amplitude/mA')
grid on

y4=U1*chanvals(:,1)/1000;
figure(2)
plot(x,y4);
title('Voltage change ')
xlabel('Time/s')
ylabel('Voltage  amplitude/kV')

如图
泄漏电流与电压
里面涉及到matlab的一些函数的用法,这些都是自己自学的一些东西,没有人会教给你,网上也没有现成的,看不懂的话就是要自己去学习,不懂的话,自己右键点击,然后进行点击help ,matlab有帮助,英文看不懂,就翻译成中文看,里面有比较多的例子,自己慢慢学,这我帮不了你。
如果你对这方面不是很熟悉,推荐一个自学网站【51自学网】-专业培训老师录制的视频教程,让学习变得很轻松[/url]这里面有matlab,LabView等软件的教学视频,这里要说明的是,以后做科研,非常重要的一点就是需要比较强的自学能力,这些东西不难,挺基础的,自己一学就会,不要指望别人教你,只有你自己多花点时间,自己才能解决这个问题。

附录:照着步骤依然打不开文件的解决办法

本博客第一张图的放大图
这里特别要注意一下这里的数据类型,我的这个程序支持打开这种数据类型的,不是这种数据类型就会出现如下图所示的这种情况
常见的错误图
其他一些数据类型运行代码都会出现这种情形,不少人私信我也是出现了这样的问题,陆陆续续收到了不少人的反馈,解决办法有两种:1)用LabView软件将数据类型改成和我一样 2)修改里面ReadFile文件的代码
第一种方法其实很直白,大多数人得到TDMS文件都是LabView导出得到的,对这个软件就已经很熟了,这些人其实就可以在LabView里面调用Matlab处理渡到的数据,导出来又用Matlab处理,多此一举,说到这里,其实之前还有人推荐另外一种打开tdms文件的方法:将tdm文件通过DIAdem软件(官网里面有下载的和教程)保存为lvm格式的文件,然后通过记事本打开lvm格式文件,去掉文件头,保持文件行列整齐,用Matlab打开这个lvm文件,然后再保存为mat格式文件,最后用程序加载这个文件,这也算读进去了。我一开始觉得这种方法也是如此,就没有在前面说,后来又发现这种方法虽然繁琐,但有效,如果实在没有办法的话,也可解燃眉之急,
第二种方法,这种情况实际比较适合我当时的情况,我老师直接给TDMS文件给我,我并没有经手LabView软件,我就没有必要去学这个软件,可以直接就在matlab处理这个程序即可,当时老师也给了我他在武大读博士(实验数据为2010年)时的处理程序,全是程序代码,一点眉目都没有,也没有一个说明书,你自己的一些基础问题要自己去百度,自己问人,自己解决,结果我搞了半天,发现这个代码是“错”,问老师,他说他当时用的好好的,看了几天没有一点感觉,不知道是程序问题还是我的问题,于是就自己找到了这么个解决方法,好在解决了。说远了,说回来。第二种解决方案,需要针对一些数据类型阱行改代码。首先给一个例子来说明,首先用Excel打开这个文件查看数据类型(步骤如上),如下图所示
浮点型数值类型

 %Get channel values if data type of channel is double (DDC_Double = 10)                                   174 
        if strcmp(type,' DDC_Double ') %比较两量,若一样则返回1      Float     DDC_Double      DDC_Float    175 
            numvalsIn = 0;                              176                             

把175行代码中间的DDC_Double 改成 DDC_Float(大小写无所谓,大小写混搭也一样,这里对照标准,关键在于下划线后的数据类型关键字别错就行),改成如下

  %Get channel values if data type of channel is double (DDC_Double = 10)                                    174
        if strcmp(type,' ddc_float ') %比较两量,若一样则返回1      Float     DDC_Double      DDC_Float       175
            numvalsIn = 0;                                        176

这样一一对应,每一种关键字对应一种数据类型,例如这里改成浮点型,就打不开原来我双精度的泄露电流、电压数据,至此这种问题应得到解决,但我还没有完全对应起来,后续补充。

处理泄漏电流

对泄漏电流进行降噪

这个话题就有点大了,就这么一个问题,在华电(华北电力大学,电气“二龙”之一)读的研究生,就这个课题可以发硕士毕业论文了。我简单的介绍一下流程:去噪的算法有许多种,比如FFT滤波算法、小波硬阈值去噪、小波软阈值去噪、EMD去噪、EEMD去噪等,现在还有一些新的算法,总而言之,算法有许多,就小波阈值去噪这一块,我们细分可以分为许多种,不止小波硬阈值去噪、小波软阈值去噪。有了这么多算法以后,我们需要评判一下所有去噪算法当中,谁去噪效果最好,于是我们引进两个参数:信噪比(SNR)和均方根误差(RMSE),这里不清楚的,可以搜百度,或者我的补充材料(我后面会上传这篇博客的补充材料)。
泄漏电流原本就不清楚没有噪音的泄漏电流是怎么样的,于是我们自己编一个三角函数,加伪随机数来模拟白噪声(查阅相关文献资料,噪声有许多种,主要是白噪声),然后求得他们不同的参数结果,这里就选用小波硬阈值去噪、小波软阈值去噪(其他算法的原理、程序都还没有搞明白),得到小波软阈值去噪效果最好。(见我补充材料,本科毕业论文)
下面进行小波软阈值去噪
这里可以学习一下小波变换(我这里有一本电子书书《小波变换10讲》,世界上讲解小波变换最畅销的书之一,适合入门,虽然是研究生学习的课程,但不难。这本电子书上传不了,需要的,在评论下方留下你的邮箱地址,注明目的,我会发给你们,若长时间没有收到,再提醒下我),再在matlab上进行算法实现,这里去噪可以自己编程,我选用小波变换包进行处理。
输入 wavemenu,调用小波变换包
界面
点击第一个按钮,在后面的界面选择file,下拉列表中选择,从工作区中导入数据,选择信号,在列表中选择一维信号:y3,
小波分解界面
我们先选择小波基,选用“db4”进行5层分解,然后点击分析,可以得到分解的信号,再点击降噪。
小波降噪界面
这里默认是小波软阈值去噪,不用处理,我之间接下来点击降噪即可。
在这里插入图片描述
后面导入进工作区以后,降噪以后的信号还是以矩阵的形式储存起来,同之前的步骤一样,可以把去噪后的矩阵用matlab给画出来。

提取泄漏电流的高频分量

这里主要是进行傅里叶分析,分析泄漏电流的高频分量,采用下列代码

x1=x';    %这里进行矩阵转置
k=[x1,y3]; %k是一个矩阵,第一列是采样点时间,第二列对应的是泄漏电流的数值大小

%%
%原离散信号有2688000个点。268w8k个采样点,也就是268w多个数据点进行fft分析
n=480000 ;    %取前几行的点,也就是前4秒的信号        需要改动 1s采集2400个点
k1=k(1:n,:) ;  %这是待处理的矩阵,处理矩阵的前n行     需要改动

%Fs = 120000;    %    因为数据是每隔T1秒采集一次数据,      
%T1 = 1/Fs;     %   T1已经做了自己的事情

t1=T1:T1:T1*n ;  %这就是时间表 需要改动 共4800个点
y1=fft(k1(:,2)) ;
y2=fftshift(y1);
f=(0:479999)*Fs/480000-Fs/2 ;  
figure(3);
plot(t1,k1(:,2),'');
title('离散数据原始图')
xlabel('Time/s')
ylabel('Leakage current amplitude/mA')
figure(4);
plot(f,abs(y2),'');  %打印出离散数据的频谱分析线
title('频谱分析')
xlabel('f/Hz')
ylabel('幅值')
axis([0 500 0 2500]);

y5=details_1D(1,:);
figure(5);
 plot(x,y5);
 title('Leakage current ')
xlabel('Time/s')
ylabel('幅值')

可以得到其时间窗,同时得到这一段时间信号的频谱图,结果如下
在这里插入图片描述
然后不同的时间分别进行傅里叶变换,但同时也暴露了傅里叶分解的缺陷,只能反映一段时间信号的频率成分中,它有哪些频率成分,但不能反映,具体什么频率是什么时候出现的,于是我采用离散小波变换,提取其高频分量,知道电压增大的同时,泄漏电流的高频分量随时间的变化情况。这里没必要涉及离散小波变换,就傅里叶变换即可,但小波变换在信号处理方面十分重要且热门,如果需要进一步理解小波变换,可以参考小波变换的理解(适合新手短期内分析信号的高频特性)。这里面有小波变换的代码。

于2021/3/15
第二版
共计10624字

©️2021 CSDN 皮肤主题: 创作都市 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值