Main Content

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

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

この例では、畳み込み符号化器とビタビ復号化器 System object を使用して、パンクチャド符号化システムをシミュレートする方法を示します。ビタビ復号化器の複雑度は符号化率に伴い急激に増大します。パンクチャとは、標準符号化率 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 ビットごとに 4 ビットの出力を生成するようになります (パンクチャする前は、6 ビットの出力が生成されていました)。これにより、符号化率 3/4 の符号になります。実行する例では、パンクチャ パターン ベクトルの長さは 6 の整数倍でなければなりません。これは、3 ビットの入力が符号化率 1/2 の畳み込み符号化器により 6 ビットの出力に変換されるからです。

畳み込み符号化器 System object hConvEnc で必要なパンクチャ パターンを設定するには、PuncturePatternSource プロパティを Property に、PuncturePattern プロパティを [1;1;0;1;1;0] に設定します。

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

変調器とチャネル

変調次数変数 M を 2 に初期化し、符号化されたデータをチャネル経由で 2 相位相偏移変調を使用して送信します。

M = 2;

comm.AWGNChannelSystem object を作成します。チャネルの NoiseMethod プロパティを Signal to noise ratio (Eb/No) に設定して、ノイズ パワー スペクトル密度に対するビットあたりのエネルギーの比率 (Eb/No) を使用してノイズ レベルを指定します。シミュレーション実行時は、さまざまな値の Eb/No 比について、チャネル オブジェクトの EbNo プロパティを変更して符号化のシステムをテストします。BPSK 変調器の出力は単位電力信号を生成します。したがって、SignalPower プロパティを 1 ワットに設定します。使用するシステムはシンボル レートであるため、SamplesPerSymbol プロパティを 1 に設定します。

channel = comm.AWGNChannel( ...
    NoiseMethod='Signal to noise ratio (Eb/No)', ...
    SignalPower=1, ...
    SamplesPerSymbol=1);

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

畳み込み符号化器用に指定されたパンクチャド符号を復号化するよう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 に近い値に設定します。パンクチャド符号を復号化するには、これより高い値が必要です。これは、これらのパンクチャがもたらすあいまいさを解決するのに十分なデータを復号化器に与えるためです。この例では、トレースバック長に 96 を使用します。この値は、TraceBackDepth プロパティを使用して設定します。

vitDecoder.TracebackDepth = 96;

エラー レートの計算

comm.ErrorRate計算機 System object を作成して、復号化されたビットと元の送信されたビットを比較します。エラー レート計算機オブジェクトの出力は、計算されたビット エラー レート (BER)、観測されたエラー数、および処理されたビットの数を含む 3 要素ベクトルです。ビタビ復号化器は、出力が復号化されたビット ストリームにトレースバック長と等しい遅延を発生します。この遅延を考慮に入れるには、エラー レート計算機 System object の 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 チャネルに入力される信号は符号化された信号です。符号化器出力でのエネルギー比に対応するように Eb/No 値を変換します。符号化器に 3 ビットを入力して 4 ビットの出力を得る場合、エネルギー関係は次のように 3/4 の比率で与えられます。

EbNoEncoderOutput = EbNoEncoderInput + 10*log10(3/4);

シミュレーション ループ

BER 性能の結果を得るには、通信システムを介して 3,000 ビットのフレームを送信します。各 Eb/No 値について、誤りまたは送信が特定の数に達したらシミュレーションをすぐに停止します。結果の精度を高めるには、目標の誤り数または最大送信回数を引き上げます。

frameLength = 3000; % this value must be an integer multiple of 3
targetErrors = 300;
maxNumTx = 5e6;

結果を格納するためにメモリを割り当て、符号化された Eb/No 値についてループ処理します。シミュレーションが完了するまで数秒かかります。

BERVec = zeros(3,length(EbNoEncoderOutput));
for n=1:length(EbNoEncoderOutput)
  reset(errorCalc)
  reset(convEncoder)
  reset(vitDecoder)
  channel.EbNo = EbNoEncoderOutput(n);
  while (BERVec(2,n) < targetErrors) && (BERVec(3,n) < maxNumTx)
    data = randi([0 1],frameLength,1); % Generate binary frames
    % Convolutionally encode the data
    encData = convEncoder(data);
    % Modulate the encoded data
    modData = pskmod(encData,2);
    % Pass the modulated signal through an AWGN channel
    channelOutput = channel(modData);
    % 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 ] の表 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])

場合によっては、低いビット エラー レートでシミュレーション結果のエラー レートが限界を少し超えることがあります。このような結果になるのは、シミュレーションの分散 (観測されたビット エラー数が 500 個未満の場合) または復号化器の有限トレースバック長が原因です。

まとめ

System object をいくつか使用して、畳み込み符号化とパンクチャのある通信システムをシミュレートしました。システムをシミュレートして、さまざまな Eb/No 比の値に対する BER 性能を求めました。それらの BER 結果を理論的限界と比較しました。

参考文献

  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