Main Content

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

comm.EVM

受信信号のエラー ベクトル振幅 (EVM) の測定

説明

comm.EVM System object™ は、受信信号の平方根平均二乗 (RMS) EVM、最大 EVM、および百分位 EVM を測定します。

受信信号の EVM を測定するには、次のようにします。

  1. comm.EVM オブジェクトを作成し、そのプロパティを設定します。

  2. 関数と同様に、引数を指定してオブジェクトを呼び出します。

System object の機能の詳細については、System object とはを参照してください。

作成

説明

evm = comm.EVM は、EVM 測定 System object を作成します。

evm = comm.EVM(Name=Value) は、名前と値の引数を 1 つ以上使用してプロパティを設定します。たとえば、comm.EVM(ReferenceSignalSource="Estimated from reference constellation") は、基準コンスタレーションに対する受信信号の EVM を測定するオブジェクトを構成します。

プロパティ

すべて展開する

特に指定がない限り、プロパティは "調整不可能" です。つまり、オブジェクトの呼び出し後に値を変更することはできません。オブジェクトは呼び出すとロックされ、ロックを解除するには関数 release を使用します。

プロパティが "調整可能" の場合、その値をいつでも変更できます。

プロパティ値の変更の詳細については、System object を使用した MATLAB でのシステム設計を参照してください。

EVM の計算で使用される正規化方式。'Average reference signal power''Average constellation power'、または 'Peak constellation power' として指定します。

データ型: char | string

平均コンスタレーション電力 (ワット単位)。正のスカラーとして指定します。

依存関係

このプロパティを有効にするには、Normalization プロパティを 'Average constellation power' に設定します。

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

ピーク コンスタレーション電力 (ワット単位)。正のスカラーとして指定します。

依存関係

このプロパティを有効にするには、Normalization プロパティを 'Peak constellation power' に設定します。

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

基準信号のソース。'Input port' または 'Estimated from reference constellation' として指定します。受信信号を測定するための明示的な基準信号を与えるには、このプロパティを 'Input port' に設定します。基準コンスタレーションに対して受信信号の EVM を測定するには、このプロパティを 'Estimated from reference constellation' に設定します。

データ型: char | string

基準コンスタレーション。ベクトルで指定します。既定値は、単位平均パワーをもつ直交位相偏移変調 (QPSK) コンスタレーションに対応します。コンスタレーション点は変調関数または変調オブジェクトを使用して得られます。たとえば、16 点の直交振幅変調 (16-QAM) 信号の基準コンスタレーションを得るには、関数 qammod を使用します。

例: qammod(0:15,16)

依存関係

このプロパティを有効にするには、ReferenceSignalSource プロパティを 'Estimated from reference constellation' に設定します。

データ型: double
複素数のサポート: あり

RMS 測定および最大 EVM 測定における測定間隔のソース。以下のいずれかの値として指定します。

  • 'Input length' — 現在のサンプルのみを使用して EVM を測定します。

  • 'Entire history' — すべてのサンプルの EVM を測定します。

  • 'Custom' — 指定した間隔で EVM を測定し、スライディング ウィンドウを使用します。

  • 'Custom with periodic reset' — 指定した間隔で EVM を測定し、各間隔で測定した後にオブジェクトをリセットします。

データ型: char | string

測定間隔。正の整数として指定します。

依存関係

このプロパティを有効にするには、MeasurementIntervalSource プロパティを 'Custom' または 'Custom with periodic reset' に設定します。

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

オブジェクトが EVM の測定値を平均する平均化次元。範囲 [1, 3] の整数のベクトルとして指定します。たとえば、行全体の平均を求めるには、このプロパティを 2 に設定します。

このオブジェクトは、平均化を行う次元の可変サイズ入力をサポートします。ただし、平均化を行わない次元の入力サイズは、オブジェクトの呼び出し間で必ず一定に保たれます。たとえば、入力のサイズが [1000 3 2] で、このプロパティを [1 3] に設定した場合、出力サイズは [1 3 1] となり、2 番目の次元要素の数は必ず 3 に固定されます。

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

最大 EVM の測定値を返すオプション。logical 1 (true) または logical 0 (false) として指定します。

データ型: logical

第 X 百分位の EVM 測定値 (EVM 測定値の下位 X% の値) を返すオプション。logical 1 (true) または logical 0 (false) として指定します。このプロパティを 1 (true) に設定すると、第 X 百分位の EVM 測定値が、オブジェクトをリセットするまで維持されます。オブジェクトは、最後のリセット以降の入力フレームをすべて使用してこれらの測定を実行します。

データ型: logical

EVM 測定値の下位 X% の値。範囲 [0, 100] のスカラーとして指定します。

依存関係

このプロパティを有効にするには、XPercentileEVMOutputPort プロパティを true に設定します。

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

最後のリセット以降の第 X 百分位の EVM を測定するためにオブジェクトが使用する累積シンボル数を返すオプション。logical 1 (true) または logical 0 (false) として指定します。

依存関係

このプロパティを有効にするには、XPercentileEVMOutputPort プロパティを true に設定します。

データ型: logical

使用法

説明

rmsEVM = evm(refSym,rxSym) は、MeasurementIntervalSource プロパティおよび MeasurementInterval プロパティで指定した測定間隔で、基準信号 refSym に対する受信信号 rxSym のパーセンテージ RMS EVM を測定します。

[rmsEVM,maxEVM] = evm(refSym,rxSym) は、構成された測定間隔で最大パーセンテージ EVM も測定します。

この構文を使用するには、MaximumEVMOutputPort プロパティを true に設定します。

[___,xEVM] = evm(refSym,rxSym) はまた、測定間隔の構成に関係なく、最後のリセット以降の入力フレームをすべて使用して、EVM 測定値の下位 X% の値を測定します。XPercentileValue プロパティで X の値を設定します。たとえば、XPercentileValue95 に設定すると、xEVM は最後のリセット以降のすべての EVM 測定値の下位 95% の値になります。この構文は、前述のいずれかの出力引数を組み合わせて使用できます。

この構文を使用するには、XPercentileEVMOutputPort プロパティを true に設定します。

[___,numSym] = evm(refSym,rxSym) はまた、第 X 百分位の EVM 測定に使用されるシンボル数を返します。この構文を使用するには、XPercentileEVMOutputPort プロパティおよび SymbolCountOutputPort プロパティを true に設定します。

[___] = evm(rxSym) は、ReferenceConstellation プロパティで指定した基準信号に対する受信信号の EVM を測定します。この構文は、前述のいずれかの出力引数を組み合わせて使用できます。

この構文を使用するには、ReferenceSignalSource プロパティを 'Estimated from reference constellation' に設定し、ReferenceConstellation プロパティを rxSym 入力と同じ長さのベクトルに設定します。

入力引数

すべて展開する

基準信号。スカラー、ベクトル、行列、または 3 次元配列として指定します。この入力を指定すると、オブジェクトは、この入力を基準コンスタレーションとして使用して、rxSym 入力の EVM を測定します。

この入力の次元は、rxSym 入力の次元と一致していなければなりません。オブジェクトは、この入力の各要素を rxSym 入力の対応する要素の基準シンボルとして使用します。

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64
複素数のサポート: あり

受信信号。スカラー、ベクトル、行列または 3 次元配列として指定します。

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64
複素数のサポート: あり

出力引数

すべて展開する

構成された測定間隔での受信信号のパーセンテージ RMS EVM。スカラーとして返されます。

データ型: double

構成された測定間隔での最大パーセンテージ EVM。スカラーとして返されます。

データ型: double

最後のリセット以降の EVM 測定値の下位 X% の値。範囲 [0, 100] のスカラーとして返されます。XPercentileValue プロパティで X の値を設定します。

データ型: double

オブジェクトが xEVM 出力の測定に使用したシンボル数。正の整数として返されます。

データ型: double

オブジェクト関数

オブジェクト関数を使用するには、System object を最初の入力引数として指定します。たとえば、obj という名前の System object のシステム リソースを解放するには、次の構文を使用します。

release(obj)

すべて展開する

stepSystem object のアルゴリズムの実行
releaseリソースを解放し、System object のプロパティ値と入力特性の変更を可能にします。
resetSystem object の内部状態のリセット

すべて折りたたむ

ランダム データ シンボルを生成して 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 測定 System object を解放します。基準コンスタレーションと比較して受信信号の EVM を推定するようにオブジェクトを構成します。

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

受信信号のみを入力として使用して RMS EVM を測定し、2 つの EVM の結果が一致することを確認します。

rmsEVM2 = evm(rxSig);
isequal(rmsEVM1,rmsEVM2)
ans = logical
   1

OFDM 変調器と OFDM 復調器の System object を作成します。

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

OFDM 信号のサブキャリアとシンボルの数を決定します。

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

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

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

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

txSig = ofdmmod(rxSym);
rxSig = awgn(txSig,10,"measured");
refSym = ofdmdemod(rxSig);

サブキャリアに対して EVM 測定値を平均するように EVM 測定 System object を構成します。EVM を測定します。4 つのエントリは、4 つの OFDM シンボルそれぞれに対応します。

evm = comm.EVM(AveragingDimensions=1);
rmsEVM = evm(refSym,rxSym)
rmsEVM = 1×4

   26.4681   25.4270   25.8847   25.6017

OFDM シンボルに対して EVM 測定値を平均するように EVM 測定 System object を構成します。EVM を測定します。21 個のエントリは、21 個のサブキャリアそれぞれに対応します。

evm = comm.EVM(AveragingDimensions=2);
rmsEVM = evm(refSym,rxSym);
disp(rmsEVM')
   25.8258   27.2699   19.9041   24.3970   27.0605   28.8856   32.7832   17.0630   21.2569   25.5982   23.0833   37.3233   31.1625   25.1941   18.2289   31.0715   26.6774   13.0369   19.0392   38.1465   24.4323

EVM を測定し、サブキャリアと OFDM シンボルの両方で全体で平均します。

evm = comm.EVM(AveragingDimensions=[1 2]);
rmsEVM = evm(refSym,rxSym)
rmsEVM = 25.8380

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

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

  • 信号を OFDM 変調する。

  • 位相ノイズを導入する。

  • 時変信号をプロットする。

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

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

tscope = timescope(YLabel="EVM (%)",YLimits=[0 40], ...
    SampleRate=1000,TimeSpanSource="Property",TimeSpan=1.2, ...
    ShowGrid=true);

EVM の時変推定を生成するように EVM 測定 System object を構成します。

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

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

modDims = info(ofdmmod);

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 を測定してプロットします。

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

最大 EVM、90 番目の百分位 EVM、およびシンボル数を出力するように 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 = 34.3113
pctEVM = 15.0200
numSym = 1000

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

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

M = 2;
K = 5;

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

sfLen = 100;
frmLen = K*sfLen;

カスタム測定間隔をフレーム長と同じに指定して、EVM 測定 System object を作成します。

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

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

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

周期リセットを伴う 500 シンボルの測定間隔を指定して、EVM 測定 System object を作成します。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 比 (SNR) の配列を初期化します。

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

Figure contains an axes object. The axes object with xlabel SNR (dB), ylabel EVM (%) contains 2 objects of type stair. These objects represent No reset, Periodic reset.

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

チャネルおよびフィルターの System object を作成します。

M = 16;
refConst = qammod(0:M-1,M);
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 測定 System object を作成し、RMS と最大 EVM を計算します。

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

エラー レート測定 System object を作成して、送信フィルターと受信フィルターによる信号遅延を考慮します。1 つのフィルターの群遅延は FilterSpanInSymbols プロパティの半分と等価です。

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

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

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

  • 16-QAM を適用します。

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

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

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

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

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

誤り統計を計算して、シンボル エラー レートを表示します。

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

歪んだ OFDM 波形の RMS と最大 EVM を測定し、コンスタレーション ダイアグラムを使用して受信シンボルを可視化します。

ランダム データに対して 64-QAM で OFDM 波形を生成します。

M = 64;
nfft = 64;
nSym = 10;
cpLen = 10;
data = randi([0 (M - 1)]',nfft,nSym);
txSym = qammod(data,M,UnitAveragePower=1);
txWaveform = ofdmmod(txSym,nfft,cpLen);

無記憶非線形性 System object を作成し、信号に非線形の歪みを適用します。

gain = 2;
nonlinearity = comm.MemorylessNonlinearity(Method="Rapp model", ... 
    LinearGain=gain);
rxWaveform = nonlinearity(txWaveform);

OFDM 復調を実行して、歪んだシンボルを復元します。

rxSym = ofdmdemod(rxWaveform,nfft,cpLen);

受信信号の OFDM シンボルごとの RMS と最大 EVM を測定します。

refSym = qammod((0:(M - 1))',M,UnitAveragePower=1);
evm = comm.EVM(MaximumEVMOutputPort=1, ...
    ReferenceSignalSource="Estimated from reference constellation", ...
    ReferenceConstellation=refSym, ...
    Normalization="Average constellation power");
[rmsEVM,maxEVM] = evm(rxSym);
disp(rmsEVM')
    8.0933
    7.4962
    7.7542
    7.7335
    7.5719
    7.9262
    7.7042
    8.6034
    8.0817
    7.6852
disp(maxEVM')
   18.8246
   15.6412
   15.9905
   13.0713
   14.0164
   15.5771
   17.0201
   19.4699
   18.2106
   16.7549

受信シンボルをコンスタレーション ダイアグラムで可視化します。

constellation = comm.ConstellationDiagram( ...
    Name="Constellation Diagram of Received Symbols", ...
    ReferenceConstellation=refSym(:));
constellation(rxSym(:))

アルゴリズム

実装では、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 は平均コンスタレーション電力です。

  • Pmax はピーク コンスタレーション電力です。

  • 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 値の下位 X% に該当する EVM 値を提供します。

拡張機能

バージョン履歴

R2012a で導入

参考

オブジェクト

ブロック