Этот пример показывает, как использовать блок Turbo Decoder, чтобы декодировать данные, и как сравнить благоприятный для оборудования проект с результатами LTE Toolbox™.
Сгенерируйте кадры случайных входных выборок в MATLAB®. Закодируйте выборки и добавьте шум в данные.
Декодируйте данные с помощью функции LTE Toolbox, lteTurboDecode
.
Преобразуйте структурированные входные данные в поток выборок и импортируйте поток в Simulink®.
Чтобы декодировать выборки с помощью благоприятной для оборудования архитектуры, выполните модель Simulink, которая содержит блок LTE HDL Toolbox™ Turbo Decoder.
Экспортируйте поток декодируемых битов к рабочему пространству MATLAB.
Преобразуйте демонстрационный поток назад в обрамленные данные и сравните кадры с декодируемыми кадрами от Шага 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