В этом примере показано, как охарактеризовать усилитель мощности (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);
Постройте характеристики AM усилителя мощности (УМ).
helperPACharPlotSpecAnAMAM(referencePower, measuredAMToAM)
Для лучшего представления фокусируйтесь на усилении по сравнению с входной мощностью вместо выходной мощности по сравнению с входной мощностью и постройте снова.
helperPACharPlotSpecAnGain(referencePower, measuredAMToAM)
Усилитель мощности (УМ) в основном линеен из области значений входной мощности-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)
Постройте величину усиления.
helperPACharPlotGain(paInput, paOutput, paOutputFitMemless)
Полиномиальная модель памяти включает эффекты памяти усилителя мощности (УМ) в дополнение к нелинейному усилению. Используйте многоцелевую функцию помощника 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 выход. Для этого усилителя мощности (УМ) полиномиальная модель памяти обеспечивает хорошее приближение характеристик усилителя мощности (УМ).
sa = helperPACharPlotSpectrum(... [paOutput paOutputFitMemless paOutputFitMem],... {'Actual PA Output','Memoryless Model Output', ... 'Memory Polynomial Output'},... sampleRate,testSignal);
Функция помощника helperPACharMemPolyModel может также использовать полином памяти с перекрестной моделью терминов, которая включает продвижение и отставание перекрестных терминов памяти в дополнение к эффектам памяти усилителя мощности (УМ) и нелинейного усиления. Установите тип модели на 'Cross-Term Memory'
исследовать эту модель.
Для дальнейшего исследования попробуйте различное время хранения в памяти и полиномиальные комбинации степени. Измените фактор сверхдискретизации и исследуйте его эффект на производительности модели усилителя мощности (УМ). Измените функцию помощника helperPACharMemPolyModel, чтобы попробовать различные модели PA.
Сохраните матрицу коэффициентов модели 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)