Этот пример показывает, как охарактеризовать усилитель степени (PA), используя измеренные входные и выходные сигналы NXP Airfast PA. Опционально можно использовать оборудование настройки теста включая корпус NI PXI с приемопередатчиком вектора сигнала (VST) для измерения сигналов во время исполнения.
Можно использовать результаты характеристики для моделирования PA с помощью comm.MemorylessNonlinearity
Системный объект или блок Memoryless Nonlinearity. Для модели PA с памятью можно использовать блок Power Amplifier (RF Blockset). Можно использовать эти модели для разработки цифрового предварительного искажения (DPD) с помощью блоков comm.DPD и comm.DPDCoefficentEstimator Системных объектов или DPD и DPD Cofficient Estimator. Для получения дополнительной информации см. «Цифровое предварительное искажение для компенсации нелинейности усилителя степени».
Этот пример может работать на шасси NI PXI с VST для измерения входных и выходных сигналов PA во время исполнения. VST является высокополосным радиочастотным инструментом, который объединяет генератор Вектора сигналов (VSG) с Вектором Signal Analyzer (VSA). Для захвата сохраненного сигнала использовалось следующее строение корпуса NI PXI:
NI PXIe-5840 векторный сигнальный приемопередатчик (VST)
Единица измерения PXIe-4139 источника NI (SMU)
НИ PXIe-4145 СМУ
Программное обеспечение 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 смещения постоянного тока, которые предоставляются с использованием 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";
Если t estSignal
является "OFDM"
этот пример использует 5G-like сигнал OFDM с 64-QAM модулированными сигналами для каждой поднесущей. Если t estSignal
является "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;
Если для переменной 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 дБ. Установите время захвата равным значению, которое приведет к примерно 40k выборок. Установите целевую входную степень 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
Системный объект.
saInput = helperPACharPlotInput(paInput, sampleRate, testSignal, bw);
Постройте график характеристик AM/AM PA.
helperPACharPlotSpecAnAMAM(referencePower, measuredAMToAM)
Для лучшего представления особое внимание на усилении по сравнению с входной степенью вместо выходной степени по сравнению с входной степенью и снова постройте график.
helperPACharPlotSpecAnGain(referencePower, measuredAMToAM)
PA в основном линейна от входа степени области значений -1 до 17 дБм, с только около 1dB изменениями по сравнению с этой областью значений. Ширина кривой усиления обусловлена эффектами памяти PA.
Используйте измеренные входные и выходные данные PA, чтобы смоделировать PA. Затем можно использовать эту модель, чтобы симулировать систему, которая содержит этот PA, и точно настроить параметры. Этот пример рассматривает три модели: безпамятную нелинейность, полином памяти и полином памяти с перекрестными терминами.
Безпамятные нелинейные искажения искажают амплитуду и фазу входного сигнала. Амплитудное искажение является амплитудно-амплитудной модуляцией (AM/AM), и фазовое искажение является амплитудно-фазовой модуляцией (AM/PM). The comm.MemorylessNonlinearity
Системный объект и блок Memoryless Nonlinearity реализует несколько таких искажений. Используйте входные и выходные данные PA, чтобы создать интерполяционную таблицу для использования с этим объектом или блоком.
Чтобы охарактеризовать передаточную функцию AM/AM, вычислите среднюю выходную степень для области значений входной степени. Измерения находятся в вольтах на общем импедансе 100 Ом, разделенных между передатчиком и приемником. Преобразуйте измеренные выборки полосы частот в значения мощности в дБм. Термин + 30 дБ для преобразования dBW в dBm и термин -20 дБ для импеданса 100 Ом.
paInputdBm = mag2db(abs(paInput)) + 30 - 20; paOutputdBm = mag2db(abs(paOutput)) + 30 - 20;
Разделите значения входа степени на интервалы. The 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, чтобы смоделировать 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)
Полиномиальная модель памяти включает эффекты памяти PA в дополнение к нелинейному усилению. Используйте многоцелевую вспомогательную функцию helperPACharMemPolyModel, чтобы определить комплексные коэффициенты полиномиальной модели памяти для характеристик усилителя. Установите тип модели равным 'Memory Polynomial'
.
modType = 'memPoly';
Выполните поиск по сетке, как показано в Приложении Grid Search for Memory Length and Polynomial Order. На основе этих результатов поиска в сетке получается лучшая подгонка, когда значения длины памяти и полиномиальной степени следующие:
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.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
Чтобы подтвердить подбор кривой, используйте вспомогательную функцию для вычисления процента ошибки 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.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, которая будет использоваться в Усилителе Степени (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)