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

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

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

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

Этот пример может работать на шасси PXI NI с VST, чтобы измерить сигналы ввода и вывода PA в течение времени выполнения. 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), этот пример использует Воздухонепроницаемый PA LDMOS Доэрти NXP с рабочей частотой 3.6-3.8 ГГц и 29 усилениями дБ. Этот PA требует 29 В, 5 В, 3 В, 1.6-вольтовое и 1.4-вольтовое смещение DC, которые обеспечиваются с помощью PXIe-4139 и PXIe-4145 SMUs.

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

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

dataSource = "From file";

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

Если testSignal "OFDM", этот пример использует подобную 5G форму волны OFDM с 64-QAM модулируемыми сигналами для каждой поднесущей. Если testSignal "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;

Тестирование оборудования

Если переменная источника данных установлена в "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 dBm. Можно увеличить это значение, чтобы управлять 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. 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);

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

helperPACharPlotSpecAnAMAM(referencePower, measuredAMToAM)

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

helperPACharPlotSpecAnGain(referencePower, measuredAMToAM)

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

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

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

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

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

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

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

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

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

Для каждого интервала вычислите среднюю точку интервала, средней выходной мощности и среднего сдвига фазы. Не включайте значение входной мощности, которое меньше-10 dBm. Сохраните результаты в матрице с тремя столбцами, где первый столбец является входной мощностью в 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 принимает загрузку на 1 Ом, однако измерения сделаны с 50 Омами. Настройте записи таблицы с коррекцией на +20 дБ.

inOutTable(:,1:2) = inOutTable(:,1:2) + 20;

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

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

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

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)

Постройте величину усиления.

helperPACharPlotGain(paInput, paOutput, paOutputFitMemless)

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

Модель полинома памяти включает эффекты памяти PA в дополнение к нелинейному усилению. Используйте многоцелевую функцию помощника 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)

Постройте величину усиления.

helperPACharPlotGain(paInput, paOutput, paOutputFitMem)

Обсуждения

Ошибка расчета 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);

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

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

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

Сохраните матрицу коэффициентов модели PA, которая будет использоваться в Усилителе мощности (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)