Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

comm.TurboEncoder

並列連結符号化方式を使用した入力信号の符号化

説明

comm.TurboEncoder System object™ は、並列連結符号化スキームをバイナリ入力メッセージに適用します。この符号化スキームでは、2 つの同じ畳み込み符号化器を使用し、符号化されたデータ ビット ストリームの末尾に終了ビットを加えます。詳細は、並列連接畳み込み符号化スキーム を参照してください。

並列連結符号化スキームを使用してバイナリ入力メッセージを符号化するには、次の手順を実行します。

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

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

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

作成

説明

turboenc = comm.TurboEncoder は、ターボ符号化器 System object を作成します。このオブジェクトは、既定のオブジェクト構成を使用してターボ符号化を実行します。

turboenc = comm.TurboEncoder(Name,Value) は、1 つ以上の名前と値のペアを使用してプロパティを設定します。たとえば、comm.TurboEncoder('InterleaverIndicesSource','Input port') は、呼び出し時に System object に入力引数として提供されるインターリーバー インデックスを使用してターボ符号化器 System object を構成します。各プロパティ名を引用符で囲みます。

turboenc = comm.TurboEncoder(trellis,interlvrindices) は、それぞれ TrellisStructure プロパティと InterleaverIndices プロパティが trellisinterlvrindices に設定されているターボ符号化器 System object を作成します。trellis 入力は TrellisStructure プロパティで記述されているように指定しなければなりません。interlvrindices 入力は InterleaverIndices プロパティで記述されているように指定しなければなりません。

プロパティ

すべて展開する

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

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

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

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

メモ

ターボ符号化器の K は 1 でなければなりません。詳細は、符号化率 を参照してください。

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

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

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

データ型: double

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

データ型: double

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

データ型: double

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

データ型: double

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

データ型: double

データ型: struct

インターリーバー インデックスのソース。'Property' または 'Input port' として指定します。

  • このプロパティを 'Input port' に設定すると、オブジェクトは、オブジェクトを呼び出すときに設定された入力インターリーバー インデックスを使用して実行されます。インターリーバー インデックスとバイナリ入力メッセージのベクトル長と値は、オブジェクトを呼び出すたびに変更できます。

  • このプロパティを 'Property' に設定すると、オブジェクトは InterleaverIndices プロパティに指定したインターリーバー インデックスを使用します。

データ型: char | string

インターリーバー インデックス。整数の列ベクトルとして指定します。ベクトルの長さは L でなければなりません。L はバイナリ入力メッセージの長さです。ベクトルの各要素は、範囲 [1 L] の整数で一意でなければなりません。インターリーバー インデックスは、符号化器で入力ビットを並べ替えるために使用されるマッピングを定義します。

調整可能: Yes

依存関係

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

データ型: double

使用法

説明

codeword = turboenc(message) は、トレリス構造体とインターリーバー インデックスで指定された並列連結畳み込み符号化スキームを使用して入力メッセージを符号化します。turboenc はバイナリ符号化された符号語を返します。message および codeword は、数値、logical 値、および語長 1 の符号なし固定小数点値 (fi (Fixed-Point Designer) オブジェクト) の列ベクトルです。詳細は、並列連接畳み込み符号化スキーム を参照してください。

codeword = turboenc(message,interlvrindices) はさらにインターリーバー インデックスを指定します。interlvrindices は、繰り返される値のない、[1, L] の範囲内の整数を含む列ベクトルでなければなりません。L はバイナリ入力メッセージ message の長さです。この構文は InterleaverIndicesSource プロパティが 'Input port' に設定されている場合に適用されます。インターリーバー インデックスは、符号化器で入力ビットを並べ替えるために使用されるマッピングを定義します。

入力引数

すべて展開する

入力メッセージ。長さ L のバイナリ列ベクトルとして指定します。L は符号化されていない入力メッセージの長さです。

データ型: double | int8 | fi(data,0,1)

出力引数

すべて展開する

並列連結号語。長さ M のバイナリ列ベクトルとして返されます。ここで、M は並列連結符号語のビット数です。この出力のデータ型は、message 入力から継承されます。

データ型: double | int8 | fi(data,0,1)

オブジェクト関数

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

release(obj)

すべて展開する

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

すべて折りたたむ

次の図に表されているように、既定のトレリス構造体 poly2trellis(4,[13 15],13) で符号化率 1/3 のターボ符号化器構成を使用して、入力メッセージを符号化します。

64 ビットの入力メッセージの場合、符号化器からの符号語出力は 204 ビットです。最初の 192 ビット出力は、XkZk、および Zk としてインターレースされた 3 つの 64 ビット ストリームに対応しています。組織ビット ストリーム、Xk、およびパリティ ビット ストリーム Zk は最初の符号化器からのもので、パリティ ビット ストリーム Zk は、2 つ目の符号化器からのものです。スイッチが低い位置にある場合、信号は破線をたどり、最後の 12 ビットは 2 つの符号化器からのテール ビットに対応します。6 ビット (3 組織的ビットと 3 パリティ ビット) の 1 番目のグループは、1 番目の構成符号化器からの出力テール ビットです。6 ビット (3 組織的ビットと 3 パリティ ビット) の 2 番目のグループは、2 番目の構成符号化器からの出力テール ビットです。

既定の設定を使用してターボ符号化器を作成します。バイナリ メッセージ データのフレームを生成してから、メッセージ データを符号化します。

rng default
turboenc = comm.TurboEncoder;
frameLen = 64; % Frame length
data = randi([0 1],frameLen,1);
encData = turboenc(data);
codewordLen = length(encData);

符号化率を計算します。テール ビットのため、符号化器出力符号化率は 1/3 より少し低くなっています。

codingrate = frameLen/codewordLen
codingrate = 0.3137

AWGN チャネル上での BPSK データの送受信を、ターボ符号化および復号化を使用してシミュレートします。

シミュレーション パラメーターを指定してから、有効な符号化率とノイズ分散を計算します。BPSK 変調の場合、シンボルあたりのビット数 (bps) が 1 のため、ES/N0Eb/N0 と等価になります。他の変調方式でのこの符号の再利用を容易にするために、この例の計算には bps 項が含まれています。パケット長、トレリス構造体、および反復回数を定義します。ES/N0 および符号化率を使用してノイズ分散を計算します。結果が繰り返し再現されるように、乱数発生器を既定の状態に設定します。

modOrd = 2; % Modulation order
bps = log2(modOrd); % Bits per symbol
EbNo = 1; % Energy per bit to noise power spectral density ratio in dB
EsNo = EbNo + 10*log10(bps); % Energy per symbol to noise power spectral density ratio in dB

L = 256; % Input packet length in bits
trellis = poly2trellis(4,[13 15 17],13);
numiter = 4;
n = log2(trellis.numOutputSymbols);
numTails = log2(trellis.numStates)*n;
M = L*(2*n - 1) + 2*numTails; % Output codeword packet length
rate = L/M; % Coding rate

snrdB = EsNo + 10*log10(rate); % Signal to noise ratio in dB
noiseVar = 1./(10.^(snrdB/10)); % Noise variance

rng default

ランダムなインターリーバー インデックスを生成します。

intrlvrIndices = randperm(L);

ターボ符号化器および復号化器のペアを作成します。定義されたトレリス構造体とランダムなインターリーバー インデックスを使用します。最大 4 回の反復を実行するように復号化器を構成します。

turboenc = comm.TurboEncoder(trellis,intrlvrIndices);
turbodec = comm.TurboDecoder(trellis,intrlvrIndices,numiter);

BPSK 変調器と復調器のペアを作成し、復調器が LLR 法を使用して判定される軟ビットを出力するようにします。

bpskmod = comm.BPSKModulator;
bpskdemod = comm.BPSKDemodulator('DecisionMethod','Log-likelihood ratio', ...
    'Variance',noiseVar);

AWGN チャネル オブジェクトと誤り率オブジェクトを作成します。

awgnchan = comm.AWGNChannel('NoiseMethod','Variance','Variance',noiseVar);
errrate = comm.ErrorRate;

主処理ループは以下のステップを実行します。

  1. バイナリ データを生成します。

  2. データをターボ符号化します。

  3. 符号化したデータを変調します。

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

  5. LLR を使用して軟ビットを出力し、ノイズの多い信号を復調します。

  6. 復調されたデータをターボ復号化する。復調器からのビット マッピングはターボ復号化器が想定するマッピングとは逆であるため、復号化器の入力は復調信号の逆数を使用しなければなりません。

  7. 誤り統計を計算します。

for frmIdx = 1:100
    data = randi([0 1],L,1);
    encodedData = turboenc(data);
    modSignal = bpskmod(encodedData);
    receivedSignal = awgnchan(modSignal);
    demodSignal = bpskdemod(receivedSignal);
    receivedBits = turbodec(-demodSignal);
    errorStats = errrate(data,receivedBits);
end

誤りデータを表示します。

fprintf('Bit error rate = %5.2e\nNumber of errors = %d\nTotal bits = %d\n', errorStats)
Bit error rate = 2.34e-04
Number of errors = 6
Total bits = 25600

AWGN チャネルで 16-QAM 信号とターボ符号を使用してエンド ツー エンド通信リンクをシミュレートします。フレーム処理ループ内で、パケット サイズは 500 ビット、1000 ビットまたは 1500 ビットにランダムに選択されます。パケット サイズが変化するため、ターボ符号化器および復号化器に、関連付けられた System object の入力引数としてインターリーバー インデックスが提供されます。

変調次数および Eb/N0 を設定します。変調次数および Eb/N0 に基づいて、シンボルあたりのビット数とシンボルあたりのエネルギー対ノイズ比 (ES/N0) を計算します。繰り返し可能な結果を取得するには、乱数発生器を既定の状態に設定します。

modOrder = 16;
bps = log2(modOrder); % Bits per symbol
EbNo = 2.8; % Energy per bit to noise power spectral density ratio in dB
EsNo = EbNo + 10*log10(bps); % Energy per symbol to noise power spectral density ratio in dB
rng default

ターボ符号化器および復号化器のペアを作成します。パケット長はフレームごとに異なるため、インターリーバー インデックスが、実行時に System object の入力引数により提供されるように指定します。復号化器が反復を 4 回実行するように指定します。

turboEnc = comm.TurboEncoder('InterleaverIndicesSource','Input port');
turboDec = comm.TurboDecoder('InterleaverIndicesSource','Input port','NumIterations',4);
trellis = poly2trellis(4,[13 15 17],13);
n = log2(turboEnc.TrellisStructure.numOutputSymbols);
numTails = log2(turboEnc.TrellisStructure.numStates)*n;

誤り率オブジェクトを作成します。

errRate = comm.ErrorRate;

フレーム処理ループは以下のステップを実行します。

  1. ランダムなパケット長を選択し、ランダムなバイナリ データを生成します。

  2. 出力符号語長と符号化率を計算します。

  3. S/N 比 (SNR) とノイズ分散を計算します。

  4. インターリーバー インデックスを生成します。

  5. データをターボ符号化します。

  6. 16-QAM 変調を適用して、平均信号強度を正規化します。

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

  8. LLR 手法を使用してノイズを含む信号を復調し、軟ビットを出力して、平均信号強度を正規化します。

  9. データをターボ復号化します。復調器からのビット マッピング次数はターボ復号化器が想定するマッピング次数とは逆であるため、復号化器の入力は復調信号の逆数を使用しなければなりません。

  10. 誤り統計を計算します。

numFrames = 100;
for pktIdx = 1:numFrames
    L = 500*randi([1 3],1,1); % Packet length in bits
    data = randi([0 1],L,1);

    M = L*(2*n - 1) + 2*numTails; % Output codeword packet length
    rate = L/M; % Coding rate for current packet
    snrdB = EsNo + 10*log10(rate); % Signal to noise ratio in dB
    noiseVar = 1./(10.^(snrdB/10)); % Noise variance
    
    intrlvrIndices = randperm(L);
    encodedData = turboEnc(data,intrlvrIndices);
    modSignal = qammod(encodedData,modOrder,'InputType','bit','UnitAveragePower',true);
    receivedSignal = awgn(modSignal,snrdB);
    demodSignal = qamdemod(receivedSignal,modOrder,'OutputType','llr', ...
        'UnitAveragePower',true,'NoiseVariance',noiseVar);
    receivedBits = turboDec(-demodSignal,intrlvrIndices); % Demodulated signal is negated
    
    errorStats = errRate(data,receivedBits);
end

誤りデータを表示します。

fprintf('Bit error rate = %5.2e\nNumber of errors = %d\nTotal bits = %d\n',errorStats)
Bit error rate = 8.51e-04
Number of errors = 80
Total bits = 94000

詳細

すべて展開する

参照

[1] Berrou, C., A. Glavieux, and P. Thitimajshima. “Near Shannon Limit Error-Correcting Coding and Decoding: Turbo-Codes.” Proceedings of ICC 93 - IEEE International Conference on Communications, Geneva, Switzerland, May 1993, 1064–70. https://doi.org/10.1109/icc.1993.397441.

[2] Benedetto, S., G. Montorsi, D. Divsalar, and F. Pollara. "A Soft-Input Soft-Output Maximum A Posterior (MAP) Module to Decode Parallel and Serial Concatenated Codes." Jet Propulsion Lab TDA Progress Report, 42–127, (November 1996).

[3] Schlegel, Christian, and Lance Perez. Trellis and Turbo Coding. IEEE Press Series on Digital & Mobile Communication. Piscataway, NJ ; Hoboken, NJ: IEEE Press ; Wiley-Interscience, 2004.

[4] 3GPP TS 36.212. "Multiplexing and channel coding." 3rd Generation Partnership Project; Technical Specification Group Radio Access Network; Evolved Universal Terrestrial Radio Access (E-UTRA). https://www.3gpp.org.

拡張機能

R2012a で導入