通信人家园

 找回密码
 注册

只需一步,快速开始

短信验证,便捷登录

搜索

军衔等级:

  新兵

注册:2017-2-221
跳转到指定楼层
1#
发表于 2018-12-4 15:04:48 |只看该作者 |倒序浏览


原文 Understanding LTE with MATLAB  ,作者Houman Zarrinkoub,本文是对于该书的翻译,书中的专业性词汇给出了英文原文,图和表的排版都是参考原文,翻译不准确的地方请读者多多包涵。本文仅限于个人学习,研究,交流,不得用于其他商业用途!



4.5 早期终止机制
在turbo译码器中执行的迭代次数是其主要特征之一。在实现高效的Turbo解码器时,我们面临一个明确的折衷。一方面,turbo译码器的精度和性能直接关系到其迭代次数。迭代越多,结果就越准确。另一方面,turbo译码器的计算复杂度与其迭代次数也成正比。

LTE规范允许通过设计早期终止来解决这种折衷的有效方法。该机制与Turbo编码器相结合。通过在turbo编码器的输入端附加CRC校验综合症,我们可以在Turbo解码器的迭代结束时检测任何比特错误的存在与否。我们现在可以选择在CRC检查表明没有检测到错误时提前停止解码,而不是按照固定的解码迭代次数来完成。这个非常简单的解决方案能够显著降低Turbo解码器的计算复杂度,而不会严重影响其性能。

4.5.1 MATLAB例子
下面的MATLAB函数(TurboDecoder_crc)显示了LTE Turbo解码器的实现,它检查输入帧末尾的CRC位,以便在执行最大迭代次数之前选择性地终止解码操作。正如我们所看到的,在这个函数中,我们使用LTETurboDecoder System对象而不是comm.TurboDecoder System对象。
1function [y, flag, iters]=TurboDecoder_crc(u, intrlvrIndices)
2%#codegen
3maxIter=6;
4persistent TurboCrc
5if isempty(TurboCrc)
6    TurboCrc = commLTETurboDecoder('InterleaverIndicesSource',  'Input port', ...
7        'MaximumIterations', maxIter);
8end
9[y, flag, iters] = step(TurboCrc, u,  intrlvrIndices);
10


在LTETurboDecoder中,常规的Turbo译码器也有相同的操作。然而,在每次解码迭代结束时,检查对应于CRC比特的输出的最后24个样本以进行错误检测。如果没有检测到错误,我们分支出循环并终止Turbo解码操作。在这种情况下,尽管尚未执行最大迭代次数,但是可能出现提前终止。如果检测到CRC位中的错误,则继续操作并输入下一个解码迭代,直到在迭代中没有检测到更多的错误或达到允许的最大迭代次数。

下面的MATLAB函数(CbCRCGenerator)在执行turbo编码之前将24位CRC特征值添加到传输块的末尾。
1function  y = CbCRCGenerator(u)
2%#codegen
3persistent hTBCRCGen
4if isempty(hTBCRCGen)
5    hTBCRCGen = comm.CRCGenerator('Polynomial',[1 1 zeros(1, 16) 1 1 0 0 0 1 1]);
6end
7% Transport block CRC generation
8y = step(hTBCRCGen, u);
9

下面的MATLAB函数(CbCRCDetector)在执行turbo解码之后将24位CRC综合征提取到传输块的末尾。
1function  y = CbCRCDetector(u)
2%#codegen
3persistent hTBCRC
4if isempty(hTBCRC)
5    hTBCRC = comm.CRCDetector('Polynomial',  [1 1 zeros(1, 16) 1 1 0 0 0 1 1]);
6end
7% Transport block CRC generation
8y = step(hTBCRC, u);
9


4.5.2误码率测试
为了检验早期终止算法的有效性,我们现在比较两种基于CRC的早期终止和不基于CRC的turbo解码的实现。下面的函数(chap4_ex04)执行CRC生成、turbo编码、加扰和调制以及它们的逆操作的组合,而不实现提前终止机制。
1function [ber, numBits]=chap4_ex04(EbNo, maxNumErrs, maxNumBits)
2%% Constants
3clear functions;
4maxIter=6;       % actual number of turbo decoder iterations
5FRM=2432-24; % Size of bit frame
6Kplus=FRM+24;
7Indices = lteIntrlvrIndices(Kplus);
8ModulationMode=1;
9k=2*ModulationMode;
10CodingRate=Kplus/(3*Kplus+12);
11snr = EbNo + 10*log10(k) + 10*log10(CodingRate);
12noiseVar = 10.^(-snr/10);
13%% Processsing loop modeling transmitter, channel model and receiver
14numErrs = 0; numBits = 0; nS=0;
15while ((numErrs < maxNumErrs) && (numBits < maxNumBits))
16    % Transmitter
17    u  =  randi([0 1], FRM,1);                                                          % Randomly generated input bits
18    data= CbCRCGenerator(u);                                                       % Code block CRC generator
19    t0 = TurboEncoder(data, Indices);                                            % Turbo Encoder
20    t1 = Scrambler(t0, nS);                                                              % Scrambler
21    t2 = Modulator(t1, ModulationMode);                                     % Modulator
22    % Channel
23    c0 = AWGNChannel(t2, snr);                                                    % AWGN channel
24    % Receiver
25    r0 = DemodulatorSoft(c0, ModulationMode, noiseVar);          % Demodulator
26    r1 = DescramblerSoft(r0, nS);                                                   % Descrambler
27    r2  = TurboDecoder(-r1, Indices,maxIter);                                % Turbo Deocder
28    y   =  CbCRCDetector(r2);                                                          % Code block CRC dtector
29    % Measurements
30    numErrs     = numErrs + sum(y~=u);                                          % Update number of bit errors
31    numBits     = numBits + FRM;                                                    % Update number of bits processed
32    % Manage slot number with each subframe processed
33    nS = nS + 2; nS = mod(nS, 20);
34end
35%% Clean up & collect results
36ber = numErrs/numBits;                                                                % Compute Bit Error Rate (BER)
37

下面的函数(chap4_ex04_crc)在实现提前终止机制的同时执行相同的收发器。在算法部署提前终止的情况下,我们记录每个子帧中的实际迭代次数,然后计算直方图。
1function [ber, numBits]=chap4_ex04_crc(EbNo, maxNumErrs, maxNumBits)
2%% Constants
3clear functions;
4FRM=2432-24; % Size of bit frame
5Kplus=FRM+24;
6Indices = lteIntrlvrIndices(Kplus);
7ModulationMode=1;
8k=2*ModulationMode;
9CodingRate=Kplus/(3*Kplus+12);
10snr = EbNo + 10*log10(k) + 10*log10(CodingRate);
11noiseVar = 10.^(-snr/10);
12%% Processsing loop modeling transmitter, channel model and receiver
13numErrs = 0; numBits = 0; nS=0;
14while ((numErrs < maxNumErrs) && (numBits < maxNumBits))
15    % Transmitter
16    u  =  randi([0 1], FRM,1);                                                          % Randomly generated input bits
17    data= CbCRCGenerator(u);                                                       % Transport block CRC code
18    t0 = TurboEncoder(data, Indices);                                            % Turbo Encoder
19    t1 = Scrambler(t0, nS);                                                              % Scrambler
20    t2 = Modulator(t1, ModulationMode);                                     % Modulator
21    % Channel
22    c0 = AWGNChannel(t2, snr);                                                    % AWGN channel
23    % Receiver
24    r0 = DemodulatorSoft(c0, ModulationMode, noiseVar);          % Demodulator
25    r1 = DescramblerSoft(r0, nS);                              % Descrambler
26    [y, ~, ~]  = TurboDecoder_crc(-r1, Indices);                        % Turbo Deocder
27    % Measurements
28    numErrs     = numErrs + sum(y~=u);                                         % Update number of bit errors
29    numBits     = numBits + FRM;                                                   % Update number of bits processed
30    % Manage slot number with each subframe processed
31    nS = nS + 2; nS = mod(nS, 20);
32end
33%% Clean up & collect results
34ber = numErrs/numBits;                                                              % Compute Bit Error Rate (BER)
35

图4.6中的BER结果表明我们得到类似的误码率性能与早期终止的SNR值范围(微量红色)而提前终止(微量蓝色)。
4.5.3 时间测量
在本实验中,我们比较了没有基于CRC的早期停止机制(chap4_ex04.m)而采用turbo解码的收发机与采用基于CRC的早期停止机制(chap4_ex04_crc.m)的收发机的执行时间。实验通过调用以下Matlab测试平台进行。
1EbNo=1; maxNumErrs=1e7; maxNumBits=1e7;
2tic; [a,b]=chap4_ex04(EbNo,maxNumErrs, maxNumBits); toc;
3tic; [a,b]=chap4_ex04_crc(EbNo,maxNumErrs, maxNumBits); toc;


该脚本的第一行强制两个收发器函数对于给定的Eb/N0值1dB,每次调用处理1000万比特。第二行使用MATLAB函数tic和toc来获得没有提前终止的算法的运行时间。第三行记录了具有提前终止的算法的经过时间。
图4.7 提前终止Turbo译码典型的执行时间节省

在MATLAB命令行中打印的结果如图4.7所示。与没有提前终止(146秒)相比,提前终止(89秒)处理相同数量的输入帧花费的时间要少得多。



未完待续
2018/12/3

点击关注了解更多精彩内容!!



举报本楼

您需要登录后才可以回帖 登录 | 注册 |

手机版|C114 ( 沪ICP备12002291号-1 )|联系我们 |网站地图  

GMT+8, 2024-5-12 07:19 , Processed in 0.414366 second(s), 15 queries , Gzip On.

Copyright © 1999-2023 C114 All Rights Reserved

Discuz Licensed

回顶部