📄 mderandomizer.m
字号:
function [Out,BlkSize] = mDerandomizer(In,BlkSize)
% Derandomizer for OFDMA of WiMAX IEEE 802.16-2004 , 8.4.9.1
%
% [Out,BlkSize] = mDerandomizer(In,BlkSize)
%
% In : input column vector or matrix (bytes, values 0 to 255)
% one column per code block
% BlkSize : row vector, length = number of code blocks
% number of payload data bytes for each code block (incl. 0xff)
%
% Out : output column vector or matrix (bytes, values 0 to 255)
% one column per code block
%
% The output block size is the same as the input block size.
%
% Matlab 7 Release 14 SP2
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Property of Freescale
% Freescale Confidential Proprietary
% Freescale Copyright (C) 2005 All rights reserved
% ----------------------------------------------------------------------------
% $RCSfile: mDerandomizer.m.rca $
% $Revision: 1.6 $
% $Date: Thu Feb 1 16:05:12 2007 $
% Target: Matlab
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
[m,n] = size(In);
InClass=class(In);
%check dimensions
[x,y]=size(BlkSize);
if ((x~=1)|(y~=n))
error('Error: BlkSize must be row vector with the same number of columns as In.');
end
if (any(BlkSize>m))
error('Error: BlkSize does not match input matrix dimensions.');
end
if m>60
%code blocks larger than 60 bytes
if n>1
error('Error: Only one code block allowed for code blocks larger than 36 bytes.');
end
%generate derandomizer sequence
seq = zeros(BlkSize,1,class(In));
InitState = 43244; %1010100011101100 = 0xa8ec
ShiftReg = uint32(InitState);
for k=1:BlkSize,
seq(k) = mod(bitshift(bitxor(ShiftReg,ShiftReg*2),-8),256);
ShiftReg = mod(bitor(ShiftReg*256,uint32(seq(k))*2),65536);
end
%allocate output
Out=zeros(m,n,InClass);
%derandomize code block
Out(1:BlkSize) = bitxor(In(1:BlkSize),seq);
else
if m<=36
%randomizer sequence for maximum code block length
%(The maximum code block length for tail-biting CC is 36 bytes.)
seq = zeros(36,1,InClass);
seq(1:36) = ...
[ 249, 54, 22,180,119,185, 49,150,165,119,223, 48,194,162,143,207,...
32,162,195,206,136,167, 51,210,168,239,242, 96, 45, 64,239,130,...
97, 13, 70, 47 ...
]';
else %(The maximum code block length for CTC is 60 bytes.)
seq = zeros(36,1,InClass);
seq(1:60) = ...
[249 54 22 180 119 185 49 150 165 119 223 48 194 162 143 207 32 ...
162 195 206 136 167 51 210 168 239 242 96 45 64 239 130 97 13 ...
70 47 148 225 122 71 29 146 77 109 175 109 227 108 75 105 187 ...
117 155 61 90 143 223 32 194 194 ]';
end
%allocate output
%Out=zeros(m,n,InClass);
Out=255.*ones(m,n,InClass);
%derandomize code block after code block
for k=1:n,
Out(1:BlkSize(k),k) = bitxor(In(1:BlkSize(k),k),seq(1:BlkSize(k)));
end
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -