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

testconsole.Results

(削除予定) テスト コンソールのシミュレーションからの結果の取得

互換性

testconsole.Results は将来のリリースで削除される予定です。代わりに comm.ErrorRate または bertool を使用してください。詳細については、互換性の考慮事項を参照してください。

説明

誤り率テスト コンソールの getResults メソッドは、シミュレーションの結果データを含む testconsole.Results オブジェクトのインスタンスを返します。結果オブジェクトのメソッドは、シミュレーションの結果データを取得したり、プロットするために使用します。

プロパティ

testconsole.Results オブジェクトには、次の表に示したプロパティがあります。明示されていない限り、どのプロパティも書き換え可能です。

プロパティ説明
TestConsoleName誤り率テスト コンソール。このプロパティは書き換え可能ではありません。
System Under Test Name誤り率テスト コンソールで結果を取得したテスト対象のシステムの名前。このプロパティは書き換え可能ではありません。
IterationMode誤り率テスト コンソールで結果の取得に使用した反復モード。このプロパティは書き換え可能ではありません。
TestPoint結果オブジェクトが結果を解析する登録済みテスト ポイントの名前を指定します。結果オブジェクトの getData、plot、および semilogy メソッドは、データを返すか、TestPoint プロパティにより指定されているテスト ポイントのプロットを作成します。
Metric結果オブジェクトが結果を解析するテスト判定基準の名前を指定します。結果オブジェクトの getData、plot、および semilogy メソッドは、データを返すか、Metric プロパティにより指定されているテスト判定基準のプロットを作成します。
TestParameter1結果オブジェクトが結果を解析する最初の独立変数の名前を指定します。
TestParameter2結果オブジェクトが結果を解析する 2 番目の独立変数の名前を指定します。

メソッド

testconsole.Results オブジェクトには、以下のメソッドがあります。

getData

d = getData(r) は結果オブジェクト r で利用できる結果データ行列 d を返します。返される結果は r の TestPoint プロパティに現在指定されているテスト ポイント、および r の Metric プロパティに現在指定されているテスト判定基準に対応します。

IterationMode が [Combinatorial] の場合、d は TestParameter1 および TestParameter2 プロパティで指定されているテスト パラメーターで利用できるすべてのスイープ値の結果を含む行列です。行列の行は、TestParameter1 で利用できるすべてのスイープ値の結果に対応します。行列の列は、TestParameter2 で利用できるすべてのスイープ値の結果に対応します。誤り率テスト コンソールに 3 つ以上のテスト パラメーターが登録されている場合、d は TestParameter1 または TestParameter2 ではないすべてのパラメーターのスイープ ベクトル内の最初の値に対応する結果を含みます。

IterationMode が [Indexed] の場合、d は、誤り率テスト コンソールに登録されているすべてのテスト パラメーター値のインデックス付けされた各組み合わせに対応する結果のベクトルです。

plot

plot(r) は結果オブジェクト r で利用できる結果のプロットを作成します。プロットは r の TestPoint および Metric プロパティで指定されているテスト ポイントおよびテスト判定基準に対応します。

IterationMode が [Combinatorial] の場合、プロットには複数の曲線が含まれます。TestParameter1 のスイープ値が x 軸を制御し、TestParameter2 のスイープ値の数がプロットに含まれる曲線の数を指定します。誤り率テスト コンソールに 3 つ以上のテスト パラメーターが登録されている場合、曲線は TestParameter1 または TestParameter2 ではないすべてのパラメーターのスイープ ベクトル内の最初の値で取得した結果に対応します。

[IterationMode] が [Indexed] の場合、プロットはありません。

semilogy

semilogy(...)plot(...) と基本的に同じですが、Y 軸が対数 (基数 10) スケールを使用する点が異なります。

surf

surf(r) は、results オブジェクト r で利用できる結果の 3 次元プロット、カラー プロット、表面プロットを作成します。表面プロットは、次のアイテムに対応します。

  • results オブジェクトの TestPoint プロパティに指定されているテスト ポイント

  • results オブジェクトの Metric プロパティに現在指定されているテスト判定基準

results オブジェクトのパラメーターと値のペアを指定すると、表面プロットに追加プロパティを設定できます。

IterationMode として Combinatorial を選択すると、TestParameter1 プロパティに指定したテスト パラメーターで利用できるスイープ値が表面プロットの x 軸を制御します。TestParameter2 プロパティに指定したテスト パラメーターで利用できるスイープ値が y 軸を制御します。

テスト コンソールに 3 つ以上のテスト パラメーターが登録されている場合、表面プロットは、以前に結果オブジェクトの setParsingValues メソッドに指定されたパラメーターのスイープ値で取得した結果に対応します。

現在の解析値を表示するには、結果オブジェクトの getParsingValues メソッドを呼び出します。既定の解析値は、各テスト パラメーターのスイープ ベクトル内の最初の値です。既定の設定では、surf メソッドは現在 [TestParameter1] または [TestParameter2] として設定されているパラメーターの解析値を無視します。

[IterationMode] が [Indexed] に設定されている場合、2 つ未満の登録済みテスト パラメーターが存在するか、[TestParameter2] が [None] に設定されていると、表面プロットを表示できません。

setParsingValues

setParsingValues(R,'ParameterName1', 'Value1', ... 'ParameterName2', 'Value2', ...) は、パラメーターと値のペアを使用して指定する値に対して解析値を設定します。パラメーター名の入力は、登録されているテスト パラメーターの名前に対応しなければなりません。また値の入力は有効なテスト パラメーターのスイープ値に対応しなければなりません。

このメソッドは、[TestParameter1] および [TestParameter2] の値とは異なるテスト パラメーターに 1 つのスイープ値を指定するために使用します。このメソッドを定義すると、results オブジェクトは setParsingValues メソッドに設定したスイープ値に対応するデータ値またはプロットを返します。既定の解析値は、各テスト パラメーターのスイープ ベクトル内の最初の値です。

現在の解析値を表示するには、結果オブジェクトの getParsingValues メソッドを呼び出します。[TestParameter1] および [TestParameter2] のパラメーターに解析値を設定できますが、データの取得時またはプロットの出力時に結果オブジェクトによりこれらの値が無視されます。

IterationMode が [Indexed] に設定されている場合、解析値は効力をもちません。

getParsingValues

getParsingValues は誤り率テスト コンソールの現在の解析値を表示します。

s = getParsingValues(r) は、フィールド名が登録されているテスト パラメーター名と同じで、値が現在の解析値と対応する構造体 s を返します。

[IterationMode] が [Indexed] に設定されている場合、解析値は効力をもちません。

すべて折りたたむ

commtest.ErrorRate および testconsole.Results オブジェクト パッケージは将来のリリースで削除される予定です。これらは、パラメーター スイープを実行して通信システムの性能を分析するために使用できます。この例では、これらを使用するワークフローと推奨される代替ワークフローを示します。

commtest.ErrorRate を使用した複数パラメーター スイープと並列実行

さまざまな変調次数と EbNo 値に対して M-PSK システムのビット誤り率とシンボル誤り率を取得します。テスト対象システムは commtest.MPSKSystem です。

% Create an M-ary PSK system
systemUnderTest = commtest.MPSKSystem;

% Instantiate an Error Rate Test Console and attach the system
errorRateTester = commtest.ErrorRate(systemUnderTest);
Warning: commtest.ErrorRate will be removed in the future. Use comm.ErrorRate or bertool instead. See <a href="matlab:helpview(fullfile(docroot, 'toolbox', 'comm', 'comm.map'), 'REMOVE_commtest_errorrate')">R2019b Communications Toolbox Release Notes</a> for more information.
errorRateTester.SimulationLimitOption = 'Number of errors or transmissions';
errorRateTester.MaxNumTransmissions = 1e5;

% Set sweep values for simulation test parameters
setTestParameterSweepValues(errorRateTester,'M',2.^[1 2 3 4],'EbNo',(-5:10))

% Register a test point
registerTestPoint(errorRateTester,'MPSK_BER','TxInputBits','RxOutputBits')

% Get information about the simulation settings
info(errorRateTester)
Test console name:           commtest.ErrorRate
System under test name:      commtest.MPSKSystem
Available test inputs:       NumTransmissions, RandomIntegerSource
Registered test inputs:      NumTransmissions
Registered test parameters:  EbNo, M
Registered test probes:      RxOutputBits, RxOutputSymbols, TxInputBits, TxInputSymbols
Registered test points:      MPSK_BER
Metric calculator functions: @commtest.ErrorRate.defaultErrorCalculator
Test metrics:                ErrorCount, TransmissionCount, ErrorRate
% Run the M-PSK simulations
run(errorRateTester)
Starting parallel pool (parpool) using the 'local' profile ...
Connected to the parallel pool (number of workers: 12).
12 workers available for parallel computing. Simulations will be distributed among these workers. 
Running simulations...
% Get the results
mpskResults = getResults(errorRateTester);
Warning: testconsole.Results will be removed in the future. See <a href="matlab:helpview(fullfile(docroot, 'toolbox', 'comm', 'comm.map'), 'REMOVE_commtest_errorrate')">R2019b Communications Toolbox Release Notes</a> for more information.
% Get a semi-log scale plot of EbNo versus bit error rate for
% different values of modulation order M
mpskResults.TestParameter2 = 'M';
semilogy(mpskResults,'*-')

入れ子にされた for ループと comm.ErrorRate を使用した複数パラメーター スイープと並列実行

M=2.^(1:4) および EbNo=-5:10 で誤り率シミュレーションを実行します。comm.ErrorRate を使用して、ビット誤り率 (BER) とシンボル誤り率 (SER) の両方のデータを収集します。シミュレーションを実行し、最小 100 個のシンボル誤りまたは最大 1e5 個のシンボルを収集します。

% Set the M sweep values same as the commtest.ErrorRate object
getTestParameterSweepValues(errorRateTester,'M')
ans = 1×4

     2     4     8    16

MSweep = 2.^[1 2 3 4];
% Set EbNo sweep values same as the commtest.ErrorRate object
getTestParameterSweepValues(errorRateTester,'EbNo')
ans = 1×16

    -5    -4    -3    -2    -1     0     1     2     3     4     5     6     7     8     9    10

EbNoSweep = -5:10;
% Set minumum number of errors same as the commtest.ErrorRate object
errorRateTester.MinNumErrors
ans = 100
minNumErrors = 100;
% Set maximum number of transmissions same as the commtest.ErrorRate
% object. In this example a transmission is a symbol.
errorRateTester.MaxNumTransmissions
ans = 100000
MaxNumTransmissions = 1e5;
% Set frame length same as the commtest.ErrorRate object
errorRateTester.FrameLength
ans = 500
frameLength = 500;
% Find out if there is a parallel pool and how many workers are available
[licensePCT,~] = license('checkout','distrib_computing_toolbox');
if (licensePCT && ~isempty(ver('parallel')))
    p = gcp;
    if isempty(p)
        numWorkers = 1;
    else
        numWorkers = p.NumWorkers
    end
else
    numWorkers = 1;
end
numWorkers = 12
minNumErrorsPerWorker = minNumErrors/numWorkers;
maxNumSymbolsPerWorker = MaxNumTransmissions/numWorkers;

% Store results in an array, where first dimension is M and second
% dimension is EbNo. Initialize the vector with NaN values.
ser = nan(length(MSweep),length(EbNoSweep));
ber = nan(length(MSweep),length(EbNoSweep));

% First sweep is over M (modulation order)
for MIdx = 1:length(MSweep)
    M = MSweep(MIdx);
    bitsPerSymbol = log2(M);
    
    % Second sweep is over EbNo
    for EbNoIdx = 1:length(EbNoSweep)
        EbNo = EbNoSweep(EbNoIdx);
        
        SNR = EbNo+10*log10(bitsPerSymbol);
        
        numSymbolErrors = zeros(numWorkers,1);
        numBitErrors = zeros(numWorkers,1);
        numSymbols = zeros(numWorkers,1);
        
        parfor worker = 1:numWorkers
            symErrRate = comm.ErrorRate;
            bitErrRate = comm.ErrorRate;
            
            while (numSymbolErrors(worker) < minNumErrorsPerWorker) ...
                    || (numSymbols(worker) < maxNumSymbolsPerWorker)
                % Generate frameLength source outputs
                txMsg = randi([0 M-1],frameLength,1);
                
                % Modulate the data
                txOutput = pskmod(txMsg,M,0,'gray');
                % Pass data through an AWGN channel with current SNR value
                chnlOutput  = awgn(txOutput,SNR,'measured',[],'dB');
                % Demodulate the data
                rxOutput = pskdemod(chnlOutput,M,0,'gray');
                
                % Calculate number of symbol errors
                symErrVal = symErrRate(txMsg,rxOutput);
                numSymbolErrors(worker) = symErrVal(2);
                numSymbols(worker) = symErrVal(3);
                
                % Convert symbol streams to bit streams
                bTx = de2bi(txMsg,bitsPerSymbol,'left-msb')';
                bTx = bTx(:);
                bRx = de2bi(rxOutput,bitsPerSymbol,'left-msb')';
                bRx = bRx(:);
                
                % Calculate number of bit errors
                bitErrVal = bitErrRate(bTx,bRx);
                numBitErrors(worker) = bitErrVal(2);
            end
        end
        
        ber(MIdx,EbNoIdx) = sum(numBitErrors)/(sum(numSymbols)*bitsPerSymbol);
        ser(MIdx,EbNoIdx) = sum(numSymbolErrors)/sum(numSymbols);
    end
end
% Plot results
semilogy(EbNoSweep,ber,'*-')
grid on
title('MPSK BER')
xlabel('Eb/No')
ylabel('BER')
legendText = cell(length(MSweep),1);
for p=1:length(MSweep)
    legendText{p} = sprintf('M: %d',MSweep(p));
end
legend(legendText)

BERTool を使用した複数変数のスイープ

BERTool は、S/N 比の関数として BER を計算します。これは、MATLAB® 関数および Simulink® モデルのモンテカルロ シミュレーション、または選択されたタイプの通信システムに対応する閉形式の理論式のいずれかにより性能解析を行います。関数 bertoolBERTool を開きます。ここで、BERTool を設定して、以下に含まれる関数 mpsksim で定義されたシミュレーションを呼び出します。

function [ber,numBits] = mpsksim(EbNo,minNumErrs,maxNumBits)
% Import the Java class for BERTool, so that you will be able to stop the simulation using the "Stop" button on the BERTool.
import com.mathworks.toolbox.comm.BERTool;

frameLength = 500;

M = 16; % Can be 2, 4, 8, 16
bitsPerSymbol = log2(M);

maxNumSymbols = maxNumBits/bitsPerSymbol;

SNR = EbNo + 10*log10(bitsPerSymbol);

% Initialize variables related to exit criteria.
numBitErrors = 0;
numSymbols = 0;

while (numBitErrors < minNumErrs) || (numSymbols < maxNumSymbols)
  
  % Check if the user clicked the Stop button of BERTool.
  if (BERTool.getSimulationStop)
    break;
  end
  
  % Generate frameLength source outputs
  txMsg = randi([0 M-1],frameLength,1);
  numSymbols = numSymbols+frameLength;
  
  % Modulate the data
  txOutput = pskmod(txMsg,M,0,'gray');
  % Pass data through an AWGN channel with current SNR value
  chnlOutput  = awgn(txOutput,SNR,'measured',[],'dB');
  % Demodulate the data
  rxOutput = pskdemod(chnlOutput,M,0,'gray');
  
  % Convert symbol streams to bit streams
  bTx = de2bi(txMsg,bitsPerSymbol,'left-msb')';
  bTx = bTx(:);
  bRx = de2bi(rxOutput,bitsPerSymbol,'left-msb')';
  bRx = bRx(:);
  
  % Calculate number of bit errors
  numBitErrors = numBitErrors+sum(bTx~=bRx);
end

% Assign values to the output variables.
numBits = numSymbols*bitsPerSymbol;
ber = numBitErrors/numBits;

次のように BERTool を設定します。

関数 mpsksim で M=2 に設定し、[Run] をクリックします。[BER Data Set] 名を 'M=2' に設定します。

M=2 の BER 曲線を表示します。

関数 mpsksimM の値を M = 4816 に更新して、このプロセスを繰り返します。[Bit Error Rate Analysis Tool] ウィンドウと BER の図に以下のような結果が表示されます。

BERTool を使用した並列 SNR スイープ

シミュレーションに使用する関数を以下に含まれる関数 mpsksim_parfor と同じように設定することにより、parfor を使用して、各シミュレーション ポイントを並列実行します。parforBERTool の Java クラスと一緒に使用できないため、[Stop] ボタンを使用してシミュレーションを停止することはできません。

function [ber,numBits] = mpsksim_parfor(EbNo,minNumErrs,maxNumBits)

% Find out if there is a parallel pool and how many workers are available
if license('test','Distrib_Computing_Toolbox')
  p = gcp;
  if isempty(p)
    numWorkers = 1;
  else
    numWorkers = p.NumWorkers;
  end
else
  numWorkers = 1;
end

M = 2;
bitsPerSymbol = log2(M);

maxNumSymbols = maxNumBits/bitsPerSymbol;

minNumErrorsPerWorker = minNumErrs/numWorkers;
maxNumSymbolsPerWorker = maxNumSymbols/numWorkers;
frameLength = 500;

SNR = EbNo + 10*log10(bitsPerSymbol);

% Initialize variables related to exit criteria.
numBitErrors = zeros(numWorkers,1);
numSymbols = zeros(numWorkers,1);

parfor worker = 1:numWorkers
  while (numBitErrors(worker) < minNumErrorsPerWorker) ...
      || (numSymbols(worker) < maxNumSymbolsPerWorker)
    
    % Generate frameLength source outputs
    txMsg = randi([0 M-1],frameLength,1);
    numSymbols(worker) = numSymbols(worker)+frameLength;
    
    % Modulate the data
    txOutput = pskmod(txMsg, M, 0, 'gray');
    % Pass data through an AWGN channel with current SNR value
    chnlOutput  = awgn(txOutput,SNR,'measured',[],'dB');
    % Demodulate the data
    rxOutput = pskdemod(chnlOutput,M,0,'gray');
    
    % Convert symbol streams to bit streams
    bTx = de2bi(txMsg,bitsPerSymbol,'left-msb')';
    bTx = bTx(:);
    bRx = de2bi(rxOutput,bitsPerSymbol,'left-msb')';
    bRx = bRx(:);
    
    % Calculate number of bit errors
    numBitErrors(worker) = numBitErrors(worker)+sum(bTx~=bRx);
  end
end

% Assign values to the output variables.
ber = sum(numBitErrors)/sum(numSymbols);
numBits = sum(numSymbols)*bitsPerSymbol;

互換性の考慮事項

すべて展開する

R2019b での開始で警告

参考

オブジェクト

関数

R2009b で導入