sidelink-broadcast发送端流程分析
总的来说,首先产生发送信号 tx_output
tx_output = broadcast_tx(struct('NSLRB',NSLRB,'NSLID',NSLID,'cp_Len_r12',cp_Len_r12, 'slMode',slMode), ...
struct('syncOffsetIndicator',syncOffsetIndicator,'syncPeriod',syncPeriod), ...
numTotSubframes);
接下来附加噪声 noise、时偏 toff、频偏 foff
noise = sqrt((1/2)*10^(-SNR_target_dB/10))*complex(randn(length(tx_output),1), randn(length(tx_output),1));
% Time offset
toff = randi([0,samples_per_subframe],1,1);
rx_input = [zeros(toff,1); rx_input];
% Freq-offset
foff = 0.01; % set an error (%)
rx_input = rx_input(:).*exp(2i*pi*(0:length(rx_input(:))-1).'*foff/NFFT);
最后从接收信号 rx_input 中读取发送端的 configuration。
有几点需要注意:
- 因为在LTE中基本时间单位为:
所以当 NSLRB = 25, NFFT = 512时,采样率为为\(7.68\text{MHz}\),因为一个子帧持续时间\(1ms\),所以得到samples_per_subframe = 7680;
-
时偏就是在信号前附加了一段0;
-
CFO对接收信号的影响为:
该公式参考《5G NR物理层技术详解 原理、模型和组件》的6.5.2,可以发现与代码实现相同,与DFT点数有关。
接下来主要是分析发送信号的产生:
发送信号包括同步块h_slSync_tx、广播块h_slBroad_tx,最后形成tx_output三个步骤。
1.
h_slSync_tx = SL_Sync(slSyncConfig, slBroadConfig);
需要生成主同步和辅同步数据块,两者生成过程类似,以PSS为例:在 h.slMode == 0 时,由36.211, 9.7.1协议可知,ZC序列的根索引值设定为 [25; 29; 34],得到:
tmp = sqrt(72/(h.N_pss_cazac-1))*exp(-1i*pi*ZC_ind(jj)*n_ind.*(n_ind+1)/h.N_pss_cazac);
再生成对应的索引,以便将数据放置在时频资源块上;同时,将PSS符号转换成时域信号:
% IFFT
Tmp = ifft(ifftshift(tmp));
% Normalize power:
Tmp = h.NFFT/sqrt(h.NSLRB*h.NRBsc)*Tmp;
% Add CP:
Tmp = [Tmp(end-h.cpLenR+1:end); Tmp];
% Shift by half subcarrier:
h.psss_time_domain = Tmp.*exp(2i*pi*(-h.cpLenR:h.NFFT-1)'/h.NFFT/2);
示意图如下:
ZC序列的优点:
1.恒包络,任意长度的ZC序列幅值恒定;
2.理想周期自相关,循环移位不等于ZC序列的长度后,则移位后的序列和原序列不相关;
3.良好的互相关,两个长度互质的ZC序列的互相关为常数,即需要当两个序列Root index的差与序列长度互质时;
4.对于长度为质数的ZC序列,傅立叶变换后仍是ZC序列
参考:1. https://www.mathworks.com/help/lte/ug/synchronization-signals-pss-and-sss.html
2. https://www.sharetechnote.com/html/Handbook_LTE_DMRS_PUSCH.html
3. https://en.wikipedia.org/wiki/Zadoff%E2%80%93Chu_sequence
4. https://blog.csdn.net/liuqi05/article/details/124010133
2.
h_slBroad_tx = SL_Broadcast(slBroadConfig, h_slSync_tx.sync_grid);
由两部分组成(在 h.slMode == 1 || h.slMode == 2 时):
l_PSBCH: Exact symbols carrying PSBCH while accounting for dm-rs, ss (guard is included!),,占据8个符号 [0 4 5 6 7 8 9 13]
l_PSBCH_DMRS: 解调参考信号,占据8个符号 [3 10]
每个子帧的样本个数:
% 2*7*512 + 2*40 + 2*(7-1)*36
h.samples_per_subframe = 2*h.NSLsymb*h.NFFT + 2*h.cpLen0 + 2*(h.NSLsymb-1)*h.cpLenR;
解释:7个ofdm共有7个cp,其中只有第一个符号的cp占比是0.0781,后面6个cp的占比是0.0703,所以分别为5120.0781=40,5120.0703=36,总的来说共有样本数:51214+402+36*(14-2)=7680,与前面吻合
PSBCH占据中心72个子载波资源,如图所示:
u_s = h.u_slots();
v_s = h.v_slots();
a_s = h.a_slots();
orth_code = h.w_OOC();
基于u_s、v_s和a_s,生成基序列base_seq_slot,再用基序列乘以正交掩码,以生成 layerseq,layerseq矩阵的每列表示每层的两时隙 DMRS 信号,layerseq经过预编码后得到 antseq,antseq的每一列包含对应于一个子帧的堆叠DMRS符号。(参考代码 SL_DMRS 的600行左右),最后将DMRS符号映射到时频资源网格上。
所谓映射类似于排序,放置数据,
h.psbch_drms_seq_grid = phy_resources_mapper(2*h.NSLsymb, h.NSLRB*h.NRBsc, h.l_PSBCH_DMRS, h.subixs_PSBCH, h.psbch_dmrs_seq);
如图所示:
可以参考:https://www.sharetechnote.com/html/Handbook_LTE_DMRS_PUSCH.html
3.
for tested_subframe = 0:numTotSubframes-1
% initialize signal
tx_output_sf = 0*complex(ones(h_slBroad_tx.samples_per_subframe,1),ones(h_slBroad_tx.samples_per_subframe,1));
% check if this is a broadcast subframe and load it
if mod(tested_subframe,h_slSync_tx.syncPeriod) == h_slSync_tx.syncOffsetIndicator
tx_output_sf = CreateSubframe (h_slBroad_tx, tested_subframe);
end
% total tx waveform loading
tx_output(tested_subframe*h_slBroad_tx.samples_per_subframe+1:(tested_subframe+1)*h_slBroad_tx.samples_per_subframe,1) = tx_output_sf;
end
接下来需要CreateSubframe,需要先SL_BCH_PSBCH_Encode:Sidelink BCH Transport/Physical Channel Tx Processing,然后phy_resources_mapper:映射到网格
SL_BCH_PSBCH_Encode包括如下内容:
1.CRC校验(40 -> 40+16=56)
参考:https://www.mathworks.com/help/matlab/matlab_prog/perform-cyclic-redundancy-check.html
https://www.sharetechnote.com/html/Handbook_LTE_NB_NPBCH.html#RateMatching_36_212_5_3_1
注意16位的CRC校验需要在序列尾附加额外的16个比特,但是多项式除数的最高次方为17。
2.信道编码(56 -> 56*3=168)
采用1/3码率的卷积码,输入1bit信息,会输出3bit,因此接下来需要速率匹配
参考:https://www.sharetechnote.com/html/Handbook_LTE_NB_NPBCH.html#RateMatching_36_212_5_3_1
https://www.sharetechnote.com/html/BasicProcedure_LTE_ChannelCoding_DL_SCH.html
3.速率匹配(168 -> 1152)h.psbch_BitCapacity = 1152 = PSBCH subcarriers x Num of Symbols x 2 due to QPSK = 7282
参考:https://www.sharetechnote.com/html/Handbook_LTE_NB_NPBCH.html#RateMatching_36_212_5_3_1
https://www.sharetechnote.com/html/BasicProcedure_LTE_ChannelCoding_DL_SCH.html
https://www.sharetechnote.com/html/5G/5G_PDSCH.html#Rate_Matching
因为不太理解,感觉有点类似交织操作,具体内容还需要联系代码,这里不做展开了。
4.无任何控制信息的 PUSCH 交织
执行的也是类似交织的操作,具体请查阅函数tran_uplink_MuxIntlvDataOnly_getIndices();
5.交织
参考:https://www.sharetechnote.com/html/Handbook_LTE_PseudoRandomSequence.html
就是将基础序列与gold序列做模2加
至于gold序列可以参阅:https://www.sharetechnote.com/html/Handbook_LTE_PseudoRandomSequence.html
https://www.sharetechnote.com/html/Handbook_Communication_GoldCode.html
gold序列是伪随机序列,通过m序列得到,区别于线性分组码和卷积码,参阅函数phy_goldseq_gen()可知,先通过序列x1和序列x1的时延做模2加得到新的x1,同理得到新的x2,最后新的x1和新的x2做模2加即可
for n = 0 : Mpn -1
output_bitseq(n+1,1) = mod(x1(n+1+Nc)+x2(n+1+Nc),2);
end
6.调制
这里的调制是将bit,即0,1映射为符号,例如QPSK调制,令00,01,10,11分别对应不同的复数值 1/sqrt(2)*[1+1i; 1-1i; -1+1i; -1-1i],这与ofdm调制是不同的
7.层的映射
和天线端口相关;天线端口区别于实际物理天线
8.发送预编码
将输入序列reshape成矩阵,然后做了fft变换,再拉直
(小细节:ofdm调制时,一次取一列,即同一个符号,不同频率,其次,因为fft点数是512需要补零,还有就是ifft(ifftshift(tmp)))

浙公网安备 33010602011771号