用Matlab处理TDMS数据(降噪+频谱分析) 您所在的位置:网站首页 matlab数据降噪处理 用Matlab处理TDMS数据(降噪+频谱分析)

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

2024-06-15 10:03| 来源: 网络整理| 查看: 265

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

大学本科专业是电气工程及其自动化,本科毕业设计课题《绝缘子沿面放电电流高频特征分析》,考研失利,颓废了几个月,差不多从4月底到5月底,这一段时间搞这个,本科毕设算是混过去了,其中大部分时间都花在这么一段代码。

这里我需要用matlab提取泄漏电流的高频分量,进而得到我课题涉及到的一些结论。整个过程涉及三个部分: 1.把TDMS数据导入到matlab中 2.把matlab中的数据画出来 3.处理读入到的数据 其中涉及matlab处理泄漏电流,重点也就是处理泄漏电流(即第三部分。)鉴于在该网上找代码时,没有一份合适的答案,还花了不少时间,现分享自己的历程,给需要的人节省一点时间。(这不是很难,反而很简单)。

把TDMS文件导入到matlab

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

用Excel 。打开之前需要安装一个插件,安装好了后,无论用金山还是微软的,他都可以打开。(该插件,我上传的资源,资源名称为:nitdmexcel_18-0-1l”,就是了) 用matlab。这里需要下载一个NI官网的程序“MATLAB TDM Example”,下载该程序后就可以进行读取TDMS文件。(这个文件,我上传的资源,搜MATLAB TDM Example) 使用ConventTDMS,这个文件也需要在NI官网下载,下载好了后,但不宜处理波形文件,我并不推荐。 使用LIBView打开,利用其的csv文件,熟悉可以打开,可以调用matlab程序。 这里推荐使用第二种方法打开,打开后,可以编程进行数据处理。

tdms文件一般由两个文件组成。一个文件后缀为‘.tdms’,另外一个为‘.tdms-index’。前一个称之为主文件,后一个为头文件。不做过多介绍,可以参开百度文件,excel可以打开TDMS文件,进入正题。matlab怎么读取TDMS文件?(使用方法1)在读文件之前,先用excel打开,如图 看到这里,我们就会对tdms文件有更深刻的理解,tdms文件本质就是二进制文件,tdms文件储存的内容的比excel文件储存的多,相当于“excel+”的版本。我这里有电压、泄漏电流采集共有268w行,但excel一次性只能显示100w左右。工业上的数据正是因为数据量大,所以NI公司推出TDMS文件格式。

matlab打开tdms文件

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

我第一次在matlab运行时,是没有成功显示上述的图画的,一开始运行就报错,好像有一批问题吧!我记的不多,印象最深的就是显示缺少什么编码器,在下面的命令行里打开浏览器,matlab内置的浏览器死活装不了这个浏览器,后来手动下载才好(这里,我上传的资源即:tdm64-gcc-9.2.0.exe)或者改网站进行下载:matlab官方库允许的编译器及其下载 有个人解决思路对我有点启发(我没有经过他那样的操作就解决了):网上一名网友的解决过程 如果还有问题,在下面评论,我有时间一定看看

把Matlab的数据画出来

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

123456//   %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原名就是一个矩阵实验室嘛,画图,只是把矩阵的数据给画出来。 我们要处理的画,就是怎么处理这个矩阵,如我们只想显示泄漏电流、单位换算等 下面的注释是文档一些随笔,不一定与程序有关,自己认真看完就明白了。

1234567891011121314151617181920212223242526272829%说一下整个流程,首先调用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 4行2 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           % 这是测量仪器的采样率,已经采集好了,存在矩阵里面(2688000行2列)             T1 = 1/Fs;                  % Sampling period  每两个采样点之间间隔0.0000083(3循环) U1=206090;                   %电压换算系数;实际电压=测量电压*206090 单位为V I1=5.57;                     %电流换算系数:实际电流=测量电流/5.57  单位为A n1=length(chanvals(:,2)); x=[1:1:n1]*T1;          %这样每一个采样点所在的位置都代表每一个时刻 相当于从0到8.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有帮助,英文看不懂,就翻译成中文看,里面有比较多的例子,自己慢慢学,这我帮不了你。

处理泄漏电流 对泄漏电流进行降噪

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

提取泄漏电流的高频分量

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

123456789101112131415161718192021222324252627282930313233x1=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('幅值')

可以得到其时间窗,同时得到这一段时间信号的频谱图,结果如下 然后不同的时间分别进行傅里叶变换,但同时也暴露了傅里叶分解的缺陷,只能反映一段时间信号的频率成分中,它有哪些频率成分,但不能反映,具体什么频率是什么时候出现的,于是我采用离散小波变换,提取其高频分量,知道电压增大的同时,泄漏电流的高频分量随时间的变化情况。这里没必要涉及离散小波变换,就傅里叶变换即可,后续再补充。 完。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有