最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

RF 損失の可視化

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

初期化

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

fs = 1000;
M = 16;
snrdB = 30;
refConst = qammod(0:M-1,M,'UnitAveragePower',true);

損失の影響を可視化するために、コンスタレーション ダイアグラム オブジェクトと時間スコープ オブジェクトを作成します。

constDiagram = comm.ConstellationDiagram('ReferenceConstellation',refConst);
timeScope = dsp.TimeScope('YLimits',[0 40],'SampleRate',fs,'TimeSpan',1, ...
    'ShowGrid',true,'YLabel','EVM (%)');

ホワイト ノイズ

16-QAM 信号を生成し、AWGN チャネルを通して渡します。そのコンスタレーションをプロットします。

data = randi([0 M-1],1000,1);
modSig = qammod(data,M,'UnitAveragePower',true);
noisySig = awgn(modSig,snrdB);

constDiagram(noisySig)

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

evm = comm.EVM('ReferenceSignalSource','Estimated from reference constellation', ...
    'ReferenceConstellation',refConst, ...
    'Normalization','Average constellation power');

rmsEVM = evm(noisySig)
rmsEVM =

    3.1768

変調誤差比 (MER) は SNR と密接に対応します。MER オブジェクトを作成し、SNR を推定します。

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

   30.1071

推定値は、指定した 30 dB の SNR に極めて近くなります。

増幅器歪み

無記憶非線形性オブジェクトを使用して増幅器を作成します。

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

変調した信号を非線形増幅器を通して渡し、そのコンスタレーション ダイアグラムをプロットします。

txSig = amp(modSig);
constDiagram(txSig)

コンスタレーションのコーナー ポイントは、増幅器のゲイン圧縮によって原点の方向へ移動しています。

軽度の AM/PM 変換を導入し、受信信号のコンスタレーションを表示します。

amp.AMPMConversion = 1;
txSig = amp(modSig);
constDiagram(txSig)

コンスタレーションは AM/PM 変換によって回転しています。時変 EVM を計算するために、EVM オブジェクトを解放して AveragingDimensions プロパティを 2 に設定します。入力信号に対する EVM を推定するために、ReferenceSignalSource プロパティ定義を省略します。この方法によって、より正確な結果が得られます。

evm = comm.EVM('AveragingDimensions',2);
evmTime = evm(modSig,txSig);

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

timeScope(evmTime)

RMS EVM を計算します。

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

   35.5919

MER を計算します。

mer = comm.MER;
snrEst = mer(modSig,txSig)
snrEst =

    8.1392

SNR (?8 dB) は、増幅器歪みが原因で初期値 (?) から低下しています。

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

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));
    ampSig = amp(txSig);
    powerOut(k) = 10*log10(var(ampSig))+30;
end

出力パワー対入力パワーの曲線をプロットします。

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

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

I/Q 不均衡

振幅と位相の不均衡を変調した信号に適用します。

ampImb = 3;
phImb = 10;
gainI = 10.^(0.5*ampImb/20);
gainQ = 10.^(-0.5*ampImb/20);
imbI = real(modSig)*gainI*exp(-0.5i*phImb*pi/180);
imbQ = imag(modSig)*gainQ*exp(1i*(pi/2 + 0.5*phImb*pi/180));
rxSig = imbI + imbQ;

受信コンスタレーションをプロットします。

constDiagram(rxSig)

I/Q 不均衡の結果、コンスタレーションの振幅と位相が変わっています。

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

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

EVM は、非線形増幅器で見られた動作と似た動作を示しますが、分散が小さくなっています。

1000 Hz のサンプルレートをもつ 100 Hz の正弦波を作成します。

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

x = sinewave();

同じ 3 dB、10 度の I/Q 不均衡を適用します。

ampImb = 3;
phImb = 10;
gainI = 10.^(0.5*ampImb/20);
gainQ = 10.^(-0.5*ampImb/20);
imbI = real(x)*gainI*exp(-0.5i*phImb*pi/180);
imbQ = imag(x)*gainQ*exp(1i*(pi/2 + 0.5*phImb*pi/180));
y = imbI + imbQ;

不均衡な信号のスペクトルをプロットします。

spectrum = dsp.SpectrumAnalyzer('SampleRate',1000,'PowerUnits','dBW');

spectrum(y)

I/Q 不均衡によって、-100 Hz に 2 番目のトーンが発生しています。これは入力トーンの逆になります。

位相ノイズ

位相ノイズを送信信号に適用します。結果のコンスタレーション ダイアグラムをプロットします。

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

位相ノイズによって回転ジッターが発生します。

受信信号の EVM を計算してプロットします。

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

RMS EVM を求めます。

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

    6.1989

フィルターの影響

シンボルあたりのサンプル数パラメーターを指定します。レイズド コサイン整合フィルターのペアを作成します。

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);

受信信号のサンプル数の変更に合わせて、コンスタレーション ダイアグラム オブジェクトと時間スコープ オブジェクトを新しく作成します。

constDiagram = comm.ConstellationDiagram('ReferenceConstellation',refConst);
timeScope = dsp.TimeScope('YLimits',[0 40],'SampleRate',fs,'TimeSpan',1, ...
    'ShowGrid',true,'YLabel','EVM (%)');

EVM を推定します。受信信号のコンスタレーション ダイアグラムと時変 EVM をプロットします。

evm = comm.EVM('ReferenceSignalSource','Estimated from reference constellation', ...
    'ReferenceConstellation',refConst, ...
    'Normalization','Average constellation power','AveragingDimensions',2);
evmTime = evm(rxSig);
constDiagram(rxSig)
timeScope(evmTime)

RMS EVM を求めます。

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

    2.7199

対応する SNR を特定します。

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

   31.4603

複合的影響

フィルター、非線形増幅器、AWGN および位相ノイズの影響を組み合わせます。コンスタレーション ダイアグラムと EVM ダイアグラムを表示します。

EVM オブジェクト、時間スコープ オブジェクトおよびコンスタレーション ダイアグラム オブジェクトを作成します。

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

非線形増幅器オブジェクトおよび位相ノイズ オブジェクトを指定します。

amp = comm.MemorylessNonlinearity('IIP3',45,'AMPMConversion',0);
pnoise = comm.PhaseNoise('Level',-55,'FrequencyOffset',20,'SampleRate',fs);

変調した信号をフィルター処理してから増幅します。

txfiltOut = txfilter(modSig);
txSig = amp(txfiltOut);

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

rxSig = awgn(txSig,snrdB);
pnoiseSig = pnoise(rxSig);
rxfiltOut = rxfilter(pnoiseSig);
constDiagram(rxfiltOut)

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

evmTime = evm(rxfiltOut);
timeScope(evmTime)

RMS EVM を求めます。

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

    6.6444

SNR を推定します。

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

   23.6978

この値は、指定値の 30 dB より約 6 dB 悪化しています。これは、他の損失の影響が著しく、ビット誤り率性能を低下させることを意味します。

参考

|