📄 crsc.m
字号:
function [W,Y,Sc]=CRSC(A,B)
%-----[W,Y]=CRSC(A,B)------
%DVB-RCS标准中的CRSC编码器
%输入:
%A,B是输入的双二元序列
%输出:
%W,Y是编码后的校验序列
%Sc:循环状态
trellis=struct('NextStates',[0 7 4 3;4 3 0 7;1 6 5 2;5 2 1 6;6 1 2 5;2 5 6 1;7 0 3 4;3 4 7 0],...
'Outputs',[ [0 0] [1 1] [1 1] [0 0];...
[0 0] [1 1] [1 1] [0 0];...
[0 1] [1 0] [1 0] [0 1];...
[0 1] [1 0] [1 0] [0 1];...
[1 1] [0 0] [0 0] [1 1];...
[1 1] [0 0] [0 0] [1 1];...
[1 0] [0 1] [0 1] [1 0];...
[1 0] [0 1] [0 1] [1 0] ]);
%NextStates和Outputs均为8*4的矩阵(实际Outputs是8*8的)
%其行表示状态0~7
%列表示输入数据(A,B)对对应的十进制数0~3
lenA=length(A);
lenB=length(B);
if lenA~=lenB
error('wrong input vector');
else
%预编码
state=0;
for cnt=1:lenA %循环结束得到(S_N)^0
state=trellis.NextStates(state+1,2*A(cnt)+B(cnt)+1);
end
rem=mod(lenA,7);
%循环状态Sc的查询表
%行表示N mod 7,分别对应于1~6;列表示预编码结束状态,分别对应于0~7
ScTable=[0 6 4 2 7 1 3 5;0 3 7 4 5 6 2 1;0 5 3 6 2 7 1 4;...
0 4 1 5 6 2 7 3;0 2 5 7 1 3 4 6;0 7 6 1 3 4 5 2];
%实际编码
if rem~=0
state=ScTable(rem,state+1); %循环状态Sc
Sc=state;
else
error('wrong input frame length');
end
for cnt=1:lenA
W(cnt)=trellis.Outputs(state+1,2*(2*A(cnt)+B(cnt))+1);
Y(cnt)=trellis.Outputs(state+1,2*(2*A(cnt)+B(cnt))+2);
state=trellis.NextStates(state+1,2*A(cnt)+B(cnt)+1);
end
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -