5G NR PSS信号生成

  • IQ调制
  • OFDM过程
  • 5G协议
  • 代码解析

PSS的生成会用到几个概念,先介绍如下。

IQ调制

一个简化的发送端基带信号处理流程大概是下面这样的。

(在IFFT前后应该分别有串并转换和并串转换操作)
这里的Modulation部分一般就都是通过IQ调制完成的。
IQ调制是一种调制方式,通过这种方式可以实现PSK,QAM等各种调制方式。在通信系统中,对于需要发送的数据,首先需要按照对应的调制方式将输入数据分解到IQ分支上。
比如,如果使用的是16QAM,它的星座图是这样的:

那么输入数据就会4个一组,按照星座图的方式分别映射到I轴和Q轴。因为IQ默认是90度关系,所以只要知道I轴和Q轴的值就能够复原表示原来4位数据的向量,也就能知道原来的4位原始数据。原始数据与IQ值的对应关系如下:

把生成的IQ信号表示成复数的形式:I+jQ,然后再取N个复数做IFFT,对IFFT的结果取实部就得到一个OFDM符号在时域的采样点。其中N是当前带宽可用的子载波数。

OFDM过程

可以这么理解,对于单个子载波,IQ调制的过程是这样的:

其中a,b就是单个子载波对应的IQ信号。
而对于OFDM符号,它在时域上是多个频率信号的叠加,它的公式如下:
x(t)=∑k=−N/2N/2−1X[k]ej2πkt/Nx(t)=\sum_{k=-N/2}^{N/2-1}X[k]e^{j2\pi kt/N} x(t)=k=−N/2∑N/2−1​X[k]ej2πkt/N
其中X[k]就相当于上面单载波中的IQ信号a+jb.

设IFFT的size为M,那么IFFT输出的M个时域离散值就是一个完整的OFDM符号时域所有的采样点。利用这些采样点就可以生成时域的OFDM基带信号。
在实际的通信系统中,IFFT的大小都是2的n次方,而子载波数却不一定是。因此通常M>N,那么在做IFFT的时候,是通过在N个IQ复数的基础上补零来完成M的IFFT。(待求证)
对于补零后的频域数据,在做IFFT之前通常会做循环移位,从而把零频分量移动到IFFT输入的中间。

5G协议

在38.211中,PSS序列被定义为一个m序列。m序列是一类特殊的LFSR序列。它的生成结构如下:

对应的生成公式是这样的:

然后是PSS所占用的时频资源的位置:

以上这些都是生成PSS所需要的参数。

代码解析

下面我们来看OAI中生成PSS的代码。
首先是函数定义及用到的变量的定义:


/*******************************************************************
*
* NAME :         generate_pss_nr
*
* PARAMETERS :   N_ID_2 : element 2 of physical layer cell identity
*                value : { 0, 1, 2}
*
* RETURN :       generate binary pss sequence (this is a m-sequence)
*
* DESCRIPTION :  3GPP TS 38.211 7.4.2.2 Primary synchronisation signal
*                Sequence generation
*
*********************************************************************/void generate_pss_nr(NR_DL_FRAME_PARMS *fp,int N_ID_2)
{AssertFatal(fp->ofdm_symbol_size > 127,"Illegal ofdm_symbol_size %d\n",fp->ofdm_symbol_size);AssertFatal(N_ID_2>=0 && N_ID_2 <=2,"Illegal N_ID_2 %d\n",N_ID_2);int16_t d_pss[LENGTH_PSS_NR];int16_t x[LENGTH_PSS_NR];int16_t *primary_synchro_time = primary_synchro_time_nr[N_ID_2];   //存储三个PSS序列的数组unsigned int length = fp->ofdm_symbol_size;   //即IFFT sizeunsigned int size = length * IQ_SIZE; /* i & q */int16_t *primary_synchro = primary_synchro_nr[N_ID_2]; /* pss in complex with alternatively i then q */int16_t *primary_synchro2 = primary_synchro_nr2[N_ID_2]; /* pss in complex with alternatively i then q */void (*idft)(int16_t *,int16_t *, int);

初始化m序列的初始状态:

  //38.211中,m序列的初始状态#define INITIAL_PSS_NR    (7)const int x_initial[INITIAL_PSS_NR] = {0, 1, 1 , 0, 1, 1, 1};

然后按照协议公式计算出PSS序列中的127个值:

  //按照38.211的公式计算127位序列for (int i=0; i < INITIAL_PSS_NR; i++) {x[i] = x_initial[i];}for (int i=0; i < (LENGTH_PSS_NR - INITIAL_PSS_NR); i++) {x[i+INITIAL_PSS_NR] = (x[i + 4] + x[i])%(2);}for (int n=0; n < LENGTH_PSS_NR; n++) {int m = (n + 43*N_ID_2)%(LENGTH_PSS_NR);d_pss[n] = 1 - 2*x[m];   //这里相当于对PSS序列进行来BPSK的调制,由0,1序列调制为-1, 1}

根据生成的原始PSS序列生成对应的IQ数据:

  /* PSS is directly mapped to subcarrier without modulation 38.211 */for (int i=0; i < LENGTH_PSS_NR; i++) {#if 1primary_synchro[2*i] = (d_pss[i] * SHRT_MAX)>>SCALING_PSS_NR; /* Maximum value for type short int ie int16_t */primary_synchro[2*i+1] = 0;   //按照实部虚部(I值Q值)的顺序以此存储IQ调制的结果primary_synchro2[i] = d_pss[i];
#elseprimary_synchro[2*i] = d_pss[i] * AMP;primary_synchro[2*i+1] = 0;primary_synchro2[i] = d_pss[i];
#endif}

根据输入输出的周期性,将IFFT的输入数据进行循环移位,将零频分量移动到中间位置。这正是由于我们之前说的FFT size比实际输入数据大造成的。也就是说时域的OFDM一个符号的采样点数比实际可用子载波数要大。

  /* call of IDFT should be done with ordered input as below**                n input samples*  <------------------------------------------------>*  0                                                n*  are written into input buffer for IFFT*   -------------------------------------------------*  |xxxxxxx                       N/2       xxxxxxxx|*  --------------------------------------------------*  ^      ^                 ^               ^          ^*  |      |                 |               |          |* n/2    end of            n=0            start of    n/2-1*         pss                               pss**                   Frequencies*      positives                   negatives* 0                 (+N/2)(-N/2)* |-----------------------><-------------------------|** sample 0 is for continuous frequency which is used here*///k就是上面图中start of pss的位置unsigned int  k = fp->first_carrier_offset + fp->ssb_start_subcarrier + 56; //andif (k>= fp->ofdm_symbol_size) k-=fp->ofdm_symbol_size;for (int i=0; i < LENGTH_PSS_NR; i++) {synchroF_tmp[2*k] = primary_synchro[2*i];synchroF_tmp[2*k+1] = primary_synchro[2*i+1];k++;if (k == length) k=0;}

最后通过IFFT生成时域序列,注意这里时域的序列也是按照实部虚部的顺序存储的。

  /* IFFT will give temporal signal of Pss */idft = get_idft(length);idft(synchroF_tmp,          /* complex input */synchro_tmp,           /* complex output */1);                 /* scaling factor *//* then get final pss in time */for (unsigned int i=0; i<length; i++) {((int32_t *)primary_synchro_time)[i] = ((int32_t *)synchro_tmp)[i];}

参考资料:
关于IQ调制的详细内容可以参考:
https://www.mobibrw.com/2018/12118
关于通信系统的完整流程可以参考:
https://zhuanlan.zhihu.com/p/25868603
关于OFDM调制可以参考:
https://www.csie.ntu.edu.tw/~hsinmu/courses/_media/wn_11fall/ofdm_new.pdf
https://zhuanlan.zhihu.com/p/57967971
https://blog.csdn.net/zzsfqiuyigui/article/details/9091363
关于5G PSS定义可以参考:
http://www.techplayon.com/nr-primary-synchronization-signal-pss/
http://www.dpi-proceedings.com/index.php/dtcse/article/viewFile/26293/25707
http://www.rfwireless-world.com/5G/5G-NR-m-sequence.html

5G NR PSS信号生成相关推荐

  1. 5G NR学习理解系列——MATLAB5G信源的生成之SSB参数配置

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 5G NR学习理解系列--MATLAB5G信源的生成之SSB参数配置 前言 SSB参数的位置 SSB参数详细解释 信号时频图 总结 前 ...

  2. 5G及无线技术专栏:5G NR信号的解调分析

    微波射频网5G及无线技术原创专栏主要介绍5G NR.LTE.WiFi等主流无线通信技术,由业界一线工程师执笔,结合理论与实践,既有标准解读,又涵盖链路仿真与测试,是不可多得的进阶学习平台.如有想看到的 ...

  3. 5G NR - CSI-RS学习笔记4 - 物理层资源映射

    CSI-RS序列 参考信号笔记第一篇<5G NR - 参考信号(Reference Signal)学习笔记1 - Overview>提到物理信号和物理信道的区别:物理信号不承载任何上层数据 ...

  4. 14 - 5G NR概述学习:多波束下的接入,移动性,用户中心多波束操作等 - 研一

    自然基金无缝切换项目 || NR学习笔记 初始接入 下行同步,小区搜索 为了支持多波束操作,特别是在高频(HF)场景中,NR引入了同步信号块(synchronization signal block, ...

  5. 700m信号测试软件,5G(NR)中同步信号的测量(SS-RSRP)

    同步信号SS-RSRP (Synchronization Signal Reference Signal Received Power) 是同步信号在每个RE的平均功率,其测量在SMTC中的窗时段进行 ...

  6. 5G/NR 下行物理信道和信号概要

    5G/NR 下行物理信道和信号概要 NR在Rel-15中定义了3种下行物理信道: 1.物理下行共享信道PDSCH(Physical Downlink Shared Channel)   主要用于单播的 ...

  7. 5G NR学习理解系列——利用matlab工具生成5G NR信源

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 5G NR学习理解系列--利用matlab工具生成5G NR信源 前言 NR工具箱的使用 直接使用代码 前言 既然发现了4G LTE ...

  8. 信号测试软件看到服务小区,5G(NR)网络中终端对服务小区和邻小区测量

    移动通信网络中当终端要切换至信号更强的小区.在载波聚合中要添加新载波(CC)时需要测量服务小区和邻小区的信号强度或质量(矩阵,即RSRP或RSRQ.这就要求终端的测量及时和准确,以保持无线链路质量. ...

  9. 5G NR学习理解系列——NR小区搜索的matlab仿真

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 5G NR学习理解系列--NR小区搜索的matlab仿真 前言 信源生成 降采样 PSS和SSS本地序列生成 相关结果 前言 既然已经 ...

最新文章

  1. Spring Boot 2.3.0 发布:支持Java14、打包Docker镜像、优雅关机配置...
  2. volley框架使用
  3. 数据结构 - 队列简介 及 1个简单的c语言链式队列代码实现
  4. Python random() 函数
  5. Ajax-基础篇(持续更新01)
  6. 随机样本一致性:一种用于图像分析和自动制图的模型拟合模型(6)--(计算共线矩阵T)
  7. [MySQL] 2059 - Authentication plugin ‘caching_sha2_password‘ cannot be loaded dlope
  8. 2021-09-02编写一个 SQL 查询,获取 Employee 表中第二高的薪水(Salary) 。
  9. 【建议收藏】货币交易信息爬取+筛选(Python附源码)
  10. B样条曲线与贝塞尔曲线学习笔记
  11. 轴承过盈量程序matlab,轴承matlab处置程序.doc
  12. 水箱建模最小二乘法_消防水箱的设置要求
  13. 小米为何要死磕某国产手机企业?这是多年被压迫下的反击
  14. 腾讯云mysql的技术原理_腾讯云自研数据库 CynosDB 存储架构揭秘!
  15. PEG 动态选股策略
  16. 如何使用百度地图API
  17. IE浏览器的一些技巧
  18. windows防火墙是干什么的_Windows 之 防火墙
  19. pta 7-10 古风排版 (20 分)
  20. Kotlin:对let,apply,run,also等作用域函数的理解

热门文章

  1. Java调用FFmpeg实现视频录制
  2. open failed: EACCES(Permission denied)解决方法
  3. RK3568 buildroot文件系统下的三屏显示
  4. 之前看过,再分析一次spring aop过程
  5. [UE4]使用Is Locally Controlled解决第一人称和第三人称武器位置问题
  6. 2018年7月19日日报
  7. 风电场视频监控:如何实现风电场可视化、智慧化管理模式?
  8. eclipse使用git如何merge
  9. Camera2 教程 一概览
  10. python算法:病毒传播模型