Характеристика усилителя мощности

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

Можно использовать результаты характеристики симулировать усилителя мощности (УМ) с помощью comm.MemorylessNonlinearity Системный объект или блок Memoryless Nonlinearity. Для модели PA с памятью можно использовать блок Power Amplifier (RF Blockset). Можно использовать эти модели, чтобы спроектировать цифровое предварительное искажение (DPD) использование comm.DPD и comm.DPDCoefficientEstimator Системные объекты или DPD и Содействующие блоки Средства оценки DPD. Для получения дополнительной информации смотрите Цифровое Предварительное искажение, чтобы Компенсировать Нелинейность Усилителя мощности.

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

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

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

  • NI Исходный модуль меры (SMU) PXIe-4139

  • PXIe-4145 SMU NI

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

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

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

Как устройство под тестом (DUT), этот пример использует Воздухонепроницаемого усилителя мощности (УМ) LDMOS Доэрти NXP с рабочей частотой 3.6-3.8 ГГц и 29 усилениями дБ. Этот усилитель мощности (УМ) требует 29 В, 5 В, 3 В, 1.6-вольтовое и 1.4-вольтовое смещение DC, которые обеспечиваются с помощью PXIe-4139 и PXIe-4145 SMUs.

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

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

dataSource = "From file";

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

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

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", загрузите записанные заранее данные. Если dataSource переменная установлена в "Hardware", запустите тестовый сигнал через усилителя мощности (УМ) с помощью 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 dBm. Можно увеличить это значение, чтобы управлять усилителем мощности (УМ) больше в нелинейную область.

  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. Measure 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 Системный объект.

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

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

Постройте характеристики AM усилителя мощности (УМ).

helperPACharPlotSpecAnAMAM(referencePower, measuredAMToAM)

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

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

helperPACharPlotSpecAnGain(referencePower, measuredAMToAM)

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

Усилитель мощности (УМ) в основном линеен из области значений входной мощности-1 к 17 dBm с изменением на только приблизительно 1 дБ в той области значений. Ширина кривой усиления происходит из-за эффектов памяти усилителя мощности (УМ).

Характеристика усилителя мощности (УМ)

Используйте измеренные входные и выходные данные усилителя мощности (УМ), чтобы смоделировать усилителя мощности (УМ). Затем можно использовать эту модель, чтобы симулировать систему, которая содержит этого усилителя мощности (УМ), и точно настройте параметры. Этот пример рассматривает три модели: нелинейность без памяти, полином памяти и полином памяти с перекрестными терминами.

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

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

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

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

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

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

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

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 = 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 object. The axes object 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 object. The axes object with title Comparison of Actual and Estimated Gain contains 2 objects of type line. These objects represent Actual Gain, Estimated Gain.

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

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

modType = 'memPoly';

Выполните поиск сетки как показано в Поиске Сетки Приложения в течение Времени хранения в памяти и Полиномиального Порядка. На основе этой сетки результаты поиска получена лучшая подгонка, когда время хранения в памяти и полиномиальные значения степени следующие:

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.8536   17.8391   13.3033    3.2171
         0   11.7675   26.4648   23.1902    5.5469
   20.9748   16.8511   25.7274   22.1880    5.0680
   32.6202    8.4028    9.4851   10.6957    2.5609
   15.3879    2.3639    2.0886    2.9343    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.1057%

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

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

Figure contains an axes object. The axes object 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 object. The axes object 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 выход. Для этого усилителя мощности (УМ) полиномиальная модель памяти обеспечивает хорошее приближение характеристик усилителя мощности (УМ).

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

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

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

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

Используя модель усилителя мощности (УМ) для тестирования DPD

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

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)
Для просмотра документации необходимо авторизоваться на сайте