Main Content

RF 損失の可視化

さまざまな RF 損失を QAM 信号に適用します。コンスタレーション ダイアグラム、時変エラー ベクトル振幅 (EVM) プロットおよびスペクトル プロットを使用して影響を観察します。変調誤差比 (MER) 測定を使用して、対応する S/N 比 (SNR) を推定します。

初期化

サンプルレート、変調次数および SNR を設定します。基準コンスタレーション点を計算します。16-QAM 信号を生成します。

fs = 1000;
M = 16;
snrdB = 30;
refConst = qammod(0:M-1,M,UnitAveragePower=true);
data = randi([0 M-1],1000,1);
modSig = qammod(data,M,UnitAveragePower=true);

損失の影響を可視化するために、constellation diagram オブジェクトと time scope オブジェクトを作成します。

constDiagram = comm.ConstellationDiagram( ...
    ReferenceConstellation=refConst);
timeScope = timescope( ...
    YLimits=[0 40], ...
    SampleRate=fs, ...
    TimeSpanSource="property", ...
    TimeSpan=1, ...
    ShowGrid=true, ...
    YLabel="EVM (%)");

増幅器歪み

無記憶非線形損失は入力信号の振幅と位相を歪めます。振幅の歪みは、振幅対振幅の変調 (AM-AM) であり、位相の歪みは振幅対位相の変調 (AM-PM) です。無記憶非線形性 System object™ は、増幅器のゲイン圧縮と AM-PM 変換からそれぞれ生じる AM-AM 歪みと AM-PM 歪みをモデル化します。

無記憶非線形性オブジェクトを使用して、AM-PM 変換損失のない増幅器のゲイン圧縮を追加します。増幅器のゲイン圧縮は、原点からの距離が増加するほどシンボルを大きく歪ませる非線形損失です。

mnlamp= comm.MemorylessNonlinearity( ...
    IIP3=38, ...
    AMPMConversion=0);

変調した信号を非線形増幅器を通して渡し、コンスタレーション ダイアグラムをプロットします。増幅器のゲイン圧縮により、コンスタレーション点が原点に向かって移動します。

mnlampSig = mnlamp(modSig);
constDiagram(mnlampSig)
release(constDiagram)

無記憶非線形性オブジェクトの構成を調整して、小さな AM-PM 変換損失を追加します。AM-PM 変換は、原点からの距離が増加するほどシンボルを大きく歪ませる非線形損失です。AM-PM 変換は、コンスタレーションの回転の原因になります。

変調した信号を非線形増幅器を通して渡し、コンスタレーション ダイアグラムをプロットして、AM-AM 歪みと AM-PM 歪みを組み合わせて表示します。

mnlamp.AMPMConversion = 1;
mnlampSig = mnlamp(modSig);
constDiagram(mnlampSig)
release(constDiagram)

基準信号ソースを入力引数として入力し、信号の行全体で結果を平均するように EVM オブジェクトを構成します。入力信号に対して EVM を推定すると、より正確な結果が得られます。信号の行全体で結果を平均すると、時変 EVM が計算されます。

evm = comm.EVM(AveragingDimensions=2);

歪んだ信号の時変 EVM をプロットします。

evmTime = evm(modSig,mnlampSig);
timeScope(evmTime)
release(timeScope)

RMS EVM を計算します。

evmRMS = sqrt(mean(evmTime.^2))
evmRMS = 35.5919

MER オブジェクトを使用して、増幅器歪みを追加した後の信号の SNR を推定します。

mer = comm.MER;
snrEst = mer(modSig,mnlampSig)
snrEst = 8.1392

入力パワー レベルの範囲で増幅器出力パワーを測定します。0 ~ 40 dBm の範囲の入力パワー レベルを指定します。このレベルをワット単位の線形等価に変換します。出力パワー ベクトルを初期化します。

powerIn = 0:40;
pin = 10.^((powerIn-30)/10);
powerOut = zeros(length(powerIn),1);
for k = 1:length(powerIn)
    data = randi([0 15],1000,1);
    txSig = qammod( ...
        data,16,UnitAveragePower=true)*sqrt(pin(k));
    mnlampSig = mnlamp(txSig);
    powerOut(k) = 10*log10(var(mnlampSig))+30;
end

出力パワー対入力パワーの曲線をプロットします。出力パワーは 30 dBm で平坦になります。増幅器は、入力パワー レベルが 25 dBm を超えると非線形動作を示します。

figure
plot(powerIn,powerOut,powerIn,powerIn,"--")
legend("Amplifier Output","Ideal Output",location="se")
xlabel("Power In (dBm)")
ylabel("Power Out (dBm)")
grid

Figure contains an axes object. The axes object contains 2 objects of type line. These objects represent Amplifier Output, Ideal Output.

IQ 不平衡

関数 iqimbal を使用して、振幅と位相の不平衡を変調した信号に適用します。IQ 不平衡の結果、コンスタレーション点の振幅と位相は線形的に変化します。

ampImb = 3;
phImb = 10;
rxSig = iqimbal(modSig,ampImb,phImb);

IQ 不平衡で劣化したコンスタレーション ダイアグラムと時変 EVM をプロットします。

constDiagram(rxSig)
release(constDiagram)

IQ 不平衡で劣化した信号の時変 EVM の動作は、非線形増幅器による時変 EVM の動作に類似していますが、分散は小さくなっています。

evmTime = evm(modSig,rxSig);
timeScope(evmTime)
release(timeScope)

IQ 不平衡を正弦波に適用し、次いで IQ 不平衡で劣化した正弦波のスペクトルを表示して示します。

正弦波 System object™ を使用して、1000 Hz のサンプル レートで 100 Hz の正弦波を作成します。

sinewave = dsp.SineWave( ...
    Frequency=100, ...
    SampleRate=1000, ...
    SamplesPerFrame=1e4, ...
    ComplexOutput=true);
x = sinewave();

同じ 3 dB、10 度の IQ 不平衡を適用します。

ampImb = 3;
phImb = 10;
y = iqimbal(x,ampImb,phImb);

不平衡な信号のスペクトルをプロットします。IQ 不平衡によって、-100 Hz に 2 番目のトーンが発生しています。これは入力トーンの逆になります。

spectrum = spectrumAnalyzer( ...
    SampleRate=1000, ...
    SpectrumUnits="dBW");
spectrum(y)
release(spectrum)

位相ノイズ

位相ノイズ System object™ を使用して、位相ノイズを送信信号に適用します。位相ノイズによって回転ジッターが発生します。

pnoise = comm.PhaseNoise( ...
    Level=-50, ...
    FrequencyOffset=20, ...
    SampleRate=fs);
pnoiseSig = pnoise(modSig);

位相ノイズで劣化したコンスタレーション ダイアグラムと時変 EVM をプロットします。

constDiagram(pnoiseSig)
release(constDiagram)

evmTime = evm(modSig,pnoiseSig);
timeScope(evmTime)
release(timeScope)

RMS EVM を計算します。

evmRMS = sqrt(mean(evmTime.^2))
evmRMS = 6.3258

フィルターの影響

レイズド コサイン送信フィルターおよび受信フィルターの System object を使用して、レイズド コサイン整合フィルターのペアを作成します。シンボルあたりのサンプル数パラメーターを指定します。

sps = 4;
txfilter = comm.RaisedCosineTransmitFilter( ...
    RolloffFactor=0.2, ...
    FilterSpanInSymbols=8, ...
    OutputSamplesPerSymbol=sps, ...
    Gain=sqrt(sps));
rxfilter = comm.RaisedCosineReceiveFilter( ...
    RolloffFactor=0.2, ...
    FilterSpanInSymbols=8, ...
    InputSamplesPerSymbol=sps, ...
    Gain=1/sqrt(sps), ...
    DecimationFactor=sps);

整合フィルターによる遅延を特定します。

fltDelay = 0.5*( ...
    txfilter.FilterSpanInSymbols + ...
    rxfilter.FilterSpanInSymbols);

整合フィルターを通して変調信号を渡します。

filtSig = txfilter(modSig);
rxSig = rxfilter(filtSig);

フィルター通過による遅延を考慮に入れるため、最初の fltDelay サンプルを破棄します。

rxSig = rxSig(fltDelay+1:end);

受信信号のサンプル数の変更に合わせて、constellation diagram オブジェクトと time scope オブジェクトを新しく作成します。EVM オブジェクトを作成して EVM を推定します。

constDiagram = comm.ConstellationDiagram(ReferenceConstellation=refConst);
timeScope = timescope( ...
    YLimits=[0 40], ...
    SampleRate=fs, ...
    TimeSpanSource="property", ...
    TimeSpan=1, ...
    ShowGrid=true, ...
    YLabel="EVM (%)");
evm = comm.EVM( ...
    ReferenceSignalSource="Estimated from reference constellation", ...
    ReferenceConstellation=refConst, ...
    Normalization="Average constellation power", ...
    AveragingDimensions=2);

フィルター処理されたコンスタレーション ダイアグラムと時変 EVM をプロットします。

constDiagram(rxSig)
release(constDiagram)

evmTime = evm(rxSig);
timeScope(evmTime)
release(timeScope)

RMS EVM を計算します。

evmRMS = sqrt(mean(evmTime.^2))
evmRMS = 2.7199

MER オブジェクトを使用して SNR を推定します。

mer = comm.MER;
snrEst = mer(modSig(1:end-fltDelay),rxSig)
snrEst = 31.4603

ホワイト ノイズ

16-QAM 信号を AWGN チャネル経由で渡してから、そのコンスタレーション ダイアグラムをプロットします。

noisySig = awgn(modSig,snrdB);
constDiagram(noisySig)
release(constDiagram)

ノイズを含む信号の EVM を、基準コンスタレーション点から推定します。

evm = comm.EVM( ...
    ReferenceSignalSource="Estimated from reference constellation", ...
    ReferenceConstellation=refConst, ...
    Normalization="Average constellation power");
rmsEVM = evm(noisySig)
rmsEVM = 3.1941

MER 測定値は、SNR に密接に対応しています。MER オブジェクトを作成し、SNR を推定します。推定値は、指定した 30 dB の SNR に近くなっています。

mer = comm.MER( ...
    ReferenceSignalSource="Estimated from reference constellation", ...
    ReferenceConstellation=refConst);
snrEst = mer(noisySig)
snrEst = 30.0598

複合的影響

フィルター、非線形増幅器、IQ 不平衡、位相ノイズ、および AWGN の影響を組み合わせます。コンスタレーション ダイアグラム、EVM プロット、および計算された EVM を表示します。

非線形増幅器、位相ノイズ、EVM、時間スコープ、およびコンスタレーション ダイアグラムのオブジェクトを作成します。

mnlamp = comm.MemorylessNonlinearity(IIP3=45,AMPMConversion=0);
pnoise = comm.PhaseNoise(Level=-55,FrequencyOffset=20,SampleRate=fs);
evm = comm.EVM( ...
    ReferenceSignalSource="Estimated from reference constellation", ...
    ReferenceConstellation=refConst, ...
    Normalization="Average constellation power", ...
    AveragingDimensions=2);
timeScope = timescope( ...
    YLimits=[0 40], ...
    SampleRate=fs, ...
    TimeSpanSource="property", ...
    TimeSpan=1, ...
    ShowGrid=true, ...
    YLabel="EVM (%)");
constDiagram = comm.ConstellationDiagram( ...
    ReferenceConstellation=refConst);

送信機のフィルター処理を適用し、次いで変調信号を増幅します。IQ 不平衡と位相ノイズを追加します。

txfiltOut = txfilter(modSig);
mnlampSig = mnlamp(txfiltOut);
iqImbalSig = iqimbal(mnlampSig,ampImb,phImb);
txSig = pnoise(iqImbalSig);

AWGN チャネルを通して、劣化した信号を渡します。コンスタレーション ダイアグラムをプロットします。

rxSig = awgn(txSig,snrdB);
rxfiltOut = rxfilter(rxSig);

constDiagram(rxfiltOut)
release(constDiagram)

時変 EVM を計算します。結果をプロットします。

evmTime = evm(rxfiltOut);
timeScope(evmTime)
release(timeScope)

RMS EVM を求めます。

evmRMS = sqrt(mean(evmTime.^2))
evmRMS = 19.4785

SNR を推定します。この値は、指定値の 30 dB よりも約 16 dB 悪化しています。このレベルの RF 劣化要因の影響は重大であり、損失補正または高度な受信機によって修正されない場合、ビット エラー レートのパフォーマンスが低下する可能性があります。

mer = comm.MER( ...
    ReferenceSignalSource="Estimated from reference constellation", ...
    ReferenceConstellation=refConst);
snrEst = mer(rxfiltOut)
snrEst = 14.2470

参考

|