В этом примере показано, как декодировать convolutionally-закодированные значения отношения логарифмической правдоподобности (LLR) с помощью блока APP Decoder. Чтобы проверить результаты, сравните выход блока с выходом Коммуникации Система Toolbox™ object™ comm.APPDecoder
этому предоставляют те же входные параметры как блок. Этот пример поддерживает генерацию HDL-кода для HDL APP Decoder
подсистема.
Задайте входные переменные. Можно изменить значения переменных в этом разделе на основе требований. В этом примере необходимо задать то же значение для длины системы координат (frameLength
) и длина окна (winLen
). Блок поддерживает максимальную длину окна 128.
numFrames = 3; frameLength = 64; codeGenerator = '[171 133]'; % Code generator, specified as a row vector of octal values codeRate = length(str2num(codeGenerator)); % Decoding rate winLen = 64; % Window length must be less than or equal to 128 CodeGenDecimal = oct2dec(str2num(codeGenerator)); K = length(dec2bin(CodeGenDecimal(2))); % Constraint length derived from code generator value TermMode = 'Truncated'; % Terminated or Truncated Algorithm = 'Max Log MAP (max)'; % Max Log MAP (max) or Log MAP (max*)
Сгенерируйте системы координат LLR-закодированных и LLR-незакодированных входных данных с заданными переменными. Чтобы сгенерировать входные данные, создайте случайные биты, convolutionally-закодируйте, и символ - демодулирует случайные биты, добавляет шум к демодулируемым символом данным и демодулирует добавленные в шум демодулируемые символом данные.
TrellisStructure = poly2trellis(K,str2num(codeGenerator)); if frameLength == winLen FrameGap = 0; else FrameGap = winLen - rem(frameLength,winLen); end if strcmpi(TermMode,'Terminated') tailLen = K - 1; else % 'Truncated' tailLen = 0; end LLRCodedIn = []; LLRUncodedIn = []; startIn = []; endIn = []; validIn = []; for fr=1:numFrames % Create binary random inputs to convolution encoder inpToConvEnc(:,fr) = [randn(frameLength-tailLen,1)>0; zeros(tailLen,1)]; % Convolutionaly-encode binary random inputs encodedData = convenc(inpToConvEnc(:,fr), TrellisStructure); % Modulate convolutionally-encoded data modData = nrSymbolModulate(encodedData,'QPSK'); % Add AWGN noise to modulated data snrdB = 8; noiseVar = 10^-(snrdB/10); rxSig = awgn(modData,snrdB,'measured'); % Demodulate noise-added modulated data demod(:,fr) = nrSymbolDemodulate(rxSig,'QPSK',noiseVar); % Prepare LLR-coded (LLRc) and LLR-uncoded (LLRu) input values to model LLRc = reshape(demod(:,fr),codeRate,[]).'; LLRu(:,fr) = LLRc(:,1); LLRCodedIn = [LLRCodedIn; LLRc]; LLRUncodedIn = [LLRUncodedIn; LLRu(:,fr)]; startSig = [true; false(frameLength-1,1); false(FrameGap,1)]; endSig = [false(frameLength-1,1); true; false(FrameGap,1)]; validSig = [true(frameLength,1); false(FrameGap,1)]; startIn = [startIn; startSig]; endIn = [endIn; endSig]; validIn = [validIn; validSig]; end stopTime = (numFrames+4)*frameLength;
Запустите модель, чтобы импортировать переменные входного сигнала от рабочей области MATLAB® до блока APP Decoder в модели.
modelName = 'HDLAPPDecoder'; open_system(modelName); set_param([modelName '/HDL APP Decoder/APP Decoder'],'Algorithm',Algorithm); set_param([modelName '/HDL APP Decoder/APP Decoder'],'CodeGenerator',codeGenerator); set_param([modelName '/HDL APP Decoder/APP Decoder'],'TermMode',TermMode); sim(modelName);
Создайте comm.APPDecoder
Системный объект и обеспечивает те же входные параметры как входные параметры блока.
hAPPDec = comm.APPDecoder; if strcmpi(Algorithm,'Max Log MAP (max)') hAPPDec.Algorithm = 'Max'; else hAPPDec.Algorithm = 'Max*'; end hAPPDec.TrellisStructure = TrellisStructure; hAPPDec.TerminationMethod = TermMode; % Generate reference output LLRu_ref = []; LLRc_ref = []; for fr=1:numFrames [LLRu_MATLAB,LLRc_MATLAB] = hAPPDec(LLRu(:,fr),demod(:,fr)); LLRu_ref = [LLRu_ref; LLRu_MATLAB]; LLRc_ref = [LLRc_ref; LLRc_MATLAB]; end
Сравните блок APP Decoder выход с comm.APPDecoder
Системный объект выводится.
LLRu_out_sim = LLRUncodedOut(validOut); LLRc_out_sim = reshape(LLRCodedOut(:,validOut),[],1); figure(1); plot(LLRu_ref,'-bd'); hold on; plot(LLRu_out_sim,'--r*') grid on; legend('Reference output','Block output'); xlabel('Sample Index'); ylabel('Uncoded LLR Output'); title('Comparison of Block Output with System Object Output'); figure(2); plot(LLRc_ref,'-bd'); hold on; plot(LLRc_out_sim,'--r*') grid on; legend('Reference output','Block output'); xlabel('Sample Index'); ylabel('Coded LLR Output'); title('Comparison of Block Output with System Object Output');