В этом примере показано, как охарактеризовать усилитель мощности (PA) с помощью измеренных входных и выходных сигналов NXP Airfast PA. Кроме того, для измерения сигналов во время выполнения можно использовать аппаратный тест, включающий шасси NI PXI с приемопередатчиком векторных сигналов (VST).
Результаты характеристики можно использовать для моделирования PA с помощью comm.MemorylessNonlinearity Системный объект или блок «Нелинейность без памяти» (Communications Toolbox). Для модели PA с памятью можно использовать блок усилителя мощности. Эти модели можно использовать для проектирования цифровых предысторий (DPD) с использованием системных объектов comm.DPD и comm.DPDcoeeAssimator или блоков DPD (Communications Toolbox) и DPD (Communications Toolbox). Дополнительные сведения см. в разделе Цифровая предистория для компенсации нелинейности усилителя мощности (Communications Toolbox).
Этот пример может работать на шасси NI PXI с VST для измерения входных и выходных сигналов PA во время выполнения. VST - это широкополосный радиочастотный прибор, который объединяет генератор векторного сигнала (VSG) с анализатором векторного сигнала (VSA). Для захвата сохраненного сигнала использовалась следующая конфигурация корпуса NI PXI:
NI PXIe-5840 Vector Signal Transceiver (VST)
NI PXIe-4139 единица измерения источника (SMU)
NI PXIe-4145 SMU
Программное обеспечение 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 DC, которые обеспечиваются с использованием 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";Если testSignal является "OFDM", в этом примере используется 5G-like 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", загрузите предварительно записанные данные. 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 дБ. Установите время сбора данных равным значению, которое приведет к 40 тыс. выборок. Установите целевую входную мощность 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) Системный объект.
saInput = helperPACharPlotInput(paInput, sampleRate, testSignal, bw);

Постройте график характеристик AM/AM PA.
helperPACharPlotSpecAnAMAM(referencePower, measuredAMToAM)

Для лучшего просмотра сосредоточьтесь на коэффициенте усиления vs входной мощности вместо выходной мощности vs входной мощности и постройте график снова.
helperPACharPlotSpecAnGain(referencePower, measuredAMToAM)

PA является в основном линейным в диапазоне входной мощности от -1 до 17 дБм, причем только около 1dB изменений в этом диапазоне. Ширина кривой усиления обусловлена эффектами памяти PA.
Используйте измеренные входные и выходные данные PA для моделирования PA. Затем эту модель можно использовать для моделирования системы, содержащей этот PA, и точной настройки параметров. В этом примере рассматриваются три модели: нелинейность без памяти, многочлен памяти и многочлен памяти с перекрестными терминами.
Нелинейные нарушения без запоминания искажают амплитуду и фазу входного сигнала. Амплитудное искажение представляет собой амплитудно-амплитудную модуляцию (AM/AM), а фазовое искажение представляет собой амплитудно-фазовую модуляцию (AM/PM). comm.MemorylessNonlinearity Блок системных объектов и нелинейности без памяти (Communications Toolbox) реализует несколько таких искажений. Используйте входные и выходные данные PA для создания таблицы подстановки для использования с этим объектом или блоком.
Чтобы охарактеризовать передаточную функцию AM/AM, вычислите среднюю выходную мощность для диапазона значений входной мощности. Измерения выполняются в вольтах по общему импедансу 100 Ом, разделенному между передатчиком и приемником. Преобразуйте измеренные выборки основной полосы в значения мощности в дБм. Член + 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 дБ, чем максимальная входная мощность. Запишите результаты в матрицу из трех столбцов, где первый столбец - входная мощность в дБм, второй столбец - выходная мощность в дБм, а последний столбец - фазовый сдвиг.
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 System для моделирования 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)

Постройте график величины усиления.
helperPACharPlotGain(paInput, paOutput, paOutputFitMemless)

Полиномиальная модель памяти включает в себя эффекты памяти ПА в дополнение к нелинейному усилению. Используйте многоцелевую вспомогательную функцию helperPACharMemPolyModel для определения комплексных коэффициентов полиномиальной модели памяти для характеристик усилителя. Задайте тип модели как 'Memory Polynomial'.
modType =
'memPoly';Выполните поиск в сетке, как показано в приложении Поиск в сетке (Grid Search for Memory Length and Polynomial Order). На основе этих результатов поиска сетки наилучшая подгонка получается, когда значения длины памяти и степени полинома следующие:
memLen = 5; degLen = 5;
Выполните расчет соответствия и среднеквадратичной ошибки для этих значений. Только половина данных используется для вычисления коэффициентов подгонки, так как весь набор данных будет использоваться для вычисления относительной ошибки. Вспомогательная функция 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
Для проверки фитинга используйте вспомогательную функцию, чтобы вычислить процент среднеквадратичной ошибки относительно измеренного сигнала.
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)

Постройте график величины усиления.
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, которая будет использоваться в усилителе мощности для моделирования на системном уровне в цифровой предыскажении для компенсации нелинейности усилителя мощности (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')
Раскомментируйте следующие строки, чтобы выполнить поиск сетки, когда функция затрат представляет собой процентную среднеквадратичную ошибку во времени. Сначала выберите тип модели.
modType ='memPoly'; % rmsErrorTime = helperPACharGridSearchTime(paInput,paOutput,modType,overSamplingRate)
Повторите поиск, если функция затрат представляет собой процент среднеквадратичной ошибки по частоте.
% rmsErrorFreq = helperPACharGridSearchFrequency(paInput,paOutput,modType,overSamplingRate)