Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

パワー アンプの特徴付け

この例では、NXP Airfast PA の測定された入力信号と出力信号を使用してパワー アンプ (PA) を特徴付ける方法を説明します。オプションで、ベクトル信号トランシーバー (VST) がある NI PXI シャーシを含むハードウェア テスト セットアップを使用して、実行時の信号を測定できます。

特徴付けの結果を使用してcomm.MemorylessNonlinearitySystem object™ またはMemoryless Nonlinearityブロックを使用する PA をシミュレートできます。メモリがある PA モデルの場合、Power Amplifier (RF Blockset)ブロックを使用できます。これらのモデルを使用してcomm.DPDSystem object とcomm.DPDCoefficientEstimatorSystem object またはDPDブロックとDPD Coefficient Estimatorブロックを使用するデジタル プリディストーション (DPD) を設計できます。詳細については、パワー アンプの非線形性を補正するデジタル プリディストーションを参照してください。

オプションのソフトウェアとハードウェア

この例を VST がある NI PXI シャーシで実行し、実行時の PA 入力信号と出力信号を測定できます。VST はベクトル信号発生器 (VSG) をベクトル信号アナライザー (VSA) と統合した高帯域幅の RF 機器です。保存された信号は、次の NI PXI シャーシ構成を使用して取得されました。

  • NI PXIe-5840 ベクトル信号トランシーバー (VST)

  • NI PXIe-4139 ソース メジャー ユニット (SMU)

  • NI PXIe-4145 SMU

  • NI RFmx SpecAn ソフトウェア

  • NI-RFSG ソフトウェア

  • NI-RFSG Playback Library ソフトウェア

テスト対象デバイス (DUT) として、この例は動作周波数 3.6 ~ 3.8 GHz と 29 dB ゲインの NXP Airfast LDMOS ドハティ PA を使用します。この PA には、PXIe-4139 SMU と PXIe-4145 SMU を使用して提供される 29V、5V、3 V、1.6V および 1.4V の DC バイアスが必要です。

MATLAB® を NI PXI コントローラーにインストールし、次の図に示すハードウェア セットアップを使用してこの例を実行します。PXI コントローラーで実行される MATLAB はテスト波形を生成し、その波形を VSG にダウンロードします。VSG はこのテスト波形を PA に送信し、VSA は 劣化した波形を PA 出力で受信します。MATLAB は VSA から PA 出力を収集し、PA の特徴付けを実行します。

paChar_hardware_setup (2).png

変数 dataSource を "Hardware" に設定し、前述のハードウェア セットアップを使用した PA を介してテスト信号を実行します。テスト信号は 5G のような OFDM 波形または次の節で説明する 2 つのトーンのいずれかにすることができます。変数 dataSource を "From file" に設定し、事前に記録されたデータを使用します。

dataSource = "From file";

テスト信号の生成

テスト信号を生成するには、テスト信号の種類を "OFDM" または "Tones" として指定します。testSignal を "OFDM" として指定すると、サブキャリアごとに 64-QAM 変調信号をもつ 5G のような OFDM 波形が使用されます。"Tones" では、1.8 MHz と 2.6 MHz の 2 つの tone を使用して、PA によって発生する相互変調をテストします。

この例では、オーバーサンプリング係数 7 を使用して、想定される非線形性の次数 7 までグリッド探索を実行し、波形振幅を正規化します。

testSignal = "OFDM";
switch testSignal
  case "OFDM"
    bw = 100e6;
    [txWaveform,sampleRate,numFrames] = helperPACharGenerateOFDM(bw);
  case "Tones"
    bw = 3e6;
    [txWaveform,sampleRate,numFrames] = helperPACharGenerateTones();
end
txWaveform = txWaveform/max(abs(txWaveform));   % Normalize the waveform

ハードウェア テスト

変数 dataSource"From file" に設定される場合、事前に記録されたデータを読み込みます。変数 dataSource"Hardware" に設定される場合、VST を使用する PA を介してテスト信号を実行します。helperVSTDriver オブジェクトを作成して VST デバイスと通信します。リソース名を VST デバイスに割り当てられたリソース名に設定します。この例では、'VST_01' を使用します。NI デバイスの場合、NI Measurement & Automation Explorer (MAX) アプリケーションを使用してリソース名を検索できます。

if strcmp(dataSource, "Hardware")
  VST = helperVSTDriver('VST_01');

DUT と減衰器の想定されるゲイン値を設定します。PA 出力は 30 dB の減衰器に接続されているため、VSA の外部減衰を 30 に設定します。想定される DUT のゲインを 29 dB に、ゲイン精度を 1 dB に設定します。取得時間を約 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 にダウンロードします。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;

関数spectrumAnalyzerを使用してテスト信号のスペクトルをプロットします。

saInput = helperPACharPlotInput(paInput, sampleRate, testSignal, bw);

PA の AM/AM 特性をプロットします。

helperPACharPlotSpecAnAMAM(referencePower, measuredAMToAM)

わかりやすく表示するために、出力パワーと入力パワーの比較ではなく、ゲインと入力パワーの比較にフォーカスし、再度プロットします。

helperPACharPlotSpecAnGain(referencePower, measuredAMToAM)

PA は入力パワー範囲 -1 ~ 17 dBm ではほぼ線形であり、この範囲での変動は約 1dB のみです。ゲイン曲線の幅は、PA のメモリの影響が原因です。

PA の特徴付け

測定された PA 入力データと出力データを使用して PA をモデル化します。次に、このモデルを使用して、この PA が含まれるシステムをシミュレートし、パラメーターを微調整できます。この例は、無記憶非線形性、メモリ多項式、交差項のあるメモリ多項式の 3 つのモデルについて考えます。

無記憶非線形性モデル

無記憶非線形劣化は入力信号の振幅と位相を歪めます。振幅の歪みは、振幅対振幅の変調 (AM/AM) であり、位相の歪みは振幅対位相の変調 (AM/PM) です。comm.MemorylessNonlinearitySystem object とMemoryless Nonlinearityブロックはこの歪みをいくつか実装します。PA 入力データと出力データを使用して、このオブジェクトまたはブロックで使用するルックアップ テーブルを作成します。

AM/AM 伝達関数を特徴付けるには、入力パワー値の範囲に対する平均出力パワーを計算します。測定値は 100 オームのインピーダンスに対するボルト単位で表され、送信側と受信側で分割されています。測定されたベースバンド サンプルを dBm 単位のパワー値に変換します。+30 dB 項は dBW から dBm への変換に対応し、-20 dB 項は 100 オームのインピーダンスに対応します。

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

入力パワー値をビンに分割します。変数 edges にはビン エッジが格納され、変数 idx には各入力パワー値に対するビン値のインデックスが格納されています。

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

ビンごとに、ビンの中点、平均出力パワー、平均位相シフトを計算します。最大入力パワーより 20 dB 低い値に達しない入力パワー値は含めないでください。最初の列が dBm 単位の入力パワー、2 番目の列が dBm 単位の出力パワー、最後の列が位相シフトの 3 列の行列に結果を保存します。

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 object のテーブルを使用して PA をモデル化します。推定した出力を実際の出力と比較します。

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

                Method: 'Lookup table'
                 Table: [40×3 double]
    ReferenceImpedance: 100

paOutputFitMemless = pa(paInput);
err = paOutput - paOutputFitMemless;
rmsErrorMemless = rms(err)/rms(paOutput)*100;
disp(['Percent RMS error in time domain is ' num2str(rmsErrorMemless) '%'])
Percent RMS error in time domain is 6.5619%

測定出力信号と近似出力信号の両方を可視化するには、実際の時間領域の出力電圧と近似時間領域の出力電圧をプロットします。

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.870608e-01.
disp(abs(fitCoefMatMem))
   23.1551    8.8539   17.8383   13.3024    3.2168
         0   11.7689   26.4694   23.1943    5.5478
   20.9757   16.8534   25.7346   22.1933    5.0689
   32.6216    8.4043    9.4910   10.6988    2.5614
   15.3882    2.3630    2.0867    2.9340    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 2.5023%

測定出力信号と近似出力信号の両方を可視化するには、実際の時間領域の出力電圧と近似時間領域の出力電圧をプロットします。

paOutputFitMem = helperPACharMemPolyModel('signalGenerator', ...
  paInput, fitCoefMatMem, modType);
helperPACharPlotTime(paOutput, paOutputFitMem, sampleRate)

ゲインの振幅をプロットします。

helperPACharPlotGain(paInput, paOutput, paOutputFitMem)

考察

無記憶非線形性モデルに対する時間領域の RMS 推定誤差の割合 (約 6%) は、異なる帯域幅の OFDM 信号のメモリ多項式モデルの誤差 (約 2%) の約 3 倍です。

実際の PA 出力のスペクトルを、3 つのすべてのモデルに対する推定 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 モデルを試します。

DPD テストの PA モデルの使用

パワー アンプの非線形性を補正するデジタル プリディストーションにおけるシステム レベルでのシミュレーションのためにPower Amplifier (RF Blockset)ブロックで使用する PA モデルの係数行列を保存します。

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)