Закодируйте сообщение к кодовому слову RS

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

Сгенерируйте входные контрольные выборки для модели Simulink ®

gapBetweenFrames = n-k;
gapBetweenSamples = 0;

[simDataIn, ctrlIn] = whdlFramesToSamples(data,gapBetweenSamples,gapBetweenFrames);
simStart = ctrlIn(:,1);
simEnd = ctrlIn(:,2);
simValidIn = ctrlIn(:,3);
stopTime = length(simValidIn);

Запуск модели Simulink

Запустите модель 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);

Экспорт выхода блока Simulink в рабочую область MATLAB ®

Закодированные выборки из блока RS Encoder экспортируются в рабочее пространство MATLAB.

simOutput = dataOut(validOut);

Сравнение вывода блока Simulink с выходом функции MATLAB

Захват выхода блока 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 

См. также

Блоки