В этом примере показано, как использовать блок кодера RS для кодирования сообщения на кодовое слово Рида-Соломона (RS). В этом примере набор случайных входных кадров генерируется и подается в comm.RSEncoder Системный объект. Использование эти кадры преобразуются в выборки и подаются в качестве входных данных в блок RS-кодера. Затем выходной сигнал блока RS-кодера сравнивается с выходным сигналом whdlFramesToSamplescomm.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