LTE 調製與編碼(一)
4 人贊了文章
LTE所使用的調製方案有三種。分別是QPSK, 16QAM, 和64QAM.
這幾種調製方案,根據信道條件不同,在適應性調製中使用。當無線電鏈路相對清晰(也就是說信噪比(SNR)較高),我們可以採用較密的星座圖調製方案,如64QAM。這樣的情況下,發送一個信號符號需要6bit,因此增加了信號的吞吐量。當信道雜訊水平增加時,我們就依靠使用碼間隔離性更好的調製方案,如QPSK。這樣會減少每個採樣信號的比特數以及減少吞吐量。
首先我們設計一個調製器:
function y=Modulator(u, Mode) %u是二進位碼流,Mode指調製模式%% Initializationpersistent QPSK QAM16 QAM64 %persistent 關鍵字相當於在C++中的staticif isempty(QPSK) QPSK = comm.PSKModulator(4, BitInput, true, ... PhaseOffset, pi/4, SymbolMapping, Custom, ... CustomSymbolMapping, [0 1 2 3]); %CustomSymbolMapping, [0 2 3 1]);%(調製階數為4,採用二進位輸入,相位偏置為pi/4, 採用自定義的星座圖編碼) QAM16 = comm.RectangularQAMModulator(16, BitInput,true,... NormalizationMethod,Average power,... SymbolMapping, Custom, ... CustomSymbolMapping, [11 10 14 15 9 8 12 13 1 0 4 5 3 2 6 7]);%(調製階數為16,採用二進位輸入) QAM64 = comm.RectangularQAMModulator(64, BitInput,true,... NormalizationMethod,Average power,... SymbolMapping, Custom, ... CustomSymbolMapping, [47 46 42 43 59 58 62 63 45 44 40 41 ... 57 56 60 61 37 36 32 33 49 48 52 53 39 38 34 35 51 50 54 55 7 ... 6 2 3 19 18 22 23 5 4 0 1 17 16 20 21 13 12 8 9 25 24 28 29 15 ... 14 10 11 27 26 30 31]); %調製階數為64,採用二進位輸入end%% Processingswitch Mode %在調製解調的過程中,我們可以選擇使用何種模式 case 1 y=step(QPSK, u); case 2 y=step(QAM16, u); case 3 y=step(QAM64, u); otherwise error(Invalid Modulation Mode. Use {1,2, or 3});end
這裡我們可能會有一個疑問,就是為什麼下面的編碼,不是一個順序的數值,而是看起來雜亂五章的數字。實際上,這裡我們選用任何的編碼都是可以的,這個矩陣實際上就是給星座圖上的每一個點定義一個所代表的數值,這個數值是我們定義的,只要一會我們解碼的時候,選用的是對應的相同編碼定義就可以了。
解碼就是編碼的反向操作,就是我們得到編碼過的碼流後,將碼流輸入進入解碼器,再根據解碼規則,我們能夠還原出原來的信息。
解碼的方式有兩種,一種是硬判決,一種是軟判決。
硬判決:是簡單的通過設置閾值來判斷輸出,以二進位來說的話,一般大於0的判1,小於0的判0
軟判決:是先將判決輸入量化成N個值,通過最大後驗概率計算每個值最有可能的原值是多少,演算法比較複雜誤碼率也更低,軟判決的誤碼率相較硬判決要低,然而實現的複雜度也相對較高。
首先我們實現的是一個比較簡單的硬判決方式的解碼:
function y=DemodulatorHard(u, Mode)% 這個函數的實現和調製函數的實現基本一樣,輸入的內容是碼流和調製模式%% Initializationpersistent QPSK QAM16 QAM64if isempty(QPSK) QPSK = comm.PSKDemodulator(... ModulationOrder, 4, ... BitOutput, true, ... PhaseOffset, pi/4, SymbolMapping, Custom, ... CustomSymbolMapping, [0 1 2 3]); %這裡的編碼要和Modulator.m中的一致 %CustomSymbolMapping, [0 2 3 1]); QAM16 = comm.RectangularQAMDemodulator(... ModulationOrder, 16, ... BitOutput, true, ... NormalizationMethod, Average power, SymbolMapping, Custom, ... CustomSymbolMapping, [11 10 14 15 9 8 12 13 1 0 4 5 3 2 6 7]); QAM64 = comm.RectangularQAMDemodulator(... ModulationOrder, 64, ... BitOutput, true, ... NormalizationMethod, Average power, SymbolMapping, Custom, ... CustomSymbolMapping, ... [47 46 42 43 59 58 62 63 45 44 40 41 57 56 60 61 37 ... 36 32 33 49 48 52 53 39 38 34 35 51 50 54 55 7 6 2 3 ... 19 18 22 23 5 4 0 1 17 16 20 21 13 12 8 9 25 24 28 29 ... 15 14 10 11 27 26 30 31]);end%% Processingswitch Mode case 1 y=QPSK.step(u); case 2 y=QAM16.step(u); case 3 y=QAM64.step(u); otherwise error(Invalid Modulation Mode. Use {1,2, or 3});end
在這裡的輸入參數為Eb/No,而不是信噪比,主要在這裡的原因是因為我們在一會的模擬工具中指定的輸入雜訊使用的單位也是Eb/No,而為什麼大家選用的是這個而不是SNR,這個問題在CSDN上有所討論,我覺得有一個博主寫的比較好理解:
Eb/No 與 SNR (轉) - Peng的日誌 - 網易博客Q2:為什麼模擬要用EbNo,而不用SNR呢?
A1:因為用EbNo可以直觀的看到系統性能,比如採用只採用QPSK,那麼BER達到千分之一時,EbNo大約為7,如果採用單用戶,進行了信道編碼又進行了均衡,也採用QPSK星座映射,但EbNo為7時,BER為百分之一,那就證明系統設計有問題或者模擬出錯了。因為SNR和EbNo是線性關係,所以用SNR為參數看BER只能看到大概的趨勢,不能看到系統性能到底如何。
好了,寫好了上面的編碼器和解碼器,就是建立我們的實驗模型了,我們首先想要觀察,在使用不同的調製方案下,各種編碼方式對於雜訊的影響(或者說是抗雜訊干擾能力)。
function [ber, numBits]=test_ber(EbNo, maxNumErrs, maxNumBits)%這是實際進行模擬,在不同的調製方案下,其對於雜訊的承受能力應該是不同的%% ConstantsFRM=24000; % Size of bit frame 我們在這裡定義一段二進位碼流的長度%% Modulation ModeModulationMode=1; % QPSK選用我們的調製方案,在模擬時進行選擇% ModulationMode=2; % QAM16%ModulationMode=3; % QAM64k=2*ModulationMode; % Number of bits per modulation symbolsnr = EbNo + 10*log10(k); %信噪比和EbNo的計算關係%% Processsing loop: transmitter, channel model and receivernumErrs = 0; numBits = 0;while ((numErrs < maxNumErrs) && (numBits < maxNumBits)) % Transmitter u = randi([0 1], FRM,1); % Randomly generated input bits t0 = Modulator(u, ModulationMode); % Modulator % Channel c0 = AWGNChannel(t0, snr); % (add white gaussian noise)給我們的二進位碼流輸入相應的高斯白雜訊 % Receiver r0 = DemodulatorHard(c0, ModulationMode); % Demodulator, Hard-decision y = r0(1:FRM); % Recover output bits % Measurements numErrs = numErrs + sum(y~=u); % Update number of bit errors numBits = numBits + FRM; % Update number of bits processedend%% Clean up & collect resultsber = numErrs/numBits; %計算bit error rate誤碼率
我們最後以誤碼率來評判我們的不同調製方式的抗干擾能力。
開始模擬。
平台信息:
Windows 10 pro 64bits;
Matlab r2018a;
打開matlab後,在shell中輸入『bertool』:
打開後選擇蒙特卡洛(Monte Carlo)選項卡,選擇Simmulation MATLAB file or Simulink model, 選擇剛才的模擬程序,記得我們剛才的誤碼率變數為ber,將它輸入到BER variable name, 進行模擬,一次模擬結束後,在文件中修改調製方案,mode選擇為QPSK, QAM16, QAM64,三次模擬後結果如下:
可將誤碼率:QPSK < QAM16 < QAM64。
至此,模擬結束,我們可以知道,在星座圖上編碼越密,誤碼率越高,而傳輸的速率也越快(這一點未在模擬中體現)。
推薦閱讀:
※MATLAB應用舉例
※CodyNote004:簡單解碼環加密問題
※Matlab中的模態分析
※CodyNote016:「拉鏈矩陣」的構造
※助力國賽 | 第2彈 擬合和插值