从示波器读取到MATLAB以及整数/字节值限制

时间:2018-11-15 12:30:35

标签: matlab

我从示波器获取数据时遇到问题。使用WORD格式时,MATLAB捕获的值超过BYTE格式的255个值和无符号16位整数的65,535个值,并将这些值从0循环回,从而导致波形非常失真。我正在使用以下代码,并使用binblockread读取数据:

clear all

clc

close all

%%

DSO_S_104A=instrfind('Type', 'visa-usb', 'RsrcName', 'USB0::0x2A8D::0x904A::MY54340109::0::INSTR', 'Tag', '');

DSO_S_104A.InputBufferSize = 350000;

DSO_S_104A.ByteOrder = 'littleEndian';

fopen(DSO_S_104A);

%% SETUP

set(DSO_S_104A, 'Timeout', 0.5);

%Set number of points

fprintf(DSO_S_104A, ':ACQUIRE:POINTS 48000');

% Set sample rate

fprintf(DSO_S_104A, ':ACQUIRE:SRATE 0.5e9');

% Turn interpolation off for faster averaging

fprintf(DSO_S_104A, ':ACQUIRE:INTERPOLATE OFF');

fprintf(DSO_S_104A,'*TRG');

fwrite(DSO_S_104A,'SYSTem:HEADer OFF');

% Specify data from Channel 1

fprintf(DSO_S_104A,':WAVEFORM:SOURCE CHAN1'); 

fprintf(DSO_S_104A,':WAVEFORM:FORMAT BYTE');

fprintf(DSO_S_104A,':WAVEFORM:BYTEORDER LSBFirst');

fprintf(DSO_S_104A, 'WAVEFORM:STREAMING OFF');

%%

fwrite(DSO_S_104A,sprintf(':WAV:DATA?\n'));

data2 = binblockread(DSO_S_104A);

plot(data2)

end

我要采样的波形是此图像上的中间一个(黄色): 结果如下:

数据显然在那里,但是高于255的采样值会回送并使所有内容失真。 有没有什么办法解决这一问题?我知道对于相位测量中2pi跳变的情况,“展开”命令可以提供帮助,但是振幅有什么用吗?

此外,如果有人对如何加快从示波器到MATLAB的数据采集过程有任何建议,我也欢迎提出任何建议。目前,要从示波器上捕获一个“屏幕”,MATLAB需要大约0.04秒的时间,最多保持3-4倍的点数不变。 我可以增加一个采集中放置多个“范围屏幕”的点数,从而加快处理速度(通过稍后将每个“屏幕”切成不同的向量),但是这也使数据处理更加困难。

2 个答案:

答案 0 :(得分:0)

您应明确给出所需的格式。例如data_read = binblockread(DSO_S_104A,'int16');

否则,Matlab可能会以奇怪的方式解释和转换字节流。

另一种解决方案是手动转换从仪器读取的数据:

// read and cast to uint8, as Matlab tends to cast everything to double
data2 = uint8(binblockread(DSO_S_104A));

// now you have an uint8 array with values in the 0-255 range
// typecast (i.e. re-interpret the binary representation of your numbers as another data type, here 'int16')
data_test = typecast(data2(:),'int16'); // or 'int32', or 'float', or 'int8', or...

// try to swap bytes, in case the data from the instrument does not have the same endianness as the computer
data_test_reverse_endianness = swapbytes(data_test);

// plot and see if it makes sense
plot([data_test,data_test_reverse_endianness]);

尝试使用多种格式,无论是否使用swapbytes,然后查看哪种格式有效。

答案 1 :(得分:0)

万一有人遇到类似的问题,这就是我的解决方法: 最后,问题是示波器上的失调电压加上v / div设置。由于某些原因,零偏移是一个主要问题。我提高了失调电压(基本上是在示波器上提高了波形),直到我开始捕获正确的波形,并在volt / div设置上发挥了一点作用(程度较小)。奇怪的问题。