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

biterr

ビット誤り数とビット誤り率 (BER) の計算

構文

[number,ratio] = biterr(x,y)
[number,ratio] = biterr(x,y,k)
[number,ratio] = biterr(x,y,k,flg)
[number,ratio,individual] = biterr(...)

説明

すべての構文に対して

関数 biterr は、x の要素の符号なしバイナリ表現を、y の要素の符号なしバイナリ表現と比較します。次の図は、xy の形状によって biterr が比較する要素が決まる様子を示したものです。

xy の各要素は、非負の 10 進数整数でなければなりません。biterr は各要素を固有の符号なしバイナリ表現に変換します。number は、異なるビット数を示すスカラーまたはベクトルです。ratio は、number"ビット総数" で除算した値です。ビット総数、number のサイズ、および biterr が比較する要素は、xy の次元と、オプション パラメーターによって決定されます。

特定の構文に対して

[number,ratio] = biterr(x,y) は、xy の要素を比較します。xy のすべての要素のうち最大の要素が、最も簡単なバイナリ表現で k ビットである場合は、ビット総数は、"小さい" 方の入力のエントリ数を k 倍した値です。xy のサイズにより、比較する要素が決定されます。

  • xy が同じ次元の行列である場合、biterrxy を要素ごとに比較します。number はスカラーです。前の図の (a) を参照してください。

  • 一方が行 (個々の列) ベクトルで、もう一方が 2 次元行列の場合、biterr はベクトルを要素ごとに、行列の "各行 (個々の列)" と比較します。ベクトルの長さは、行列の列 (個々の行) の数に等しくなければなりません。number は列 (個々の行) ベクトルであり、その m 番目のエントリは、ベクトルと行列の m 番目の行 (個々の列) を比較するとき異なるビット数を示します。図の (b) と (c) を参照してください。

[number,ratio] = biterr(x,y,k) は、最初の構文と基本的に同じですが、k ビットをもつために xy の各エントリを考慮する点が異なります。ビット総数は、xy のうち小さい方のエントリ数を k 倍した値です。x または y の要素のバイナリ表現に k 桁を超える桁数が必要な場合は、エラーが発生します。

[number,ratio] = biterr(x,y,k,flg) は、これまでの構文と基本的に同じですが、biterr が比較する要素と、biterr が出力を計算する方法を指定する既定の設定を flg がオーバーライドできる点が異なります。flg の取り得る値は、'row-wise''column-wise'、および 'overall' です。次の表では、さまざまな入力の組み合わせからの結果の違いを説明しています。通常どおり、ratio は、number をビット総数で除算した値です。k を入力引数として指定しない場合は、xy のすべての要素のうち、最大要素の最も簡単なバイナリ表現のビット数として内部的に定義されます。

2 次元行列 x と他の入力 y との比較

y の形状flg比較のタイプビット総数
2 次元行列'overall' (既定の設定)要素ごとビット誤り総数y のエントリ数の k
'row-wise'x の m 番目の行と y の m 番目の行を比較エントリが各行のビット誤り数である列ベクトルy のエントリ数の k
'column-wise'x の m 番目の列と y の m 番目の列を比較エントリが各列のビット誤り数である行ベクトルy のエントリ数の k
行ベクトル'overall'yx の各行を比較ビット誤り総数x のエントリ数の k
'row-wise' (既定の設定)yx の各行を比較エントリが x の各行のビット誤り数である列ベクトルy のサイズの k
列ベクトル'overall'yx の各列を比較ビット誤り総数x のエントリ数の k
'column-wise' (既定の設定)yx の各列を比較エントリが x の各列のビット誤り数である行ベクトルy のサイズの k

[number,ratio,individual] = biterr(...) は、行列 individual を返します。この次元は、xy のうち大きい方の次元です。individual の各エントリは、xy の 1 組の要素間の比較に対応し、組内の要素が異なるビット数を指定します。

すべて折りたたむ

2 つのバイナリ行列を作成します。

x = [0 0; 0 0; 0 0; 0 0]
x = 4×2

     0     0
     0     0
     0     0
     0     0

y = [0 0; 0 0; 0 0; 1 1]
y = 4×2

     0     0
     0     0
     0     0
     1     1

ビット誤り数を求めます。

numerrs = biterr(x,y)
numerrs = 2

列方向に計算して誤り数を求めます。

numerrs = biterr(x,y,[],'column-wise')
numerrs = 1×2

     1     1

行方向の誤り数を計算します。

numerrs = biterr(x,y,[],'row-wise')
numerrs = 4×1

     0
     0
     0
     2

全体の誤り数を計算します。この動作は既定と同じです。

numerrs = biterr(x,y,[],'overall')
numerrs = 2

ノイズの多い 64-QAM 信号を復調し、Eb/No 値の範囲のビット誤り率 (BER) を推定します。BER の推定値を理論上の値と比較します。

シミュレーション パラメーターを設定します。

M = 64;                 % Modulation order
k = log2(M);            % Bits per symbol
EbNoVec = (5:15)';      % Eb/No values (dB)
numSymPerFrame = 100;   % Number of QAM symbols per frame

結果のベクトルを初期化します。

berEst = zeros(size(EbNoVec));

メインの処理ループは次のステップを実行します。

  • バイナリ データを静止して 64 値シンボルに変換する

  • データ シンボルを QAM 変調する

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

  • 受信信号を復調する

  • 復調したシンボルをバイナリ データに変換する

  • ビット誤り数を計算する

while ループは、誤りが 200 個検出されるか、1e7 ビットが転送されるまで継続します。

for n = 1:length(EbNoVec)
    % Convert Eb/No to SNR
    snrdB = EbNoVec(n) + 10*log10(k);
    % Reset the error and bit counters
    numErrs = 0;
    numBits = 0;
    
    while numErrs < 200 && numBits < 1e7
        % Generate binary data and convert to symbols
        dataIn = randi([0 1],numSymPerFrame,k);
        dataSym = bi2de(dataIn);
        
        % QAM modulate using 'Gray' symbol mapping
        txSig = qammod(dataSym,M);
        
        % Pass through AWGN channel
        rxSig = awgn(txSig,snrdB,'measured');
        
        % Demodulate the noisy signal
        rxSym = qamdemod(rxSig,M);
        % Convert received symbols to bits
        dataOut = de2bi(rxSym,k);
        
        % Calculate the number of bit errors
        nErrors = biterr(dataIn,dataOut);
        
        % Increment the error and bit counters
        numErrs = numErrs + nErrors;
        numBits = numBits + numSymPerFrame*k;
    end
    
    % Estimate the BER
    berEst(n) = numErrs/numBits;
end

berawgn を使用して理論上の BER を判断します。

berTheory = berawgn(EbNoVec,'qam',M);

BER データの推定値と理論値をプロットします。推定された BER データ点は理論上の曲線とよく一致しています。

semilogy(EbNoVec,berEst,'*')
hold on
semilogy(EbNoVec,berTheory)
grid
legend('Estimated BER','Theoretical BER')
xlabel('Eb/No (dB)')
ylabel('Bit Error Rate')

R2006a より前に導入