Main Content

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

comm.TurboDecoder

並列連結復号化スキームを使用した入力信号の復号化

説明

comm.TurboDecoder System object™ は、並列連結復号化スキームを使用して符号化された入力信号を復号化します。入力信号は通常、ベースバンド復調操作からの軟判定出力です。詳細については、並列連結畳み込み復号化スキームを参照してください。

並列連結復号化スキームを使用して入力信号を復号化するには、以下の手順に従います。

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

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

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

作成

説明

turbodec = comm.TurboDecoder は、ターボ符号化器 System object を作成します。このオブジェクトは、"事後" 確率 (APP) 構成復号化器を使用して、並列連結され、畳み込み符号化された入力データを繰り返し復号化します。

turbodec = comm.TurboDecoder(trellis,interlvrindices,numiter) は、それぞれ TrellisStructureInterleaverIndices、および numiter をもつターボ復号化器 System object を作成します。trellis 入力は TrellisStructure プロパティで記述されているように指定しなければなりません。interlvrindices 入力は InterleaverIndices プロパティで記述されているように指定しなければなりません。numiter 入力は NumIterations プロパティで記述されているように指定しなければなりません。

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

プロパティ

すべて展開する

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

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

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

データ型: char | string

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

依存関係

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

データ型: double

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

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

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

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

データ型: char | string

完全に符号化されたデータで使用されるビット順序およびパンクチャ用の入力インデックス。整数の列ベクトルとして指定します。このプロパティの長さは、入力データのベクトル codeword の長さと等しくなければなりません。

依存関係

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

データ型: double

復号化アルゴリズム。'True APP''Max*' または 'Max' として指定します。このプロパティを 'True APP' に設定すると、オブジェクトは真の APP 復号化を実装します。このプロパティを 'Max*' または 'Max' に設定すると、オブジェクトは近似を使用して、計算速度を上げます。詳細については、APP 復号化器を参照してください。

データ型: char | string

スケーリング ビット数。範囲 [0, 8] の整数として指定します。このプロパティは、計算中に精度が失われないように、構成復号化器が入力データのスケーリングに使用するビット数を設定します。構成復号化器は入力に 2 NumScalingBits を掛けて、同じ係数で事前出力を割ります。詳細については、APP 復号化器を参照してください。

依存関係

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

データ型: double

復号化の反復回数。正の整数として指定します。このプロパティは、オブジェクトへの各呼び出しに使用される復号化反復の回数を設定します。オブジェクトは、符号化されていない出力ビットの対数尤度比 (LLR) への更新を反復して提供します。オブジェクトの出力は最終 LLR 更新の硬判定出力です。

データ型: double

使用法

説明

decmsg = turbodec(codeword) は、トレリス構造体とインターリーバー インデックスで指定された並列連結畳み込み復号化スキームを使用して入力コードワードを復号化します。turbodec はバイナリ復号化されたデータを返します。詳細については、並列連結畳み込み復号化スキームを参照してください。

decmsg = turbodec(codeword,interlvrindices) はさらにインターリーバー インデックスを指定します。この構文を有効にするには、InterleaverIndicesSource プロパティを 'Input port' に設定します。インターリーバー インデックスは、復号化器で入力を並べ替えるために使用されるマッピングを定義します。

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

入力引数

すべて展開する

並列連結コードワード。長さ M の列ベクトルとして指定します。ここで、M は並列連結コードワードの長さです。

InterleaverIndicesSource'Input port' に設定した場合、このオブジェクトは可変サイズの入力を受け入れます。オブジェクトがロックされると、各入力チャネルのサイズは変更できますが、チャネルの数は変更できません。詳細については、Variable-Size Signal Support with System Objectsを参照してください。

このオブジェクトは可変サイズの入力を受け入れます。オブジェクトがロックされると、各入力チャネルのサイズは変更できますが、チャネルの数は変更できません。詳細については、Variable-Size Signal Support with System Objectsを参照してください。

データ型: double | single

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

調整可能: Yes

依存関係

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

データ型: double

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

依存関係

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

データ型: double

出力引数

すべて展開する

復号化されたメッセージ。長さ L のバイナリ列ベクトルとして返されます。ここで L は復号化された出力メッセージの長さです。この出力信号は、codeword 入力のデータ型と同じです。

オブジェクト関数

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

release(obj)

すべて展開する

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

すべて折りたたむ

ターボ符号化の OutputIndices プロパティを使用して出力インデックスを定義し、ターボ復号化の InputIndices プロパティを使用して入力インデックスを定義します。符号化率 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;

turboDec = comm.TurboDecoder('TrellisStructure',trellis);
turboDec.InterleaverIndices = intIndices;
turboDec.InputIndicesSource = 'Property';
turboDec.InputIndices = 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

rxMsg = turboDec(2*encMsg-1); % Decode

isequal(data, rxMsg)          % Compare bits with decoded bits
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;

turboDec = comm.TurboDecoder('TrellisStructure',trellis);
turboDec.InterleaverIndices = intIndices;
turboDec.InputIndicesSource = 'Property';
turboDec.InputIndices = 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

rxMsg = turboDec(2*encMsg-1); % Decode

isequal(data, rxMsg)          % Compare bits with decoded bits
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')

詳細

すべて展開する

参照

[1] 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).

[2] Viterbi, A.J. “An Intuitive Justification and a Simplified Implementation of the MAP Decoder for Convolutional Codes.” IEEE Journal on Selected Areas in Communications 16, no. 2 (February 1998): 260–64. https://doi.org/10.1109/49.661114.

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

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

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