最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

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 の組織畳み込み符号化器のトレリス構造体を作成します。トレリスを使用して、ランダム ビット ストリームを符号化および復号化します。

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

最初の出力は組織的なビットに対応するため、最初の生成多項式はフィードバック接続多項式と一致します。フィードバック多項式は、図の上列の 2 進数値に対応するバイナリ ベクトル [1 1 1 1 1] によって表されます。これらの数値は、レジスタの出力から加算器への接続を示します。最初の 1 は入力ビットに対応します。2 進数 11111 の 8 進数表現は 37 です。

2 番目の生成多項式は、図の下列の 2 進数値に対応するバイナリ ベクトル [1 1 0 1 1] によって表されます。2 進数 11011 に対応する 8 進数は 33 です。

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

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

ランダムなバイナリ データを生成してそのデータを畳み込み符号化し、さらにビタビ アルゴリズムを使用して復号化します。

data = randi([0 1],70,1);
codedData = convenc(data,trellis);
decodedData = vitdec(codedData,trellis,34,'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 のフィードフォワード畳み込み符号のトレリス構造体を作成します。トレリスを使用して、ランダム ビット ストリームを符号化および復号化します。

トレリス構造体を作成します。拘束長を 7 に設定し、符号生成を多項式文字ベクトルの cell 配列として指定します。

trellis = poly2trellis(7,{'1 + x^3 + x^4 + x^5 + x^6', ...
    '1 + x + x^3 + x^4 + x^6'})
trellis = struct with fields:
     numInputSymbols: 2
    numOutputSymbols: 4
           numStates: 64
          nextStates: [64x2 double]
             outputs: [64x2 double]

ランダムなバイナリ データを生成してそのデータを畳み込み符号化し、さらにビタビ アルゴリズムを使用して復号化します。

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

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

biterr(data,decodedData)
ans = 0

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

行列 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);

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

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 個の出力結合を指定します。

詳細については、多項式の文字表現を参照してください。

データ型: double | char | string

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

データ型: double

出力引数

すべて折りたたむ

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

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

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

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

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

現在の状態と現在の入力のすべての組み合わせの次の状態。numStates 行 2K 列の行列として返されます。

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

拡張機能

R2006a より前に導入