exponenta event banner

Кодировать сообщение в кодовое слово RS

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

См. также

Блоки