「原文 Understanding LTE with MATLAB,作者Houman Zarrinkoub,本文是對於該書的翻譯,書中的專業性詞彙給出了英文原文,圖和表的排版都是參考原文,翻譯不準確的地方請讀者多多包涵。本文僅限於個人學習,研究,交流,不得用於其他商業用途!」
6.6.6 信道估計擴展
下面的matlab函數顯示了三種算法,它們可以擴展僅在CSR信號上計算的信道矩陣,以在整個資源網格上生成函數輸出(y)、信道頻率響應。該函數接受以下參數作為輸入:
通過導頻(hp)計算的有限信道響應集;與資源網格維度相關的參數,包括資源塊(Nrb)的數量、每個資源塊中的子載波數(Nrb_sc)和每個插槽的OFDM符號數(Ndl_symb)以及其他兩個參數;指定CSR信號相對於資源塊(邊緣)邊緣的位置的向量,以及選擇將響應擴展到整個網格(模式)的算法。 1functiony=gridResponse(hp, Nrb, Nrb_sc, Ndl_symb, Edges,Mode) 2%#codegen 3switchMode 4case 1 5y=gridResponse_interpolate(hp, Nrb, Nrb_sc, Ndl_symb, Edges); 6case 2 7y=gridResponse_averageSlot(hp, Nrb, Nrb_sc, Ndl_symb, Edges); 8case 3 9y=gridResponse_averageSubframe(hp, Ndl_symb, Edges);10otherwise11error('Choose the right Mode in function ChanEstimate.');12end13end
如果在gridResponse.m函數中為模式參數選擇的值為1,則執行以下matlab函數(gridResponse_interpolate.m)。它執行基於頻域和時域插值的擴展算法。該算法涉及包含CSR信號的OFDM符號在頻域內的子載波之間的插值。在計算了這些符號上所有子載波的信道響應之後,該函數會及時進行內插,以在整個資源網格中找到信道響應。該算法與單天線情況下的算法的區別在於對兩個天線和四個天線情況分別進行處理。請注意,在四個天線盒的第三和第四個天線中,包含CSR信號的OFDM符號的數量只有兩個。OFDM符號之間的插值必須考慮到這個細節。
1functionhD=gridResponse_interpolate(hp, Nrb, Nrb_sc, Ndl_symb, Edges) 2 3% AverageoverthetwosameFreqsubcarriers, andtheninterpolatebetween 4% them - getallestimatesandthenrepeatoverallcolumns (symbols). 5% TheinterpolationassmuesNCellID = 0. 6% Timeaveragetwopilotsovertheslots, theninterpolate (F) 7% betweenthe 4 averagedvalues, repeatforallsymbolsinsframe 8 9Separation=6;10hD = complex(zeros(Nrb*Nrb_sc, Ndl_symb*2));11N=numel(Edges);12% ComputechannelresponseoverallresourceelementsofOFDMsymbols13switchN14case 215Symbols=[2, 9];16 % Interpolatebetweensubcarriers17forn=1:N18E=Edges(n);Edge=[E, 5-E];19y = InterpolateCsr(hp(:,n), Separation, Edge);20hD(:,Symbols(n))=y;21end22 % InterpolatebetweenOFDMsymbols23form=[1,3:8,10:14]24alpha=(1/7)*(m-2);25 beta=1-alpha;26 hD(:,m) = beta*hD(:,2) + alpha*hD(:, 9);27 end28 case 429 Symbols=[1, 5, 8, 12];30 % Interpolate between subcarriers31 for n=1:N32 E=Edges(n);Edge=[E, 5-E];33 y = InterpolateCsr(hp(:,n), Separation, Edge);34 hD(:,Symbols(n))=y;35 end36 % Interpolate between OFDM symbols37 for m=[2, 3, 4, 6, 7]38 alpha=0.25*(m-1);39 beta=1-alpha;40 hD(:,m) = beta*hD(:,1) + alpha*hD(:, 5);41 hD(:,m+7) =beta*hD(:,8) + alpha*hD(:,12);42 end43 otherwise44 error('Wrong Edges parameter for function gridResponse.');45end46
如果gridResponse.m函數中模式參數的值設置為2,則執行以下matlab函數(gridResponse_averageslot.m)。它執行一種基於頻域內插和時間平均的擴展算法。此算法的操作取決於在給定的槽中是否找到一個或兩個包含CSR信號的OFDM符號。如果有兩個包含CSR信號的OFDM符號,該算法將前兩個OFDM符號的CSR信號組合在一起。在這種情況下,我們沒有在CSR信號之間分離六個副載波,而是分離三個副載波。如果每個插槽只有一個包含CSR信號的OFDM符號(例如,在四個天線的情況下,在第三和第四個天線中),則不會執行CSR組合,並且CSR值之間的分離仍然是六個子載波。作為下一步,該函數根據之前確定的分離值沿頻率軸插入值。最後,對給定時隙的所有OFDM符號應用相同的信道響應,並對下一時隙重複操作,以計算整個資源網格的信道響應。
1functionhD=gridResponse_averageSlot(hp, Nrb, Nrb_sc, Ndl_symb, Edges) 2 3% AverageoverthetwosameFreqsubcarriers, andtheninterpolatebetween 4% them - getallestimatesandthenrepeatoverallcolumns (symbols). 5% TheinterpolationassmuesNCellID = 0. 6% Timeaveragetwopilotsovertheslots, theninterpolate (F) 7% betweenthe 4 averagedvalues, repeatforallsymbolsinsframe 8 9Separation=3;10hD = complex(zeros(Nrb*Nrb_sc, Ndl_symb*2));11N=numel(Edges);12% ComputechannelresponseoverallresourceelementsofOFDMsymbols13switchN14case 215 % Interpolatebetweensubcarriers16Index=1:Ndl_symb;17forn=1:N18E=Edges(n);Edge=[E, 5-E];19y = InterpolateCsr(hp(:,n), 2* Separation, Edge);20 % RepeatbetweenOFDMsymbolsineachslot21yR=y(:,ones(1,Ndl_symb));22hD(:,Index)=yR;23Index=Index+Ndl_symb;24end25case 426Edge=[0 2];27h1_a_mat = [hp(:,1),hp(:,2)].';28h1_a = h1_a_mat(:);29h2_a_mat = [hp(:,3),hp(:,4)].';30h2_a = h2_a_mat(:);31hp_a=[h1_a,h2_a];32Index=1:Ndl_symb;33forn=1:size(hp_a,2) 34y = InterpolateCsr(hp_a(:,n), Separation, Edge);35 % RepeatbetweenOFDMsymbolsineachslot36yR=y(:,ones(1,Ndl_symb));37hD(:,Index)=yR;38Index=Index+Ndl_symb;39end40otherwise41error('Wrong Edges parameter for function gridResponse.');42end43
最後,如果gridResponse.m函數中模式參數的值設置為3,則執行以下matlab函數(gridResponse_averagesubframe.m)。它在整個子幀中對OFDM符號進行頻域插值和時間平均的擴展算法。該算法的操作取決於給定子幀中是否有兩個或四個包含CSR信號的OFDM符號。如果有四個,算法首先對第一個和第三個OFDM符號中的值進行平均,然後對第二個和第四個符號中的值進行平均,然後組合這些平均向量。在這種情況下,我們不再在CSR信號之間分離六個副載波,而是分離三個副載波。如果每個包含CSR信號的插槽只有一個OFDM符號,則該算法將兩個OFDM符號組合在一起,從而在組合的CSR信號之間分離出三個子載波。作為下一步,在所有情況下,函數都會根據3的分離值沿頻率軸插入值。最後,將相同的信道響應應用於子幀的所有OFDM符號,作為整個資源網格的信道響應。
1functionhD=gridResponse_averageSubframe(hp, Ndl_symb, Edges) 2 3% AverageoverthetwosameFreqsubcarriers, andtheninterpolatebetween 4% them - getallestimatesandthenrepeatoverallcolumns (symbols). 5% TheinterpolationassmuesNCellID = 0. 6% Timeaveragetwopilotsovertheslots, theninterpolate (F) 7% betweenthe 4 averagedvalues, repeatforallsymbolsinsframe 8 9Separation=3;10N=numel(Edges);11Edge=[0 2];12% ComputechannelresponseoverallresourceelementsofOFDMsymbols13switchN14case 215h1_a_mat = hp.';16h1_a = h1_a_mat(:);17 % Interpolatebetweensubcarriers18y = InterpolateCsr(h1_a, Separation, Edge);19 % RepeatbetweenOFDMsymbols20hD=y(:,ones(1,Ndl_symb*2));21case 422h1_a1 = mean([hp(:, 1), hp(:, 3)],2);23h1_a2 = mean([hp(:, 2), hp(:, 4)],2);24h1_a_mat = [h1_a1h1_a2].';25h1_a = h1_a_mat(:);26 % Interpolatebetweensubcarriers27y = InterpolateCsr(h1_a, Separation, Edge);28 % RepeatbetweenOFDMsymbols29hD=y(:,ones(1,Ndl_symb*2));30otherwise31error('Wrong Edges parameter for function gridResponse.');32end33
這裡提到的三種算法在每個子幀內提供不同的動態行為。注意,在具有普通循環前綴的OFDM傳輸中,每個時隙包含七個OFDM符號,並且每個子幀包含十四個。第一算法導致信道估計,其中子幀內的響應是動態的並且從一個OFDM符號改變到下一個OFDM符號。第二算法導致前七個OFDM符號(第一時隙)的恆定信道響應,並且對於接下來的七個OFDM符號(第二時隙)產生不同的恆定響應。第三算法是最不動態的實現,其中單個響應應用於子幀的所有OFDM符號。
6.6.7 理想信道估計
到目前為止,我們已經討論了依賴於導頻(CSR信號)來提供信道響應估計的算法。這些算法是實際的實現,可以作為實際系統的一部分。在本節中,我們將介紹所謂的「理想信道估計器」。這種理想算法依賴於信道矩陣的精確知識或MIMO信道模型提供的路徑增益值。由於MIMOFadingChan.m函數的第二輸出是表示路徑增益的多維信道矩陣,因此理想信道估計器可以使用這些路徑增益來計算整個資源網格的信道頻率響應的最佳估計。請注意,由於它的制定方式,理想的信道估計器不能作為實際系統的一部分來實現。它只能在模擬過程中用作衡量標準或作為信道估計問題的最佳「上限」解決方案。
函數IdChEst.m實現了理想的信道估計器。它將在結構(prmLTEPDSCH)中捕獲的PDSCH的參數,信道模型參數結構(prmMdl)和信道矩陣(chPathG)作為輸入,其是MIMOFadingChan.m函數的第二輸出。作為其輸出,該函數計算整個網格(H)上的信道頻率響應。
1functionH = IdChEst(prmLTEPDSCH, prmMdl, chPathG) 2% IdealchannelestimationforLTEsubframes 3% 4% GiventhesystemparametersandtheMIMOchannelpathGains, provide 5% theidealchannelestimatesfortheREcorrespondingtothedata. 6% Limitation - willworkforpathdelaysthataremultipleofchannelsample 7% timeandlargestpathDelay < sizeofFFT 8% ImplementationbasedonFFTofchannelimpulseresponse 910persistenthFFT; 11ifisempty(hFFT) 12hFFT = dsp.FFT; 13end14% getparameters15numDataTones = prmLTEPDSCH.Nrb*12; % Nrb_sc = 1216N = prmLTEPDSCH.N;17cpLen0 = prmLTEPDSCH.cpLen0;18cpLenR = prmLTEPDSCH.cpLenR;19slotLen = (N*7 + cpLen0 + cpLenR*6);20% Getpathdelays21pathDelays = prmMdl.PathDelays;22% Delays, intermsofnumberofchannelsamples, +1 forindexing23sampIdx = round(pathDelays/(1/prmLTEPDSCH.chanSRate)) + 1;24[~, numPaths, numTx, numRx] = size(chPathG);2526H = complex(zeros(numDataTones, 14, numTx, numRx));27fori= 1:numTx28forj = 1:numRx29link_PathG = chPathG(:, :, i, j);30 % SplitthisperOFDMsymbol31g = complex(zeros(2*7, numPaths));32forjj = 1:2 % overtwoslots33 % FirstOFDMsymbol34g((jj-1)*7+1, :) = mean(link_PathG((jj-1)*slotLen + (1:(N+cpLen0)), :), 1);3536 % Next 6 OFDMsymbols37fork = 1:638g((jj-1)*7+k+1, :) = mean(link_PathG((jj-1)*slotLen+cpLen0+k*N+(k-1)*cpLenR + (1:(N+cpLenR)), :), 1);39end40end41hImp = complex(zeros(2*7, N));42hImp(:, sampIdx) = g; % assignpathGainsatsamplelocations43 % FFTprocessing44h = step(hFFT, hImp.'); 4546 % Reorder, remove DC, Unpack channel gains47 h = [h(N/2+1:N, :); h(1:N/2, :)];48 H(:, :, i, j) = [h(N/2-numDataTones/2+1:N/2, :); h(N/2+2:N/2+1+numDataTones/2, :)];49 end50end51
該函數基本上通過對信道脈衝響應應用快速傅立葉變換(FFT)來計算信道頻率。它基於整個子幀的平均,因此相同的信道響應被應用於子幀的所有14個OFDM符號。該函數的操作可歸納如下:
(i)對於任何給定的發射天線和接收天線,及時提取所有採樣的信道路徑增益;
(ii)排除循環前綴樣本;
(iii)取得非循環前綴樣本的平均值;
(iv)初始化單個脈衝響應矢量(hImp);
(v)通過將歸一化的路徑延遲值四捨五入到最接近的整數來找到脈衝響應的非零樣本;
(vi)通過將平均路徑增益放在非零樣本中來更新脈衝響應矢量; (vii)anFFT應用於脈衝響應;
(viii)在通道中重新排序和解包信道響應值以計算整個資源網格上的信道響應。
6.6.8信道響應提取
每個接收天線的接收資源網格包含多種類型的數據,包括用戶數據,CSR和頻譜空信號,DCI,同步信號和BCH信號。為了專注於均衡和恢復用戶數據,我們必須從估計的信道響應中提取與用戶數據一致的元素。以下MATLAB函數(ExtChResponse.m)使用PDSCH參數結構(prmLTEPDSCH)和用戶數據索引(idx_data)從完整網格(chEst)中提取與用戶數據(hD)對齊的通道響應值。請注意,調用此函數時,用戶數據索引(idx_data)已經計算為資源解映射函數(REdemapper_mTx)的第三個輸出。
1functionhD=ExtChResponse(chEst, idx_data, prmLTE) 2%#codegen 3numTx = prmLTE.numTx; 4numRx = prmLTE.numRx; 5if (numTx==1) 6hD=complex(zeros(numel(idx_data),numRx)); 7forn=1:numRx 8tmp=chEst(:,:,n); 9hD(:,n)=tmp(idx_data);10end11else12hD=complex(zeros(numel(idx_data),numTx,numRx));13forn=1:numRx14form=1:numTx15tmp=chEst(:,:,m,n);16hD(:,m,n)=tmp(idx_data);17end18end19end20
未完待續
2019/2/12