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 將卷積編碼多項式轉換為網格描述
比對後可以看到解碼出的數據和原數據完全相同