最近一个朋友让帮忙做个DVB-S的m序列发生器仿真,做完记录下。
各个数字电视广播传输标准都含有能量扩散模块,即为了消除输入的TS流中含的长“0”或长“1”,进行的一个伪随机化处理,也就是我们说的能量扩散模块或者m序列发生器。
TS包的简单结构如下图:
固定长度为188字节,第一个为同步字节47H,DVB-S中还规定8个TS帧为一个超帧,对每个超帧的第一个TS帧的同步字节47H进行翻转成B8H。
PRBS的二进制生成多项式为:P(X)=1+X14+X15
结构图如下:
由一个移位寄存器、两个异或门和一个与门组成,其中移位寄存器的初始序列为100101010000000。
需注意的是,DVB-S中规定,每个超帧数据开始前需对PRBS进行初始化,并且每个同步字节都不进行伪随机化,但移位寄存器需要进行移位。综上,matlab仿真程序如下:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% DVB-S PRBS
% 2012/6/25
%
%% initial
PACKAGE_BYTES = 188;
TEST_PACKETS = 400;
PRBS_INIT_DATA = [1 0 0 1 0 1 0 1 0 0 0 0 0 0 0];
%% PRBS
null_package_data = [71 31 255 16 zeros(1,184)+255];
data = repmat(null_package_data, [1 TEST_PACKETS]);
data_before_prbs = data;
% super frame 1st sync change
for periods=1:TEST_PACKETS;
for i=1:PACKAGE_BYTES;
if i==1 && mod(periods,8)==1
data((periods - 1) * PACKAGE_BYTES + i) = 255 - 71; % B8HEX
end
end
end
% frame data prbs
for periods=1:TEST_PACKETS;
for i=1:PACKAGE_BYTES;
tempbin = zeros(1, 8);
if i==1 && mod(periods,8)==1
PRBS = PRBS_INIT_DATA;
else
%PRBS generator is 1+x^14+x^15
tempbin = xor(PRBS(15:-1:8), PRBS(14:-1:7));
PRBS(15:-1:9) = PRBS(7:-1:1);
PRBS(8:-1:1) = tempbin;
end
if i>1
tempdata = data((periods - 1) * PACKAGE_BYTES + i);
datastr = dec2bin(tempdata, 8);
tempdatabin = zeros(1, 8);
tempdatabin(1:8) = datastr(1:8) - 48;
databin = xor(tempbin, tempdatabin);
data((periods - 1) * PACKAGE_BYTES + i) = sum(databin.*[128 64 32 16 8 4 2 1]);
end
end
end
data_after_prbs = data;
仅供参考。
文章评论(0条评论)
登录后参与讨论