このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
poly2trellis
畳み込み符号多項式をトレリス表現に変換
構文
説明
は、符号化率 K / N のフィードフォワード符号化器の変換に対応するトレリス構造体記述を返します。K は符号化器への入力ビット ストリームの数、N は出力結合の数です。trellis
= poly2trellis(ConstraintLength
,CodeGenerator
)ConstraintLength
は符号化器への入力ビット ストリームの遅延を指定します。CodeGenerator
は符号化器への入力ビット ストリームの出力結合を指定します。
関数 poly2trellis は、畳み込み符号化器の多項式表現を受け入れ、対応するトレリス構造体記述を返します。この出力を関数 convenc
および vitdec
への入力として使用できます。また、Convolutional Encoder、Viterbi Decoder、および APP Decoder ブロックのマスク パラメーター値として使用することもできます。
メモ
フィードバック多項式と共に使用すると、poly2trellis はトレリスの入力へのフィードバック接続を作成します。
は、符号化率 K / N のフィードバック符号化器の変換に対応するトレリス構造体記述を返します。K は符号化器への入力ビット ストリームの数、N は出力結合の数です。trellis
= poly2trellis(ConstraintLength
,CodeGenerator
,FeedbackConnection
)ConstraintLength
は符号化器への入力ビット ストリームの遅延を指定します。CodeGenerator
は符号化器への入力ビット ストリームの出力結合を指定します。FeedbackConnection
は符号化器への K 個の入力ビット ストリームそれぞれのフィードバック接続を指定します。
例
トレリス構造体を使用して、次の図の符号化率 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: [4×2 double]
outputs: [4×2 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: [128×4 double]
outputs: [128×4 double]
2 つのビット ストリームで 4 つの異なる入力シンボルを生成できるため、構造体フィールド numInputSymbols
は 4 になります。3 つのビット ストリームで 8 つの異なる出力シンボルを生成できるため、構造体フィールド numOutputSymbols
は 8 になります。符号化器に合計で 7 つのシフト レジスタがあるため、nextStates
フィールドで示されるように、可能な状態の数は です。
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: [16×2 double]
outputs: [16×2 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
トレリス構造体の符号生成器を指定する代替方法が同等であることを実証します。
トレリス構造体を使用して、次の図の符号化率 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: [8×2 double]
outputs: [8×2 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: [8×2 double]
outputs: [8×2 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: [8×8 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: [8×8 double]
outputs: [8×8 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 Channel 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 進数です。
拡張機能
入力は定数でなければなりません。最大で 3 つ使用できます (ConstraintLength
、CodeGenerator
、FeedbackConnection
)。
バージョン履歴
R2006a より前に導入
MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
Web サイトの選択
Web サイトを選択すると、翻訳されたコンテンツにアクセスし、地域のイベントやサービスを確認できます。現在の位置情報に基づき、次のサイトの選択を推奨します:
また、以下のリストから Web サイトを選択することもできます。
最適なサイトパフォーマンスの取得方法
中国のサイト (中国語または英語) を選択することで、最適なサイトパフォーマンスが得られます。その他の国の MathWorks のサイトは、お客様の地域からのアクセスが最適化されていません。
南北アメリカ
- América Latina (Español)
- Canada (English)
- United States (English)
ヨーロッパ
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)