Main Content

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

poly2trellis

畳み込み符号多項式をトレリス表現に変換

説明

trellis = poly2trellis(ConstraintLength,CodeGenerator) は、符号化率 K / N のフィードフォワード符号化器の変換に対応するトレリス構造体記述を返します。K は符号化器への入力ビット ストリームの数、N は出力結合の数です。ConstraintLength は符号化器への入力ビット ストリームの遅延を指定します。CodeGenerator は符号化器への入力ビット ストリームの出力結合を指定します。

関数 poly2trellis は、畳み込み符号化器の多項式表現を受け入れ、対応するトレリス構造体記述を返します。この出力を関数 convenc および vitdec への入力として使用できます。また、Convolutional EncoderViterbi Decoder、および APP Decoder ブロックのマスク パラメーター値として使用することもできます。

メモ

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

trellis = poly2trellis(ConstraintLength,CodeGenerator,FeedbackConnection) は、符号化率 K / N のフィードバック符号化器の変換に対応するトレリス構造体記述を返します。K は符号化器への入力ビット ストリームの数、N は出力結合の数です。ConstraintLength は符号化器への入力ビット ストリームの遅延を指定します。CodeGenerator は符号化器への入力ビット ストリームの出力結合を指定します。FeedbackConnection は符号化器への K 個の入力ビット ストリームそれぞれのフィードバック接続を指定します。

すべて折りたたむ

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

Diagram of a rate 1/2 feedforward convolutional encoder with codegenerators [6 7] and constraint length 3

拘束長を 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

符号化率 2/3 のフィードフォワード畳み込み符号のトレリス構造体を作成し、トレリスの次の状態の一部を表示します。この符号化器の使用例は、convencを参照してください。

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

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

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]

2 つのビット ストリームで 4 つの異なる入力シンボルを生成できるため、構造体フィールド numInputSymbols は 4 になります。3 つのビット ストリームで 8 つの異なる出力シンボルを生成できるため、構造体フィールド numOutputSymbols は 8 になります。符号化器に合計で 7 つのシフト レジスタがあるため、nextStates フィールドで示されるように、可能な状態の数は 27=128 です。

trellis.nextStates の 128 行 4 列の行列の最初の 5 行を表示します。

trellis.nextStates(1:5,:)
ans = 5×4

     0    64     8    72
     0    64     8    72
     1    65     9    73
     1    65     9    73
     2    66    10    74

次の図に表示されているフィードバックを使用して、符号化率 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

トレリス構造体の符号生成器を指定する代替方法が同等であることを実証します。

Diagram of a rate 1/2 feedforward convolutional encoder with codegenerators [12 15] and constraint length 3

トレリス構造体を使用して、次の図の符号化率 1/2 のフィードフォワード畳み込み符号を構成します。この図は 2 進数値と多項式形式を示し、一番左のビットが最上位ビットであることを示します。

拘束長を 4 に設定します。多項式の文字ベクトルの cell 配列を使用して符号生成器を指定します。詳細については、Communications Toolbox での多項式の表現を参照してください。符号生成器の指定に文字表現を使用する場合、多項式は昇順または降順で指定できますが、関数poly2trellisは MSB の左端レジスタを使用して常にレジスタを降順で割り当てます。

trellis_poly = poly2trellis(4,{'x3 + x','x3 + x2 + 1'})
trellis_poly = struct with fields:
     numInputSymbols: 2
    numOutputSymbols: 4
           numStates: 8
          nextStates: [8x2 double]
             outputs: [8x2 double]

バイナリ ベクトル [1 0 1 0] は 8 進数 12 を表し、図の上列の 2 進数値に対応します。バイナリ ベクトル [1 1 0 1] は 8 進数 15 を表し、図の下列の 2 進数値に対応します。8 進数表現を使用して、等価のトレリス構造体の符号生成器を指定します。

trellis = poly2trellis(4,[12 15])
trellis = struct with fields:
     numInputSymbols: 2
    numOutputSymbols: 4
           numStates: 8
          nextStates: [8x2 double]
             outputs: [8x2 double]

isequalを使用して 2 つのトレリスが等価であることを確認します。

isequal(trellis,trellis_poly)
ans = logical
   1

この例では、符号化されていないビットとフィードバックをもつ畳み込み符号化器用の非標準トレリス構造体を作成する方法を示します。符号化器固有の仕様が poly2trellis の入力要件に合わないため、poly2trellisを使用してこの符号化器を作成することはできません。

手動でトレリス構造体を作成して、符号化器および復号化器の入力トレリス構造体として使用できます。符号化されていないビットとフィードバックをもつ畳み込み符号化器のモデルで使用されているConvolutional EncoderブロックおよびViterbi Decoderブロックが、ここで作成されたトレリス構造体を PreLoadFcn コールバックを使用して読み込みます。

畳み込み符号化器

MSB ビットが符号化されないで残っている、フィードバック接続をもつレート 3/4 の畳み込み符号化器を作成します。

仕様に従って変数を宣言します。

K = 3;
N = 4;
constraintLength = 4;

トレリス構造体の作成

トレリスは、以下のフィールドをもつ構造体で表現されます。

  • numInputSymbols - 入力シンボルの数

  • numOutputSymbols - 出力シンボルの数

  • numStates - 状態の数

  • nextStates - 次の状態行列

  • outputs - 出力行列

これらの構造体フィールドの詳細については、istrellisを参照してください。

以前の myTrellis 構造体のすべての出現箇所をリセットします。

clear myTrellis;

トレリス構造体のフィールドを定義します。

myTrellis.numInputSymbols = 2^K;
myTrellis.numOutputSymbols = 2^N;
myTrellis.numStates  = 2^(constraintLength-1);

行列 nextStates の作成

行列 nextStates は [numStates x numInputSymbols] 行列です。次の状態行列の (i,j) 要素は、j に等しい入力の初期状態 i からの遷移に対応する、結果として得られる最終状態インデックスです。

myTrellis.nextStates = [0  1  2  3  0  1  2  3; ...
                        6  7  4  5  6  7  4  5; ...
                        1  0  3  2  1  0  3  2; ...
                        7  6  5  4  7  6  5  4; ...
                        2  3  0  1  2  3  0  1; ...
                        4  5  6  7  4  5  6  7; ...
                        3  2  1  0  3  2  1  0; ...
                        5  4  7  6  5  4  7  6]    
myTrellis = struct with fields:
     numInputSymbols: 8
    numOutputSymbols: 16
           numStates: 8
          nextStates: [8x8 double]

行列 nextStates のプロット

補助関数 commcnv_plotnextstates を使用して行列 nextStates をプロットし、与えられた入力のさまざまな状態間の分枝遷移を示します。

commcnv_plotnextstates(myTrellis.nextStates);

MATLAB figure

行列 outputs の作成

行列 outputs は [numStates x numInputSymbols] 行列です。出力行列の (i,j) 要素は、j に等しい入力の現在の状態 i を与えられた 8 進数の出力シンボルです。

outputs =  [0  2  4  6  10  12  14  16; ...
            1  3  5  7  11  13  15  17; ...
            0  2  4  6  10  12  14  16; ...
            1  3  5  7  11  13  15  17; ...
            0  2  4  6  10  12  14  16; ...
            1  3  5  7  11  13  15  17; ...
            0  2  4  6  10  12  14  16; ...
            1  3  5  7  11  13  15  17]
outputs = 8×8

     0     2     4     6    10    12    14    16
     1     3     5     7    11    13    15    17
     0     2     4     6    10    12    14    16
     1     3     5     7    11    13    15    17
     0     2     4     6    10    12    14    16
     1     3     5     7    11    13    15    17
     0     2     4     6    10    12    14    16
     1     3     5     7    11    13    15    17

oct2decを使用して、これらの値を 10 進数で表示します。

outputs_dec = oct2dec(outputs)
outputs_dec = 8×8

     0     2     4     6     8    10    12    14
     1     3     5     7     9    11    13    15
     0     2     4     6     8    10    12    14
     1     3     5     7     9    11    13    15
     0     2     4     6     8    10    12    14
     1     3     5     7     9    11    13    15
     0     2     4     6     8    10    12    14
     1     3     5     7     9    11    13    15

出力行列を myTrellis 構造体にコピーします。

myTrellis.outputs = outputs
myTrellis = struct with fields:
     numInputSymbols: 8
    numOutputSymbols: 16
           numStates: 8
          nextStates: [8x8 double]
             outputs: [8x8 double]

行列 outputs のプロット

補助関数 commcnv_plotoutputs を使用して行列 outputs をプロットし、入力シンボルに応じて与えられた状態の考えられる出力シンボルを示します。

commcnv_plotoutputs(myTrellis.outputs, myTrellis.numOutputSymbols);

MATLAB figure

結果のトレリス構造体のチェック

istrellis(myTrellis)
ans = logical
   1

戻り値 1 により、トレリス構造体が有効であることが確認されます。

0 に近い値が 0 にマッピングされ、1 に近い値が 7 にマッピングされるように、分割された 3 ビット軟判定で復号化します。より優れた復号化性能が必要となるアプリケーションの場合は、分割を調整してより微細な量子化が行われるようにします。

例では符号を復号化し、ビット エラー レートを計算します。復号化されたデータと元のメッセージの比較時に、例では復号化の遅延を考慮に入れなければなりません。ビタビ復号化器の連続操作モードではトレースバック長と等しい遅延が生じるので、msg(1)decoded(1) ではなく decoded(tblen+1) に対応します。

システム設定

メッセージ データ、トレリス、ビット エラー レートの計算、およびトレースバック長のランタイム変数を初期化します。

stream = RandStream.create('mt19937ar', 'seed',94384);
prevStream = RandStream.setGlobalStream(stream);
msg = randi([0 1],4000,1); % Random data

trellis = poly2trellis(7,[171 133]); % Define trellis

ber = zeros(3,1); % Store BER values
tblen = 48; % Traceback length

AWGN チャネル System object™ (ビタビ復号化器 System object) とエラー レート計算機 System object を作成します。ビタビ復号化器のトレースバック長による受信遅延を考慮します。

awgnChan = comm.AWGNChannel('NoiseMethod','Signal to noise ratio (SNR)','SNR',6);
vitDec = comm.ViterbiDecoder(trellis,'InputFormat','Soft', ...
    'SoftInputWordLength',3,'TracebackDepth',tblen,'TerminationMethod','Continuous');
errorCalc = comm.ErrorRate('ReceiveDelay', tblen);

符号化および復号化の実行

メッセージを畳み込み符号化し、AWGN フィルターを通過させて、ノイズを含むメッセージを軟判定復号化のために量子化します。poly2trellis を使用して生成されたトレリスを使用してビタビ復号化を実行します。

code = convenc(msg,trellis);
awgnChan.SignalPower = (code'*code)/length(code);
ncode = awgnChan(code);

quantiz を使用してノイズを含むデータ値を 0 から 7 までの整数の適切な判定値にマッピングします。quantiz の 2 番目の引数は、どのデータ値が 0、1、2 などにマッピングされるかを決定する分割ベクトルです。

qcode = quantiz(ncode,[0.001,0.1,0.3,0.5,0.7,0.9,0.999]);
decoded = vitDec(qcode);

ビット エラー レートを計算します。

ber = errorCalc(msg,decoded);
ratio = ber(1)
ratio = 0.0013
number = ber(2)
number = 5
RandStream.setGlobalStream(prevStream);

入力引数

すべて折りたたむ

拘束長。符号化器への K 個の入力ビット ストリームのそれぞれの遅延を定義する、1 行 K 列の行ベクトルとして指定します。

データ型: double

符号生成器。8 進数の K 行 N 列の行列、多項式の文字ベクトルの K 行 N 列の cell 配列、または K 行 N 列の string 配列として指定します。CodeGenerator は、符号化器への K 個の入力ビット ストリームそれぞれに N 個の出力結合を指定します。

符号生成器の指定に文字表現を使用する場合、多項式は昇順または降順で指定できますが、関数 poly2trellis は、最上位ビット (MSB) の左端をレジスタとして常にレジスタを降順で割り当てます。詳細については、多項式型での符号生成器の指定を参照してください。

データ型: double | char | string

フィードバック接続。符号化器への K 個の入力ビット ストリームそれぞれのフィードバック接続を定義する、1 行 K 列の 8 進数の行ベクトルとして指定します。

データ型: double

出力引数

すべて折りたたむ

トレリス表現。次のフィールドがある構造体として返されます。この構造体の詳細については、関数 istrellis を参照してください。

符号化率 K/N の符号に対するトレリス構造体のフィールド

入力シンボルの数。2K の値をもつスカラーとして返されます。この値は符号化器への入力シンボルの数を表し、K は入力ビット ストリームの数を表します。

出力シンボルの数。2N の値をもつスカラーとして返されます。この値は符号化器からの出力シンボルの数を表し、N は出力ビット ストリームの数を表します。

符号化器の状態の数。スカラーとして返されます。

現在の状態と現在の入力のすべての組み合わせの次の状態。numStates 行 2K 列の行列として返されます。K は入力ビット ストリームの数を表します。

現在の状態と現在の入力のすべての組み合わせの出力。numStates 行 2K 列の行列として返されます。K は入力ビット ストリームの数を表します。この行列の要素は 8 進数です。

拡張機能

バージョン履歴

R2006a より前に導入