Main Content

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

comm.ViterbiDecoder

ビタビ アルゴリズムを使用した畳み込み符号化されたデータの復号化

説明

comm.ViterbiDecoder System object™ は、トレリス構造体で指定された畳み込み符号化スキームであるビタビ アルゴリズムを使用して、畳み込み符号化された入力シンボルを復号化し、バイナリ出力シンボルを生成します。詳細については、畳み込み符号のトレリス表現のトピックを参照してください。

ビタビ アルゴリズムを使用して、畳み込み符号化されたデータを復号化するには、以下の手順に従います。

  1. comm.ViterbiDecoder オブジェクトを作成し、そのプロパティを設定します。

  2. 関数と同様に、引数を指定してオブジェクトを呼び出します。

System object の機能の詳細については、System object とはを参照してください。

作成

説明

viterbidecoder = comm.ViterbiDecoder は、ビタビ復号化器 System object を作成します。このオブジェクトは、ビタビ アルゴリズムを使用して、畳み込み符号化された入力データを復号化します。

viterbidecoder = comm.ViterbiDecoder(trellis) は、TrellisStructure プロパティ セットを trellis に設定します。

viterbidecoder = comm.ViterbiDecoder(___,Name,Value) は、前の構文の任意の引数の組み合わせに加えて、名前と値の引数を 1 つ以上使用してプロパティを設定します。たとえば、viterbidecoder = comm.ViterbiDecoder('TerminationMethod','Continuous') は終了方法を連続として指定し、次のフレームで使用するために、各フレームの最後で内部状態メトリクスを保存します。

プロパティ

すべて展開する

特に指定がない限り、プロパティは "調整不可能" です。つまり、オブジェクトの呼び出し後に値を変更することはできません。オブジェクトは呼び出すとロックされ、ロックを解除するには関数 release を使用します。

プロパティが "調整可能" の場合、その値をいつでも変更できます。

プロパティ値の変更の詳細については、System object を使用した MATLAB でのシステム設計を参照してください。

畳み込み符号のトレリス表現。符号化率 K / N の符号に対するトレリス表現を含む構造体として指定します。K は入力ビット ストリーム数を表し、N は出力ビット ストリーム数を表します。

トレリス構造体は、関数 poly2trellis を使用して作成するか、手動で作成することができます。この構造体の詳細については、畳み込み符号のトレリス表現および関数 istrellis を参照してください。

トレリス構造体には次のフィールドがあります。

符号化器への入力シンボルの数。2K と等しい整数として指定します。ここで、K は入力ビット ストリームの数です。

符号化器からの出力シンボルの数。2N と等しい整数として指定します。ここで、N は出力ビット ストリームの数です。

符号化器内の状態の数。2 のべき乗として指定します。

現在の状態と現在の入力のすべての組み合わせの次の状態。整数の行列として指定します。行列のサイズは numStates 行 2K 列でなければなりません。

現在の状態と現在の入力のすべての組み合わせの出力。8 進数の行列として指定します。行列のサイズは numStates 行 2K 列でなければなりません。

データ型: struct

復号化器の入力形式。'Unquantized''Hard'、または 'Soft' として指定します。

  • 'Unquantized' — 入力データは量子化されていない倍精度または単精度の軟判定値の実数値ベクトルでなければなりません。オブジェクトは、正の値を logical 1 に、負の値を logical 0 にマッピングします

  • 'Hard' — 入力は 0 または 1 の硬判定値のベクトルでなければなりません。入力のデータ型は、倍精度、単精度、logical、または数値でなければなりません。

  • 'Soft' — 入力には、0 と 2SoftInputWordLength – 1 の間の整数として表される量子化された軟判定値のベクトルが必要です。入力のデータ型は、倍精度、単精度、logical、または数値でなければなりません。あるいは、SoftInputWordLength プロパティで指定する語長に等しい語長で (fi (Fixed-Point Designer)) を使用して、符号なしおよびスケーリングなしの固定小数点オブジェクトとしてデータ型を指定できます。0 は最も信頼性の高い 0 と見なされ、2SoftInputWordLength – 1 は最も信頼性の高い 1 と見なされます。

それぞれの量子化された軟入力値に対するビット数を表す軟入力の語長。整数として指定します。

依存関係

このプロパティを有効にするには、InputFormat プロパティを 'Soft' に設定します。

データ型: double

無効な量子化入力 (つまり、入力値が範囲外) に対してアクションを実行するオプション。'Ignore' または 'Error' として指定します。このプロパティを 'Error' に設定すると、量子化された入力値が範囲外の場合、オブジェクトはエラーを生成します。

依存関係

このプロパティを有効にするには、InputFormat プロパティを 'Soft' または 'Hard' に設定します。

トレースバック長。整数として指定します。詳細については、トレースバックと復号化の遅延およびトレースバック長の推定値を参照してください。

データ型: double

符号化フレームの終了方法。以下のいずれかの値を指定します。

  • 'Continuous' — System object は、次のフレームで使用するために、各フレームの最後で内部状態メトリクスを保存します。オブジェクトは、各トレースバック パスを個別に扱います。このモードでは、符号化率 K/N の畳み込み符号に対する出力復号化遅延が TracebackDepth×K ゼロ ビットになります。K は入力シンボルの数、N は出力シンボルの数です。

  • 'Truncated' — System object は各フレームを個別に扱います。トレースバック パスは最良のメトリクスで始まり、すべて 0 の状態で終了します。このモードでは、出力遅延が発生しません。

  • 'Terminated' — System object は各フレームを個別に扱います。トレースバック パスはすべて 0 の状態で開始し、終了します。このモードでは、出力遅延が発生しません。

復号化器リセット入力を有効にするオプション。logical 1 (true) または 0 (false) として指定します。オブジェクトに対して、このプロパティを 1 (true) に設定します。この追加のリセット入力が非ゼロの値のとき、復号化器の内部状態はその初期条件にリセットされます。

依存関係

このプロパティを有効にするには、TerminationMethod プロパティを 'Continuous' に設定します。

データ型: logical

出力リセットを遅延するオプション。次のいずれかの論理値を指定します。

  • 1 (true) — オブジェクトが復号化されたデータを計算した後に、復号化器の内部状態のリセットが行われます。

  • 0 (false) — オブジェクトが復号化されたデータを計算する前に、復号化器の内部状態のリセットが行われます。

依存関係

このプロパティを有効にするには、ResetInputPort プロパティを true に設定します。

データ型: logical

パンクチャ パターンのソース。次のいずれかの値を指定します。

  • 'None' — オブジェクトはパンクチャを適用しません。

  • 'Property' — オブジェクトは、PuncturePattern プロパティで指定するパンクチャ パターン ベクトルに基づいてパンクチャされたコードワードを復号化します。

復号化されたデータをパンクチャするためのパンクチャ パターン ベクトル。列ベクトルとして指定します。ベクトルには 10 が含まれている必要があります。ここで、0 はパンクチャされたビットの位置を示します。このパンクチャ パターンは畳み込み符号化器によって使用されるパンクチャ パターンと一致しなければなりません。

依存関係

このプロパティを有効にするには、PuncturePatternSource プロパティを 'Property' に設定します。

データ型: double

入力シンボルで消去の指定を有効化するオプション。次の数値または logical 値のいずれかとして指定します。

  • 1 (true) — System object を呼び出す場合、呼び出す際に消去のベクトルを指定します。このベクトルは、消去する入力コードワードのシンボルを示します。1 の値は消去されたビットを示します。受信するデータ ストリームで消去する場合、復号化器は分岐メトリクスを更新しません。消去入力は、倍精度または logical の列ベクトルでなければなりません。消去ベクトルの長さは、入力データの長さと等しくなければなりません。

  • 0 (false) — System object は消去を行いません。

データ型: logical

出力のデータ型。"Full precision""Smallest unsigned integer""double""single""int8""uint8""int16""uint16""int32""uint32""logical" として指定します。

入力信号が整数データ型のとき、"Smallest unsigned integer" または "Full precision" モードでこのプロパティを使用するには Fixed-Point Designer™ ユーザー ライセンスがなければなりません。

状態メトリクスのデータ型。'Full precision' または 'Custom' として指定します。

このプロパティを 'Full precision' に設定すると、オブジェクトは状態メトリクスの固定小数点型を numerictype([],16) に設定します。

  • InputFormat プロパティを 'Hard' に設定した場合、入力データは列ベクトルでなければなりません。このベクトルは、語長 1 の符号なし固定小数点数 (fi オブジェクト) を構成して、固定小数点 Viterbi 復号化を有効にします。この入力 (0 または 1) に基づいて、オブジェクトは語長 L の符号なし整数を使用して内部分岐メトリクスを計算します。この場合、L はトレリス構造体で指定される出力ビットの数です。

  • InputFormat プロパティを 'Soft' に設定した場合、入力データは列ベクトルでなければなりません。このベクトルは、語長 N の符号なし固定小数点数 (fi オブジェクト) を構成します。この場合、N は、SoftInputWordLength プロパティで指定される軟判定ビットの数です。

System object を呼び出す場合、データ入力は 0 から 2N–1 の範囲の整数でなければなりません。このオブジェクトは、語長 L = (N + Nout – 1) の符号なし整数を使用して、内部分岐メトリクスを計算します。この場合、Nout はトレリス構造体で指定される出力ビットの数です。

依存関係

このプロパティを有効にするには、InputFormat プロパティを 'Hard' または 'Soft' に設定します。

状態メトリクスの固定小数点データ型。Auto の符号属性のスケーリングされていない numerictype (Fixed-Point Designer) オブジェクトとして指定します。

依存関係

このプロパティを有効にするには、StateMetricDataType プロパティを 'Custom' に設定します。

データ型: numeric

使用法

説明

decmsg = viterbidecoder(codeword) は、ビタビ アルゴリズムを使用して、畳み込み符号化されている入力データ codeword を復号化します。decmsg は復号化されたデータです。

decmsg = viterbidecoder(codeword,erasures) は、オブジェクトが消去する入力コードワードのシンボルを指定します。この構文を有効にするには、ErasuresInputPort プロパティを 1 (true) に設定します。

decmsg = viterbidecoder(codeword,resetstate) は、復号化器の内部状態をリセットするための入力を指定します。この構文を有効にするには、TerminationMethod プロパティを 'Continuous' に設定し、ResetInputPort プロパティを 1 (true) に設定します。

入力引数

すべて展開する

畳み込み符号化されたメッセージ。数値の列ベクトルとして指定します。codeword のデータ型と要素の値は、設定した InputFormat プロパティによって異なります。

InputFormat プロパティを 'Unquantized' に設定すると、[–1012, 1012] の範囲外の入力値はそれぞれ –1012 と 1012 にクリップされます。

畳み込み符号が 2N 個の出力シンボル候補のアルファベットを使用する場合、この入力ベクトルの長さは、ある正の整数 L に対して L × N でなければなりません。

データ型: double

コードワードの消去シンボル。バイナリ値ベクトルで指定します。erasures 内の要素は、double または logical データ型でなければなりません。erasures ベクトルの 1 の値は消去されたシンボルに対応し、0 の値は消去されていないシンボルに対応します。codeword の長さは erasures の長さに等しくなければなりません。

依存関係

この引数を有効にするには、ErasuresInputPort プロパティを 1 (true) に設定します。

復号化器の内部状態のリセット。数値あるいは logical 1 (true) または 0 (false) として指定します。

依存関係

この引数を有効にするには、TerminationMethod プロパティを 'Continuous' に設定し、ResetInputPort プロパティを true に設定します。

データ型: double | logical

出力引数

すべて展開する

復号化されたメッセージ。バイナリ値列ベクトルとして返されます。この出力ベクトルのデータ型は OutputDataType プロパティと同じです。

復号化されたデータが 2K 個の出力シンボル候補のアルファベットを使用する場合、この出力ベクトルの長さは L × K になります。

オブジェクト関数

オブジェクト関数を使用するには、System object を最初の入力引数として指定します。たとえば、obj という名前の System object のシステム リソースを解放するには、次の構文を使用します。

release(obj)

すべて展開する

stepSystem object のアルゴリズムの実行
releaseリソースを解放し、System object のプロパティ値と入力特性の変更を可能にします。
resetSystem object の内部状態のリセット

すべて折りたたむ

畳み込み符号化され、8 差動位相偏移変調 (DPSK) 変調されたビット ストリームを加法性ホワイト ガウス ノイズ (AWGN) チャネル経由で送信します。次に、ビタビ復号化器を使用して、変調されたビット ストリームの復調と復号化を行います。

必要な System object を作成します。

conEnc = comm.ConvolutionalEncoder;
modDPSK = comm.DPSKModulator('BitInput',true);
chan = comm.AWGNChannel('NoiseMethod','Signal to noise ratio (SNR)','SNR',10);
demodDPSK = comm.DPSKDemodulator('BitOutput',true);
vDec = comm.ViterbiDecoder('InputFormat','Hard');
error = comm.ErrorRate('ComputationDelay',3,'ReceiveDelay',34);

次の手順に従ってデータを処理します。

  1. ランダムなビットを生成します。

  2. データを畳み込み符号化します。

  3. DPSK 変調を適用します。

  4. AWGN チャネルを通して、変調された信号を渡します。

  5. ノイズを含む信号を復調します。

  6. ビタビ アルゴリズムを使用してデータを復号化します。

  7. 誤り統計を収集します。

for counter = 1:20
    data = randi([0 1],30,1);
    encodedData = conEnc(data);
    modSignal = modDPSK(encodedData);
    receivedSignal = chan(modSignal);
    demodSignal = demodDPSK(receivedSignal);
    receivedBits = vDec(demodSignal);
    errors = error(data,receivedBits);
end

誤り数を表示します。

errors(2)
ans = 3

定義されたパンクチャ パターンで畳み込み符号化器およびビタビ復号化器を使用し、ビットのシーケンスを符号化して復号化します。入力ビットと出力ビットが同一であることを確認します。

パンクチャ パターン行列を定義し、符号化器および復号化器 System object で使用するためにベクトル形式に変更します。

pPatternMat = [1 0 1;1 1 0];
pPatternVec = reshape(pPatternMat,6,1);

pPatternVec によってパンクチャ パターンを定義する、畳み込み符号化器およびビタビ復号化器を作成します。

conEnc = comm.ConvolutionalEncoder('PuncturePatternSource','Property','PuncturePattern',pPatternVec);
viDec = comm.ViterbiDecoder('InputFormat','Hard','PuncturePatternSource','Property', ...
        'PuncturePattern',pPatternVec);

適切な受信遅延を適用してエラー レート カウンターを作成します。

error = comm.ErrorRate('ReceiveDelay',viDec.TracebackDepth);

ランダム ビットのシーケンスを符号化し、符号化されたメッセージを復号化します。

dataIn = randi([0 1],600,1);
dataEncoded = conEnc(dataIn);
dataOut = viDec(dataEncoded);

出力データに誤りがないことを確認します。

errStats = error(dataIn,dataOut);
errStats(2)
ans = 0

詳細

すべて展開する

参照

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

[6] Moision, B. "A Truncation Depth Rule of Thumb for Convolutional Codes." In Information Theory and Applications Workshop (January 27 2008-February 1 2008, San Diego, California), 555-557. New York: IEEE, 2008.

拡張機能

バージョン履歴

R2012a で導入

すべて展開する