Этот пример показывает, как использовать блок Convolutional Decoder, чтобы декодировать данные, и как сравнить благоприятный для оборудования проект с результатами LTE Toolbox™. Рабочий процесс выполняет эти шаги:
Сгенерируйте LTE, convolutionally закодировал сообщения в MATLAB®, с помощью LTE Toolbox.
Вызовите функции Communications Toolbox™, чтобы выполнить модуляцию BPSK, передачу через канал AWGN и демодуляцию BPSK. Результатом являются мягко-битные значения, которые представляют логарифмические отношения правдоподобия (LLRs).
Квантуйте мягкие биты согласно порции сигнала к шуму (SNR).
Преобразуйте структурированные входные данные в поток выборок и импортируйте поток в Simulink®.
Чтобы декодировать выборки с помощью благоприятной для оборудования архитектуры, выполните модель Simulink, которая содержит LTE HDL Toolbox™ Сверточный Декодер.
Экспортируйте поток декодируемых битов к рабочему пространству MATLAB.
Преобразуйте демонстрационный поток назад в обрамленные данные и сравните кадры с исходными входными кадрами.
Вычислите ОСШ канала и создайте модулятор, канал и Системные объекты демодулятора. 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