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 は入力ビット ストリームの数です。

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

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

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

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

データ型: struct

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

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

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

データ型: char | string

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

調整可能: Yes

依存関係

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

データ型: double

出力インデックスのソース。'Auto''Property' または 'Input port' として指定します。

  • このプロパティを 'Auto' に設定すると、オブジェクトは 2 番目の組織ストリームをパンクチャしてすべてのテール ビットを含む出力インデックスを計算します。

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

  • このプロパティを 'Input port' に設定すると、オブジェクトは、入力引数 outindices で指定された出力インデックスを使用して実行されます。出力インデックスのベクトル長と値、および符号化された出力信号は、オブジェクトを呼び出すたびに変更できます。

データ型: char | string

完全に符号化されたデータで使用されるビット順序およびパンクチャ用の出力インデックス。整数の列ベクトルとして指定します。符号化器からの出力ビット数は、このプロパティの長さと等しくなります。最大長は、完全に符号化された長さ (L+mLen) × N × 2 を超えてはなりません。ここで、L は入力ブロックの長さ、mLen はメモリの長さ、N は構成符号化器で符号化されたストリームの数です。

依存関係

このプロパティを有効にするには、OutputIndicesSource プロパティを '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' に設定されている場合に適用されます。インターリーバー インデックスは、符号化器で入力ビットを並べ替えるために使用されるマッピングを定義します。

codeword = turboenc(message,interlvrindices,outindices) はさらに、メッセージ データを符号化するときに使用されるビット順序およびパンクチャを指定します。この構文を有効にするには、OutputIndicesSource プロパティを 'Input port' に設定します。出力インデックス ベクトルの値は、すべてのストリームのテール ビットを含む、符号化方式に応じて完全に符号化されたデータを基準とする必要があります。

入力引数

すべて展開する

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

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

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

依存関係

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

データ型: double

完全に符号化されたデータで使用されるビット順序およびパンクチャ用の出力インデックス。整数の列ベクトルとして指定します。outindices ベクトルの要素の値は、すべてのストリームのテール ビットを含む、符号化方式に応じて完全に符号化されたデータを基準とする必要があります。

依存関係

この引数を有効にするには、OutputIndicesSource プロパティを 'Input port' に設定します。

データ型: double

出力引数

すべて展開する

並列連結号語。長さ 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

OutputIndices プロパティを使用して出力インデックスを定義します。符号化率 1/2 の符号および 10 ビットのブロック長で、フルレングス符号化された出力およびパンクチャド符号化された出力を示します。

パラメーターの初期化

符号化器を初期化するパラメーターを定義します。

blkLen = 10;
trellis = poly2trellis(4,[13 15],13);
n = log2(trellis.numOutputSymbols);
mLen = log2(trellis.numStates);

フルレングス符号化された出力

フルレングス符号化用に、変数およびターボ符号化器 System object を初期化します。ターボ符号化率を表示します。出力インデックス ベクトルの長さに対して、符号化された出力の長さをチェックします。

fullOut = (1:(mLen+blkLen)*2*n)';
outLen = length(fullOut);
netRate = blkLen/outLen;
data = randi([0 1],blkLen,1);
intIndices  = randperm(blkLen);

turboEnc = comm.TurboEncoder('TrellisStructure',trellis);
turboEnc.InterleaverIndices = intIndices;
turboEnc.OutputIndicesSource = 'Property';
turboEnc.OutputIndices = fullOut;

encMsg = turboEnc(data);   % Encode

disp(['Turbo coding rate: ' num2str(netRate)])
Turbo coding rate: 0.19231
encOutLen = length(encMsg) % Display encoded length
encOutLen = 52
isequal(encOutLen,outLen)  % Check lengths
ans = logical
   1

パンクチャド符号化された出力

関数 getTurboIOIndices を使用して、2 番目の組織ストリームをパンクチャする出力インデックスを指定します。パンクチャド符号化用に、変数およびターボ符号化器 System object を初期化します。ターボ符号化率を表示します。出力インデックス ベクトルの長さに対して、符号化された出力の長さをチェックします。

puncOut = getTurboIOIndices(blkLen,n,mLen);
outLen = length(puncOut);
netRate = blkLen/outLen;
data = randi([0 1],blkLen,1);
intIndices  = randperm(blkLen);

turboEnc = comm.TurboEncoder('TrellisStructure',trellis);
turboEnc.InterleaverIndices = intIndices;
turboEnc.OutputIndicesSource = 'Property';
turboEnc.OutputIndices = puncOut;

encMsg = turboEnc(data);   % Encode

disp(['Turbo coding rate: ' num2str(netRate)])
Turbo coding rate: 0.25641
encOutLen = length(encMsg) % Display encoded length
encOutLen = 39
isequal(encOutLen, outLen) % Check lengths
ans = logical
   1

完全な出力とパンクチャされた出力の比較

符号化器の出力は、個々のビット ストリームをインターレースします。4 ビット組ごとに 3 番目のビットがフルレングスの符号から削除され、パンクチャド符号を生成します。この 3 番目の出力ビット ストリームは、2 番目の組織ビット ストリームに対応しています。フルレングス符号のインデックスおよびパンクチャド符号のインデックスを表示し、4 ビット組ごとに 3 番目のビットがパンクチャされていることを示します。

fullOut'
ans = 1×52

     1     2     3     4     5     6     7     8     9    10    11    12    13    14    15    16    17    18    19    20    21    22    23    24    25    26    27    28    29    30    31    32    33    34    35    36    37    38    39    40    41    42    43    44    45    46    47    48    49    50

puncOut'
ans = 1×39

     1     2     4     5     6     8     9    10    12    13    14    16    17    18    20    21    22    24    25    26    28    29    30    32    33    34    36    37    38    40    41    42    44    45    46    48    49    50    52

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;               % Modulation order
bps = log2(modOrder);        % Bits per symbol
EbNo = (2:0.5:4);            % 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(1963);

ターボ符号化器および復号化器のペアを作成します。パケット長はフレームごとに異なるため、インターリーバー インデックスが、実行時に 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. 誤り統計を計算します。

ber = zeros(1,length(EbNo));
for k = 1:length(EbNo)
    % numFrames = 100;
    errorStats = zeros(1,3);
    %for pktIdx = 1:numFrames
    L = 500*randi([1 3],1,1);         % Packet length in bits
    M = L*(2*n - 1) + 2*numTails;     % Output codeword packet length
    rate = L/M;                       % Coding rate for current packet
    snrdB = EsNo(k) + 10*log10(rate); % Signal to noise ratio in dB
    noiseVar = 1./(10.^(snrdB/10));   % Noise variance
    
    while errorStats(2) < 100 && errorStats(3) < 1e7
        data = randi([0 1],L,1);
        intrlvrIndices = randperm(L);
        encodedData = turboEnc(data,intrlvrIndices);
        modSignal = qammod(encodedData,modOrder, ...
            'InputType','bit','UnitAveragePower',true);
        rxSignal = awgn(modSignal,snrdB);
        demodSignal = qamdemod(rxSignal,modOrder,'OutputType','llr', ...
            'UnitAveragePower',true,'NoiseVariance',noiseVar);
        rxBits = turboDec(-demodSignal,intrlvrIndices); % Demodulated signal is negated
        errorStats = errRate(data,rxBits);
    end
    % Save the BER data and reset the bit error rate object
    ber(k) = errorStats(1);
    reset(errRate)
end

結果のプロット

ビット エラー レートをプロットし、符号化されていないビット エラー レートと比較します。

semilogy(EbNo,ber,'-o')
grid
xlabel('Eb/No (dB)')
ylabel('Bit Error Rate')
uncodedBER = berawgn(EbNo,'qam',modOrder); % Estimate of uncoded BER
hold on
semilogy(EbNo,uncodedBER)
legend('Turbo','Uncoded','location','sw')

Figure contains an axes object. The axes object with xlabel Eb/No (dB), ylabel Bit Error Rate contains 2 objects of type line. These objects represent Turbo, Uncoded.

詳細

すべて展開する

参照

[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 で導入