Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

vitdec

ビタビ アルゴリズムを使用したバイナリ データの畳み込み復号化

説明

decodedout = vitdec(codedin,trellis,tbdepth,opmode,dectype) は、ビタビ アルゴリズムを使用して codedin 入力の各シンボルを復号化します。それ以外の入力は、畳み込み符号化のトレリス、トレースバック長、操作モード、判定タイプを指定し、実行時にまとめてビタビ アルゴリズムを構成します。

decodedout = vitdec(codedin,trellis,tbdepth,opmode,'soft',nsdec) は、dectype として軟判定復号化を指定し、nsdec ビットの量子化を使用するビタビ アルゴリズムを構成します。

decodedout = vitdec(codedin,trellis,tbdepth,opmode,dectype,puncpat) は、パンクチャされた codedin 入力の各シンボルを復号化します。ここで、puncpat はパンクチャ パターンです。

decodedout = vitdec(codedin,trellis,tbdepth,opmode,dectype,puncpat,eraspat) は、消去パターン eraspat を指定します。パンクチャを使用しないようにするには、puncpat[] として指定します。

decodedout = vitdec(codedin,trellis,tbdepth,'cont',dectype,___,imetric,istate,iinput) は、前述の構文のいずれかで opmode として連続操作モードを指定します。復号化器は、それぞれ imetricistate および iinput により指定された初期状態メトリクス、初期トレースバック状態、および初期トレースバック入力で開始します。

連続操作モードを使用すると、この関数のその後の呼び出しで使用する復号化器の内部状態情報を保存できます。ループ処理のためにデータが一連のベクトルに区切られる場合は、繰り返しこの関数を呼び出すと便利です。ビタビ復号化アルゴリズムを繰り返し呼び出す必要があるワークフローについては、ヒントを参照してください。

[decodedout,fmetric,fstate,finput] = vitdec(codedin,trellis,tbdepth,'cont',___) は、前述の構文のいずれかで連続操作モードを使用する場合に、復号化プロセスの最後に最終状態メトリクス、最終トレースバック状態、および最終トレースバック入力も返します。この関数の後続の呼び出しで、fmetricfstate、および finput をそれぞれ imetricistate、および iinput の初期設定として使用します。ビタビ復号化アルゴリズムを繰り返し呼び出す必要があるワークフローについては、ヒントを参照してください。

すべて折りたたむ

関数 convenc を使用して 1 のベクトルを畳み込み符号化し、関数 vitdec を使用して復号化します。

関数 poly2trellis を使用してトレリス構造体を定義します。1 のベクトルを符号化する際に、このトレリス構造体を使用して関数 convenc を構成します。

trellis = poly2trellis([4 3],[4 5 17;7 4 2]);
x = ones(100,1);
code = convenc(x,trellis);

符号化されたメッセージを復号化する際に、先ほど定義したトレリス構造体、トレースバック長 2、打ち切り操作モード、硬判定を使用するようにビタビ復号化器を構成します。

tb = 2;
decoded = vitdec(code,trellis,tb,'trunc','hard');

復号化されたメッセージが 100 個の 1 のベクトルであることを確認します。

isequal(decoded,ones(100,1))
ans = logical
   1

パンクチャされた信号にビタビ復号化を適用します。パンクチャによって符号化率が 1/2 から 3/4 に変更されます。

符号化操作と復号化操作のパラメーターを初期化します。

trellis = poly2trellis(7,[171 133])
trellis = struct with fields:
     numInputSymbols: 2
    numOutputSymbols: 4
           numStates: 64
          nextStates: [64x2 double]
             outputs: [64x2 double]

puncpat = [1;1;0;1;1;0];
tbdepth = 96;
opmode = 'trunc';
dectype = 'hard';

パンクチャされていない符号化率とパンクチャされた符号化率を計算します。

K = log2(trellis.numInputSymbols); % Number of input streams
N = log2(trellis.numOutputSymbols); % Number of output streams
unpunc_coderate = K/N % Unpunctured code rate
unpunc_coderate = 0.5000
punc_coderate = (K/N)*(length(puncpat)/sum(puncpat)) % Punctured code rate
punc_coderate = 0.7500

符号化された出力にパンクチャを適用して、すべて 1 のビット メッセージを畳み込み符号化します。

msg = ones(100*length(puncpat),1);
puncturedcode = convenc(msg,trellis,puncpat);

メッセージ、パンクチャド符号、パンクチャ パターンの長さを表示します。

length(msg)
ans = 600
length(puncturedcode)
ans = 800
length(puncpat)
ans = 6

パンクチャド符号化されたメッセージにビタビ復号化を適用します。復号化された出力を元のメッセージと比較します。符号化されたメッセージにパンクチャを適用しても、ビタビ復号化では誤差 0 のメッセージが復元されています。

codedin = puncturedcode;
decodedout = vitdec(codedin,trellis,tbdepth,opmode,dectype,puncpat);
isequal(msg,decodedout)
ans = logical
   1

符号化率 2/3 の畳み込み符号を使用して 16-QAM 変調を適用し、AWGN チャネルを通してデータを送信するリンクの、ビット誤り率 (BER) シミュレーションを推定します。次の図は、2 つの入力ストリーム、3 つの出力ストリーム、および 7 つのシフト レジスタがある符号化率 2/3 の符号化器を示しています。

図で表されている畳み込み符号化のトレリスを定義します。

trellis = poly2trellis([5 4],[23 35 0; 0 5 13])
trellis = struct with fields:
     numInputSymbols: 4
    numOutputSymbols: 8
           numStates: 128
          nextStates: [128x4 double]
             outputs: [128x4 double]

K = log2(trellis.numInputSymbols); % Number of input bit streams
N = log2(trellis.numOutputSymbols); % Number of output bit streams
coderate = K/N;

fprintf('K is %d and N is %d. The code rate is %3.2f.\n', ...
    K,N,coderate)
K is 2 and N is 3. The code rate is 0.67.

変調次数を設定し、変調シンボルあたりのビット数を計算します。ランダムなバイナリ データを生成します。入力ビット ストリームは、符号化操作では入力ビット ストリーム数 (K) の倍数、変調操作では変調シンボルあたりのビット数 (bps) の倍数でなければなりません。

M = 16; % Modulation order
bps = log2(M); % Bits per modulation symbol
numSymPerFrame = 5000;
dataIn = randi([0 1],K*bps*numSymPerFrame,1);

入力データを畳み込み符号化します。

codedout = convenc(dataIn,trellis);

符号化されたシンボルに 16-QAM 変調を適用します。

txSig = qammod(codedout,M,'InputType','bit');

シンボルあたりのビット数 (bps) と符号化率 (coderate) を使用して、ノイズ パワー スペクトル密度に対する 1 ビットあたりのエネルギーの比 (EbNo) を、関数awgnで使用する S/N 比 (snr) の値に変換します。10 dB の Eb/No を等価の SNR 比に変換します。AWGN チャネルを通して信号を渡します。

EbNo = 9;
snr = EbNo + 10*log10(bps*coderate);
rxSig = awgn(txSig,snr,'measured');

受信信号を復調します。

demodSig = qamdemod(rxSig,M,'OutputType','bit');

ビタビ復号化器のトレースバック長を指定します。

tbdepth = 16;

連続終了モードで動作するビタビ復号化器を使用して、バイナリ復調された信号を復号化します。

dataOut = vitdec(demodSig,trellis,tbdepth,'cont','hard');

復号化器による遅延を計算し、BER の計算時に復号化遅延を考慮します。符号化された BER を理論上の符号化されていない BER と比較して、符号化されたデータの BER が向上していることを確認します。

decDelay = K*tbdepth;
berCoded = biterr(dataIn(1:end-decDelay),dataOut(decDelay+1:end))/length(dataOut(decDelay+1:end));
berUncoded = berawgn(EbNo,'qam',M);
fprintf('  The coded BER is %6.5f.\nThe uncoded BER is %6.5f.\n', ...
    berCoded,berUncoded)
  The coded BER is 0.00060.
The uncoded BER is 0.00439.

入力引数

すべて折りたたむ

畳み込み符号化されたメッセージ。バイナリ値または数値のベクトルとして指定します。codedin の各シンボルは、log2(trellis.numOutputSymbols) ビットで構成されます。

データ型: double | logical

トレリス表現。符号化率 K/N の符号に対するトレリス表現を含む MATLAB® 構造体として指定します。K は入力ビット ストリーム数を表し、N は出力ビット ストリーム数を表します。

トレリス構造体には次のフィールドがあります。トレリス構造体は、関数 poly2trellis を使用して作成するか、手動で作成することができます。この構造体の詳細については、畳み込み符号のトレリス表現および関数 istrellis を参照してください。

符号化器への入力シンボルの数。2K と等しい整数として指定します。ここで、K は入力ビット ストリームの数です。

データ型: double

符号化器からの出力シンボルの数。2N と等しい整数として指定します。ここで、N は出力ビット ストリームの数です。

データ型: double

符号化器内の状態の数。2 のべき乗として指定します。

データ型: double

現在の状態と現在の入力のすべての組み合わせの次の状態。整数の行列として指定します。最大サイズは numStates 行 2 K 列でなければなりません。

データ型: double

現在の状態と現在の入力のすべての組み合わせの出力。8 進数の行列として指定します。最大サイズは numStates 行 2 K 列でなければなりません。

データ型: double

データ型: struct

トレースバック長。正の整数として指定します。詳細については、トレースバック長の推定値を参照してください。

データ型: double

操作モード。'cont''term' または 'trunc' として指定します。この入力は、復号化器の操作モードと、対応する符号化器の操作に関する以下の仮定を示します。

  • 'cont' — 連続操作モードを指定します。連続操作モードでは、符号化器がすべて 0 の状態から開始されていることを仮定しています。復号化器は最良のメトリクスで状態を追跡します。入力 tbdepth シンボルと等価の遅延が経過すると、復号化された最初のシンボルが出力に表示されます。このモードは、この関数を繰り返し呼び出し、連続する呼び出し間で連続性を保持する場合に適しています。ビタビ復号化アルゴリズムを繰り返し呼び出す必要があるワークフローについては、ヒントを参照してください。

  • 'term' — 終了操作モードを指定します。終了操作モードでは、符号化器がすべて 0 の状態から開始され、すべて 0 の状態で終了したことを仮定しています。これは関数 convenc の既定の構文にあてはまります。復号化器はすべて 0 の状態から追跡します。このモードでは遅延は生じません。

    このモードは、関数 convenc への入力メッセージの末尾に、符号化器のすべてのメモリ レジスタを埋めるのに充分な 0 がある場合に適しています。ゼロ値のテール ビットにより、符号化器からすべてのメッセージ データ ビットがフラッシュされます。符号化器の多項式表現を使用すると、K 入力ビットと拘束長ベクトル ConstraintLength をもつ符号化器のフラッシュに必要な 0 の数は、K × max(ConstraintLength – 1) になります。拘束長ベクトルは、関数 poly2trellis への最初の入力引数です。

  • 'trunc' — 打ち切り操作モードを指定します。打ち切り操作モードでは、符号化器がすべて 0 の状態から開始されていることを仮定しています。復号化器は最良のメトリクスで状態を追跡します。このモードでは遅延は生じません。このモードは、符号化器がすべて 0 の状態で終了したことを仮定できず、この関数の連続する呼び出し間で連続性を保持しない場合に適しています。

'term' モードと 'trunc' モードの場合、トレースバック長 tbdepth は、入力 codedin の入力シンボル数以下の、正の整数としなければなりません。

詳細は、トレースバックと復号化の遅延トレースバック長の推定値を参照してください。

データ型: char | string

復号化タイプ。'unquant''hard'、または 'soft' として指定します。このパラメーターは、復号化器の復号化判定タイプを示し、復号化器が codedin の入力として予想するデータ型に影響を与えます。

  • 'unquant' — 復号化器には符号付き入力数値が必要で、正の値は logical 0、負の値は logical 1 にマッピングされます。

  • 'hard' — 復号化器には 0 または 1 のバイナリ入力値が必要です。

  • 'soft' — 復号化器には [0, (2nsdec – 1)] の範囲の整数入力値が必要です。ビタビ アルゴリズムの判定基準では、0 が最も信頼性の高い 0、2nsdec – 1 が最も信頼性の高い 1 と見なされます。

データ型: char | string

軟判定の量子化ビット数。範囲 [1, 13] の整数として指定します。参考として、3 ビットの量子化で軟判定復号化を行うと、誤り復号化による復元が硬判定復号化と比べて約 2 dB 向上します。

依存関係

この入力引数を有効にするには、dectype 入力引数を 'soft' に設定します。

データ型: double

パンクチャ パターン。バイナリ値のベクトルとして指定します。パンクチャされたビットを 0、パンクチャされていないビットを 1 で示します。入力符号長をパンクチャ パターンの 1 の数とパンクチャ パターンの長さの積で除算した値は、入力シンボルのビット数の整数倍でなければなりません。

データ型: double

消去パターン。バイナリ値のベクトルとして指定します。消去されたビットを 1、消去されていないビットを 0 で示します。消去パターンの長さは入力符号長と同じでなければなりません。

データ型: double

復号化器の状態メトリクス。整数または整数値のベクトルとして指定します。imetric の各値は、対応する復号化器状態の開始状態メトリクスを表します。imetric をベクトルに設定する場合、長さは trellis.numStates でなければなりません。既定の復号化器の状態メトリクスを使用するには、imetric[] として指定します。

依存関係

この入力引数を有効にするには、opmode 入力引数を 'cont' に設定します。

データ型: double

復号化器の初期トレースバック状態。範囲 [0, (trellis.numStates – 1)] の整数値の trellis.numStatestbdepth 列の行列として指定します。既定の復号化器の初期トレースバック状態を使用するには、istate[] として指定します。

入力 istate および iinput は、共同で復号化器の初期トレースバック メモリを指定します。符号化器の図に複数の入力ストリームがある場合、最初の入力ストリームを受け取るシフト レジスタが istate の最下位ビットを与え、最後の入力ストリームを受け取るシフト レジスタが istate の最上位ビットを与えます。

依存関係

この入力引数を有効にするには、opmode 入力引数を 'cont' に設定します。

データ型: double

復号化器の初期トレースバック入力。範囲 [0, (trellis.numStates – 1)] の整数値の trellis.numStatestbdepth 列の行列として指定します。既定の復号化器の初期トレースバック入力を使用するには、iinput[] として指定します。

入力 istate および iinput は、共同で復号化器の初期トレースバック メモリを指定します。

依存関係

この入力引数を有効にするには、opmode 入力引数を 'cont' に設定します。

データ型: double

出力引数

すべて折りたたむ

復号化されたメッセージ。バイナリ値のベクトルとして返されます。ベクトル decodedout の各シンボルは、log2(trellis.numInputSymbols) ビットで構成されます。

復号化器の最終状態メトリクス。trellis.numStates 要素をもつ整数値のベクトルとして返されます。fmetric の各値は、対応する復号化器状態の最終状態メトリクスを表します。

vitdec を連続モードで呼び出す場合、fmetric は一般に、関数 vitdec の後続の呼び出しに対して imetric を設定するために使用します。

依存関係

この出力は、opmode パラメーターを 'cont' に設定した場合に適用されます。

データ型: double

復号化器の最終トレースバック状態。範囲 [0, (trellis.numStates – 1)] の整数値の trellis.numStatestbdepth 列の行列として返されます。

出力 fstate および finput は、共同で復号化器の最終トレースバック メモリを記述します。符号化器の図に複数の入力ストリームがある場合、最初の入力ストリームを受け取るシフト レジスタが fstate の最下位ビットを与え、最後の入力ストリームを受け取るシフト レジスタが fstate の最上位ビットを与えます。

vitdec を連続モードで呼び出す場合、fstate は一般に、関数 vitdec の後続の呼び出しに対して istate を設定するために使用します。

依存関係

この出力は、opmode パラメーターを 'cont' に設定した場合に適用されます。

データ型: double

復号化器の最終トレースバック入力。範囲 [0, (trellis.numStates – 1)] の整数値の trellis.numStatestbdepth 列の行列として返されます。

出力 fstate および finput は、共同で復号化器の最終トレースバック メモリを指定します。

vitdec を連続モードで呼び出す場合、finput は一般に、関数 vitdec の後続の呼び出しに対して iinput を設定するために使用します。

依存関係

この出力は、opmode パラメーターを 'cont' に設定した場合に適用されます。

データ型: double

詳細

すべて折りたたむ

トレースバックと復号化の遅延

トレースバック長は復号化遅延に影響を与えます。復号化遅延は、出力の最初に復号化されるシンボルよりも前の 0 シンボルの数です。

  • 連続操作モードの場合、復号化遅延はトレースバック長シンボルの数と同じです。

  • 打ち切られた操作モードまたは終了した操作モードの場合、復号化遅延は 0 です。この場合、トレースバック長は、各入力のシンボルの数以下でなければなりません。

トレースバック長の推定値

一般的な推定として、標準のトレースバック長の値は (ConstraintLength – 1) / (1 – coderate) の約 2 倍から 3 倍になります。符号の拘束長 ConstraintLength は (log2(trellis.numStates) + 1) に等しくなります。coderate は (K / N) × (length(PuncturePattern) / sum(PuncturePattern) に等しくなります。

K は入力シンボルの数、N は出力シンボルの数、および PuncturePattern はパンクチャ パターン ベクトルです。

たとえば、この一般的な推定を適用することで、次のようなおおよそのトレースバック長が得られます。

  • 符号化率 1/2 の符号のトレースバック長は 5(ConstraintLength – 1) です。

  • 符号化率 2/3 の符号のトレースバック長は 7.5(ConstraintLength – 1) です。

  • 符号化率 3/4 の符号のトレースバック長は 10(ConstraintLength – 1) です。

  • 符号化率 5/6 の符号のトレースバック長は 15(ConstraintLength – 1) です。

詳細については、[7]を参照してください。

ヒント

  • ビタビ アルゴリズムを連続して呼び出す必要がある場合は、comm.ViterbiDecoder System object™ の使用を検討してください。この System object を使用すると、状態メトリクス、トレースバック状態および入力が呼び出し間で本質的に保持されるため、必要な状態の保持操作が簡略化されます。

参照

[1] Clark, George C., and J. Bibb Cain. Error-Correction Coding for Digital Communications. Applications of Communications Theory. New York: Plenum Press, 1981.

[2] Gitlin, Richard D., Jeremiah F. Hayes, and Stephen B. Weinstein. Data Communications Principles. Applications of Communications Theory. New York: Plenum Press, 1992.

[3] Heller, J., and I. Jacobs. “Viterbi Decoding for Satellite and Space Communication.” IEEE Transactions on Communication Technology 19, no. 5 (October 1971): 835–48. https://doi.org/10.1109/TCOM.1971.1090711.

[4] Yasuda, Y., K. Kashiki, and Y. Hirata. “High-Rate Punctured Convolutional Codes for Soft Decision Viterbi Decoding.” IEEE Transactions on Communications 32, no. 3 (March 1984): 315–19. https://doi.org/10.1109/TCOM.1984.1096047.

[5] Haccoun, D., and G. Begin. “High-Rate Punctured Convolutional Codes for Viterbi and Sequential Decoding.” IEEE Transactions on Communications 37, no. 11 (November 1989): 1113–25. https://doi.org/10.1109/26.46505.

[6] Begin, G., D. Haccoun, and C. Paquin. “Further Results on High-Rate Punctured Convolutional Codes for Viterbi and Sequential Decoding.” IEEE Transactions on Communications 38, no. 11 (November 1990): 1922–28. https://doi.org/10.1109/26.61470.

[7] Moision, B. "A Truncation Depth Rule of Thumb for Convolutional Codes." In Information Theory and Applications Workshop (January 27 2008-February 1 2008, San Diego, California), 555-557. New York: IEEE, 2008.

拡張機能

R2006a より前に導入