メインコンテンツ

パンクチャド畳み込み符号化

この例では、畳み込み符号化器とビタビ復号化器の System object を使用し、パンクチャド畳み込み符号化システムをシミュレートしてビット エラー レート (BER) を計算する方法を示します。ビタビ復号化器の複雑度は符号化率に伴い急激に増大します。パンクチャとは、標準符号化率 1/2 の符号化器と復号化器を使用して高符号化率の符号の符号化と復号化を可能にする手法です。

はじめに

この例では、ランダムなバイナリ信号源、畳み込み符号化器、BPSK 変調器、加法性ホワイト ガウス ノイズ (AWGN) チャネル、およびビタビ復号化器で構成される通信システムをシミュレートする方法を示します。この例では、システムをシミュレートし、BER 曲線を取得し、その曲線を理論上の限界と比較します。

初期化

パンクチャを使用した畳み込み符号化

符号化率が 1/2、拘束長が 7 の comm.ConvolutionalEncoderSystem object™ を作成します。この符号化器は、入力として 1 ビットのシンボルを取り、出力として 2 ビットのシンボルを生成します。3 ビットのメッセージ ワードを入力すると、この符号化器は 6 ビットのコードワード出力を生成します。

convEncoder = comm.ConvolutionalEncoder(poly2trellis(7,[171 133]));

パンクチャ パターンを指定し、パンクチャ パターン ベクトル [1;1;0;1;1;0] を使用して前の符号化率 1/2 の符号から符号化率 3/4 の符号を作成します。このパンクチャ パターン ベクトル内の 1 は位置 1、2、4、および 5 にあるビットが送信されることを示し、ゼロは位置 3 および 6 にあるビットが送信信号からパンクチャ (削除) されることを示します。この場合、3 ビットを入力するごとに、パンクチャド符号によって 6 ビットではなく 4 ビットの出力が生成されます。パンクチャによって、符号化率 3/4 の符号になります。3 ビットの入力は、符号化率 1/2 の畳み込み符号化器によって 6 ビットの出力に変換されるため、パンクチャ パターン ベクトルの長さは 6 の整数倍でなければなりません。

パンクチャ パターンを指定するには、PuncturePatternSource プロパティを Property に設定し、PuncturePattern プロパティを [1;1;0;1;1;0] に設定します。

convEncoder.PuncturePatternSource = 'Property';
convEncoder.PuncturePattern = [1;1;0;1;1;0];

デパンクチャを使用したビタビ復号化

畳み込み符号化器からのパンクチャド符号を復号化するように comm.ViterbiDecoderSystem object を構成します。この例ではビタビ復号化器への非量子化入力を想定するので、InputFormat プロパティを Unquantized に設定します。

vitDecoder = comm.ViterbiDecoder( ...
    poly2trellis(7,[171 133]), ...
    InputFormat='Unquantized');

一般的に畳み込み符号化器とビタビ復号化器に使用するパンクチャ パターン ベクトルは同じでなければなりません。ビタビ復号化器の対応するプロパティを設定します。

  • PuncturePatternSource プロパティを Property に設定します。

  • PuncturePattern プロパティを、畳み込み符号化器と同じパンクチャ パターン ベクトルに設定します。

送信ではパンクチャド ビットが含まれないため、信号にはその値を示す情報が含まれません。その結果、復号化プロセスではそれらの値は無視されます。

vitDecoder.PuncturePatternSource = 'Property';
vitDecoder.PuncturePattern = convEncoder.PuncturePattern;

ビタビ復号化器のトレースバック長を設定します。パンクチャのない符号化率 1/2 の符号の場合、一般的なビタビ復号化器のトレースバック長は 40 です。パンクチャド符号を復号化するには、これより高い値が必要です。これは、パンクチャによって生じたあいまいさを解決するのに十分なデータを復号化器に与えるためです。TracebackDepth プロパティを使用して、トレースバック長を 96 に設定します。トレースバック長の推定の詳細については、トレースバック長の推定値を参照してください。

vitDecoder.TracebackDepth = 96;

エラー レートの計算

comm.ErrorRate計算機 System object を作成して、復号化された出力のビットと元の送信されたビットを比較します。エラー レート計算機オブジェクトの出力は、計算されたビット エラー レート、観測されたエラーの数、および処理されたビットの数を含む 3 要素ベクトルです。ビタビ復号化器は、出力が復号化されたビット ストリームにトレースバック長と等しい遅延を発生します。この遅延を考慮に入れるには、エラー レート計算機の ReceiveDelay プロパティをビタビ復号化器のトレースバック長である 96 に設定します。

errorCalc = comm.ErrorRate(ReceiveDelay=vitDecoder.TracebackDepth);

処理ループ

さまざまなノイズ レベルについて、パンクチャド符号化システムの BER の性能を分析します。

符号化前の Eb/No 比と符号化後の Eb/No 比

一般に、システム パフォーマンスは、チャネル符号化器の入力におけるビットあたりのエネルギーとノイズのパワー スペクトル密度の比 (Eb/No) の値から測定します。この量はシステム エンジニアによって直接制御されます。2 ~ 5 dB の Eb/No 値について、符号化システムの性能を分析します。

EbNoEncoderInput = 2:0.5:5; % in dB

AWGN チャネルへの入力は、変調および符号化された信号です。符号化器の入力におけるノイズ パワー スペクトル密度比を、AWGN チャネルの出力における S/N 比 (SNR) 値に変換します。SNR が符号化器出力のエネルギー比に対応するように、符号化率を 3/4 に指定して Eb/No 値を変換します。この計算では、元の信号電力が符号化プロセスによって変更されないことを前提としています。システムはシンボル レートで実行されるため、SamplesPerSymbol プロパティを 1 に設定します。この例では BPSK 変調を使用しているため、ビットあたりのエネルギーとノイズのパワー スペクトル密度の比 (Eb/No) とシンボルあたりのエネルギーとノイズのパワー スペクトル密度の比 (Es/No) は同じです。

SNR = convertSNR(EbNoEncoderInput,'ebno',CodingRate=3/4,SamplesPerSymbol=1);

シミュレーション

BER 性能の結果を得るには、通信システムを介して 3,000 ビットのフレームを送信します。フレーム長さは 3 の整数倍でなければなりません。

frameLength = 3000;

各 Eb/No 値について、シミュレーションを停止させる誤り数または送信数を設定します。結果の精度を高めるには、目標の誤り数または最大送信回数を引き上げます。

targetErrors = 300;
maxNumTx = 5e6;

シミュレートされた BER の結果を格納するための 3 行 7 列の行列 BERVec を作成します。

BERVec = zeros(3,length(SNR));

2:0.5:5 における各 Eb/No 値の BER を計算し、BERVec に保存します。この処理には数秒かかります。

for n=1:length(SNR)
  reset(errorCalc)
  reset(convEncoder)
  reset(vitDecoder)
  while (BERVec(2,n) < targetErrors) && (BERVec(3,n) < maxNumTx)
    % Generate binary frame
    data = randi([0 1],frameLength,1);
    % Convolutionally encode the data
    encData = convEncoder(data);
    % Modulate the encoded data using M-PSK method
    modData = pskmod(encData,2);
    % Pass the modulated signal through an AWGN channel
    channelOutput = awgn(modData,SNR(n));
    % Pass the real part of the channel complex outputs 
    % as the unquantized input to the Viterbi decoder. 
    decData = vitDecoder(real(channelOutput));
    % Compute and accumulate errors
    BERVec(:,n) = errorCalc(data,decData);
  end
end

シミュレーションの結果と理論上の曲線との比較

[1] に従って、パンクチャド符号のビット エラー確率の境界近似値を使用して、シミュレーション結果を比較します。2:0.5:5 における Eb/No 値の積算の最初の 7 項を使用して、この限界の近似値を計算します。nerr の値は [2] の Table 2 から引用しました。

dist = 5:11;
nerr = [42 201 1492 10469 62935 379644 2253373];
codeRate = 3/4;
bound = ...
    nerr*(1/6)*erfc(sqrt(codeRate*(10.0.^((2:.02:5)/10))'*dist))';

結果をプロットします。曲線近似アルゴリズムが失敗した場合は、目標の誤り数または最大送信回数を引き上げます。

berfit(EbNoEncoderInput,BERVec(1,:)); % Curve-fit results
hold on;
semilogy((2:.02:5),bound,'g'); % Theoretical results
legend('Empirical BER', ...
    'Fit for simulated BER', ...
    'Theoretical bound on BER')
axis([1 6 10^-5 1])

Figure contains an axes object. The axes object with title BER vs. Eb/No with Best Curve Fit, xlabel Eb/No (dB), ylabel BER contains 3 objects of type line. One or more of the lines displays its values using only markers These objects represent Empirical BER, Fit for simulated BER, Theoretical bound on BER.

ビット エラー レートが低い場合、シミュレーションでは境界をわずかに上回るエラー レートが示されることがあります。これは、シミュレーションのばらつきによるもの (観測されたエラーが 500 ビット未満の場合)、または復号化器のトレースバック長が有限であることによるものです。

参考文献

[1] Yasuda, Y., K. Kashiki, and Y. Hirata, "High Rate Punctured Convolutional Codes for Soft Decision Viterbi Decoding," IEEE® Transactions on Communications, Vol. COM-32, March, 1984, pp. 315–319.

[2] Begin, G., Haccoun, D., and Paquin, C., "Further results on High-Rate Punctured Convolutional Codes for Viterbi and Sequential Decoding," IEEE Transactions on Communications, Vol. 38, No. 11, November, 1990, p. 1923.

参考

オブジェクト