最近在学习5G通信,关注到5G中的信道参考信号SRS是由ZC序列产生的,相关知识点记录如下。
zc 序列由 Zadoff 和Chu 两人提出,两人具体信息网上没查到,估计这也算不算什么伟大发明吧,就有了这个名字。
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]=e−jπrn(n+1)/Nzc
式中, r r r为根序列索引(root index, r ∈ { 1 , . . . , ( N z c − 1 ) } r\in \{ 1,...,(N_{zc}-1)\} r∈{1,...,(Nzc−1)}),这个概念我不是很懂。其他两个变量容易理解, 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,...,Nzc−1。
我们可以发现,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一看,已经发现,已经有函数专门产生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) || ...
恒幅值:意味着均峰比小,这样对前端 PA 的要求比较小,成本也就小了
零自相关:它和自己的(非整周期)移位序列的相关值为 0,而且两个互质的 zc 序列的互相关也接近于 0。
它的傅立叶变换仍然是 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
到此结束。