Турбо декодирует выборки потоковой передачи

Этот пример показывает, как использовать блок Turbo Decoder, чтобы декодировать данные, и как сравнить благоприятный для оборудования проект с результатами LTE Toolbox™.

  1. Сгенерируйте кадры случайных входных выборок в MATLAB®. Закодируйте выборки и добавьте шум в данные.

  2. Декодируйте данные с помощью функции LTE Toolbox, lteTurboDecode.

  3. Преобразуйте структурированные входные данные в поток выборок и импортируйте поток в Simulink®.

  4. Чтобы декодировать выборки с помощью благоприятной для оборудования архитектуры, выполните модель Simulink, которая содержит блок LTE HDL Toolbox™ Turbo Decoder.

  5. Экспортируйте поток декодируемых битов к рабочему пространству MATLAB.

  6. Преобразуйте демонстрационный поток назад в обрамленные данные и сравните кадры с декодируемыми кадрами от Шага 2.

Сгенерируйте кадры входных данных. Турбо кодирует данные, модулирует сообщение и добавляет шум в получившуюся совокупность. Демодулируйте шумную совокупность и сгенерируйте мягкие битные значения. Сгенерируйте декодируемые данные ссылки с помощью lteTurboDecode. Для благоприятной для оборудования модели преобразуйте мягкие биты в тип данных с фиксированной точкой.

rng(0);
numframes = 2;

txBits   = cell(1,numframes);
softBits = cell(1,numframes);
rxBits   = cell(1,numframes);
inframes = cell(1,numframes);

for ii = 1:numframes
    txBits{ii} = randi([0 1],6144,1);
    codedData = lteTurboEncode(txBits{ii});
    txSymbols = lteSymbolModulate(codedData,'QPSK');
    noise = 0.5*complex(randn(size(txSymbols)),randn(size(txSymbols)));
    rxSymbols = txSymbols + noise;
    softBits{ii} = lteSymbolDemodulate(rxSymbols,'QPSK','Soft');
    rxBits{ii} = lteTurboDecode(softBits{ii});
    inframes{ii} = fi(softBits{ii},1,5,2);
end

Сериализируйте входные данные для модели Simulink. Оставьте достаточно времени между кадрами для каждого кадра, который будет полностью декодироваться, прежде чем следующий запустится. Блок Turbo Decoder берет 2 * numTurboIterations * HalfIterationLatency + (inframesize / samplesizeIn) циклы, чтобы завершить декодирование кадра. Для получения дополнительной информации вычисления HalfIterationLatency смотрите страницу с описанием блока Turbo Decoder.

Блок Turbo Decoder ожидает, что входные выборки чередованы с битами четности.

Благоприятный для оборудования вход: S_1 P1_1 P2_1 S2 P1_2 P2_2 ... Sn P1_n P2_n

Вход LTE Toolbox: S_1 S_2 ... S_n P1_1 P1_2 ... P1_n P2_1 P2_2 ... P2_n

Переупорядочьте выборки с помощью опции чередования функции ltehdlFramesToSamples.

inframesize = size(inframes{1},1); %includes 4 tail bit samples
encoderrate = 3; % rate 1/3 Turbo code
samplesizeIn = encoderrate; % 3 samples in at a time

idlecyclesbetweensamples = 0;
outframesize = size(txBits{1},1);
numTurboIterations = 6;
halfIterationLatency = (ceil(outframesize/32)+3)*32; % window size=32
algframedelay = 2*numTurboIterations*halfIterationLatency+(inframesize/samplesizeIn);
idlecyclesbetweenframes = algframedelay;

interleaveSamples = true;
[sampleIn,ctrlIn] = ...
    ltehdlFramesToSamples(inframes, ...
                          idlecyclesbetweensamples, ...
                          idlecyclesbetweenframes, ...
                          samplesizeIn, ...
                          interleaveSamples);

Запустите модель Simulink. Время симуляции равняется количеству входных выборок. Из-за добавленных неактивных циклов между кадрами входные данные потоковой передачи включают достаточно циклов для модели, чтобы завершить декодирование обоих кадров.

sampletime = 1;
simTime = size(ctrlIn, 1);
modelname = 'ltehdlTurboDecoderModel';
open_system(modelname);
sim(modelname);

Модель Simulink экспортирует sampleOut_ts и ctrlOut_ts назад к рабочему пространству MATLAB. Десериализуйте выходные выборки и сравните с декодируемым кадром.

sampleOut = squeeze(sampleOut_ts.Data);
ctrlOut = [squeeze(ctrlOut_ts.start.Data) ...
    squeeze(ctrlOut_ts.end.Data) ...
    squeeze(ctrlOut_ts.valid.Data)];
outframes = ltehdlSamplesToFrames(sampleOut,ctrlOut);

fprintf('\nLTE Turbo Decoder\n');
for ii = 1:numframes
    numBitsDiff = sum(outframes{ii} ~= rxBits{ii});
    fprintf(['  Frame %d: Behavioral and ' ...
        'HDL simulation differ by %d bits\n'],ii,numBitsDiff);
end
Maximum frame size computed to be 6144 samples.

LTE Turbo Decoder
  Frame 1: Behavioral and HDL simulation differ by 0 bits
  Frame 2: Behavioral and HDL simulation differ by 0 bits

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

Блоки

Функции

Похожие темы