Декодируйте Convolutionally-закодированные значения LLR Используя декодер APP

В этом примере показано, как декодировать 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;

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

Запустите модель, чтобы импортировать переменные входного сигнала от рабочей области 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

Сравните блок Simulink Выход с системным объектом Выход

Сравните блок 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');

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

|