В этом примере показано, как использовать блок RS Encoder для кодирования сообщения к кодовому слову Рида-Соломона (RS). В этом примере набор систем координат случайных входов генерируется и предоставляется в comm.RSEncoder
Системный объект. Использование
функция, эти системы координат преобразуются в выборки и предоставляются как вход в блок RS Encoder. Вывод блока RS Encoder затем сравнивается с выходом whdlFramesToSamples
comm.RSEncoder
Системный объект, чтобы проверить, является ли закодированное выходное кодовое слово для данного входного сообщения тем же. По умолчанию опция прокалывания в этом примере отключена. Чтобы включить прокалывание, установите значение прокалывания равным true
. Эта модель примера поддерживает генерацию HDL-кода для подсистемы RS Encoder.
Настройте эти переменные рабочей области для моделей, которые будут использоваться. Эти переменные конфигурируют блок RS Encoder внутри модели.
nMessages = 3; n = 255; % Specify codeword length k = 239; % Specify message length m = n-k; % Parity length inDataType = fixdt(0,ceil(log2(n)),0); puncturing = false; % true for puncturing puncturePattern = randsrc(m,1,[0 1]); % Considered, when punturing is true shortMsg = false; % true for shortened message k1 = k-1; % Considered when shortMsg is true
Сгенерируйте случайные выборки, используя n
, k
, и m
переменные и обеспечивают эти сгенерированные выборки как вход в comm.RSEncoder
Системный объект.
hRSEnc = comm.RSEncoder; hRSEnc.CodewordLength = n; hRSEnc.MessageLength = k; if isequal(shortMsg,true) hRSEnc.ShortMessageLength = k1; else k1 = k; end if isequal(puncturing,true) hRSEnc.PuncturePatternSource = "Property"; hRSEnc.PuncturePattern = puncturePattern; puncLen = n-k-sum(hRSEnc.PuncturePattern); else puncLen = 0; end data = cell(1,nMessages); refData = (zeros(k1+m-puncLen,nMessages)); for ii = 1:nMessages data{ii} = randi([0 n],k1,1); refData(:,ii) = hRSEnc(data{ii}); end refOutput = refData(:);
gapBetweenFrames = n-k; gapBetweenSamples = 0; [simDataIn, ctrlIn] = whdlFramesToSamples(data,gapBetweenSamples,gapBetweenFrames); simStart = ctrlIn(:,1); simEnd = ctrlIn(:,2); simValidIn = ctrlIn(:,3); stopTime = length(simValidIn);
Запустите модель Simulink. Блок импортирует переменные рабочей области и генерирует выход.
modelname = 'HDLRSEncoder'; open_system(modelname); if isequal(puncturing,true) set_param([modelname '/RS Encoder/RS Encoder'],'PuncturePatternSource','on'); set_param([modelname '/RS Encoder/RS Encoder'],'PuncturePattern',['[' num2str(puncturePattern') ']']); end out = sim(modelname);
Закодированные выборки из блока RS Encoder экспортируются в рабочее пространство MATLAB.
simOutput = dataOut(validOut);
Захват выхода блока RS Encoder. Сравните этот вывод с выходом comm.RSEncoder
Системный объект.
fprintf('\nHDL RS Encoder\n'); difference = double(simOutput) - double(refOutput); fprintf('\nTotal Number of samples differed between Simulink block output and MATLAB function output is: %d \n',sum(difference));
HDL RS Encoder Total Number of samples differed between Simulink block output and MATLAB function output is: 0