Этот пример показывает создание комплексной основной полосы (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, отображающего синфазное и квадратуру (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.
% 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, и автоматизировать управление этих инструментов.