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 を使用して、畳み込み符号化多項式をトレリス記述に変換します
比較すると、復号化されたデータは元のデータと完全に一致していることがわかります