“原文 Understanding LTE with MATLAB ,作者Houman Zarrinkoub,本文是對于該書的翻譯,書中的專業(yè)性詞匯給出了英文原文,圖和表的排版都是參考原文,翻譯不準確的地方請讀者多多包涵。本文僅限于個人學(xué)習(xí),研究,交流,不得用于其他商業(yè)用途!”
4.5 早期終止機制
在turbo譯碼器中執(zhí)行的迭代次數(shù)是其主要特征之一。在實現(xiàn)高效的Turbo解碼器時,我們面臨一個明確的折衷。一方面,turbo譯碼器的精度和性能直接關(guān)系到其迭代次數(shù)。迭代越多,結(jié)果就越準確。另一方面,turbo譯碼器的計算復(fù)雜度與其迭代次數(shù)也成正比。
LTE規(guī)范允許通過設(shè)計早期終止來解決這種折衷的有效方法。該機制與Turbo編碼器相結(jié)合。通過在turbo編碼器的輸入端附加CRC校驗綜合癥,我們可以在Turbo解碼器的迭代結(jié)束時檢測任何比特錯誤的存在與否。我們現(xiàn)在可以選擇在CRC檢查表明沒有檢測到錯誤時提前停止解碼,而不是按照固定的解碼迭代次數(shù)來完成。這個非常簡單的解決方案能夠顯著降低Turbo解碼器的計算復(fù)雜度,而不會嚴重影響其性能。
4.5.1 MATLAB例子
下面的MATLAB函數(shù)(TurboDecoder_crc)顯示了LTE Turbo解碼器的實現(xiàn),它檢查輸入幀末尾的CRC位,以便在執(zhí)行最大迭代次數(shù)之前選擇性地終止解碼操作。正如我們所看到的,在這個函數(shù)中,我們使用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中,常規(guī)的Turbo譯碼器也有相同的操作。然而,在每次解碼迭代結(jié)束時,檢查對應(yīng)于CRC比特的輸出的最后24個樣本以進行錯誤檢測。如果沒有檢測到錯誤,我們分支出循環(huán)并終止Turbo解碼操作。在這種情況下,盡管尚未執(zhí)行最大迭代次數(shù),但是可能出現(xiàn)提前終止。如果檢測到CRC位中的錯誤,則繼續(xù)操作并輸入下一個解碼迭代,直到在迭代中沒有檢測到更多的錯誤或達到允許的最大迭代次數(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誤碼率測試
為了檢驗早期終止算法的有效性,我們現(xiàn)在比較兩種基于CRC的早期終止和不基于CRC的turbo解碼的實現(xiàn)。下面的函數(shù)(chap4_ex04)執(zhí)行CRC生成、turbo編碼、加擾和調(diào)制以及它們的逆操作的組合,而不實現(xiàn)提前終止機制。
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)在實現(xiàn)提前終止機制的同時執(zhí)行相同的收發(fā)器。在算法部署提前終止的情況下,我們記錄每個子幀中的實際迭代次數(shù),然后計算直方圖。
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值范圍(微量紅色)而提前終止(微量藍色)。
4.5.3 時間測量
在本實驗中,我們比較了沒有基于CRC的早期停止機制(chap4_ex04.m)而采用turbo解碼的收發(fā)機與采用基于CRC的早期停止機制(chap4_ex04_crc.m)的收發(fā)機的執(zhí)行時間。實驗通過調(diào)用以下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;
該腳本的第一行強制兩個收發(fā)器函數(shù)對于給定的Eb/N0值1dB,每次調(diào)用處理1000萬比特。第二行使用MATLAB函數(shù)tic和toc來獲得沒有提前終止的算法的運行時間。第三行記錄了具有提前終止的算法的經(jīng)過時間。
圖4.7 提前終止Turbo譯碼典型的執(zhí)行時間節(jié)省
在MATLAB命令行中打印的結(jié)果如圖4.7所示。與沒有提前終止(146秒)相比,提前終止(89秒)處理相同數(shù)量的輸入幀花費的時間要少得多。
未完待續(xù)
2018/12/3