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

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

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

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

変調次数と Eb/No 値の範囲を設定して評価を行います。フレーム長を 500 に設定します。

rng(10,'twister');
M = 16;
bps = log2(M); % bits per symbol
EbNo = (2:0.5:4);
frmLen = 500;

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

ber = zeros(size(EbNo));

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

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

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

QAM 変調器と復調器のペアを作成し、復調器が対数尤度比法を使用して判定される軟ビットを出力するようにします。変調器および復調器オブジェクトは、平均強度 1 W を使用するように正規化されます。

qamModulator = comm.RectangularQAMModulator('ModulationOrder',M, ...
    'BitInput',true, ...
    'NormalizationMethod','Average power');

qamDemodulator = comm.RectangularQAMDemodulator('ModulationOrder',M, ...
    'BitOutput',true, ...
    'NormalizationMethod','Average power', ...
    'DecisionMethod','Log-likelihood ratio', ...
    'VarianceSource','Input port');

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

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

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

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

主処理ループ

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

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

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

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

  • 16-QAM 変調を適用する

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

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

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

  • 誤り統計を計算する

for k = 1:length(EbNo)
    
    % Initialize error statistics vector, signal-to-noise ratio, and noise variance
    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],frmLen,1);

        % Interleaver indices
        intrlvrInd = randperm(frmLen);

        % Turbo encode the data
        encodedData = turboEnc(data,intrlvrInd);

        % Modulate the encoded data
        modSignal = qamModulator(encodedData);

        % Pass the signal through the AWGN channel
        receivedSignal = awgnChannel(modSignal);

        % Demodulate the received signal
        demodSignal = qamDemodulator(receivedSignal,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.
        receivedBits = turboDec(-demodSignal,intrlvrInd);

        % Calculate the error statistics
        errorStats = errorRate(data,receivedBits);
    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')

参考

|