Генерация и загрузка сгенерированного модулированного сигнала к генератору сигнала RF

Этот пример показывает создание комплексной основной полосы (IQ) сигнал с MATLAB®, загрузкой этого сигнала к векторному генератору сигнала, повышающему преобразованию сигнала поставщику услуг RF и генерации сигнала RF от инструмента. Загрузка сигнала и управление инструмента используют Instrument Control Toolbox™, который поддерживает связь с инструментами через интерфейсы и драйверами.

Для полного списка поддерживаемого оборудования посетите страницу продукта Instrument Control Toolbox.

Введение

В этом примере мы создаем сгенерированный модулированный сигнал и загружаем его по интерфейсу VISA TCP/IP к Keysight Technologies® (раньше Agilent Technologies®) Вектор MXG Генератор Сигнала. Мы затем управляем генератором сигнала к upconvert сигнал к RF и воспроизводим его.

Требования

Этот пример был протестирован с MXG (N5182A) Генератор Сигнала. Пример использует Signal Processing Toolbox™, чтобы создать формы волны и Instrument Control Toolbox, чтобы взаимодействовать через интерфейс с оборудованием с помощью специфичных для инструмента Стандартных Команд для Программируемых Инструментов (SCPI) набор команд MXG. Пример также требует, чтобы была установлена поддерживаемая реализация VISA.

Создайте комплексный сгенерированный модулированный сигнал

В этом примере мы создадим щебетавшую форму волны или импульс линейной частоты модулируется (LFM). Такие формы волны могут использоваться, чтобы симулировать выход модуля передатчика импульсного доплеровского радиолокатора.

% Define parameters of the LFM pulse.
sampleRate = 1e8;               % Define sample rate of baseband signal (Hz)
pulseWidth = 10e-6;             % Define pulse width (seconds)
pulseRepititionInterval = 50e-6;% Define pulse repetition interval (seconds)
bandWidth = 10e6;               % Bandwidth of the pulse (Hz)
IPhase = 0;                     % Initial phase in degrees of IComponent
QPhase = 90;                    % Initial phase in degrees of QComponent

tVector = 0:1/sampleRate:pulseWidth; % Vector to generate ideal pulse
IComponent = chirp(tVector,-bandWidth/2,tVector(end), bandWidth/2,'linear',IPhase);
QComponent = chirp(tVector,-bandWidth/2,tVector(end), bandWidth/2,'linear',QPhase);
IQData = IComponent + 1i*QComponent;

% Normalize amplitude.
scale = max(max(abs(real(IQData))), max(abs(imag(IQData))));
idealPulse = IQData / scale;

% Pad the pulse with zeros for the off cycle of the pulse.
offPulse = 0:1/sampleRate:((pulseRepititionInterval-pulseWidth)/2);
idealSpacedPulse = [offPulse idealPulse offPulse];

Визуализируйте импульс LFM

Постройте один цикл импульса LFM, отображающего синфазное и квадратуру (IQ) данные и конверт импульса.

figure(1); hold on;
plot((1:length(idealSpacedPulse))/sampleRate, real(idealSpacedPulse),'b')
plot((1:length(idealSpacedPulse))/sampleRate, imag(idealSpacedPulse),'g')
plot((1:length(idealSpacedPulse))/sampleRate, abs(idealSpacedPulse),':r','linewidth',2)
title('One cycle of LFM pulse waveform')
xlabel('Time (s)')
ylabel('Magnitude (V)')
legend('I component','Q component','Envelope')
axis tight; axisLimits = axis; axis([axisLimits(1:2) 1.2*(axisLimits(3:4))])

Задайте параметры связи и открытую связь с инструментом

Этот раздел задает параметры связи и инициализирует объект передать данные инструменту.

% Define a filename for the data in the instrument.
ArbFileName = 'MATLAB_WFM';
% Define IP address of the instrument. This will need to be updated to
% execute this code on your instrument.
MXGIPAddress = '172.31.146.123';
% Create a VISA-TCPIP object to connect to the instrument.
signalGeneratorObject = visa('agilent',['TCPIP0::' MXGIPAddress '::inst0::INSTR']);
% Set up the output buffer size to hold at least the number of bytes we are
% transferring. Each point requires 4 bytes (since we are using UINT16
% format to transfer data to the instrument) - 2 bytes for I and 2 bytes
% for Q. An additional overhead for the binblock header is also included in
% the buffer.
signalGeneratorObject.OutputBufferSize = 4*numel(idealSpacedPulse) + 1024;
signalGeneratorObject.ByteOrder = 'bigEndian';
% Set the timeout to ensure the entire waveform is downloaded before a
% timeout occurs.
signalGeneratorObject.Timeout = 10.0;
% Set the terminator character to line feed, or LF (i.e., ASCII code 10).
signalGeneratorObject.EOSCharCode = 'LF';
% Open a connection to the instrument.
fopen(signalGeneratorObject);

Данные о формате, чтобы удовлетворить инструментальные требования

Основополосный генератор на MXG требует, чтобы данные были в области значений [0,65536]. Кроме того, я и значения Q должны быть чередованы перед передачей в инструмент. В этом разделе входным массивом управляют как требуется прежде, чем загрузить его на MXG.

% Ensure the waveform is a row vector.
if ~isequal(size(idealSpacedPulse,1),1)
    idealSpacedPulse = reshape(idealSpacedPulse,1,numel(idealSpacedPulse));
end

% Separate out the real and imaginary data in the baseband signal.
wave = [real(idealSpacedPulse);imag(idealSpacedPulse)];
% Transpose the waveform to interleave I & Q data.
wave = wave(:)';

% Scale the waveform. Be sure to prevent division by 0.
tmp = max(abs([max(wave) min(wave)]));
if (tmp == 0)
    tmp = 1;
end

scale = 2^15-1;
scale = scale/tmp;
wave = round(wave * scale);
modval = 2^16;

% Convert from double to unsigned int datatype.
wave = uint16(mod(modval + wave, modval));

Запросите инструментальную идентификационную информацию

Этот раздел настраивает инструмент, чтобы получить данные и инструментальную идентификационную информацию запросов и отображений.

% Empty instrument error queue and event registers and reset the instrument.
fprintf(signalGeneratorObject, '*CLS');
fprintf(signalGeneratorObject, '*RST');

% Query the instrument identity and display it.
instrumentInfo = query(signalGeneratorObject, '*IDN?');
fprintf('Instrument identification information: %s', instrumentInfo);
Instrument identification information: Agilent Technologies, N5182A, US00000104, A.01.62

Загрузите данные на инструмент

Этот раздел загружает форму волны на инструмент и инициирует генерацию сигнала. Команды SCPI, используемые для этой задачи, могут быть найдены в инструментальном руководстве программиста.

% Turn off instrument before downloading waveform.
fprintf(signalGeneratorObject,':OUTPut:STATe OFF');
fprintf(signalGeneratorObject,':SOURce:RADio:ARB:STATe OFF');
fprintf(signalGeneratorObject,':OUTPut:MODulation:STATe OFF');
% Set the sample rate of the ARB clock to the sample rate of the baseband
% signal.
fprintf(signalGeneratorObject,[':SOURce:RADio:ARB:CLOCk:SRATe ' num2str(sampleRate)]);

% Write the data to the unprotected non-volatile memory of the instrument.
n = size(wave);
fprintf('Starting Download of %d Points...',n(2)/2)
binblockwrite(signalGeneratorObject,wave,'uint16', [':MEM:DATA:UNProtected "WFM1:' ArbFileName '",']);
% The signal generator expects an LF character at the end of the binaryblock.
% By printing a null string with the EOS character set to LF, this byte will
% be sent to the signal generator.
fprintf(signalGeneratorObject,'');

% Wait for instrument to complete download.
% If you see a "Warning: A timeout occurred before the Terminator was reached."
% warning you will need to adjust the signalGeneratorObject.Timeout value
% appropriately.
commandCompleted = query(signalGeneratorObject,'*OPC?');
disp('...done');
Starting Download of 5003 Points......done

Инициируйте воспроизведение сигнала RF на инструменте

Теперь, когда форма волны загружается на энергонезависимую память инструмента, установите инструмент начинать генерировать сигнал RF.

% Set the carrier frequency of the upconverted signal.
fprintf(signalGeneratorObject, ':SOURce:FREQuency 3000000000');
% Set the source power to -30dBm.
fprintf(signalGeneratorObject, ':SOURce:POWer -30DBM');
% Select the waveform and initiate generation.
fprintf(signalGeneratorObject,[':SOURce:RADio:ARB:WAV "ARBI:' ArbFileName '"']);
fprintf(signalGeneratorObject,':SOURce:RADio:ARB:STATe ON');
fprintf(signalGeneratorObject,':OUTPut:MODulation:STATe ON');
fprintf(signalGeneratorObject,':OUTPut:STATe ON');

Проверьте ошибки в очереди инструментальной погрешности

Если бы какая-либо из предыдущих команд SCPI сгенерировала ошибку, это было бы доступно в очереди инструментальной погрешности. Считайте назад ошибочную очередь и ошибки отображения, если таковые имеются.

% Read back and display any instrument errors.
instrumentError = query(signalGeneratorObject,'SYST:ERR?');
while isempty(strfind(lower(instrumentError),'no error'))
    fprintf('\tINSTRUMENT ERROR: %s', instrumentError)
    instrumentError = query(signalGeneratorObject,'SYST:ERR?');
end

Очистка

% Close the connection to the instrument and delete the object.
fclose(signalGeneratorObject); delete(signalGeneratorObject);
clear signalGeneratorObject

Дополнительная информация

Этот пример показывает, что генерация простого LFM пульсировала формы волны, и загрузка и воспроизведение с помощью Генератора Сигнала RF. MATLAB может использоваться, чтобы задать большое разнообразие стандартных и произвольных сигналов, пользующихся богатой библиотекой функций в Signal Processing Toolbox и Системах связи Toolbox™. Кроме того, с помощью Instrument Control Toolbox, возможно загрузить эти сигналы на инструменты, такие как Функциональные преобразователи, Произвольные Генераторы Формы волны и Генераторы Сигнала RF, и автоматизировать управление этих инструментов.