Main Content

このページは前リリースの情報です。該当の英語のページはこのリリースで削除されています。

インターリーブ

ブロック インターリーブ

ブロック インターリーブ機能

ブロック インターリーバーは、セット内のシンボルを繰り返したり省略したりせずに、一連のシンボルを受け取り、再配置します。各セット内のシンボルの数は、与えられたインターリーバーに対して固定されています。一連のシンボルに対するインターリーバーの操作は、他のすべてのセット内のシンボルに対する操作とは無関係です。

インターリーバーは、マッピングに従いシンボルの順序を変えます。対応するデインターリーバーは、逆マッピングを使用して元のシンボル シーケンスを復元します。インターリーブとデインターリーブは、通信システムでのバースト エラーによって引き起こされる誤りを減らすのに役立ちます。

各インターリーバー関数には、対応するデインターリーバー関数があります。インターリーバー/デインターリーバーの組の標準的な利用では、データが再配置されることを除き、デインターリーバーの入力はインターリーバーの入力に一致します。

ブロック インターリーバーは、セット内のシンボルを繰り返したり省略したりせずに、一連のシンボルを受け取り、再配置します。各セット内のシンボルの数は、与えられたインターリーバーに対して固定されています。

このツールボックスのブロック インターリーバーのセットには、いくつかの特別な場合と同様に、一般ブロック インターリーバーが含まれています。特別な場合の各インターリーバー関数は、一般ブロック インターリーバー関数が使用するものと同じ計算コードを使用しますが、特別な場合により適した構文を提供します。インターリーバー関数を、次に説明します。

インターリーバーのタイプインターリーバーの機能説明
一般ブロック インターリーバーintrlv入力引数として明示的に指定された置換テーブルを使用します。
代数インターリーバーalgintrlvTakeshita-Costello 法または Welch-Costas 法を使用して、置換テーブルを代数的に導出します。これらの手法の詳細は、[4]を参照してください。
ヘリカル スキャン インターリーバーhelscanintrlv行列に対して行ごとにデータを入力してから、行列の内容をらせん状に出力に送ります。
行列インターリーバーmatintrlv行列に対して行ごとにデータ要素を入力してから、行列の内容を列ごとに出力に送ります。
ランダム インターリーバーrandintrlv入力した初期状態の入力を使用して置換テーブルをランダムに選択します。

ブロック インターリーバーのタイプ-  このライブラリのブロック インターリーバーのセットには、いくつかの特別な場合と同様に、一般的なインターリーバー/デインターリーバーがあります。特定の場合の各ブロックは、対応するより一般的なブロックが使用するものと同じ計算コードを使用しますが、特定の場合に適したインターフェイスを提供します。

Matrix Interleaver ブロックは、行列に行ごとに入力シンボルを埋め、行列の内容を列ごとに出力端子に送り、ブロック インターリーブを実行します。たとえば、インターリーバーが 2 行 3 列の行列を使用して内部計算を行う場合、ブロックは [1 2 3 4 5 6] の入力に対し、[1 4 2 5 3 6] の出力を生成します。

Random Interleaver ブロックは、ブロック マスクで指定した [Initial seed] パラメーターを使用して置換テーブルをランダムに選択します。同じ [Initial seed] 値を対応する Random Deinterleaver ブロックで使用すると、並べ替えられたシンボルを元の順序に戻すことができます。

Algebraic Interleaver ブロックは代数的に求めた置換テーブルを使用します。このブロックは、Takeshita-Costello インターリーバーと Welch-Costas インターリーバーをサポートします。これらのインターリーバーの詳細は、[4]を参照してください。

MATLAB でブロック インターリーバーを使用した誤り率の改善

次の例では、チャネルがバースト エラーを生成する通信システムの誤り率をインターリーバーがどのように改善するかを説明します。ランダム インターリーバーは、2 つの隣り合った符号語それぞれに 3 つのエラーによる誤りが生じる前に、多数の符号語のビットを再配置します。

エラーが 3 つあると、ハミング符号の誤り訂正能力を越えます。ただし、例は、ハミング符号をインターリーバーと組み合わせると、このシステムは 6 ビットのバースト エラーにもかかわらず元のメッセージを復元できることを示しています。符号語あたりの誤り数が符号の誤り訂正能力内になるように、インターリーブは異なる符号語間で効果的に誤りを分散させるので、パフォーマンスが改善されます。

st1 = 27221; st2 = 4831; % States for random number generator
n = 7; k = 4; % Parameters for Hamming code
msg = randi([0 1],k*500,1); % Data to encode
code = encode(msg,n,k,'hamming/binary'); % Encoded data
% Create a burst error that will corrupt two adjacent codewords.
errors = zeros(size(code)); errors(n-2:n+3) = [1 1 1 1 1 1];

% With Interleaving
%------------------
inter = randintrlv(code,st2); % Interleave.
inter_err = bitxor(inter,errors); % Include burst error.
deinter = randdeintrlv(inter_err,st2); % Deinterleave.
decoded = decode(deinter,n,k,'hamming/binary'); % Decode.
disp('Number of errors and error rate, with interleaving:');
[number_with,rate_with] = biterr(msg,decoded) % Error statistics

% Without Interleaving
%---------------------
code_err = bitxor(code,errors); % Include burst error.
decoded = decode(code_err,n,k,'hamming/binary'); % Decode.
disp('Number of errors and error rate, without interleaving:');
[number_without,rate_without] = biterr(msg,decoded) % Error statistics

例からの出力は以下のようになります。

Number of errors and error rate, with interleaving:

number_with =

     0


rate_with =

     0

Number of errors and error rate, without interleaving:

number_without =

     4


rate_without =

    0.0020

Simulink でブロック インターリーバーを使用した誤り率の改善

次の例では、インターリーバーを使用してチャネルがバースト エラーを生成するときの誤り率を改善する方法を説明します。

モデルを実行する前に、Simulink でブロック インターリーバーを使用した誤り率の改善で説明されているように、バースト エラーをシミュレートするバイナリ ベクトルを作成しなければなりません。Signal From Workspace ブロックはこのベクトルを MATLAB ワークスペースからモデルにインポートし、ここで、Logical Operator ブロックは信号を使用してベクトルの XOR を実行します。

完成したモデルを開くには、MATLAB® コマンド ラインに doc_interleaver と入力します。モデルを作成するには、次のブロックを収集し、設定します。

  • Bernoulli Binary Generator、Comm Sources ライブラリの Random Data Sources サブライブラリ内

    • [Frame-based outputs] の隣にあるボックスをオンにします。

    • [Samples per frame]4 に設定します。

  • Error Detection および Correction ライブラリの Block サブライブラリの Hamming Encoder。既定のパラメーターを使用します。

  • DSP System Toolbox™ の Signal Management ライブラリの Buffers サブライブラリ内の Buffer

    • [Output buffer size (per channel)]84 に設定します。

  • Communications Toolbox™ の Interleaving ライブラリの Block サブライブラリ内の Random Interleaver

    • [Number of elements]84 に設定します。

  • Simulink Math Operations ライブラリの Logical Operator (Simulink)

    • [Operator][XOR] に設定します。

  • DSP System Toolbox 製品の Sources ライブラリの Signal From Workspace

    • [Signal]errors に設定します。

    • [Sample time]4/7 に設定します。

    • [Samples per frame]84 に設定します。

  • Communications Toolbox の Interleaving ライブラリの Block サブライブラリ内の Random Deinterleaver

    • [Number of elements]84 に設定します。

  • DSP System Toolbox の Signal Management ライブラリの Buffers サブライブラリ内の Buffer

    • [Output buffer size (per channel)]7 に設定します。

  • Error Detection および Correction ライブラリの Block サブライブラリの Hamming Decoder。既定のパラメーターを使用します。

  • Comm Sinks ライブラリの Error Rate Calculation

    • [Receive delay](4/7)*84 に設定します。

    • [Computation delay]100 に設定します。

    • [Output data][Port] に設定します。

  • Simulink Sinks ライブラリの Display (Simulink)既定のパラメーターを使用します。

[シミュレーション] タブの [シミュレーション] セクションで、[終了時間]length(errors) に設定します。[シミュレーション] セクションは複数のタブに表示されます。

誤差のベクトルの作成-  モデルを実行する前に、次のコードを使用して MATLAB ワークスペースでバイナリ ベクトルを作成します。モデルはこのベクトルを使用して、バースト エラーをシミュレートします。ベクトルには 3 つの 1 で構成されるブロックが含まれており、それぞれがランダムな間隔でのバースト エラーを表しています。1 で構成される 2 つの連続したブロック間の距離は、1 ~ 80 までの整数乱数です。

errors=zeros(1,10^4);
n=1;
while n<10^4-80;
n=n+floor(79*rand(1))+3;
errors(n:n+2)=[1 1 1];
end

ベクトル errors 内のシンボル総数に対する 1 の数の割合を特定するには、以下を入力します。

sum(errors)/length(errors)

正しい割合は約 3/43 または 0.0698 になります。これは、3 つの 1 で構成される各シーケンスの後、1 で構成される次のシーケンスまでの予想距離が 40 になるためです。この結果、43 個のシーケンスの項で 3 つの 1 が予想されます。モデルに誤り訂正がない場合は、ビット誤り率はおよそ .0698 になります。

モデルでシミュレーションを実行すると、誤り訂正とインターリーブによって、誤り率はおよそ .019 となり改善されます。Random Interleaver および Random Deinterleaver ブロックをモデルから削除し、ラインを接続し、別のシミュレーションを実行すると、インターリーブの効果を確認できます。ハミング符号は各符号語で 1 つの誤りしか訂正できないため、ビット誤り率はインターリーブを使用しないと高くなります。

畳み込みインターリーブ

畳み込みインターリーブ機能

畳み込みインターリーバーは、それぞれが一定の遅延をもつ、一連のシフト レジスタで構成されます。一般多重インターリーバーは遅延の値が制限されませんが、標準的な畳み込みインターリーバーの遅延は、一定の整数の非負整数倍です。入力ベクトルからの新しいシンボルはそれぞれ、次のシフト レジスタに入力され、そのレジスタ内の最も古いシンボルは出力ベクトルの一部になります。畳み込みインターリーバーにはメモリがあります。つまり、その操作は、現在のシンボルのみでなく前のシンボルにも依存します。

下図は、シフト レジスタのセットとそれらの遅延の値 D(1), D(2),..., D(N) を示すことによって、一般畳み込みインターリーバーの構造を表します。k 番目のシフト レジスタは、D(k) 個のシンボルを保持します。ここで、k = 1,2,...,N です。このツールボックスの畳み込みインターリーブ関数は、シフト レジスタの番号と各シフト レジスタに対する遅延を表す入力引数をもちます。

Communications Toolbox は、Simulink® ブロック、System オブジェクト、および関数 MATLAB を使用して畳み込みインターリーブ機能を実装します。

この製品の畳み込みインターリーバーのセットには、いくつかの特別な場合と同様に、一般的なインターリーバー/デインターリーバーがあります。特定の場合の各関数は、対応するより一般的な関数が使用するものと同じ計算コードを使用しますが、特定の場合に適した構文を提供します。特定の場合を次に説明します。

インターリーバーのタイプインターリーブ関数説明
一般多重インターリーバーmuxintrlvシフト レジスタのセットに対して制限のない遅延値を使用できます。
畳み込みインターリーバーconvintrlvシフト レジスタのセットに対する遅延値は、指定した一定の整数の非負整数倍です。
ヘリカル インターリーバーhelintrlvらせん状に配列に入力シンボルを入力し、行ごとに配列を空にします。

関数 helscanintrlv および helintrlv は、いずれも内部的な計算に対してヘリカル配列を使用します。ただし、2 つの関数には重要な違いがあります。

  • helintrlv は、行に制限のない配列を使用し、列に沿って配列に入力シンボルを配置します。現在の入力からのものではないシンボルをいくつか出力し、入力シンボルの一部を出力に含めずに配列に残します。

  • helscanintrlv は、固定サイズの行列を使用し、配列の各行で入力シンボルを配置して、既定値または前の呼び出しからの値を使用せずに、すべての入力シンボルを出力します。

畳み込みインターリーバーのタイプ-  このライブラリの畳み込みインターリーバーのセットには、いくつかの特別な場合と同様に、一般的なインターリーバー/デインターリーバーがあります。特定の場合の各ブロックは、対応するより一般的なブロックが使用するものと同じ計算コードを使用しますが、特定の場合に適したインターフェイスを提供します。

このライブラリで最も一般的なブロックは General Multiplexed Interleaver ブロックです。このブロックでは、シフト レジスタのセットに対して任意の遅延値を指定できます。このブロックを使用して前の回路図を実装するには、[D(1); D(2); ...; D(N)] の [Interleaver delay] パラメーターを使用します。

より具体的には Convolutional Interleaver ブロックを使用します。このブロック内では、k 番目のシフト レジスタの遅延値はブロックの [Register length step] パラメーターの (k-1) 倍になります。このブロック内のシフト レジスタの数は、[Rows of shift registers] パラメーターの値です。

最後に、Helical Interleaver ブロックはらせん状に配列にシンボルを入力し、行ごとに配列を空にする特殊な畳み込みインターリーブをサポートします。インターリーバーを設定するには、[Number of columns of helical array] パラメーターを使用して配列の幅を設定し、[Group size][Helical array step size] パラメーターを使用してシンボルが配列でどのように配置されるかを特定します。詳細と例は、Helical Interleaver ブロックのリファレンス ページを参照してください。

畳み込みインターリーバーの遅延

シンボルのシーケンスが畳み込みインターリーバーと対応する畳み込みデインターリーバーを通過した後、復元されたシーケンスは元のシーケンスより遅れます。次の表は、シンボルで測定される元のシーケンスと復元されたシーケンスの間の遅延をまとめています。2 番目の列の変数名 (delaynrowsslopecolngrp、および stp) は、各関数のリファレンス ページに示されている入力を参照します。

インターリーバー/デインターリーバー ペアの遅延

インターリーバー/デインターリーバー ペア元のシーケンスと復元されたシーケンスの間の遅延
muxintrlvmuxdeintrlvlength(delay)*max(delay)
convintrlvconvdeintrlvnrows*(nrows-1)*slope
helintrlvheldeintrlvcol*ngrp*ceil(stp*(col-1)/ngrp)

畳み込みインターリーバーの遅延-  シンボルのシーケンスが畳み込みインターリーバーと対応する畳み込みデインターリーバーを通過した後、復元されたシーケンスは元のシーケンスより遅れます。一般多重インターリーバーのほとんどでは、シンボルで測定される元のシーケンスと復元されたシーケンスの間の遅延は次の式で表されます。

シフト レジスタ数 × すべてのシフト レジスタ間の最大遅延

モデルのインターリーバー出力とデインターリーバー入力間で追加の遅延が発生した場合は、復元されたシーケンスは、追加の遅延と上述の式による遅延を足した分だけ元のシーケンスより遅れます。

メモ:

同期が正しく行われるためには、モデルのインターリーバー出力とデインターリーバー入力間の遅延は、シフト レジスタ数の整数倍でなければなりません。DSP System Toolbox Delay ブロックを使用すると、必要に応じて遅延を手動で調整できます。

Convolutional Interleaver ブロック

Convolutional Interleaver/Convolutional Deinterleaver のペアによって実装される特殊なケースでは、シフト レジスタの数は [Rows of shift registers] パラメーターですが、すべてのシフト レジスタ間の最大遅延は、次の式で表されます。

B × (N-1)

ここで、B は [Register length step] パラメーターで、N は [Rows of shift registers] パラメーターです。

Helical Interleaver ブロック

Helical Interleaver/Helical Deinterleaver のペアで実装される特殊なケースでは、復元されたシーケンスと元のシーケンス間の遅延は、次の式で表されます。

CNs(C1)N

ここで、C[Number of columns in helical array] パラメーター、N[Group size] パラメーター、s[Helical array step size] パラメーターです。

MATLAB を使用して畳み込みインターリーブされたデータの再生に対する遅延の影響-  畳み込みインターリーバーの後に対応する畳み込みデインターリーバーを使用する場合、遅延がゼロでないことは、復元されたデータ (つまり、デインターリーバーからの出力) が元のデータ (つまり、インターリーバーへの入力) と同じではないことを意味します。2 つのデータ セットを直接比較する場合、適切な切り捨てまたはパディング操作を行って遅延を考慮しなければなりません。

インターリーバー/デインターリーバーのペアで遅延 D を補正する標準的な方法がいくつかあります。

  • 元のデータの末尾に余分な D 個のシンボルを付加してインターリーブする。元のデータを復元されたデータと比較する前に、復元されたデータの最初の D 個のシンボルを省略する。この方法では、元のシンボルはすべて、復元されたデータに現れます。

  • 元のデータを復元されたデータと比較する前に、元のデータの最後の D 個のシンボルと、復元されたデータの最初の D 個のシンボルを省略する。この方法では、元のシンボルのいくつかは、デインターリーバーのシフト レジスタに残され、復元されたデータには現れません。

次のコードは、インターリーブ/デインターリーブ操作のシンボル誤り率を計算することによって、これらの方法を説明します。

x = randi([0 63],20,1); % Original data
nrows = 3; slope = 2; % Interleaver parameters
D = nrows*(nrows-1)*slope; % Delay of interleaver/deinterleaver pair
hInt   = comm.ConvolutionalInterleaver('NumRegisters', nrows, ...
                    'RegisterLengthStep', slope);
hDeint = comm.ConvolutionalDeinterleaver('NumRegisters', nrows, ...
                    'RegisterLengthStep', slope);

% First approach.
x_padded = [x; zeros(D,1)]; % Pad x at the end before interleaving.
a1 = step(hInt, x_padded); % Interleave padded data.

b1 = step(hDeint, a1)
% Omit input padding and the first D symbols of the recovered data and
% compare
servec1 = step(comm.ErrorRate('ReceiveDelay',D),x_padded,b1);
ser1 = servec1(1)

% Second approach.
release(hInt); release(hDeint)
a2 = step(hInt,x); % Interleave original data.
b2 = step(hDeint,a2)
% Omit the last D symbols of the original data and the first D symbols of
% the recovered data and compare.
servec2 = step(comm.ErrorRate('ReceiveDelay',D),x,b2);
ser2 = servec2(1)

出力は、以下のとおりです。ser1ser2 の値 0 は、シンボル誤り率を計算する前に、スクリプトが元のデータと復元されたデータを正しく並べることを示します。ただし、b1b2 の長さから、2 つの配置方法では、デインターリーブされたデータの長さが異なることに注意してください。

b1 =

     0
     0
     0
     0
     0
     0
     0
     0
     0
     0
     0
     0
    59
    42
     1
    28
    52
    54
    43
     8
    56
     5
    35
    37
    48
    17
    28
    62
    10
    31
    61
    39


ser1 =

     0


b2 =

     0
     0
     0
     0
     0
     0
     0
     0
     0
     0
     0
     0
    59
    42
     1
    28
    52
    54
    43
     8


ser2 =

     0

インターリーブ遅延と他の遅延を組み合わせる-  インターリーバー出力とデインターリーバー入力の間に、さらに遅延 d (たとえば、フィルターからの遅延) を引き起こすスクリプトで畳み込みインターリーバーを使用する場合、d と表インターリーバー/デインターリーバー ペアの遅延からの値の合計だけ、復元されたシーケンスは元のシーケンスより遅れます。この場合、d はシフト レジスタ数の整数倍でなければなりません。そうでない場合、畳み込みデインターリーバーは、元のシンボルを適切に復元できません。d がシフト レジスタ数の整数倍でない場合、デインターリーバーへの入力となるベクトルを付加することによって、遅延を手作業で調整できます。

MATLAB で連続した整数のシーケンスを使用した畳み込みインターリーブとデインターリーブ

下記の例は、連続した整数のシーケンスを使用した、畳み込みインターリーブとデインターリーブを説明します。また、インターリーバー/デインターリーバーのペアに固有の遅延も説明します。

x = [1:10]'; % Original data
delay = [0; 1; 2]; % Set delays of three shift registers.
hInt = comm.MultiplexedInterleaver('Delay', delay);
hDeint = comm.MultiplexedDeinterleaver('Delay', delay);
y = step(hInt,x) % Interleave.
z = step(hDeint,y) % Deinterleave.

この例では、関数 muxintrlv は、3 つのシフト レジスタをそれぞれ [][0]、および [0 0] の値に初期化します。その後、この関数は次の表に示すように内部的な計算を実行して、入力データ [1:10]' を処理します。

現在の入力現在のシフト レジスタ現在の出力シフト レジスタの内容
111
[]
[0]
[0 0]
220
[]
[2]
[0 0]
330
[]
[2]
[0 3]
414
[]
[2]
[0 3]
522
[]
[5]
[0 3]
630
[]
[5]
[3 6]
717
[]
[5]
[3 6]
825
[]
[8]
[3 6]
933
[]
[8]
[6 9]
10110
[]
[8]
[6 9]

例からの出力は以下のようになります。

y =

     1
     0
     0
     4
     2
     0
     7
     5
     3
    10


state_y =

    value: {3x1 cell}
    index: 2


z =

     0
     0
     0
     0
     0
     0
     1
     2
     3
     4

上の表の列 "現在の出力" は、ベクトル y の値と一致することに注意してください。さらに、上の表の最後の行は、与えられたデータ セットに対して処理された最後のシフト レジスタが 1 番目のシフト レジスタであることを示します。これは、state_y.index の値が 2 であることに合致し、追加された入力データが 2 番目のシフト レジスタに割り当てられることを示します。例を実行した後にコマンド ウィンドウで state_y.value と入力すると、state_y.value{:} にリストされた状態の値が表の最後の行の項目 "シフト レジスタの内容" に一致することを確認できます。

例の出力のその他の特徴として、z は元のデータ セットからのシンボルを含む前に先頭に 6 個の 0 を含むことに注意してください。6 個の 0 は、この畳み込みインターリーバー/デインターリーバーのペアの遅延が length(delay)*max(delay) = 3*2 = 6 であることを示します。遅延の詳細は、畳み込みインターリーバーの遅延を参照してください。

Simulink で連続した整数のシーケンスを使用した畳み込みインターリーブとデインターリーブ

下記の例は、連続した整数のシーケンスを使用した、畳み込みインターリーブとデインターリーブを説明します。また、インターリーブ ブロックの初期条件に固有の遅延および影響についても説明します。

モデルを開くには、MATLAB コマンド ラインに doc_convinterleaver と入力します。モデルを作成するには、次のブロックを収集し、設定します。

  • Simulink Sources ライブラリ内の Ramp (Simulink)既定のパラメーターを使用します。

  • Simulink Discrete ライブラリ内の Zero-Order Hold (Simulink)既定のパラメーターを使用します。

  • Convolutional Interleaver

    • [Rows of shift registers]3 に設定します。

    • [Initial conditions][-1 -2 -3]' に設定します。

  • Convolutional Deinterleaver

    • [Rows of shift registers]3 に設定します。

    • [Initial conditions][-1 -2 -3]' に設定します。

  • 2 点の To Workspace (Simulink)、Comm Sinks ライブラリ内

    • このブロックの 2 つのコピーで [変数名] をそれぞれ interleavedrestored に設定します。

    • このブロックの 2 つのコピーのそれぞれで [保存形式][配列] に設定します。

前の図に示したようにブロックを接続します。[シミュレーション] タブの [シミュレーション] セクションで、[終了時間]20 に設定します。[シミュレーション] セクションは複数のタブに表示されます。シミュレーションを実行し、次のコマンドを実行します。

comparison = [[0:20]', interleaved, restored]

comparison =

     0     0    -1
     1    -2    -2
     2    -3    -3
     3     3    -1
     4    -2    -2
     5    -3    -3
     6     6    -1
     7     1    -2
     8    -3    -3
     9     9    -1
    10     4    -2
    11    -3    -3
    12    12     0
    13     7     1
    14     2     2
    15    15     3
    16    10     4
    17     5     5
    18    18     6
    19    13     7
    20     8     8

この出力では、最初の列には元のシンボル シーケンスが含まれます。2 つ目の列には、インターリーブされたシーケンス、そして 3 つ目の列には復元されたシーケンスが含まれます。

インターリーブおよび復元されたシーケンスの負の数値は、元のデータではなくインターリーブ ブロックの初期条件から取得されたものです。元のシンボルの最初のシンボルは 12 シンボルの遅延の後でのみ復元されたシーケンスに含まれます。インターリーバー/デインターリーバーの組み合わせの遅延は、シフト レジスタ数 (3) とすべてのシフト レジスタ間の最大遅延 (4) の積です。

プロセスの各ステップでのシフト レジスタのコンテンツを示す同様な例は、MATLAB で連続した整数のシーケンスを使用した畳み込みインターリーブとデインターリーブを参照してください。

インターリーブの参考文献

[1] Berlekamp, E.R., and P. Tong, “Improved Interleavers for Algebraic Block Codes,” U. S. Patent 4559625, Dec. 17, 1985.

[2] Clark, George C. Jr., and J. Bibb Cain, Error-Correction Coding for Digital Communications, New York, Plenum Press, 1981.

[3] Forney, G. D. Jr., “Burst-Correcting Codes for the Classic Bursty Channel,” IEEE Transactions on Communications, vol. COM-19, October 1971, pp. 772-781.

[4] Heegard, Chris and Stephen B. Wicker, Turbo Coding, Boston, Kluwer Academic Publishers, 1999.

[5] Ramsey, J. L, “Realization of Optimum Interleavers,” IEEE Transactions on Information Theory, IT-16 (3), May 1970, pp. 338-345.

[6] Takeshita, O. Y. and D. J. Costello, Jr., “New Classes Of Algebraic Interleavers for Turbo-Codes,” Proc. 1998 IEEE International Symposium on Information Theory, Boston, Aug. 16–21, 1998. pp. 419.