В этом примере показано, как использовать блок 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(:);
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