moerjielovecookie

Sawen_Blog

一个普通工科牲的博客网站
x
github
follow
email

DVB-S系統仿真學習

DVB-S 系統用於衛星電視信號傳輸,發送端框圖如下所示

1711536126647.png

擾碼#

實際數字通信中,載荷數據的碼元會出現長連 0 或長連 1 的情況,不利於接收端提取時鐘信號,同時會使得數據流中含有大量的低頻分量,使得 QPSK 調製器的相位長時間不變,使得信號易受干擾。因此要對載荷數據進行隨機化擾碼處理

DVB-S 標準中規定擾碼的生成多項式為

p(x)=x15+x14+1p(x)=x^{15}+x^{14}+1

同時移位寄存器的初始狀態為 "1001_0101_0000_000”

1711536797434.png

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)

運行結果如下圖所示

1711536855542.png

可以看出初始的 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 編碼,再進行譯碼,根據對比可以看出譯碼後的比特和譯碼前的完全一樣

1711538853533.png

卷積交織#

在實際的傳輸過程中,由於脈衝干擾、多徑效應等因素會帶來持續一定時間的突發錯誤,雖然 RS 碼對突發錯誤有較好的糾錯能力,但是當其持續時間較長時,就會超出 RS 碼的糾錯能力,因此在編碼過程中引入了卷積交織,將數據的傳輸順序按照一定的規律分散開,就可以使得錯誤的碼元也被分散開

DVB-S 中交織深度為 12,總共 17 個 FIFO,數據按行寫入寄存器,按列讀出

交織後最大可糾錯長度為 12*8=96

1711539867512.png

可以看出前一段時間讀取到了很多 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 將卷積編碼多項式轉換為網格描述

1711541868504.png

比對後可以看到解碼出的數據和原數據完全相同

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。