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

В этом примере показано, как использовать блок RS Encoder, чтобы закодировать сообщение к кодовой комбинации Тростника-Solomon (RS). В этом примере набор случайных входных систем координат сгенерирован и предоставлен comm.RSEncoder функция. Используя whdlFramesToSamples функция, эти системы координат преобразованы в выборки и предоставлены, как введено блоку RS Encoder. Выход блока RS Encoder затем по сравнению с выходом comm.RSEncoder функционируйте, чтобы проверять, является ли закодированная выходная кодовая комбинация для данного входного сигнала тем же самым. По умолчанию опция прокалывания отключена в этом примере. Чтобы позволить проколоть, установите значение прокалывания к true. Эта модель в качестве примера поддерживает генерацию HDL-кода для подсистемы Энкодера RS.

Настройте параметры входных данных

Настройте их переменная рабочей области для моделей, чтобы использовать. Эти переменные конфигурируют блок 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® Workspace

Закодированные выборки от блока 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 

Смотрите также

Блоки

Для просмотра документации необходимо авторизоваться на сайте