力科(Lecroy)示波器专用波形文件(轨迹文件/trace文件/.trc文件)在MATLAB上的解析与回写
读取出来的量的具体含义可以查阅力科官方有关 trace 的定义文件 LeCroyWaveformTemplate_2_3.pdf
使用方法:
1、用下面的类定义,声明一个 Trace 对象
2、用 Read 方法读取即可
3、用 ADCSamples2Voltage 方法提取波形数据(原始数据为 ADC 采样数值)
4、如需回写,需要先用 Voltage2ADCSamples 方法将已有的波形数据转换为 ADC 采样值,再用 Write 方法写入到新文件
Trace 类定义(文件头+数据段):
classdef Trace < handlepropertiesHeadOffset = 11HEADER = '#9020000350' %文件头,主要用于指示文件大小,数值为9e10+文件字节长度(不包括此文件头的11个字节)DESCRIPTOR_NAME = 'WAVEDESC' %解释器, 16B, s, 0-15TEMPLATE_NAME = 'LECROY_2_3' %模板名, 16B, s, 16-31COMM_TYPE = 1 %2B, enum, 32-33COMM_ORDER = 1 %2B, enum, 34-35 小端%各块长度(字节)WAVE_DESCRIPTOR = 346 %文件头WAVEDSEC块的长度,4B, long, 36-39USER_TEXT = 0 %用户文本块的长度,4B, long, 40-43RES_DESC1 = 0 %保留,4B, long, 44-47%各序列长度(字节)TRIGTIME_ARRAY = 0 %4B,long,48-51RIS_TIME_ARRAY = 0 %4B,long,52-55RES_ARRAY_1 = 0 %保留,4B,long,56-59WAVE_ARRAY_1 = 20000004 %4B,long,60-63,数据列1WAVE_ARRAY_2 = 0 %4B,long,64-67,数据列2RES_ARRAY_2 = 0 %4B,long,68-71,保留2RES_ARRAY_3 = 0 %4B,long,72-75,保留3%仪器信息INSTRUMENT_NAME = 'LECROYWaveRunner'%16B,s,76-91INSTRUMENT_NUMBER %4B, long, 92-95 仪器编号TRACE_LABEL = repmat(char(0),1,16) %16B, s, 96-111RESERVED1 = 10000002 %4B, 保留, 112-115,数值等于WAVE_ARRAY_COUNT,原因我也不知道%波形信息WAVE_ARRAY_COUNT= 10000002 %数据长度,4B, long, 116-119PNTS_PER_SCREEN = 10000000 %屏幕上的数据长度,等于上面的值-2, 4B, long, 120-123FIRST_VALID_PNT = 0 %需要跳过的数据点数,置0即可,4B, long, 124-127LAST_VALID_PNT = 10000001 %WAVE_ARRAY_COUNT-1,4B, long, 128-131FIRST_POINT = 0 %第一个数据点,填0即可,4B,132-135SPARSING_FACTOR = 1 %填1即可,4B ,136-139SEGMENT_INDEX = 0 %数据段索引,填0即可,4B, 140-143SUBARRAY_COUNT = 1 %获取到的数据段数,4B, 144-147SWEEPS_PER_ACQ = 1 %Average或Extrema专用,否则填1, 4B, 148-151POINTS_PER_PAIR = 0 %2B, 152-153,峰值检测专用,这两个不用改PAIR_OFFSET = 0 %2B, 154-155VERTICAL_GAIN = 1.373120030621067e-04 %4B f 156-159 垂直轴增益 原数据=数据*增益+偏移VERTICAL_OFFSET = 0 %4B f 160-163 垂直轴偏移MAX_VALUE = 28875 %波形图网格的最大最小值, 4B f 164-167MIN_VALUE = -29131 %4B f 168-171NOMINAL_BITS = 8 %2B 172-173 不用改NOM_SUBARRAY_COUNT = 1 %2B 174-175HORIZ_INTERVAL = 1e-10 %4B f 176-179 采样点间隔HORIZ_OFFSET = -5e-4 %8B double 180-187PIXEL_OFFSET = -5e-4 %8B d 188-195VERTUNIT = ['V', repmat(char(0),1,47)] %196-243 单位定义, 48BHORUNIT = ['S', repmat(char(0),1,47)] %244-291 单位定义, 48BHORIZ_UNCERTAINTY = 1e-12 %4B f 292-295 不确定性 单位为秒TRIGGER_TIME %24B f 296-311触发时间戳ACQ_DURATION = 0 %4B f 312-315RECORD_TYPE = 0 %2B 316-317 波形类型,一般填0即可PROCESSING_DONE = 0 %2B 318-319RESERVED5 = 0 %2B 320-321RIS_SWEEPS = 1 %2B 322-323TIMEBASE = 24 %2B 324-325 水平轴栅格时长VERT_COUPLING = 0 %2B 326-327 耦合方式PROBE_ATT = 1 %4B f 328-331 探针衰减FIXED_VERT_GAIN = 18 %2B 332-333 垂直轴固定增益BANDWIDTH_LIMIT = 0 %2B 334-335 带宽显示,填0即可VERTICAL_VERNIER= 1 %4B f 336-339ACQ_VERT_OFFSET = 0 %4B f 340-343WAVE_SOURCE = -1 %2B 344-345 波形通道%用户文本块TEXT %视上面定义的长度而定%TRIGTIMETRIGGER_T %8B f 原名结尾是TIME,但与前面定义重复,故改为TTRIGGER_OFFSET %8B f%RISTIMERIS_OFFSET %8B f%DATA_ARRAY_1DATA_ARRAY_1%DATA_ARRAT_2DATA_ARRAY_2%SIMPLESIMPLE%DUALDUALendmethodsfunction self = Trace()return;end%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%function Read(self,fn)fid=fopen(fn,'r');if fid==-1 fprintf('ERROR: file not found: %s\n', fn);return;enddata = fread(fid,50);self.HeadOffset = strfind(char(data(1:50)'), self.DESCRIPTOR_NAME) - 1; %找到文件头并返回偏移量fseek(fid, self.HeadOffset+34, 'bof'); %指针定位到指定项self.COMM_ORDER = fread(fid,1,'int16');fclose(fid);if self.COMM_ORDER %根据文件数据格式重新读入fid = fopen(fn,'r','ieee-le'); % LOFIRST ,小端数据else fid = fopen(fn,'r','ieee-be'); % HIFIRST ,大端数据endfseek(fid, 0 ,'bof');self.HEADER = ReadStringN(fid, 0, 11);templateName = ReadString(fid, self.HeadOffset+16);if ~strcmp( deblank(templateName), self.TEMPLATE_NAME)error('Unsupported Template');end%开始读入文件信息self.COMM_TYPE = ReadWord(fid, self.HeadOffset+32);self.WAVE_DESCRIPTOR = ReadLong(fid, self.HeadOffset+36);self.USER_TEXT = ReadLong(fid, self.HeadOffset+40);self.RES_DESC1 = ReadLong(fid, self.HeadOffset+44);self.TRIGTIME_ARRAY = ReadLong(fid, self.HeadOffset+48);self.RIS_TIME_ARRAY = ReadLong(fid, self.HeadOffset+52);self.RES_ARRAY_1 = ReadLong(fid, self.HeadOffset+56);self.WAVE_ARRAY_1 = ReadLong(fid, self.HeadOffset+60);self.WAVE_ARRAY_2 = ReadLong(fid, self.HeadOffset+64);self.RES_ARRAY_2 = ReadLong(fid, self.HeadOffset+68);self.RES_ARRAY_3 = ReadLong(fid, self.HeadOffset+72);%开始读入仪器信息self.INSTRUMENT_NAME = ReadString(fid, self.HeadOffset+76);self.INSTRUMENT_NUMBER = ReadLong(fid, self.HeadOffset+92);self.TRACE_LABEL = ReadString(fid, self.HeadOffset+96);self.RESERVED1 = ReadLong(fid, self.HeadOffset+112);%开始读入波形信息self.WAVE_ARRAY_COUNT = ReadLong(fid, self.HeadOffset+116);self.PNTS_PER_SCREEN = ReadLong(fid, self.HeadOffset+120);self.FIRST_VALID_PNT = ReadLong(fid, self.HeadOffset+124);self.LAST_VALID_PNT = ReadLong(fid, self.HeadOffset+128);self.FIRST_POINT = ReadLong(fid, self.HeadOffset+132);self.SPARSING_FACTOR = ReadLong(fid, self.HeadOffset+136);self.SEGMENT_INDEX = ReadLong(fid, self.HeadOffset+140);self.SUBARRAY_COUNT = ReadLong(fid, self.HeadOffset+144);self.SWEEPS_PER_ACQ = ReadLong(fid, self.HeadOffset+148);self.POINTS_PER_PAIR = ReadWord(fid, self.HeadOffset+152);self.PAIR_OFFSET = ReadWord(fid, self.HeadOffset+154);self.VERTICAL_GAIN = ReadFloat(fid, self.HeadOffset+156);self.VERTICAL_OFFSET = ReadFloat(fid, self.HeadOffset+160);self.MAX_VALUE = ReadFloat(fid, self.HeadOffset+164);self.MIN_VALUE = ReadFloat(fid, self.HeadOffset+168);self.NOMINAL_BITS = ReadWord(fid, self.HeadOffset+172);self.NOM_SUBARRAY_COUNT = ReadWord(fid, self.HeadOffset+174);self.HORIZ_INTERVAL = ReadFloat(fid, self.HeadOffset+176);self.HORIZ_OFFSET = ReadDouble(fid, self.HeadOffset+180);self.PIXEL_OFFSET = ReadDouble(fid, self.HeadOffset+188);self.VERTUNIT = ReadStringN(fid, self.HeadOffset+196, 48);self.HORUNIT = ReadStringN(fid, self.HeadOffset+244, 48);self.HORIZ_UNCERTAINTY = ReadFloat(fid, self.HeadOffset+292);self.TRIGGER_TIME = ReadTimestamp(fid,self.HeadOffset+296);self.ACQ_DURATION = ReadLong(fid, self.HeadOffset+312);self.RECORD_TYPE = ReadWord(fid, self.HeadOffset+316);self.PROCESSING_DONE = ReadWord(fid, self.HeadOffset+318);self.RESERVED5 = ReadWord(fid, self.HeadOffset+320);self.RIS_SWEEPS = ReadWord(fid, self.HeadOffset+322);self.TIMEBASE = ReadWord(fid, self.HeadOffset+324);self.VERT_COUPLING = ReadWord(fid, self.HeadOffset+326);self.PROBE_ATT = ReadFloat(fid, self.HeadOffset+328);self.FIXED_VERT_GAIN = ReadWord(fid, self.HeadOffset+332);self.BANDWIDTH_LIMIT = ReadWord(fid, self.HeadOffset+334);self.VERTICAL_VERNIER = ReadFloat(fid, self.HeadOffset+336);self.ACQ_VERT_OFFSET = ReadFloat(fid, self.HeadOffset+340);self.WAVE_SOURCE = ReadWord(fid, self.HeadOffset+344);%开始读入数据self.TEXT = ReadStringN(fid, self.HeadOffset+346, self.USER_TEXT);if self.RECORD_TYPE == 0 %single sweepfseek(fid, self.HeadOffset + self.WAVE_DESCRIPTOR + self.USER_TEXT, 'bof');if self.COMM_TYPE %2Bself.DATA_ARRAY_1 = fread(fid, self.WAVE_ARRAY_1, 'int16');else %1Bself.DATA_ARRAY_1 = fread(fid, self.WAVE_ARRAY_1, 'int8');endelse error('Unsupported Record Type');endfclose(fid);end%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%function Write(self,fn,wvfm)self.Voltage2ADCSamples(wvfm); %转换数据if self.COMM_ORDERfid = fopen(fn,'w','ieee-le');elsefid = fopen(fn,'w','ieee-be');endfseek(fid,0,'bof');self.HEADER = strcat('#', num2str( 9000000000 + self.WAVE_DESCRIPTOR + self.WAVE_ARRAY_1 ));fwrite(fid, self.HEADER, 'char*1');fwrite(fid, self.DESCRIPTOR_NAME,'char*1');fwrite(fid, repmat(char(0),1,8),'char*1'); %补\0fwrite(fid, self.TEMPLATE_NAME,'char*1');fwrite(fid, repmat(char(0),1,6),'char*1');fwrite(fid, self.COMM_TYPE, 'int16');fwrite(fid, self.COMM_ORDER, 'int16');fwrite(fid, self.WAVE_DESCRIPTOR, 'int32');fwrite(fid, self.USER_TEXT, 'int32');fwrite(fid, self.RES_DESC1, 'int32');fwrite(fid, self.TRIGTIME_ARRAY, 'int32');fwrite(fid, self.RIS_TIME_ARRAY, 'int32');fwrite(fid, self.RES_ARRAY_1, 'int32');fwrite(fid, self.WAVE_ARRAY_1, 'int32');fwrite(fid, self.WAVE_ARRAY_2, 'int32');fwrite(fid, self.RES_ARRAY_2, 'int32');fwrite(fid, self.RES_ARRAY_3, 'int32');fwrite(fid, self.INSTRUMENT_NAME, 'char*1');fwrite(fid, self.INSTRUMENT_NUMBER, 'int32');fwrite(fid, self.TRACE_LABEL, 'char*1');fwrite(fid, self.RESERVED1, 'int32');fwrite(fid, self.WAVE_ARRAY_COUNT, 'int32');fwrite(fid, self.PNTS_PER_SCREEN, 'int32');fwrite(fid, self.FIRST_VALID_PNT, 'int32');fwrite(fid, self.LAST_VALID_PNT, 'int32');fwrite(fid, self.FIRST_POINT, 'int32');fwrite(fid, self.SPARSING_FACTOR, 'int32');fwrite(fid, self.SEGMENT_INDEX, 'int32');fwrite(fid, self.SUBARRAY_COUNT, 'int32');fwrite(fid, self.SWEEPS_PER_ACQ, 'int32');fwrite(fid, self.POINTS_PER_PAIR, 'int16');fwrite(fid, self.PAIR_OFFSET, 'int16');fwrite(fid, self.VERTICAL_GAIN, 'float');fwrite(fid, self.VERTICAL_OFFSET, 'float');fwrite(fid, self.MAX_VALUE, 'float');fwrite(fid, self.MIN_VALUE, 'float');fwrite(fid, self.NOMINAL_BITS, 'int16');fwrite(fid, self.NOM_SUBARRAY_COUNT, 'int16');fwrite(fid, self.HORIZ_INTERVAL, 'float');fwrite(fid, self.HORIZ_OFFSET, 'double');fwrite(fid, self.PIXEL_OFFSET, 'double');fwrite(fid, self.VERTUNIT, 'char*1');fwrite(fid, self.HORUNIT, 'char*1');fwrite(fid, self.HORIZ_UNCERTAINTY, 'float');timestamp = datetime('now');fwrite(fid, second(timestamp), 'float64'); %时间戳fwrite(fid, minute(timestamp), 'int8');fwrite(fid, hour(timestamp), 'int8');fwrite(fid, day(timestamp), 'int8');fwrite(fid, month(timestamp), 'int8');fwrite(fid, year(timestamp), 'int32');fwrite(fid, self.ACQ_DURATION, 'int32');fwrite(fid, self.RECORD_TYPE, 'int16');fwrite(fid, self.PROCESSING_DONE, 'int16');fwrite(fid, self.RESERVED5, 'int16');fwrite(fid, self.RIS_SWEEPS, 'int16');fwrite(fid, self.TIMEBASE, 'int16');fwrite(fid, self.VERT_COUPLING, 'int16');fwrite(fid, self.PROBE_ATT, 'float');fwrite(fid, self.FIXED_VERT_GAIN, 'int16');fwrite(fid, self.BANDWIDTH_LIMIT, 'int16');fwrite(fid, self.VERTICAL_VERNIER, 'float');fwrite(fid, self.ACQ_VERT_OFFSET, 'float');fwrite(fid, self.WAVE_SOURCE, 'int16');if self.USER_TEXT ~= 0fwrite(fid, self.TEXT, 'char*1');endif self.COMM_ORDERfwrite(fid, self.DATA_ARRAY_1, 'int16');elsefwrite(fid, self.DATA_ARRAY_1, 'int8');endfclose(fid);end%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 恢复波形数据function [x,y] = ADCSamples2Voltage(self)y = self.VERTICAL_GAIN * self.DATA_ARRAY_1 - self.VERTICAL_OFFSET;x = (0:self.WAVE_ARRAY_COUNT-1)'*self.HORIZ_INTERVAL + self.HORIZ_OFFSET;end% 将浮点数波形数据转换为ADC采样值,会覆盖对象中的数值function Voltage2ADCSamples(self,wvfm)self.DATA_ARRAY_1 = int16( (wvfm + self.VERTICAL_OFFSET) / self.VERTICAL_GAIN );end%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%end
end
下面是一些辅助函数(为每个函数定义一个文件,并将所有文件放至同一目录即可正常运行):
% Read 8Bit signed Byte (not used)
function b=ReadByte(fid, Addr)fseek(fid,Addr,'bof');b=fread(fid,1,'int8');
end% Read 16Bit signed Word
function w=ReadWord(fid, Addr)fseek(fid,Addr,'bof');w=fread(fid,1,'int16');
end% Read 32Bit signed Long
function l=ReadLong(fid, Addr)fseek(fid,Addr,'bof');l=fread(fid,1,'int32');
end% Read 32Bit IEEE Float
function f=ReadFloat(fid, Addr)fseek(fid,Addr,'bof');f=fread(fid,1,'float32');
end% Read 64Bit IEEE Double
function d=ReadDouble(fid, Addr)fseek(fid,Addr,'bof');d=fread(fid,1,'float64');
end % Read timestamp
function t=ReadTimestamp(fid, Addr)fseek(fid,Addr,'bof');t.Seconds = fread(fid,1,'float64');t.Minutes = fread(fid,1,'int8');t.Hours = fread(fid,1,'int8');t.Days = fread(fid,1,'int8');t.Months = fread(fid,1,'int8');t.Year = fread(fid,1,'int16');
end% Read string (up to 16 characters)
function s=ReadString(fid, Addr)fseek(fid,Addr,'bof');s=fgets(fid,16);
end% Read string (N characters)
function s=ReadStringN(fid, Addr, n)fseek(fid,Addr,'bof');s=fgets(fid,n);
end
回写后的文件在力科的 WaveStudio 中的显示效果:
力科(Lecroy)示波器专用波形文件(轨迹文件/trace文件/.trc文件)在MATLAB上的解析与回写相关推荐
- 推荐一款FPGA lattice 深力科电子LCMXO3LF-4300C-5BG324C 使得您的控制PLD和桥接设计能够跟上技术发展
推荐一款FPGA lattice 深力科电子LCMXO3LF-4300C-5BG324C 使得您的控制PLD和桥接设计能够跟上技术发展 FPGA lattice深力科电子LCMXO3LF-4300C- ...
- 泰克|是德|普源|力科|RS示波器软件下载
NS-Scope示波器程控软件 *主要功能:硬件连接:参数配置:运行参数:数据查询. *程控对象:示波器. *程控接口:兼容市面上所有具有GPIB.USB.RS232.LAN.RS485.TTL任意一 ...
- win oracle trc文件怎么打开,trc文件打开工具
trc文件打开工具也就是Anritsu TraceView,安装之后就可自动关联TRC文件格式,这样就可以进行trc文件的查看和编辑了.还可进行trc文件的翻转.对齐.修改等操作,需要的朋友可以来本站 ...
- 力科的示波器离线波形查看工具
上面这张是它的最新版,叫MAUI.终于能在一屏上对比查看多个通道的波形了. 下面的这个是老的远程和离线工具, WaveStudio: 我的一个同事,私人买了一款XP时代的示波器,2G采样率,极深的存储 ...
- 力科示波器上位机软件NS-Scope功能介绍
1.软件概述 ◆为了解决示波器测试操作流程繁琐.参数配置复杂等问题,Namisoft开发的NS-Scope示波器自动化测试程控软件,通过对示波器的程序控制,实现自动化参数配置.数据采集和数据存储 ...
- matlab meas 函数_力科示波器Matlab使用指南
自定义示波器系列之一 自定义示波器系列之一 -- --力科示波器 力科示波器 MATLAB 使用指南 使用指南 美国力科公司 万力劢 基于 X-Stream 技术的力科示波器既是一个高速信号采集平台, ...
- 力科示波器 matlab,自定义眼图模板
Teledyne LeCroy 万力劢 一.眼图模板的电气特性意义 眼图模板测试是评估高速串行信号质量的重要方法.力科示波器串行数据分析功能已经内置了业界主流高速信号的模板,多达50种以上.但是以下几 ...
- 力科示波器 matlab,力科周末文章四周年180期合集目录
力科周末文章四周年180期合集 一.示波器基础系列 01 关于示波器的带宽-Frankie 01-1calibrating scopes 02 采样率和存储深度-Rick 03 DSO中的内插技术-P ...
- 横河、力科、泰克三种示波器的触发功能对比
横河和泰克都有run/stop键,run起来之后自动启用触发功能,横河在single下还可以滚动,泰克是增加单位时间长度后自动进入滚动模式,滚动下也可以进行触发.力科没有run键,但在时间设置较长后可 ...
- 泰科MDO3034示波器波形FFT分析及数据导出
一:FFT波形获取 获取波形,下图依电流波形为例 选择M(Math)按钮,出现菜单处选择FFT 再点击M Label标签,出现如下菜单 选择Vertical菜单,选择Linear RMS,此时会显示各 ...
最新文章
- 2018 Multi-University Training Contest 7
- 进一步认识golang中的并发
- Select()系统调用及文件描述符集fd_set的应用
- 安装库_免费软件安装库
- Laravel Auth 自定义user 模型目录结构
- c/c++宏函数的定义与使用(宏定义函数)(macro definition)
- java中四类八中_JAVA中的八中基本数据类型
- 基于JAVA+Swing+MYSQL的汽车租赁系统
- linux规定ip使用网卡,使用TC 对LINUX服务器网卡进行带宽限制的办法
- 【学术分享】发顶会论文,怎么就那么难?
- Flutter mixin用法详解
- sqlserver行列转换,动态行转换
- ELK日志分析系统理论加实操演练!!
- 计算机专业法语怎么读,计算机专业法语词汇
- Liunx修改用户密码
- 字体设计编辑软件Glyphs 2 for mac中文版v2.6.6(1350)
- 调出夕阳日落照片效果
- 计算机英语软件系统介绍ppt,ppt软件电脑上显示英文
- | 应用打包还是测试团队老大难问题?
- MySQL DBA的修炼与未来(参考篇)
热门文章
- JEECG架构讲解及使用
- ORA-01790 expression must have same datatype as corresponding expression 问题解决
- linux目录和文件
- Ant Design Pro学习记录—默认主题配色修改
- VScode的代码截图插件CodeSnap
- 用c语言屏蔽鼠标键盘,用VBS屏蔽键盘和鼠标
- 利用ICommand和ITool重写Arcengine中控件的事件
- 微信付款到个人银行卡php,微信企业付款到银行卡(下)
- Qt 教程(传智教育)
- Android专业DJ,著名音乐游戏《DJ英雄》登陆Android Market