ユーザー定義トレリス構造体の作成、検証、およびテスト
ユーザー定義トレリス構造体の作成
この例では、符号化されていないビットとフィードバックをもつ畳み込み符号化器用の非標準トレリス構造体を作成する方法を示します。符号化器固有の仕様が 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
により、トレリス構造体が有効であることが確認されます。
符号化されていないビットとフィードバックをもつ畳み込み符号化器
モデルは、実装された畳み込み符号のユニット テスト ベンチとして機能します。モデルでは、畳み込み符号を記述するトレリスを定義して使用する方法を示します。この例の特定の符号は、一連の生成多項式およびフィードバック接続多項式で記述できません。関数が入力引数として生成多項式およびフィードバック接続多項式を期待しているため、符号のトレリスはpoly2trellis
で作成できません。
畳み込み符号の構造
次の図は、畳み込み符号を示しています。
モデルの検証
slex_commcnvencoder
モデルの主要なコンポーネントには、次が含まれます。
離散低レベル遅延ブロックおよび加算 (XOR) ブロックを使用して畳み込み符号化器の表現を作成する、送信パス。この表現は、畳み込み符号の構造を示す図によく似ています。
Trellis structure
パラメーター内に記述された符号化器でConvolutional Encoderブロックを使用して、同じ畳み込み符号化器の表現を作成する送信-受信パス。モデルのこの部分には、畳み込み符号を復号化する、Viterbi Decoderブロックも含まれます。どちらのパスもビット エラー数を計算します。
結果と表示
シミュレーションを実行すると、Compare Encoder
というラベルのブロックによって、符号化器の 2 つの表現が同じ結果になることがチェックされます。Compare Encoder - Decoder
というラベルのブロックによって、符号化器と復号化器がペアとして適切に機能することがチェックされます。モデルの各 Display ブロックに、予想どおりに、エラー レートが 0 と表示されます。
Error rate for Compare Encoder signal: 0.000 Error rate for Compare Encoder-Decoder signal: 0.000