Main Content

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

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

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

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

M = 16;
k = log2(M);

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

trellis = poly2trellis([5 4],[23 35 0; 0 5 13]);
traceBack = 28;
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/N0 値の範囲を設定し、等価の SNR 値を計算します。ビット エラー レート統計行列を初期化します。

ebnoVec = 0:2:10;
snr = convertSNR(ebnoVec,"ebno","snr", ...
    BitsPerSymbol=k, ...
    CodingRate=codeRate);
errorStats = zeros(length(ebnoVec),3);

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

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

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

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

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

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

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

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

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

関数berawgnを使用して、前方誤り訂正符号化を行わない場合の理論上の BER 曲線を計算します。

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

関数bercodingと符号化率 2/3 の畳み込み符号の距離スペクトルを使用して、前方誤り訂正符号化を使用した場合の理論上の BER 曲線を計算します。関数distspecは、畳み込み符号の距離スペクトルを計算し、距離スペクトル構造体を出力します。

spect = distspec(trellis,4)
spect = struct with fields:
     dfree: 5
    weight: [1 6 28 142]
     event: [1 2 8 25]

berCoded_emp = bercoding(ebnoVec', ...
    'conv','hard',codeRate,spect,'qam',M);

シミュレートした符号化データ、および理論上の符号化していないデータと符号化データの BER 曲線を Eb/N0 に対してプロットします。Eb/N0 値が高くなると、誤り訂正符号によるパフォーマンス上のメリットが得られます。シミュレートされた符号化エラー レートの結果は、理論上の符号化結果と良好な相関関係を示しています。

semilogy(ebnoVec,errorStats(:,1),'b*', ...
    ebnoVec,berUncoded_emp,'c-', ...
    ebnoVec,berCoded_emp,'r')
grid
legend('Coded simulated','Uncoded theoretical','Coded theoretical', ...
     'Location','southwest')
title('16-QAM With and Without Forward Error Correction')
xlabel('Eb/N0 (dB)')
ylabel('Bit Error Rate')

Figure contains an axes object. The axes object with title 16-QAM With and Without Forward Error Correction, xlabel Eb/N0 (dB), ylabel Bit Error Rate contains 3 objects of type line. One or more of the lines displays its values using only markers These objects represent Coded simulated, Uncoded theoretical, Coded theoretical.