Характеристика усилителя степени

Этот пример показывает, как охарактеризовать усилитель степени (PA), используя измеренные входные и выходные сигналы NXP Airfast PA. Опционально можно использовать оборудование настройки теста включая корпус NI PXI с приемопередатчиком вектора сигнала (VST) для измерения сигналов во время исполнения.

Можно использовать результаты характеристики для моделирования PA с помощью comm.MemorylessNonlinearity (Communications Toolbox) Системный объект или блок Memoryless Nonlinearity (Communications Toolbox). Для модели PA с памятью можно использовать блок Power Amplifier. Можно использовать эти модели для разработки цифрового предварительного искажения (DPD) с помощью блоков comm.DPD и comm.DPDCoefficentEstimator Системных объектов или DPD (Communications Toolbox) и DPD Cofficent Estimator (Communications Toolbox). Для получения дополнительной информации см. «Цифровое предварительное искажение для компенсации нелинейности усилителя степени» (Communications Toolbox).

Дополнительное аппаратное и программное обеспечение

Этот пример может работать на шасси NI PXI с VST для измерения входных и выходных сигналов PA во время исполнения. VST является высокополосным радиочастотным инструментом, который объединяет генератор Вектора сигналов (VSG) с Вектором Signal Analyzer (VSA). Для захвата сохраненного сигнала использовалось следующее строение корпуса NI PXI:

  • NI PXIe-5840 векторный сигнальный приемопередатчик (VST)

  • Единица измерения PXIe-4139 источника NI (SMU)

  • НИ PXIe-4145 СМУ

  • Программное обеспечение NI RFmx SpecAn

  • Программное обеспечение NI-RFSG

  • Программное обеспечение библиотеки воспроизведения NI-RFSG

В качестве тестируемого устройства (DUT) в этом примере используется NXP Airfast LDMOS Doherty PA с рабочей частотой 3,6-3,8 ГГц и усилением 29 дБ. Этот PA требует 29V, 5V, 3 В, 1.6V и 1.4V смещения постоянного тока, которые предоставляются с использованием PXIe-4139 и PXIe-4145 SMU.

Установите MATLAB ® на контроллер NI PXI, чтобы запустить этот пример с аппаратной настройкой, которая показана на следующем рисунке. MATLAB, работающий на контроллере PXI, генерирует тестовый сигнал и загружает сигнал в VSG. VSG передает эту тестовую форму волны в PA, и VSA получает ослабленную форму волны на выходе PA. MATLAB собирает выходы PA из VSA и выполняет характеристику PA.

Установите переменную dataSource на "Hardware" чтобы запустить тестовый сигнал через PA с помощью аппаратной настройки, описанной выше. Тестовый сигнал может быть либо 5G-like формой волны OFDM, либо двумя тонами, как описано в следующем разделе. Установите переменную dataSource на "From file" для использования предварительно записанных данных.

dataSource = "From file";

Сгенерируйте тестовые сигналы

Если t estSignal является "OFDM"этот пример использует 5G-like сигнал OFDM с 64-QAM модулированными сигналами для каждой поднесущей. Если t estSignal является "Tones"этот пример использует два тональных сигнала на частоте 1,8 МГц и 2,6 МГц, чтобы протестировать интермодуляцию, вызванную PA.

testSignal = "OFDM";
switch testSignal
  case "OFDM"
    bw = 100e6;
    [txWaveform, sampleRate, numFrames] = helperPACharGenerateOFDM (bw);
  case "Tones"
    bw = 3e6;
    [txWaveform, sampleRate, numFrames] = helperPACharGenerateTones ();
end

Чтобы идентифицировать нелинейность высокого порядка, тестовый сигнал должен быть переизбран, по крайней мере, на величину ожидаемого порядка нелинейности. В этом примере мы запускаем поиск по сетке до порядка нелинейности семи. Увеличьте значение на семь, чтобы покрыть возможные нелинейности седьмого порядка. Также нормализуйте амплитуду формы волны.

overSamplingRate = 7;
filterLength = 6*70;
lowpassfilter = firpm(filterLength, [0 8/70 10/70 1], [1 1 0 0]);
firInterp = dsp.FIRInterpolator(overSamplingRate, lowpassfilter);
txWaveform = firInterp([txWaveform; zeros(filterLength/overSamplingRate/2,1)]);
txWaveform = txWaveform((filterLength/2)+1:end,1);      % Remove transients
txWaveform = txWaveform/max(abs(txWaveform));   % Normalize the waveform
sampleRate = sampleRate * overSamplingRate;

Аппаратный тест

Если для переменной dataSource задано значение "From file", загрузите предварительно записанные данные. If dataSource переменная установлена в "Hardware", rзапустите тестовый сигнал через PA с помощью VST. Создайте объект helperVSTDriver для связи с устройством VST. Установите имя ресурса на имя ресурса, присвоенное устройству VST. Этот пример использует 'VST_01'. Для устройств NI можно найти имя ресурса с помощью приложения NI Measurement & Automation Explorer (MAX).

if strcmp(dataSource, "Hardware")
  VST = helperVSTDriver('VST_01');

Установите ожидаемые значения усиления DUT и аттенюатора. Поскольку выход PA соединяется с аттенюатором на 30 дБ, установите внешнее ослабление VSA на 30. Установите ожидаемый коэффициент усиления DUT равным 29 дБ и точность усиления равной 1 дБ. Установите время захвата равным значению, которое приведет к примерно 40k выборок. Установите целевую входную степень 8 дБм. Можно увеличить это значение, чтобы перенести PA в нелинейную область.

  VST.DUTExpectedGain     = 29;     % dB
  VST.ExternalAttenuation = 30;     % dB
  VST.AcquisitionTime     = 0.9e-3*(53.76e6/sampleRate); % seconds
  VST.DUTTargetInputPower =8;  % dBm
  VST.CenterFrequency = 3.7e9   % Hz

Загрузите тестовый сигнал в VSG. Измерьте выход PA.

  writeWaveform(VST,txWaveform,sampleRate,testSignal)
  results = runPAMeasurements(VST);
  release(VST)
else
  % Load the prerecorded results from VST
  switch testSignal
    case "OFDM"
      dataFileName = sprintf("helperPACharSavedData%dMHz",bw/1e6);
    case "Tones"
      dataFileName = "helperPACharSavedDataTones";
  end
  load(dataFileName,"results","sampleRate","overSamplingRate","testSignal","numFrames")
end

Сопоставьте результаты в локальные переменные.

referencePower = results.ReferencePower;
measuredAMToAM = results.MeasuredAMToAM;
paInput = results.InputWaveform;
paOutput = results.OutputWaveform;
linearGaindB = results.LinearGain;

Постройте график спектра тестового сигнала с помощью dsp.SpectrumAnalyzer (DSP System Toolbox) Системный объект.

saInput = helperPACharPlotInput(paInput, sampleRate, testSignal, bw);

Figure Spectrum Analyzer contains an axes and other objects of type uiflowcontainer, uimenu, uitoolbar. The axes contains 6 objects of type patch, line. This object represents PA Input.

Постройте график характеристик AM/AM PA.

helperPACharPlotSpecAnAMAM(referencePower, measuredAMToAM)

Figure contains an axes. The axes with title AM/AM contains an object of type line.

Для лучшего представления особое внимание на усилении по сравнению с входной степенью вместо выходной степени по сравнению с входной степенью и снова постройте график.

helperPACharPlotSpecAnGain(referencePower, measuredAMToAM)

Figure contains an axes. The axes with title Gain vs Input Power contains an object of type line.

PA в основном линейна от входа степени области значений -1 до 17 дБм, с только около 1dB изменениями по сравнению с этой областью значений. Ширина кривой усиления обусловлена эффектами памяти PA.

Характеристика PA

Используйте измеренные входные и выходные данные PA, чтобы смоделировать PA. Затем можно использовать эту модель, чтобы симулировать систему, которая содержит этот PA, и точно настроить параметры. Этот пример рассматривает три модели: безпамятную нелинейность, полином памяти и полином памяти с перекрестными терминами.

Безпамятная модель нелинейности

Безпамятные нелинейные искажения искажают амплитуду и фазу входного сигнала. Амплитудное искажение является амплитудно-амплитудной модуляцией (AM/AM), и фазовое искажение является амплитудно-фазовой модуляцией (AM/PM). The comm.MemorylessNonlinearity (Communications Toolbox) Системный объект и блок Memoryless Nonlinearity (Communications Toolbox) реализует несколько таких искажений. Используйте входные и выходные данные PA, чтобы создать интерполяционную таблицу для использования с этим объектом или блоком.

Чтобы охарактеризовать передаточную функцию AM/AM, вычислите среднюю выходную степень для области значений входной степени. Измерения находятся в вольтах на общем импедансе 100 Ом, разделенных между передатчиком и приемником. Преобразуйте измеренные выборки полосы частот в значения мощности в дБм. Термин + 30 дБ для преобразования dBW в dBm и термин -20 дБ для импеданса 100 Ом.

paInputdBm  = mag2db(abs(paInput)) + 30 - 20;
paOutputdBm  = mag2db(abs(paOutput)) + 30 - 20;

Разделите значения входа степени на интервалы. The edges переменная содержит границы интервала, и idx переменная содержит индекс значений интервала для каждого входного значения степени.

[N,edges,idx] = histcounts(paInputdBm, 'BinWidth', 0.5);

Для каждого интервала вычислите середину интервала, среднюю выходную степень и средний сдвиг фазы. Не включать никакой вход степени, которое меньше чем на 20 дБ максимальной входной степени. Сохраните результаты в трехколоночной матрице, где первый столбец является входом степени в дБм, второй столбец - выход степени в дБм и последний столбец - сдвиг фазы.

minInPowerdBm = max(paInputdBm) - 20;
minIdx = find(edges < minInPowerdBm, 1, 'last');
tableLen = length(edges)-minIdx-1;
inOutTable = zeros(tableLen,2);
for p = minIdx+1:length(edges)-1
  inOutTable(p-minIdx,1) = mean(paInputdBm(idx == p));   % Average input power for current bin
  inOutTable(p-minIdx,2) = mean(paOutputdBm(idx == p));  % Average output power for current bin
  inOutTable(p-minIdx,3) = mean(angle(paOutput(idx == p)./paInput(idx == p)));  % Average phase shift for current bin
end

Используйте таблицу в Системный объект comm.MemorylessNonlinearity, чтобы смоделировать PA. Сравните предполагаемый выход с фактическим выходом.

pa = comm.MemorylessNonlinearity('Method','Lookup table','Table',inOutTable,'ReferenceImpedance',100)
pa = 
  comm.MemorylessNonlinearity with properties:

                Method: 'Lookup table'
                 Table: [40x3 double]
    ReferenceImpedance: 100

paOutputFitMemless = pa(paInput);
err = abs(paOutput - paOutputFitMemless)./abs(paOutput);
rmsErrorMemless = rms(err)*100;
disp(['Percent RMS error in time domain is ' num2str(rmsErrorMemless) '%'])
Percent RMS error in time domain is 12.1884%

Чтобы визуализировать как измеренный выходной сигнал, так и установленный выходной сигнал, постройте график фактических и установленных выходных напряжений во временной области.

helperPACharPlotTime(paOutput, paOutputFitMemless, sampleRate)

Figure contains an axes. The axes with title Comparison of Actual and Estimated Output Signals contains 2 objects of type line. These objects represent Actual, Estimated.

Постройте график величины усиления.

helperPACharPlotGain(paInput, paOutput, paOutputFitMemless)

Figure contains an axes. The axes with title Comparison of Actual and Estimated Gain contains 2 objects of type line. These objects represent Actual Gain, Estimated Gain.

Полиномиальная модель памяти

Полиномиальная модель памяти включает эффекты памяти PA в дополнение к нелинейному усилению. Используйте многоцелевую вспомогательную функцию helperPACharMemPolyModel, чтобы определить комплексные коэффициенты полиномиальной модели памяти для характеристик усилителя. Установите тип модели равным 'Memory Polynomial'.

modType = 'memPoly';

Выполните поиск по сетке, как показано в Приложении Grid Search for Memory Length and Polynomial Order. На основе этих результатов поиска в сетке получается лучшая подгонка, когда значения длины памяти и полиномиальной степени следующие:

memLen = 5;
degLen = 5;

Выполните вычисление подгонки и ошибки RMS для этих значений. Только половина данных используется для вычисления подобранных коэффициентов, так как весь набор данных будет использоваться для вычисления относительной погрешности. Вспомогательная функция helperPACharMemPolyModel вычисляет коэффициенты модели.

numDataPts = length(paInput);
halfDataPts = round(numDataPts/2);

Вспомогательная функция helperPACharMemPolyModel может редактироваться для пользовательских модификаций и возвращать нужную матрицу. Модель PA имеет некоторые нулевые оцененные коэффициенты, что приводит к матрице неполного ранга.

fitCoefMatMem = helperPACharMemPolyModel('coefficientFinder',             ...
  paInput(1:halfDataPts),paOutput(1:halfDataPts),memLen,degLen,modType);
Warning: Rank deficient, rank = 24, tol =  1.870573e-01.
disp(abs(fitCoefMatMem))
   23.1553    8.8539   17.8403   13.3042    3.2174
         0   11.7661   26.4612   23.1878    5.5464
   20.9748   16.8495   25.7229   22.1851    5.0674
   32.6203    8.4018    9.4817   10.6939    2.5605
   15.3880    2.3642    2.0892    2.9342    0.7370

Чтобы подтвердить подбор кривой, используйте вспомогательную функцию для вычисления процента ошибки RMS относительно измеренного сигнала.

rmsErrorTimeMem = helperPACharMemPolyModel('errorMeasure', ...
  paInput, paOutput, fitCoefMatMem, modType);
disp(['Percent RMS error in time domain is ' num2str(rmsErrorTimeMem) '%'])
Percent RMS error in time domain is 6.1056%

Чтобы визуализировать как измеренный выходной сигнал, так и установленный выходной сигнал, постройте график фактических и установленных выходных напряжений во временной области.

paOutputFitMem = helperPACharMemPolyModel('signalGenerator', ...
  paInput, fitCoefMatMem, modType);
helperPACharPlotTime(paOutput, paOutputFitMem, sampleRate)

Figure contains an axes. The axes with title Comparison of Actual and Estimated Output Signals contains 2 objects of type line. These objects represent Actual, Estimated.

Постройте график величины усиления.

helperPACharPlotGain(paInput, paOutput, paOutputFitMem)

Figure contains an axes. The axes with title Comparison of Actual and Estimated Gain contains 2 objects of type line. These objects represent Actual Gain, Estimated Gain.

Обсуждения

Процентная ошибка расчета RMS во временном интервале для модели нелинейности без памяти, которая находится между 9% и 13%, примерно в 3-4 раза больше, чем ошибка для полиномиальной модели памяти, которая находится между 2% и 6%, для сигналов OFDM с различными полосами пропускания.

Проверьте ошибку расчета в частотный диапазон путем построения графика спектра фактического результата PA вместе со спектром предполагаемого результата PA для всех трех моделей. Беспамятная интерполяционная модель таблицы нелинейности не способна симулировать спектральный рост, наблюдаемый в измеренном выходе PA. Для этого PA полиномиальная модель памяти обеспечивает хорошее приближение характеристик PA.

sa = helperPACharPlotSpectrum(...
  [paOutput paOutputFitMemless paOutputFitMem],...
  {'Actual PA Output','Memoryless Model Output', ...
  'Memory Polynomial Output'},...
  sampleRate,testSignal);

Figure Spectrum Analyzer contains an axes and other objects of type uiflowcontainer, uimenu, uitoolbar. The axes contains 3 objects of type line. These objects represent Actual PA Output, Memoryless Model Output, Memory Polynomial Output.

Вспомогательная функция helperPACharMemPolyModel может также использовать полином памяти с перекрестной моделью терминов, которая включает в себя ведущие и отстающие перекрестные условия памяти в дополнение к эффектам памяти PA и нелинейному усилению. Установите тип модели равным 'Cross-Term Memory' чтобы исследовать эту модель.

Для дальнейшего исследования попробуйте различные комбинации длины памяти и полиномиальной степени. Измените коэффициент избыточной дискретизации и исследуйте его эффект на производительность модели PA. Измените вспомогательную функцию helperPACharMemPolyModel, чтобы попробовать другие модели PA.

Использование модели PA для проверки DPD

Сохраните матрицу коэффициентов модели PA, которая будет использоваться в Усилителе Степени для симуляции на уровне системы в Цифровом Предварительном Искажении, чтобы Компенсировать Нелинейности Усилителя Степени (Communications Toolbox).

frameSize = floor(length(paInput)/numFrames);
paIn.signals.values = double(reshape(paInput(1:frameSize*numFrames,1),numFrames,frameSize));
paIn.signals.dimensions = frameSize;
paIn.time = [];
save('PAcoefficientsAndInput.mat','modType','fitCoefMatMem','memLen','degLen','paIn','linearGaindB')

Приложение: Поиск по сетке для длины памяти и полиномиального порядка

Раскомментируйте следующие линии, чтобы выполнить поиск по сетке, когда функция затрат является процентной ошибкой RMS во времени. Сначала выберите тип модели.

modType = 'memPoly';
% rmsErrorTime = helperPACharGridSearchTime(paInput,paOutput,modType,overSamplingRate)

Повторите поиск, когда функцией стоимости является процент ошибки RMS в частоте.

% rmsErrorFreq = helperPACharGridSearchFrequency(paInput,paOutput,modType,overSamplingRate)

Похожие темы