“原文 Understanding LTE with MATLAB ,作者Houman Zarrinkoub,本文是對(duì)于該書的翻譯,書中的專業(yè)性詞匯給出了英文原文,圖和表的排版都是參考原文,翻譯不準(zhǔn)確的地方請(qǐng)讀者多多包涵。本文僅限于個(gè)人學(xué)習(xí),研究,交流,不得用于其他商業(yè)用途!”

4.5 早期終止機(jī)制
在turbo譯碼器中執(zhí)行的迭代次數(shù)是其主要特征之一。在實(shí)現(xiàn)高效的Turbo解碼器時(shí),我們面臨一個(gè)明確的折衷。一方面,turbo譯碼器的精度和性能直接關(guān)系到其迭代次數(shù)。迭代越多,結(jié)果就越準(zhǔn)確。另一方面,turbo譯碼器的計(jì)算復(fù)雜度與其迭代次數(shù)也成正比。
LTE規(guī)范允許通過(guò)設(shè)計(jì)早期終止來(lái)解決這種折衷的有效方法。該機(jī)制與Turbo編碼器相結(jié)合。通過(guò)在turbo編碼器的輸入端附加CRC校驗(yàn)綜合癥,我們可以在Turbo解碼器的迭代結(jié)束時(shí)檢測(cè)任何比特錯(cuò)誤的存在與否。我們現(xiàn)在可以選擇在CRC檢查表明沒(méi)有檢測(cè)到錯(cuò)誤時(shí)提前停止解碼,而不是按照固定的解碼迭代次數(shù)來(lái)完成。這個(gè)非常簡(jiǎn)單的解決方案能夠顯著降低Turbo解碼器的計(jì)算復(fù)雜度,而不會(huì)嚴(yán)重影響其性能。
4.5.1 MATLAB例子
下面的MATLAB函數(shù)(TurboDecoder_crc)顯示了LTE Turbo解碼器的實(shí)現(xiàn),它檢查輸入幀末尾的CRC位,以便在執(zhí)行最大迭代次數(shù)之前選擇性地終止解碼操作。正如我們所看到的,在這個(gè)函數(shù)中,我們使用LTETurboDecoder System對(duì)象而不是comm.TurboDecoder System對(duì)象。
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中,常規(guī)的Turbo譯碼器也有相同的操作。然而,在每次解碼迭代結(jié)束時(shí),檢查對(duì)應(yīng)于CRC比特的輸出的最后24個(gè)樣本以進(jìn)行錯(cuò)誤檢測(cè)。如果沒(méi)有檢測(cè)到錯(cuò)誤,我們分支出循環(huán)并終止Turbo解碼操作。在這種情況下,盡管尚未執(zhí)行最大迭代次數(shù),但是可能出現(xiàn)提前終止。如果檢測(cè)到CRC位中的錯(cuò)誤,則繼續(xù)操作并輸入下一個(gè)解碼迭代,直到在迭代中沒(méi)有檢測(cè)到更多的錯(cuò)誤或達(dá)到允許的最大迭代次數(shù)。
下面的MATLAB函數(shù)(CbCRCGenerator)在執(zhí)行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函數(shù)(CbCRCDetector)在執(zhí)行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誤碼率測(cè)試
為了檢驗(yàn)早期終止算法的有效性,我們現(xiàn)在比較兩種基于CRC的早期終止和不基于CRC的turbo解碼的實(shí)現(xiàn)。下面的函數(shù)(chap4_ex04)執(zhí)行CRC生成、turbo編碼、加擾和調(diào)制以及它們的逆操作的組合,而不實(shí)現(xiàn)提前終止機(jī)制。
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
下面的函數(shù)(chap4_ex04_crc)在實(shí)現(xiàn)提前終止機(jī)制的同時(shí)執(zhí)行相同的收發(fā)器。在算法部署提前終止的情況下,我們記錄每個(gè)子幀中的實(shí)際迭代次數(shù),然后計(jì)算直方圖。
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結(jié)果表明我們得到類似的誤碼率性能與早期終止的SNR值范圍(微量紅色)而提前終止(微量藍(lán)色)。

4.5.3 時(shí)間測(cè)量
在本實(shí)驗(yàn)中,我們比較了沒(méi)有基于CRC的早期停止機(jī)制(chap4_ex04.m)而采用turbo解碼的收發(fā)機(jī)與采用基于CRC的早期停止機(jī)制(chap4_ex04_crc.m)的收發(fā)機(jī)的執(zhí)行時(shí)間。實(shí)驗(yàn)通過(guò)調(diào)用以下Matlab測(cè)試平臺(tái)進(jìn)行。
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;
該腳本的第一行強(qiáng)制兩個(gè)收發(fā)器函數(shù)對(duì)于給定的Eb/N0值1dB,每次調(diào)用處理1000萬(wàn)比特。第二行使用MATLAB函數(shù)tic和toc來(lái)獲得沒(méi)有提前終止的算法的運(yùn)行時(shí)間。第三行記錄了具有提前終止的算法的經(jīng)過(guò)時(shí)間。

圖4.7 提前終止Turbo譯碼典型的執(zhí)行時(shí)間節(jié)省
在MATLAB命令行中打印的結(jié)果如圖4.7所示。與沒(méi)有提前終止(146秒)相比,提前終止(89秒)處理相同數(shù)量的輸入幀花費(fèi)的時(shí)間要少得多。
未完待續(xù)
2018/12/3
點(diǎn)擊關(guān)注了解更多精彩內(nèi)容!!
