В этом примере показано, как охарактеризовать усилитель мощности (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, и точно настройте параметры. Этот пример рассматривает три модели: нелинейность без памяти, полином памяти и полином памяти с перекрестными условиями.
Нелинейные нарушения без памяти искажают амплитуду входного сигнала и фазу. Амплитудное искажение является модуляцией от амплитуды к амплитуде (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, которая будет использоваться в Усилителе мощности (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)