ZC序列学习

最近在学习5G通信,关注到5G中的信道参考信号SRS是由ZC序列产生的,相关知识点记录如下。

名字由来

zc 序列由 ZadoffChu 两人提出,两人具体信息网上没查到,估计这也算不算什么伟大发明吧,就有了这个名字。

表达式

z r [ n ] = e − j π r n ( n + 1 ) / N z c z_r[n]=e^{-j\pi rn(n+1)/N_{zc}} zr[n]=ejπrn(n+1)/Nzc
式中, r r r为根序列索引(root index, r ∈ { 1 , . . . , ( N z c − 1 ) } r\in \{ 1,...,(N_{zc}-1)\} r{1,...,(Nzc1)}),这个概念我不是很懂。其他两个变量容易理解, N z c N_{zc} Nzc表示序列的总长度, n n n代表了序列的索引值, n = 0 , 1 , . . . , N z c − 1 n=0,1,...,N_{zc}-1 n=0,1,...,Nzc1

表达式初步理解

我们可以发现,zc序列的值是一个复数,由欧拉公式 e j a = c o s ( a ) + j s i n ( a ) e^{ja}=cos(a)+jsin(a) eja=cos(a)+jsin(a)即可得到该复数的实部和虚部,除此之外,还可以发现它的赋值恒为1,其实在复数坐标系中,它都是在单位圆上。

matlab小试牛刀

对于理工科人,matlab是必备工具,干啥都好使,来matlab一看,已经发现,已经有函数专门产生zc序列了。

SEQ = lteZadoffChuSeq(R,N)

其中R为上面提到的根序列索引,N为序列长度。
在matlab中实际产生一下:

a = lteZadoffChuSeq(1,21)
a =

   1.0000 + 0.0000i
   0.9556 - 0.2948i
   0.6235 - 0.7818i
  -0.2225 - 0.9749i
  -0.9888 - 0.1490i
  -0.2225 + 0.9749i
   1.0000 + 0.0000i
  -0.5000 - 0.8660i
  -0.2225 + 0.9749i
   0.6235 - 0.7818i
  -0.7331 + 0.6802i
   0.6235 - 0.7818i
  -0.2225 + 0.9749i
  -0.5000 - 0.8660i
   1.0000 + 0.0000i
  -0.2225 + 0.9749i
  -0.9888 - 0.1490i
  -0.2225 - 0.9749i
   0.6235 - 0.7818i
   0.9556 - 0.2948i
   1.0000 + 0.0000i

我们再尝试一下将根序列索引值改变一下

aa = lteZadoffChuSeq(2,21)

aa =

   1.0000 + 0.0000i
   0.8262 - 0.5633i
  -0.2225 - 0.9749i
  -0.9010 + 0.4339i
   0.9556 + 0.2948i
  -0.9010 - 0.4339i
   1.0000 + 0.0000i
  -0.5000 + 0.8660i
  -0.9010 - 0.4339i
  -0.2225 - 0.9749i
   0.0747 - 0.9972i
  -0.2225 - 0.9749i
  -0.9010 - 0.4339i
  -0.5000 + 0.8660i
   1.0000 + 0.0000i
  -0.9010 - 0.4339i
   0.9556 + 0.2948i
  -0.9010 + 0.4339i
  -0.2225 - 0.9749i
   0.8262 - 0.5633i
   1.0000 + 0.0000i

我惊奇的发现,都是一个21*1的列向量,除此之外,我还发现序列长度N只能是奇数,偶数的时候会报错:

a = lteZadoffChuSeq(1,20)
Error using coder.internal.errorIf (line 9)
The sequence length must be an odd-valued positive integer scalar.

Error in lteZadoffChuSeq (line 35)
coder.internal.errorIf( (~isscalar(N) || ~isnumeric(N) || ~isreal(N) || ...

zc序列的特点及用处

  1. 恒幅值:意味着均峰比小,这样对前端 PA 的要求比较小,成本也就小了

  2. 零自相关:它和自己的(非整周期)移位序列的相关值为 0,而且两个互质的 zc 序列的互相关也接近于 0。

  3. 它的傅立叶变换仍然是 CAZAC(Const Amplitude Zero Auto-Corelation),即为恒包络(幅度)零自相关序列(OFDM 系统开心死了)
    在LTE系统中,PSS、SSS、cellRS、DMRS、SRS、PRACH、PUCCH信号基本上都涉及到了Zadoff –Chu信号,NR除了PSS和SSS信号采用M序列来生成抵抗大频偏场景,其它信号也同样涉及到了Zadoff -Chu序列,看来用处还不小。

造轮子

纸上得来终觉浅,得知此事要躬行。理解一件事最佳的办法便是动手编程实现,想要真正理解一件事情不妨写篇博客,把自己的思考过程从头到尾记录下来。在matlab中自己编写的zc序列生产函数如下:

function zc_seq = my_zcGenerate(R,N)
n = 0:1:N-1;
n_1 = n+1;
nn = (n.*n_1)';
zc_seq = exp(-1j*pi*R*nn/N);

用自己编写的函数和matlab内置的函数对比一下,比如生成一个根序列索引为1,长度为11的zc序列,matlab中产生如下:

>> seq1 = lteZadoffChuSeq(1,11)

seq1 =

   1.0000 + 0.0000i
   0.8413 - 0.5406i
  -0.1423 - 0.9898i
  -0.9595 + 0.2817i
   0.8413 + 0.5406i
  -0.6549 - 0.7557i
   0.8413 + 0.5406i
  -0.9595 + 0.2817i
  -0.1423 - 0.9898i
   0.8413 - 0.5406i
   1.0000 - 0.0000i

用自己的函数:

>> seq2=my_zcGenerate(1,11)

seq2 =

   1.0000 + 0.0000i
   0.8413 - 0.5406i
  -0.1423 - 0.9898i
  -0.9595 + 0.2817i
   0.8413 + 0.5406i
  -0.6549 - 0.7557i
   0.8413 + 0.5406i
  -0.9595 + 0.2817i
  -0.1423 - 0.9898i
   0.8413 - 0.5406i
   1.0000 - 0.0000i

两者一模一样。

>> seq1==seq2

ans =

     1
     1
     1
     1
     1
     1
     1
     1
     1
     1
     1

今天在matlab上编程的时候发现一个经常忽略的地方,那就是常用的转置(’)其实对复数而言代表的是共轭转置。例如:

a = [1+2j 3-4j]

a =

   1.0000 + 2.0000i   3.0000 - 4.0000i

>> a'

ans =

   1.0000 - 2.0000i
   3.0000 + 4.0000i

我们可以看到行向量转置之后不仅变为了列向量,其元素1+2j经过转置之后变成了1-2j,那么对于复数矩阵怎样进行简单的转置呢?可以使用(.’)

>> a.'

ans =

   1.0000 + 2.0000i
   3.0000 - 4.0000i

当然对于实数的话,两者一样。

 a = [1 2]

a =

     1     2

>> a'

ans =

     1
     2

>> a.'

ans =

     1
     2

到此结束。

你可能感兴趣的:(信号处理,matlab,矩阵,开发语言)