Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

AWGN における符号化率 2/3 の畳み込み符号

この例では、リンクのビット誤り率対 Eb/No の曲線を生成します。リンクは AWGN で 16-QAM 変調および符号化率 2/3 の畳み込み符号を使用します。

変調次数を設定し、シンボルあたりのビット数を計算します。

M = 16;
k = log2(M);

符号化率 2/3 の畳み込み符号のトレリスを作成します。トレースバック パラメーターと符号化率パラメーターを設定します。

trellis = poly2trellis([5 4],[23 35 0; 0 5 13]);
traceBack = 16;
codeRate = 2/3;

畳み込み符号化器とそれに対応するビタビ復号化器を作成します。

convEncoder = comm.ConvolutionalEncoder('TrellisStructure',trellis);
vitDecoder = comm.ViterbiDecoder('TrellisStructure',trellis, ...
    'InputFormat','Hard','TracebackDepth',traceBack);

誤り率オブジェクトを作成します。受信機の遅延をトレースバック長の 2 倍に設定します。これは、復号化器による遅延です。

errorRate = comm.ErrorRate('ReceiveDelay',2*traceBack);

シミュレートする Eb/No 値の範囲を設定します。ビット誤り率統計行列を初期化します。

ebnoVec = 0:2:10;
errorStats = zeros(length(ebnoVec),3);

次の手順に従ってリンクをシミュレートします。

  • バイナリ データを生成します。

  • 符号化率 2/3 の畳み込み符号を使用してデータを符号化します。

  • 符号化されたデータ、設定ビット入力、および単位平均パワーを 16-QAM 変調します。

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

  • 受信した信号構成ビット出力と単位平均パワーを 16-QAM 復調します。

  • ビタビ復号化器を使用して、復調した信号を復号化します。

  • 誤り統計を収集します。

for m = 1:length(ebnoVec)
    snr = ebnoVec(m) + 10*log10(k*codeRate);
    while errorStats(m,2) <= 100 && errorStats(m,3) <= 1e7
        dataIn = randi([0 1],10000,1);
        dataEnc = convEncoder(dataIn);
        txSig = qammod(dataEnc,M, ...
            'InputType','bit','UnitAveragePower',true);
        rxSig = awgn(txSig,snr);
        demodSig = qamdemod(rxSig,M, ...
            'OutputType','bit','UnitAveragePower',true);
        dataOut = vitDecoder(demodSig);
        errorStats(m,:) = errorRate(dataIn,dataOut);
    end
    reset(errorRate)
end

前方誤り訂正符号化を行わない場合の理論上の BER 曲線を Eb/No に対し計算します。

berUncoded = berawgn(ebnoVec','qam',M);

シミュレートした符号化データと理論上の符号化していないデータの BER 曲線を Eb/No に対してプロットします。Eb/No 値が高くなると、誤り訂正符号によるパフォーマンス上のメリットが得られます。

semilogy(ebnoVec,[errorStats(:,1) berUncoded])
grid
legend('Coded','Uncoded')
xlabel('Eb/No (dB)')
ylabel('Bit Error Rate')

Figure contains an axes. The axes contains 2 objects of type line. These objects represent Coded, Uncoded.