Main Content

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

convenc

バイナリ メッセージの畳み込み符号化

説明

codedout = convenc(msg,trellis) は、トレリス構造体で表される畳み込み符号化器を使用して入力バイナリ メッセージを符号化します。MATLAB® のトレリス構造体の詳細については、畳み込み符号のトレリス表現を参照してください。入力メッセージは、それぞれ log2(trellis.numInputSymbols) ビットで構成される 1 つ以上のシンボルを含みます。符号化された出力 codedout は、それぞれ log2(trellis.numOutputSymbols) ビットで構成される 1 つ以上のシンボルを含みます。

codedout = convenc(msg,trellis,puncpat) は、パンクチャされていない符号化よりも高いレートの符号化を有効にするためにパンクチャ パターン puncpat を指定します。

特定のレートや多項式で一般的に使用するパンクチャ パターンについては、最後の 3 つのリファレンスを参照してください。

codedout = convenc(___,istate) は、符号化器レジスタが istate で指定される状態で開始できるようにします。istate は、前述の構文における入力引数の任意の組み合わせに続いて、最後の入力パラメーターとして指定します。

[codedout,fstate] = convenc(___) は、符号化器の最終状態も返します。fstate は、一般に、convenc を反復して呼び出す場合に関数 convenc の後続の呼び出しに対して istate を設定するために使用します。

すべて折りたたむ

トレリス構造体を使用して畳み込み符号を作成します。トレリス構造体は、関数 poly2trellis を使用するか手動でトレリス構造体を指定することで定義できます。この例では両方の方法を示します。

関数 poly2trellis を使用したトレリスの定義

関数 poly2trellis を使用して、符号化器の構成に使用するトレリス構造体を定義します。

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

トレリス構造体を使用して関数 convenc を構成します。関数 convenc を使用して、K/N 符号化率 2/3 の畳み込み符号に対する 5 個の 2 ビット シンボルを符号化します。

K = log2(trellis_a.numInputSymbols) % Number of input bit streams
K = 2
N = log2(trellis_a.numOutputSymbols) % Number of output bit streams
N = 3
numReg = log2(trellis_a.numStates) % Number of coder registers
numReg = 7
numSymPerFrame = 5; % Number of symbols per frame
data = randi([0 1],K*numSymPerFrame,1);
[code_a,fstate_a] = convenc(data,trellis_a);

符号化された出力が 15 ビットで、入力シーケンス data の 3/2 (N/K) 倍の長さであることを確認します。

code_a'
ans = 1×15

     1     1     1     0     0     1     1     1     1     1     0     1     0     1     0

length(data)
ans = 10
length(code_a)
ans = 15

手動でのトレリスの定義

K/N 符号化率 1/2 の畳み込み符号に対するトレリス構造体を手動で定義します。

trellis_b = struct('numInputSymbols',2,'numOutputSymbols',4, ...
'numStates',4,'nextStates',[0 2;0 2;1 3;1 3], ...
'outputs',[0 3;1 2;3 0;2 1])
trellis_b = struct with fields:
     numInputSymbols: 2
    numOutputSymbols: 4
           numStates: 4
          nextStates: [4x2 double]
             outputs: [4x2 double]

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

K = log2(trellis_b.numInputSymbols) % Number of input bit streams
K = 1
N = log2(trellis_b.numOutputSymbols) % Number of output bit streams
N = 2
numReg = log2(trellis_b.numStates) % Number of coder registers
numReg = 2
numSymPerFrame = 10; % Number of symbols per frame
data = randi([0 1],K*numSymPerFrame,1);
code_b = convenc(data,trellis_b);

符号化された出力が 20 ビットで、入力シーケンス data の 2/1 (N/K) 倍の長さになることを確認します。

code_b'
ans = 1×20

     0     0     1     1     0     0     1     0     1     0     1     1     0     1     1     1     0     0     0     1

length(data)
ans = 10
length(code_b)
ans = 20

パンクチャを使用して、畳み込み符号化器の K/N 符号化率を 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];

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

K = log2(trellis.numInputSymbols); % Number of input streams
N = log2(trellis.numOutputSymbols); % Number of output streams
unpunc_coderate = K/N; % Unpunctured code rate
punc_coderate = (K/N)*length(puncpat)/sum(puncpat); % Punctured code rate
fprintf('K is %d and N is %d. The unpunctured code rate is %3.2f and the punctured code rate is %3.2f.\n',K,N,unpunc_coderate,punc_coderate)
K is 1 and N is 2. The unpunctured code rate is 0.50 and the punctured code rate is 0.75.

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

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

メッセージ、パンクチャされていない符号、パンクチャされた符号、パンクチャ パターンを表示します。

msg'
ans = 1×3

     1     1     1

unpuncturedcode'
ans = 1×6

     1     1     0     1     1     0

puncpat'
ans = 1×3

     1     1     0

puncturedcode'
ans = 1×4

     1     1     1     1

パンクチャを使用しない場合、構成した畳み込み符号化で 3 個のメッセージ ビットの入力に対して 6 個の符号化ビットが出力されます。結果の符号化率が想定される符号化率 1/2 と一致することを確認します。

length(msg)/length(unpuncturedcode)
ans = 0.5000

パンクチャを使用した場合、入力メッセージの位置 1 および 2 のビットは送信されますが、位置 3 のビットは削除されます。3 ビットの入力ごとに、パンクチャされた符号で 4 ビットの出力が生成されます。結果の符号化率が想定される符号化率 3/4 と一致することを確認します。

length(msg)/length(puncturedcode)
ans = 0.7500

トレリス構造体を使用して、次の図の符号化率 1/2 のフィードフォワード畳み込み符号を構成します。

拘束長を 3 に設定し、符号生成器を 8 進数値のベクトルとして指定して、トレリス構造体を作成します。この図は 2 進数値と多項式形式を示し、一番左のビットが最上位ビットであることを示します。バイナリ ベクトル [1 1 0] は 8 進数 6 を表し、図の上列の 2 進数値に対応します。バイナリ ベクトル [1 1 1] は 8 進数 7 を表し、図の下列の 2 進数値に対応します。これらの 2 進数値は、図におけるレジスタの出力から 2 つの加算器への接続を示します。

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

ランダムなバイナリ データを生成します。指定したトレリス構造体を使用してデータを畳み込み符号化します。トレリス構造体、トレースバック長 34、打ち切り操作モード、硬判定を指定したビタビ アルゴリズムを使用して、符号化したデータを復号化します。

data = randi([0 1],70,1);
codedData = convenc(data,trellis);
tbdepth = 34;
decodedData = vitdec(codedData,trellis,tbdepth,'trunc','hard');

復号化されたデータにビット誤りがないことを確認します。

biterr(data,decodedData)
ans = 0

次の図に表示されているフィードバックを使用して、符号化率 1/2 の組織畳み込み符号化器を表すトレリス構造体を作成します。

この符号化器は、拘束長が 5 で、生成多項式行列が [37 33] で、フィードバック接続多項式は 37 です。

最初の生成多項式は 8 進数 37 です。2 番目の生成多項式は 8 進数 33 です。フィードバック多項式は 8 進数 37 です。最初の出力は組織的なビットに対応するため、最初の生成多項式はフィードバック接続多項式と一致します。

バイナリ ベクトル [1 1 1 1 1] は 8 進数 37 を表し、図の上列の 2 進数値に対応します。バイナリ ベクトル [1 1 0 1 1] は 8 進数 33 を表し、図の下列の 2 進数値に対応します。これらの 2 進数値は、図におけるレジスタの出力から 2 つの加算器への接続を示します。最初の 1 は入力ビットに対応します。

関数 poly2trellis を使用して多項式をトレリス構造体に変換します。フィードバック多項式と共に使用すると、poly2trellis はトレリスの入力へのフィードバック接続を作成します。

trellis = poly2trellis(5,[37 33],37)
trellis = struct with fields:
     numInputSymbols: 2
    numOutputSymbols: 4
           numStates: 16
          nextStates: [16x2 double]
             outputs: [16x2 double]

ランダムなバイナリ データを生成します。指定したトレリス構造体を使用してデータを畳み込み符号化します。トレリス構造体、トレースバック長 34、打ち切り操作モード、硬判定を指定したビタビ アルゴリズムを使用して、符号化したデータを復号化します。

data = randi([0 1],70,1);
codedData = convenc(data,trellis);
tbdepth = 34; % Traceback depth for Viterbi decoder
decodedData = vitdec(codedData,trellis,tbdepth,'trunc','hard');

復号化されたデータにビット誤りがないことを確認します。

biterr(data,decodedData)
ans = 0

メッセージ全体の畳み込み符号化を、2 つのセグメントに分けたメッセージの畳み込み符号化と比較します。

次の図は、2 つの入力ストリーム、3 つの出力ストリーム、および 7 つのシフト レジスタがある符号化率 2/3 の符号化器を示しています。

関数 poly2trellis を使用して、この図のトレリス構造体を定義します。上のパスの拘束長は 5、下のパスの拘束長は 4 に設定します。符号生成行列の 8 進数表現は、上と下のシフト レジスタからのタップに対応します。

trellis = poly2trellis([5 4],[23 35 0; 0 5 13]);

符号化器の構成を調べます。

K = log2(trellis.numInputSymbols) % Number of input bit streams
K = 2
N = log2(trellis.numOutputSymbols) % Number of output bit streams
N = 3
coderate = K/N
coderate = 0.6667
numReg = log2(trellis.numStates) % Number of coder registers
numReg = 7

5 個の 2 ビット入力シンボルでメッセージを定義します。

numSymPerFrame = 5; % Number of symbols per frame
msg = randi([0 1],K*numSymPerFrame,1);

トレリスを使用して関数 convenc を構成してメッセージ全体を符号化します。

[code_a,fstate_a] = convenc(msg,trellis);

同じトレリス構造体を使用してピース メッセージ符号化を適用します。関数 convenc を使用する際に最終状態と初期状態の引数を使用します。ピース メッセージ符号化では、メッセージのセグメント数は入力シンボルのビット数の倍数でなければなりません。

メッセージの一部を符号化し、後で使用するために最終状態を記録します。

[code_a1,fstate_a1] = convenc(msg(1:6),trellis);

最終状態 fstate_a1 を初期状態の入力引数として使用して、メッセージの残りを符号化します。

[code_a2,fstate_a2] = convenc(msg(7:end),trellis,fstate_a1);

全体を符号化したメッセージ code_a と区分的に符号化して連結したメッセージ [code_a1; code_a2] が一致することを確認します。

isequal(code_a,[code_a1; code_a2])
ans = logical
   1

フル メッセージ符号化後の符号化器の最終状態 fstate_a とピース メッセージ符号化後の符号化器の最終状態 fstate_a2 が一致することを確認します。

isequal(fstate_a,fstate_a2)
ans = logical
   1

入力引数

すべて折りたたむ

バイナリ メッセージ。バイナリ値のベクトルとして指定します。msg は 1 つ以上のシンボルを含まなければなりません。各シンボルは log2(trellis.numInputSymbols) ビットで構成されていなければなりません。

例: [1 1 0 1 0 0 1 1] はメッセージを 8 要素のバイナリ行ベクトルとして指定します。

データ型: 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

パンクチャ パターン。バイナリ値のベクトルとして指定します。パンクチャされたビットを 0、パンクチャされていないビットを 1 で示します。puncpat ベクトルの長さは、入力メッセージ ベクトルの長さ length(msg) の整数の除数でなければなりません。

データ型: double

符号化器レジスタで使用する初期状態。範囲 [0, (trellis.numStates – 1)] の整数値スカラーとして指定します。

データ型: double

出力引数

すべて折りたたむ

畳み込み符号化されたメッセージ。バイナリ値のベクトルとして返されます。この出力ベクトルのデータ型および方向は入力 msg と同じです。codedout の各シンボルは、log2(trellis.numOutputSymbols) ビットで構成されます。

データ型: double | logical

符号化器レジスタの最終状態。整数値スカラーとして返されます。fstate は、一般に、ループなどで convenc を反復して呼び出す場合に関数 convenc の後続の呼び出しに対して istate を設定するために使用します。

データ型: double

詳細

すべて折りたたむ

畳み込み符号化

畳み込み符号化は、メモリがある誤り制御符号化です。具体的には、計算と符号化される出力が、入力シンボルの現在のセットに加え、前の入力シンボルのいくつかにも依存します。依存する入力シンボルの数は、トレリスの構成に応じて異なります。畳み込み符号化器は、固定数のメッセージ シンボルを受け取り、固定数の符号シンボルを生成します。

一連の生成多項式を定義するトレリス構造体を使用して、非組織、組織フィードフォワード、または組織フィードバック畳み込み符号をモデル化できます。このページの例では、さまざまな畳み込み符号のアーキテクチャを示します。詳細については、畳み込み符号を参照してください。

畳み込み符号化された出力の復号化には以下を使用できます。

  • 関数 vitdec または comm.ViterbiDecoder System object™ — 硬判定と軟判定の復号化でビタビ アルゴリズムを使用

  • comm.APPDecoder 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] 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.

[4] 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.

[5] 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.

拡張機能

R2006a より前に導入