Сверточное декодирование потоковой передачи выборок

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

  1. Сгенерируйте LTE, convolutionally закодировал сообщения в MATLAB®, с помощью LTE Toolbox.

  2. Вызовите функции Communications Toolbox™, чтобы выполнить модуляцию BPSK, передачу через канал AWGN и демодуляцию BPSK. Результатом являются мягко-битные значения, которые представляют логарифмические отношения правдоподобия (LLRs).

  3. Квантуйте мягкие биты согласно порции сигнала к шуму (SNR).

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

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

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

  7. Преобразуйте демонстрационный поток назад в обрамленные данные и сравните кадры с исходными входными кадрами.

Вычислите ОСШ канала и создайте модулятор, канал и Системные объекты демодулятора. EbNo является отношением энергии на незакодированный бит к шумовой спектральной плотности в дБ. EcNo является отношением энергии на бит канала к шумовой спектральной плотности в дБ. Уровень кода сверточного энкодера является 1/3. Поэтому каждый переданный бит содержит 1/3 небольшого количества информации.

EbNo = 10;
EcNo = EbNo - 10*log10(3);

modulator = comm.BPSKModulator;
channel = comm.AWGNChannel('EbNo',EcNo);
demodulator = comm.BPSKDemodulator('DecisionMethod','Log-likelihood ratio');

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

rng(0);
messageLength = 100;
numframes = 2;
numSoftBits = 5;

txMessages     = cell(1,numframes);
rxSoftMessages = cell(1,numframes);

No            = 10^((-EcNo)/10);
quantStepSize = sqrt(No/2^numSoftBits);

for k = 1:numframes

    txMessages{k}  = randi([0 1],messageLength,1,'int8');
    txCodeword = lteConvolutionalEncode(txMessages{k});

    modOut   = modulator.step(txCodeword);
    chanOut  = channel.step(modOut);
    demodOut = -demodulator.step(chanOut)/4;

    rxSoftMessagesDouble = demodOut./quantStepSize;
    rxSoftMessages{k} = fi(rxSoftMessagesDouble,1,numSoftBits,0);

end

Сериализируйте входные данные для модели Simulink. Оставьте достаточно времени между кадрами так, чтобы каждый кадр полностью декодировался, прежде чем следующий запускается. Блок Convolutional Decoder берет (2 * messageLength) + 140 циклов, чтобы завершить декодирование кадра.

Блок Convolutional Decoder ожидает, что входные данные будут содержать три закодированных чередованные бита.

  • Благоприятный для оборудования вход: G0_1 G1_1 G2_1 G0_2 G1_2 G2_2 ... G0_n G1_n G2_n

  • Вход LTE Toolbox: G0_1 G0_2 ... G0_n G1_1 G1_2 ... G1_n G2_1 G2_2 ... G2_n

idleCyclesBetweenSamples = 0;
idleCyclesBetweenFrames  = 2 * messageLength + 140;
samplesizeIn             = 3;
interleaveSamples        = true;

[sampleIn,ctrlIn] = ltehdlFramesToSamples(rxSoftMessages,...
                    idleCyclesBetweenSamples,...
                    idleCyclesBetweenFrames,...
                    samplesizeIn,...
                    interleaveSamples);

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

sampletime= 1;
simTime = size(ctrlIn,1);
modelname = 'ltehdlConvolutionalDecoderModel';
open(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)];
rxMessages = ltehdlSamplesToFrames(sampleOut, ctrlOut);

fprintf('\nLTE Convolutional Decoder\n');
for k = 1:numframes
    numBitsDiff = sum(double(txMessages{k})-double(rxMessages{k}));
    fprintf(['  Frame %d: Behavioral and ' ...
        'HDL simulation differ by %d bits\n'], k, numBitsDiff);
end
Maximum frame size computed to be 100 samples.

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

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

Блоки

Функции

Похожие темы