DVB-S システムは衛星テレビ信号の伝送に使用され、送信側のブロック図は以下の通りです。
擾乱符号#
実際のデジタル通信では、ペイロードデータの符号元に長い連続した 0 または 1 が現れることがあり、受信側がクロック信号を抽出するのに不利です。また、データストリームに多くの低周波成分が含まれ、QPSK 変調器の位相が長時間変わらず、信号が干渉を受けやすくなります。したがって、ペイロードデータに対してランダム化擾乱処理を行う必要があります。
DVB-S 標準では、擾乱符号の生成多項式は次のように規定されています。
同時にシフトレジスタの初期状態は「1001_0101_0000_000」です。
Matlab コードシミュレーション#
n=500;
% origin_data=randi([0 1],n,1);
origin_cnt_1=nnz(origin_data==1)
scrambling = comm.Scrambler("CalculationBase",2,"InitialConditions",[1 0 0 1 0 1 0 1 0 0 0 0 0 0 0], ...
"Polynomial",[1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1]);
scrambling_data=step(scrambling,origin_data);
scrambling_data_cnt_1=nnz(scrambling_data==1)
実行結果は以下の図の通りです。
初期の 500 点のデータパケットには 403 個の「1」が含まれており、擾乱処理後の「1」の数はデータ総量のほぼ半分に近づいています。
外部符号誤り訂正符号(RS 符号)#
RS 符号の定義:
$GF (q) 上(q \neq 2, 通常 q=2^m),符号長 n=q-1 の本原 BCH 符号 $
t 個のエラーを訂正できる RS 符号のパラメータは
- 分組長n=q-1
- 校正符号数n-k=2t
- 符号の最小距離dmin=2t+1
DVB-S システムで使用される RS (188,204) は RS (239,255) から切り取られたもので、8 バイトのエラーを訂正できます。
Matlab シミュレーション#
m=8; %bit per symbol
n=204;
k=188;
data_test=randi([0,n],1,k);
data_gf=gf(data_test,m);
data_rs_enc=rsenc(data_gf,n,k);
data_enc=data_rs_enc.x;
data_rs_dec=rsdec(data_rs_enc,n,k);
data_dec=data_rs_dec.x;
subplot(3,1,1);
stem(data_test);
subplot(3,1,2);
stem(data_enc);
subplot(3,1,3);
stem(data_dec);
まず、長さ 188 のシーケンスを生成し、それをガロア体に変換した後、rsenc 関数を使用して RS 符号化を行い、次に復号化を行います。比較すると、復号化後のビットは復号化前のものと完全に一致します。
畳み込みインタリーブ#
実際の伝送プロセスでは、パルス干渉やマルチパス効果などの要因により、一定時間の持続的なバーストエラーが発生します。RS 符号はバーストエラーに対して良好な訂正能力を持っていますが、持続時間が長くなると RS 符号の訂正能力を超えてしまいます。したがって、符号化プロセスで畳み込みインタリーブを導入し、データの伝送順序を一定の規則に従って分散させることで、エラーの符号元も分散させることができます。
DVB-S ではインタリーブ深度は 12 で、合計 17 個の FIFO があり、データは行単位でレジスタに書き込まれ、列単位で読み出されます。
インタリーブ後の最大訂正可能長は 12*8=96 です。
前の期間に多くの 0 が読み取られたことがわかり、下のシフトレジスタのデータがまだ末端に移動していないことを示しています。
畳み込み符号#
畳み込み符号は、$(n,k,m)$ として記述される効果的な前方誤り訂正符号で、k 個の情報ビットを n 個のビットに符号化し、m は符号化ストレージの長さ、N=m+1 は制約長であり、畳み込み符号の現在の符号元は、現在の入力の k の情報符号元だけでなく、前の m 個の時刻の入力の情報符号元にも関連しています。
clc;
close all;
n=500;
tre1=[1 1 1 1 0 0 1]; %oct 171
tre2=[1 0 1 1 0 1 1]; %oct 133
trellis = poly2trellis(7,[171 133]);
convData=convenc(scrambling_data,trellis);
decData=vitdec(convData,trellis,499,"trunc","hard");
subplot(3,1,1);
stem(scrambling_data);
subplot(3,1,2);
stem(convData);
subplot(3,1,3);
stem(decData);
biterr(scrambling_data,decData)
poly2trellis を使用して、畳み込み符号化多項式をトレリス記述に変換します。
比較すると、復号化されたデータは元のデータと完全に一致することがわかります。