Чтение с осциллографа в MATLAB и ограничение целого / байтового значения - PullRequest
0 голосов
/ 15 ноября 2018

У меня проблема с получением данных с осциллографа. MATLAB захватывает значения, которые превышают ограничение 255 для формата BYTE и 65 535 для беззнакового 16-разрядного целого числа при использовании формата WORD, и возвращают эти значения обратно с 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 голосов
/ 21 ноября 2018

Если кто-нибудь когда-либо сталкивался с подобной проблемой, вот как я ее решил: В итоге проблема была в смещении напряжения на прицеле в сочетании с настройками v / div. По некоторым причинам обнуление смещения было серьезной проблемой. Я увеличивал напряжение смещения (которое в основном поднимает форму волны на прицеле), пока я не начал захватывать правильную форму волны, а также немного поиграл с настройками вольт / деление (в меньшей степени). Странная проблема.

0 голосов
/ 15 ноября 2018

Вы должны явно указать ожидаемый формат. Такие как 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 или без него, и посмотрите, какой из них работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...