Main Content

このページは前リリースの情報です。該当の英語のページはこのリリースで削除されています。

AWGN におけるターボ符号の BER 性能の推定

16-QAM を使用するエンド ツー エンド通信リンクを、AWGN チャネルのターボ符号を使用してシミュレートします。ビット誤り率を推定します。

シミュレーションの初期化

変調次数と Eb/No 値の範囲を設定して評価を行います。パケット長を 500 に設定します。

rng(10,'twister');
M = 16; % Modulation order
bps = log2(M); % Bits per symbol
EbNo = (2:0.5:4);
pktLen = 500;

ビット誤り率のベクトルを初期化します。

ber = zeros(size(EbNo));

ターボ符号化器と復号化器の System object を作成し、インターリーバー インデックスを入力引数として指定します。

turboEnc = comm.TurboEncoder('InterleaverIndicesSource','Input port');

turboDec = comm.TurboDecoder('InterleaverIndicesSource','Input port', ...
    'NumIterations',4);

AWGN チャネル System object と誤り率カウンター System object を作成します。

awgnChannel = comm.AWGNChannel('NoiseMethod','Variance','Variance',1);
errorRate = comm.ErrorRate;

パケット長とターボ符号化器の設定を使用して実際の送信ビット レートを決定します。ターボ符号化オブジェクトは、構成畳み込み符号にレート 1/2 のトレリスを使用するように初期化され、その結果、ターボ符号化器の出力は (組織ストリームに加えて) 2 パリティ ビット ストリームおよび入力パケットの 12 テール ビットになります。この 12 テール ビットは、拘束長が構成符号化器あたり 4 に指定されていることによるもので、合計 4 ストリーム (S1 P1 S2 P2) についてストリームあたり 3 ビットが出力されます。

    rate = pktLen/(3*pktLen+4*3);

主処理ループ

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

  • ランダムなバイナリ データを生成する

  • ランダムなインターリーバー インデックスを生成する

  • データをターボ符号化する

  • 16-QAM 変調を適用する

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

  • LLR アルゴリズムを使用してノイズの多い信号を復調する

  • データをターボ復号化する

  • 誤り統計を計算する

 for k = 1:length(EbNo)

誤り統計ベクトル、S/N 比、およびノイズ分散を初期化します。AWGN チャネル System object のノイズ分散値を更新します。

    errorStats = zeros(1,3);
    EsNo = EbNo(k) + 10*log10(bps);       
    snrdB = EsNo + 10*log10(rate); % in dB
    noiseVar = 1./(10.^(snrdB/10));  
    awgnChannel.Variance = noiseVar;

    while errorStats(2) < 100 && errorStats(3) < 1e7
        % Generate random binary data
        data = randi([0 1],pktLen,1);
        % Interleaver indices
        intrlvrInd = randperm(pktLen);
        % Turbo encode the data
        encodedData = turboEnc(data,intrlvrInd);
        % Modulate the encoded data
        modSignal = qammod(encodedData,M,'InputType','bit','UnitAveragePower',true);
        % Pass the signal through the AWGN channel
        rxSignal = awgnChannel(modSignal);
        % Demodulate the received signal
        demodSignal = qamdemod(rxSignal,M,'UnitAveragePower',true,'OutputType','llr','NoiseVariance',noiseVar);
        % Turbo decode the demodulated signal. Because the bit mapping from the
        % demodulator is opposite that expected by the turbo decoder, the
        % decoder input must use the inverse of demodulated signal.
        rxBits = turboDec(-demodSignal,intrlvrInd);
        % Calculate the error statistics
        errorStats = errorRate(data,rxBits);
    end
    % Save the BER data and reset the bit error rate object
     ber(k) = errorStats(1);
     reset(errorRate)
end

ビット誤り率をプロットし、符号化されていないビット誤り率と比較します。

semilogy(EbNo,ber,'-o')
grid
xlabel('Eb/No (dB)')
ylabel('Bit Error Rate')
uncodedBER = berawgn(EbNo,'qam',M); % Estimate of uncoded BER
hold on
semilogy(EbNo,uncodedBER)
legend('Turbo','Uncoded','location','sw')

参考

|