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

comm.EVM

エラー ベクトル振幅の測定

説明

comm.EVM (エラー ベクトル振幅) System object™ は、劣化した信号の変調器または復調器の性能を測定します。

エラー ベクトル振幅を測定するには、以下の手順に従います。

  1. EVM オブジェクトを定義および設定します。構築を参照してください。

  2. step を呼び出して、comm.EVM のプロパティに従い、変調器または復調器の性能を測定します。step の動作は、ツールボックスの各オブジェクト固有のものです。

メモ

R2016b 以降では、step メソッドを使用して、System object によって定義された演算を実行する代わりに、引数を関数であるかのように使ってオブジェクトを呼び出すことができます。たとえば、y = step(obj,x)y = obj(x) は同等の演算を実行します。

構築

EVM = comm.EVM は、エラー ベクトル振幅オブジェクト EVM を作成します。このオブジェクトは、1 変調信号における障害量を計測します。

EVM = comm.EVM(Name,Value) は、指定された各プロパティを指定値に設定して、EVM オブジェクトを作成します。(Name1,Value1,...,NameN,ValueN) のように、のように、追加の名前と値のペアの引数を任意の順番で指定できます。

: EVM = comm.EVM('ReferenceSignalSource','Estimated from reference constellation') は、基準コンスタレーションを使用して受信信号の RMS EVM を測定する EVM オブジェクトを作成します。

プロパティ

Normalization

正規化方式

EVM の計算で使用される正規化方式。'Average reference signal power' (既定)、'Average constellation power' または 'Peak constellation power' のいずれかで指定します。

AverageConstellationPower

平均コンスタレーション電力

平均コンスタレーション電力。ワット単位で、正の実数スカラーとして指定します。このプロパティは、Normalization'Average constellation power' である場合に使用できます。既定の設定は 1 です。

PeakConstellationPower

ピーク コンスタレーション電力

ピーク コンスタレーション電力。ワット単位で、正の実数スカラーとして指定します。このプロパティは、Normalization'Peak constellation power' である場合に使用できます。既定の設定は 1 です。

ReferenceSignalSource

基準信号のソース

基準信号のソース。'Input port' (既定) または 'Estimated from reference constellation' のいずれかで指定します。入力信号を比較して測定する明示的な基準信号を与えるには、このプロパティを 'Input port' に設定します。基準コンスタレーションと比較して入力信号の EVM を測定するには、このプロパティを 'Estimated from reference constellation' に設定します。

ReferenceConstellation

基準コンスタレーション

基準コンスタレーション。ベクトルで指定します。このプロパティは、ReferenceSignalSource プロパティが 'Estimated from reference constellation' である場合に使用できます。

既定の設定は [0.7071 - 0.7071i; -0.7071 - 0.7071i; -0.7071 + 0.7071i; 0.7071 + 0.7071i] です。これは標準 QPSK コンスタレーションに相当します。コンスタレーション点は変調関数または変調オブジェクトを使用して得られます。たとえば、16-QAM 信号の基準コンスタレーションを得るには、qammod(0:15,16) が使用できます。

MeasurementIntervalSource

測定間隔のソース

測定間隔のソース。'Input length' (既定)、'Entire history''Custom' または 'Custom with periodic reset' のいずれかで指定します。このプロパティは RMS EVM 出力および最大 EVM 出力のみに影響します。

  • 現在のサンプルのみを使用して EVM を計算するには、このプロパティを 'Input length' に設定します。

  • すべてのサンプルの EVM を計算するには、このプロパティを 'Entire history' に設定します。

  • 指定した間隔にわたって EVM を計算し、スライディング ウィンドウを使用するには、このプロパティを 'Custom' に設定します。

  • 指定した間隔にわたって EVM を計算し、測定間隔がいっぱいになるたびにオブジェクトをリセットするには、このプロパティを 'Custom with periodic reset' に設定します。

MeasurementInterval

測定間隔

EVM を計算する測定間隔。サンプル単位で、実数の正の整数として指定します。このプロパティは、MeasurementIntervalSource'Custom' または 'Custom with periodic reset' である場合に使用できます。既定の設定は 100 です。

AveragingDimensions

平均化次元

平均化次元。正の整数または正の整数の行ベクトルで指定します。このプロパティは、平均化を実行する次元を決定します。たとえば、行全体の平均を求めるには、このプロパティを 2 に設定します。既定の設定は 1 です。

このオブジェクトは、平均化を実行する次元に対する可変サイズ入力をサポートします。ただし、平均化を行わない次元に対する入力サイズは、step 呼び出し間で一定に保たなければなりません。たとえば、入力のサイズが [4 3 2]Averaging dimensions[1 3] の場合、出力サイズは [1 3 1] となり、2 番目の次元は 3 に固定されなければなりません。

MaximumEVMOutputPort

最大 EVM 測定値出力端子

最大 EVM 測定値出力端子。論理スカラーで指定します。最大 EVM 測定値の出力端子を作成するには、このプロパティを true に設定します。既定の設定は false です。

XPercentileEVMOutputPort

X 百分位 EVM 測定値出力端子

X 百分位 MER 測定値出力端子。論理スカラーで指定します。X 百分位 MER 測定値の出力端子を作成するには、このプロパティを true に設定します。X 百分位 MER 測定値は、オブジェクトをリセットするまで維持されます。これらの測定値は、最後のリセット以降のすべての入力フレームを使用して計算されます。既定の設定は false です。

XPercentileValue

X 百分位値

EVM 測定値の X% がその値を下回る X 百分位値。0100 の実数スカラーで指定します。このプロパティは、XPercentileEVMOutputPorttrue である場合に使用できます。既定の設定は 95 です。

SymbolCountOutputPort

シンボル数出力端子

シンボル数出力端子。論理スカラーで指定します。X 百分位 EVM 測定値の計算に使用された累積シンボル数を出力するには、このプロパティを true に設定します。このプロパティは、XPercentileEVMOutputPorttrue である場合に使用できます。既定の設定は false です。

メソッド

resetEVM 測定オブジェクトの状態のリセット
stepエラー ベクトル振幅の測定
すべての System object に共通
release

System object のプロパティ値の変更の許可

すべて展開する

EVM オブジェクトを作成します。名前と値のペアを使用して、最大 EVM、90 番目の百分位 EVM およびシンボル数を出力するようにそのオブジェクトを構成します。

evm = comm.EVM('MaximumEVMOutputPort',true,...
    'XPercentileEVMOutputPort',true, 'XPercentileValue',90,...
    'SymbolCountOutputPort',true);

ランダム データ シンボルを生成します。16-QAM 変調を適用します。変調した信号は、この後の EVM 測定の基準として機能します。

data = randi([0 15],1000,1);
refSym = qammod(data,16,'UnitAveragePower',true);

AWGN チャネルを通して、変調された信号を渡します。

rxSym = awgn(refSym,20);

ノイズを含む信号の EVM を測定します。

[rmsEVM,maxEVM,pctEVM,numSym] = evm(refSym,rxSym)
rmsEVM = 9.8775
maxEVM = 26.8385
pctEVM = 14.9750
numSym = 1000

フィルター処理した QAM データを生成し、AWGN チャネルを通して渡します。シンボル誤り率を計算し、受信した信号の EVM を推定します。

変調、復調、チャネルおよびフィルターの各 System object™ を作成します。

modulator = comm.RectangularQAMModulator(16);
demodulator = comm.RectangularQAMDemodulator(16);
channel = comm.AWGNChannel('NoiseMethod','Signal to noise ratio (SNR)',...
    'SNR',15,'SignalPower',10);

txfilter = comm.RaisedCosineTransmitFilter('OutputSamplesPerSymbol',4);
rxfilter = comm.RaisedCosineReceiveFilter('InputSamplesPerSymbol',4, ...
    'DecimationFactor',4);

EVM オブジェクトを作成し、RMS EVM および最大 EVM の測定値を出力します。

evm = comm.EVM('MaximumEVMOutputPort',true, ...
    'ReferenceSignalSource','Estimated from reference constellation', ...
    'ReferenceConstellation',constellation(modulator));

誤り率オブジェクトを作成して、送信および受信フィルターによる遅延を考慮します。1 つのフィルターの群遅延は FilterSpanInSymbols プロパティの 1/2 と等価です。

rxd = (txfilter.FilterSpanInSymbols + rxfilter.FilterSpanInSymbols)/2;
errorRate = comm.ErrorRate('ReceiveDelay',rxd);

以下のチャネル処理を実行します。

  • ランダム データ シンボルを生成します。

  • 16-QAM 変調を適用します。

  • 変調されたデータをレイズド コサイン Tx フィルターでフィルター処理します。

  • AWGN チャネルを通して送信された信号を渡します。

  • 受信データをレイズド コサイン Rx フィルターでフィルター処理します。

  • フィルター処理されたデータを復調します。

txData = randi([0 15],1000,1);
modData = modulator(txData);
txSig = txfilter(modData);
rxSig = channel(txSig);
filtSig = rxfilter(rxSig);
rxData = demodulator(filtSig);

誤り統計を計算して、シンボル誤り率を表示します。

errStats = errorRate(txData,rxData);
symErrRate = errStats(1)
symErrRate = 0.0222

受信した RMS EVM および最大 EVM の値を測定して表示します。フィルターによる遅延とみなして、最初の rxd+1 シンボルを削除します。シンボル誤りが存在するため、EVM が完全には正確でない可能性があります。

[rmsEVM,maxEVM] = evm(filtSig(rxd+1:end))
rmsEVM = 17.2966
maxEVM = 40.1595

ランダム データ シンボルを生成して 8-PSK 変調を適用します。

d = randi([0 7],2000,1);
txSig = pskmod(d,8,pi/8);

AWGN チャネルを通して、変調された信号を渡します。

rxSig = awgn(txSig,30);

EVM オブジェクトを作成します。送信された信号を基準として使用し、RMS EVM を測定します。

evm = comm.EVM;
rmsEVM1 = evm(txSig,rxSig);

EVM オブジェクトを解放します。基準コンスタレーションと比較して受信信号の EVM を推定するようにオブジェクトを構成します。

release(evm)
evm.ReferenceSignalSource = 'Estimated from reference constellation';
evm.ReferenceConstellation = pskmod(0:7,8,pi/8);

受信信号のみを入力として使用して RMS EVM を測定します。測定値が、基準信号の使用時に取得した結果と一致していることを確認します。

rmsEVM2 = evm(rxSig);
[rmsEVM1 rmsEVM2]
ans = 1×2

    3.1524    3.1524

カスタムの測定間隔 2 種類を使用し、ノイズを含む 8-PSK 信号の EVM を測定します。結果を表示します。

フレーム数 M とフレームごとのサブフレーム数 K を設定します。

M = 2;
K = 5;

サブフレームのシンボル数を設定します。対応するフレーム長を計算します。

sfLen = 100;
frmLen = K*sfLen
frmLen = 500

EVM オブジェクトを作成します。フレーム長と等しいカスタムの測定間隔を使用するようにオブジェクトを構成します。

evm1 = comm.EVM('MeasurementIntervalSource','Custom', ...
    'MeasurementInterval',frmLen);

8-PSK 基準コンスタレーションを使用して EVM を測定するようにオブジェクトを構成します。

evm1.ReferenceSignalSource = 'Estimated from reference constellation';
evm1.ReferenceConstellation = pskmod(0:7,8,pi/8);

EVM オブジェクトを作成し、周期的なリセットを伴う 500 シンボルの測定間隔を使用するように構成します。8-PSK 基準コンスタレーションを使用して EVM を測定するようにオブジェクトを構成します。

evm2 = comm.EVM('MeasurementIntervalSource','Custom with periodic reset', ...
    'MeasurementInterval',frmLen);
evm2.ReferenceSignalSource = 'Estimated from reference constellation';
evm2.ReferenceConstellation = pskmod(0:7,8,pi/8);

EVM の配列と S/N 比の配列を初期化します。

rmsEVM1 = zeros(K,M);
rmsEVM2 = zeros(K,M);
snrdB = zeros(K,M);

両方のオブジェクトを使用して、ノイズを含む 8-PSK 信号の EVM を測定します。SNR は、サブフレーム間で 1 dB 増加します。evm1 では、最新の 500 シンボルが推定の計算に使用されます。この場合は、常にデータ フレーム全体が処理されるように、スライディング ウィンドウを使用します。evm2 では、フレームが新しくなるたびにシンボルが消去されます。

for m = 1:M
    for k = 1:K
        data = randi([0 7],sfLen,1);
        txSig = pskmod(data,8,pi/8);
        snrdB(k,m) = k+(m-1)*K+7;
        rxSig = awgn(txSig,snrdB(k,m));
        rmsEVM1(k,m) = evm1(rxSig);
        rmsEVM2(k,m) = evm2(rxSig);
    end
end

2 つの方法を使用して測定した EVM を表示します。1 番目のケースで使用したウィンドウ処理では、サブフレーム全体を平均しています。2 番目のケースでは、計算される EVM 値が現在の SNR をより正確に反映するように、最初のフレームの後に EVM オブジェクトがリセットされています。

stairs(snrdB(:),[rmsEVM1(:) rmsEVM2(:)])
xlabel('SNR (dB)')
ylabel('EVM (%)')
legend('No Reset','Periodic Reset')

OFDM 変調器オブジェクトと OFDM 復調器オブジェクトを作成します。

ofdmmod = comm.OFDMModulator('FFTLength',32,'NumSymbols',4);
ofdmdemod = comm.OFDMDemodulator('FFTLength',32,'NumSymbols',4);

OFDM 信号の副搬送波とシンボルの数を決定します。

ofdmDims = info(ofdmmod);
numSC = ofdmDims.DataInputSize(1)
numSC = 21
numSym = ofdmDims.DataInputSize(2)
numSym = 4

ランダムなシンボルを生成して QPSK 変調を適用します。

msg = randi([0 3],numSC,numSym);
modSig = pskmod(msg,4,pi/4);

QPSK 信号を OFDM 変調します。AWGN チャネルを通して信号を渡します。ノイズを含む信号を復調します。

txSig = ofdmmod(modSig);
rxSig = awgn(txSig,10,'measured');
demodSig = ofdmdemod(rxSig);

EVM オブジェクトを作成します。ここで、結果は副搬送波全体で平均されます。EVM を測定します。4 つの OFDM シンボルそれぞれに対応する 4 つのエントリが存在します。

evm = comm.EVM('AveragingDimensions',1);
rmsEVM = evm(demodSig,modSig)
rmsEVM = 1×4

   27.4354   23.6279   22.6772   23.1699

EVM オブジェクトを上書きします。ここで、結果は OFDM シンボル全体で平均されます。EVM を測定します。21 個の副搬送波それぞれに対応する 21 個のエントリが存在します。

evm = comm.EVM('AveragingDimensions',2);
rmsEVM = evm(demodSig,modSig)
rmsEVM = 21×1

   28.8225
   17.8536
   18.6809
   20.8872
   22.3532
   24.7197
   30.1954
   33.4899
   36.2847
   21.4230
      ⋮

EVM を測定し、副搬送波と OFDM シンボルの両方で全体で平均します。

evm = comm.EVM('AveragingDimensions',[1 2]);
rmsEVM = evm(demodSig,modSig)
rmsEVM = 24.2986

OFDM 信号の EVM を計算してプロットします。信号は間隔で区切られた 2 つのパケットから構成されています。

以下を実行する System object を作成します。

  • 信号の OFDM 変調

  • 位相ノイズの導入

  • 時変信号のプロット

ofdmmod = comm.OFDMModulator('FFTLength',256,'NumSymbols',2);

pnoise = comm.PhaseNoise('Level',-60,'FrequencyOffset',20,'SampleRate',1000);

tscope = dsp.TimeScope('YLabel','EVM (%)','YLimits',[0 40], ...
    'SampleRate',1000,'TimeSpan',1.2, ...
    'ShowGrid',true);

EVM オブジェクトを作成します。EVM の時変推定を生成するには、AveragingDimensions プロパティを 2 に設定します。

evm = comm.EVM('MaximumEVMOutputPort',false, ...
    'ReferenceSignalSource','Input port', ...
    'AveragingDimensions',2);

OFDM 変調器の入力データの次元を決定します。

modDims = info(ofdmmod)
modDims = 

  struct with fields:

    DataInputSize: [245 2]
       OutputSize: [544 1]

1 番目のパケットとして、QPSK 変調したランダム データを作成します。OFDM 変調を適用します。

data = randi([0 3],modDims.DataInputSize);
qpskSig = pskmod(data,4,pi/4);
txSig1 = ofdmmod(qpskSig);

2 番目のデータ パケットを作成します。

data = randi([0 3],modDims.DataInputSize);
qpskSig = pskmod(data,4,pi/4);
txSig2 = ofdmmod(qpskSig);

2 つのパケットを連結し、何も送信しない間隔を含めます。

txSig = [txSig1; zeros(112,1); txSig2];

送信信号に I/Q 振幅と位相の不均衡を適用します。

rxSigIQimb = iqimbal(txSig,2,5);

位相ノイズを適用します。

rxSig = pnoise(rxSigIQimb);

受信信号の EVM を測定し、その時変 EVM をプロットします。

e = evm(txSig,rxSig);
tscope(e)

アルゴリズム

EVM ブロックおよび EVM オブジェクトのいずれにも 3 種類の正規化方式が用意されています。測定値の正規化を基準信号の平均電力、平均コンスタレーション電力、またはピーク コンスタレーション電力に従って行うことができます。さまざまな業界標準が、これらの正規化方式のいずれかに準拠しています。

ブロックまたはオブジェクトは、それぞれの正規化方式に応じて各様に RMS EVM を計算します。

EVM 正規化方式アルゴリズム
基準信号

EVMRMS=1Nk=1N(ek)1Nk=1N(Ik2+Qk2)*100

平均電力

EVMRMS(%)=1001Nk=1N(ek)Pavg

ピーク電力

EVMRMS(%)=1001Nk=1N(ek)Pmax

ここで、次のようになります。

  • ek = ek=(IkI˜k)2+(QkQ˜k)2

  • Ik = バーストにおける k 番目のシンボルの同相での計測

  • Qk = バーストにおける k 番目のシンボルの直交位相での計測

  • N = 入力ベクトル長

  • Pavg = [Average constellation power] の値

  • Pmax = [Peak constellation power] の値

  • Ik および Qk は理想 (基準) 値。I˜k および Q˜k は測定された (受信した) シンボル。

最大 EVM は、フレームまたは EVMmax=maxk[1,...,N]{EVMk}, の最大 EVM 値です。ここで、k は長さ N のバーストにおける k 番目のシンボルです。

EVMk の定義は、測定値の計算に選択された正規化方式に応じて異なります。ブロックまたはオブジェクトは次のアルゴリズムをサポートします。

EVM 正規化アルゴリズム
基準信号

EVMk=ek1Nk=1N(Ik2+Qk2)*100

平均電力

EVMk=100ekPavg

ピーク電力

EVMk=100ekPmax

ブロックまたはオブジェクトは、すべての受信 EVMk 値のヒストグラムを作成して、X 百分位 EVM を計算します。出力で EVM 値が得られます。EVM 値の X% がこの値を下回ります。

拡張機能

R2012a で導入