热度 22
2012-6-27 20:01
3285 次阅读|
0 个评论
最近一个朋友让帮忙做个DVB-S的m序列发生器仿真,做完记录下。 各个数字电视广播传输标准都含有能量扩散模块,即为了消除输入的TS流中含的长“0”或长“1”,进行的一个伪随机化处理,也就是我们说的能量扩散模块或者m序列发生器。 TS包的简单结构如下图: 固定长度为188字节,第一个为同步字节47H,DVB-S中还规定8个TS帧为一个超帧,对每个超帧的第一个TS帧的同步字节47H进行翻转成B8H。 PRBS的二进制生成多项式为:P(X)=1+X 14 +X 15 结构图如下: 由一个移位寄存器、两个异或门和一个与门组成,其中移位寄存器的初始序列为100101010000000。 需注意的是,DVB-S中规定,每个超帧数据开始前需对PRBS进行初始化,并且每个同步字节都不进行伪随机化,但移位寄存器需要进行移位。 综上,matlab仿真程序如下: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% DVB-S PRBS % 2012/6/25 % %% initial PACKAGE_BYTES = 188; TEST_PACKETS = 400; PRBS_INIT_DATA = ; %% PRBS null_package_data = ; data = repmat(null_package_data, ); 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 i1 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.* ); end end end data_after_prbs = data; 仅供参考。