“原文 Understanding LTE with MATLAB ,作者Houman Zarrinkoub,本文是对于该书的翻译,书中的专业性词汇给出了英文原文,图和表的排版都是参考原文,翻译不准确的地方请读者多多包涵。
本文仅限于个人学习,研究,交流,不得用于其他商业用途!”
5.10 资源粒映射
在本节中,我们将详细描述将资源网格的组件放置在标准中指定的位置的资源元素映射。映射主要通过创建到资源网格矩阵的索引并在网格中放置各种信息类型来执行。图5.8-5.10中给出的三种不同类型的资源块的说明有助于可视化这些索引的公式。根据使用的子帧,我们将BCH、PSS和SSS填充在DC子载波周围的六个中央资源块的子帧0或子帧5中。CSR被放置在每个时隙的符号0和5中,具有六个子载波的频域分离。
下面的MATLAB函数显示了资源元素映射。由于MATLAB使用基于1的索引符号,因此我们为矩阵中的各种元素生成索引,索引从1开始,而不是0,如标准所指定的。该函数将用户数据(in)、CSR信号(csr)、子帧索引(nS)和称为prmLTE的结构中捕获的PDSCH的参数作为输入。根据BCH、SSS、PSS和DCI的可用性,该函数可以承担额外的输入。输出变量y是资源网格矩阵。2D网格矩阵的行数等于子载波的数目和列的数目,总共是14(每个时隙包含7个OFDM符号)。
1function y = REmapper_1Tx(in, csr, nS, prmLTE, varargin)
2%#codegen
3switch nargin
4 case 4, pdcch=[];pss=[];sss=[];bch=[];
5 case 5, pdcch=varargin{1};pss=[];sss=[];bch=[];
6 case 6, pdcch=varargin{1};pss=varargin{2};sss=[];bch=[];
7 case 7, pdcch=varargin{1};pss=varargin{2};sss=varargin{3};bch=[];
8 case 8, pdcch=varargin{1};pss=varargin{2};sss=varargin{3};bch=varargin{4};
9 otherwise
10 error('REMapper has 4 to 8 arguments!');
11end
12% NcellID = 0; % One of possible 504 values
13% numTx = 1; % prmLTE.numTx;
14% Get input params
15Nrb = prmLTE.Nrb; % either of {6, }
16Nrb_sc = prmLTE.Nrb_sc; % 12 for normal mode
17Ndl_symb = prmLTE.Ndl_symb; % 7 for normal mode
18numContSymb = prmLTE.contReg; % either {1, 2, 3}
19% Initialize output buffer
20y = complex(zeros(Nrb*Nrb_sc, Ndl_symb*2));
21%% Specify resource grid location indices for CSR, PDCCH, PDSCH, PBCH, PSS, SSS
22%% 1st: Indices for CSR pilot symbols
23lenOFDM = Nrb*Nrb_sc;
24idx = 1:lenOFDM;
25idx_csr0 = 1:6:lenOFDM; % More general starting point = 1+mod(NcellID, 6);
26idx_csr4 = 4:6:lenOFDM; % More general starting point = 1+mod(3+NcellID, 6);
27idx_csr =[idx_csr0, 4*lenOFDM+idx_csr4, 7*lenOFDM+idx_csr0, 11*lenOFDM+idx_csr4];
28%% 2nd: Indices for PDCCH control data symbols
29ContREs=numContSymb*lenOFDM;
30idx_dci=1:ContREs;
31idx_pdcch = ExpungeFrom(idx_dci,idx_csr0);
32%% 3rd: Indices for PDSCH and PDSCH data in OFDM symbols whee pilots are present
33idx_data0= ExpungeFrom(idx,idx_csr0);
34idx_data4 = ExpungeFrom(idx,idx_csr4);
35%% Handle 3 types of subframes differently
36switch nS
37 %% 4th: Indices for BCH, PSS, SSS are only found in specific subframes 0 and 5
38 % Thsese symbols share the same 6 center sub-carrier locations (idx_ctr)
39 % and differ in OFDM symbol number.
40 case 0 % Subframe 0
41 % PBCH, PSS, SSS are available + CSR, PDCCH, PDSCH
42 idx_6rbs = (1:72);
43 idx_ctr = 0.5* lenOFDM - 36 + idx_6rbs ;
44 idx_SSS = 5* lenOFDM + idx_ctr;
45 idx_PSS = 6* lenOFDM + idx_ctr;
46 idx_ctr0 = ExpungeFrom(idx_ctr,idx_csr0);
47 idx_bch=[7*lenOFDM + idx_ctr0, 8*lenOFDM + idx_ctr, 9*lenOFDM + idx_ctr, 10*lenOFDM + idx_ctr];
48 idx_data5 = ExpungeFrom(idx,idx_ctr);
49 idx_data7 = ExpungeFrom(idx_data0,idx_ctr);
50 idx_data = [ContREs+1:4*lenOFDM, 4*lenOFDM+idx_data4, ...
51 5*lenOFDM+idx_data5, 6*lenOFDM+idx_data5, 7*lenOFDM+idx_data7, 8*lenOFDM+idx_data5, ...
52 9*lenOFDM+idx_data5, 10*lenOFDM+idx_data5, 11*lenOFDM+idx_data4, ...
53 12*lenOFDM+1:14*lenOFDM];
54 y(idx_csr)=csr(:); % Insert Cell-Specific Reference signal (CSR) = pilots
55 y(idx_data)=in; % Insert Physical Downlink Shared Channel (PDSCH) = user data
56 if ~isempty(pdcch), y(idx_pdcch)=pdcch;end % Insert Physical Downlink Control Channel (PDCCH)
57 if ~isempty(pss), y(idx_PSS)=pss;end % Insert Primary Synchronization Signal (PSS)
58 if ~isempty(sss), y(idx_SSS)=sss;end % Insert Secondary Synchronization Signal (SSS)
59 if ~isempty(bch), y(idx_bch)=bch;end % Insert Broadcast Cahnnel data (BCH)
60
61 case 10 % Subframe 5
62 % PSS, SSS are available + CSR, PDCCH, PDSCH
63 % Primary ans Secondary synchronization signals in OFDM symbols 5 and 6
64 idx_6rbs = (1:72);
65 idx_ctr = 0.5* lenOFDM - 36 + idx_6rbs ;
66 idx_SSS = 5* lenOFDM + idx_ctr;
67 idx_PSS = 6* lenOFDM + idx_ctr;
68 idx_data5 = ExpungeFrom(idx,idx_ctr);
69 idx_data = [ContREs+1:4*lenOFDM, 4*lenOFDM+idx_data4, 5*lenOFDM+idx_data5, 6*lenOFDM+idx_data5, ...
70 7*lenOFDM+idx_data0, 8*lenOFDM+1:11*lenOFDM, 11*lenOFDM+idx_data4, ...
71 12*lenOFDM+1:14*lenOFDM];
72 y(idx_csr)=csr(:); % Insert Cell-Specific Reference signal (CSR) = pilots
73 y(idx_data)=in; % Insert Physical Downlink Shared Channel (PDSCH) = user data
74 if ~isempty(pdcch), y(idx_pdcch)=pdcch;end % Insert Physical Downlink Control Channel (PDCCH)
75 if ~isempty(pss), y(idx_PSS)=pss;end % Insert Primary Synchronization Signal (PSS)
76 if ~isempty(sss), y(idx_SSS)=sss;end % Insert Secondary Synchronization Signal (SSS)
77
78 otherwise % other subframes
79 % Only CSR, PDCCH, PDSCH
80 idx_data = [ContREs+1:4*lenOFDM, 4*lenOFDM+idx_data4, ...
81 5*lenOFDM+1:7*lenOFDM, ...
82 7*lenOFDM+idx_data0, ...
83 8*lenOFDM+1:11*lenOFDM, ...
84 11*lenOFDM+idx_data4, ...
85 12*lenOFDM+1:14*lenOFDM];
86 y(idx_csr)=csr(:); % Insert Cell-Specific Reference signal (CSR) = pilots
87 y(idx_data)=in; % Insert Physical Downlink Shared Channel (PDSCH) = user data
88 if ~isempty(pdcch), y(idx_pdcch)=pdcch;end % Insert Physical Downlink Control Channel (PDCCH)
89end
90end
5.11 OFDM符号生成
OFDM信号生成操作在资源网格上。它逐个接收OFDM符号(资源网格矩阵中的数据列),并执行IFFT操作,然后进行CP加法以生成OFDM调制信号。下面的MATLAB函数显示如何在IFFT操作之前,将数据打包到FFT缓冲区中并重新排序以排除DC子载波。在IFFT操作之后,我们调整输出。CP加法将IFFT输出的最后N个样本加到缓冲区的开头。第一OFDM符号中的N值与所有其他OFDM符号中的N值不同。函数的输入是资源网格(in)和包含PDSCH(prmLTE)参数的结构。CP在插槽中的符号之间具有不同的长度。每个时隙(cpLen0)的第一OFDM符号中的CP的长度略大于时隙(cpLenR)的其余六个符号中的CP值。在for循环中,当输出信号序列化并将每个OFDM调制信号的长度附加到每个子帧的输出向量时,计算输出信号时考虑这种差异[3]。
函数的输出是2D矩阵:第一维的大小是每个子帧的输出,第二维是天线端口的数量。在本章中,我们主要讨论接触式天线,其输出为二维等于一的列向量。在下一章介绍MIMO技术时,我们不必修改这个函数,因为它同样适用于单信道和多信道OFDM信号生成情况。
1function y = OFDMTx(in, prmLTE)
2%#codegen
3persistent hIFFT;
4if isempty(hIFFT)
5 hIFFT = dsp.IFFT;
6end
7[len, numSymb, numLayers] = size(in);
8% N assumes 15KHz subcarrier spacing
9N = prmLTE.N;
10cpLen0 = prmLTE.cpLen0;
11cpLenR = prmLTE.cpLenR;
12slotLen = (N*7 + cpLen0 + cpLenR*6);
13subframeLen = slotLen*2;
14tmp = complex(zeros(N, numSymb, numLayers));
15% Pack data, add DC, and reorder
16tmp(N/2-len/2+1:N/2, :, :) = in(1:len/2, :, :);
17tmp(N/2+2:N/2+1+len/2, :, :) = in(len/2+1:len, :, :);
18tmp = [tmp(N/2+1:N, :, :); tmp(1:N/2, :, :)];
19% IFFT processing
20x = step(hIFFT, tmp);
21x = x.*(N/sqrt(len));
22% Add cyclic prefix per OFDM symbol per antenna port
23% and serialize over the subframe (equal to 2 slots)
24% For a subframe of data
25y = complex(zeros(subframeLen, numLayers));
26for j = 1:2 % Over the two slots
27 % First OFDM symbol
28 y((j-1)*slotLen+(1:cpLen0), :) = x((N-cpLen0+1):N, (j-1)*7+1, :);
29 y((j-1)*slotLen+cpLen0+(1:N), :) = x(1:N, (j-1)*7+1, :);
30
31 % Next 6 OFDM symbols
32 for k = 1:6
33 y((j-1)*slotLen+cpLen0+k*N+(k-1)*cpLenR+(1:cpLenR), :) = x(N-cpLenR+1:N, (j-1)*7+k+1, :);
34 y((j-1)*slotLen+cpLen0+k*N+k*cpLenR+(1:N), :) = x(1:N, (j-1)*7+k+1, :);
35 end
36end
37
未完待续
2018/12/18