exponenta event banner

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

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

  1. Создание сверточно закодированных сообщений LTE в MATLAB ® с помощью LTE Toolbox.

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

  3. Квантуют мягкие биты в соответствии с отношением сигнал-шум (SNR).

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

  5. Для декодирования выборок с использованием аппаратной архитектуры выполните модель Simulink, которая содержит блок сверточного декодера LTE.

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

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

Вычислите SNR канала и создайте объекты системы модулятора, канала и демодулятора. 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. Оставьте достаточно времени между кадрами, чтобы каждый кадр был полностью декодирован до начала следующего. Блок сверточного декодера LTE принимает (2 * messageLength) + 140 циклов для завершения декодирования кадра.

Блок сверточного декодера LTE ожидает, что входные данные будут содержать три кодированных бита, перемеженных.

  • Аппаратный ввод: G0_1 G1_1 G2_1 G0_2 G1_2 G2_2 ... G0_n G1_n G2_n

  • Входные данные панели инструментов LTE: 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] = whdlFramesToSamples(rxSoftMessages,...
                    idleCyclesBetweenSamples,...
                    idleCyclesBetweenFrames,...
                    samplesizeIn,...
                    interleaveSamples);

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

sampletime= 1;
simTime = size(ctrlIn,1);
modelname = 'ltehdlConvolutionalDecoderModel';
open(modelname);
sim(modelname);

Экспорт модели Simulink sampleOut и ctrlOut обратно в рабочую область MATLAB. Десериализация выходных выборок и сравнение с декодированным кадром.

rxMessages = whdlSamplesToFrames(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

См. также

Блоки

Функции

Связанные темы