无线通信系统中的同步是一个非常关键的过程,对信号的正确传输具有重要意义。通常,我们经常使用CAZAC序列(ConstAmplitudeZeroAuto-Corelation)进行帧同步。CAZAC序列的全称是常数包络零自相关序列。主要包括ZC序列、Frank序列、Golomb多相序列和Chirp序列等。由于其良好的自相关特性,广泛应用于无线通信、雷达、CDMA、LTE、5GNR等通信方式需要信号同步。下面以ZC序列为例,用Python画图来直观的理解这个序列。ZC序列的全称是ZadoffChu序列。由于它是由Zadoff和Chu提出的,因此以他们的名字命名。可用下式表示:式中u为其根。根据ZC数列的公式,我们可以很容易的画出ZC数列的图形。废话不多说,我们可以直接写代码了。u=1N=128n=np.arange(N)x=np.exp(-1j*np.pi*u*n*(n+1)/(N-1))plt.subplot(2,1,1)plt.plot(np.real(x))plt.subplot(2,1,2)plt.plot(np.imag(x))plt.show()这里序列根为1,N为128,如下图是它的时域图形。是不是觉得上面的图形似乎有一些规律性?那么,ZC序列有什么特别之处呢?我们可以从另一个角度来看这个序列。接下来,我们将把这个序列画在一个复杂的坐标系上,看看它长什么样子。u=1N=128n=np.arange(N)x=np.exp(-1j*np.pi*u*n*(n+1)/(N-1))plt.scatter(np.real(x),np.imag(x))plt.show()图中横坐标为实部I,纵坐标为虚部Q。从图中可以看出序列是复数上的一个圆平面,也就是说,它的振幅是恒定的。从数列的公式来看,复坐标系下的ZC数列是以e为底的复指数函数,所以大家可以根据上篇文章《谈谈欧拉公式与复指数信号》来理解。如果两个序列相关会发生什么?相关运算实际上是一种卷积运算。为了计算方便,我们先将序列转移到频域进行计算,因为时域的卷积运算实际上是频域的。乘上以上,卷积计算公式如下:时域傅里叶变换:整理公式:推导总是一堆公式让人应接不暇,不过早就有大佬给我们总结出来了,这里大家需要记住量积定理就行了。时域卷积定理是指瞬时域的卷积对应频域的乘积;频域卷积定理意味着频域中的卷积对应于时域中的乘积。我们继续看下面的代码。我们先将序列向右旋转10位生成一个新的序列,然后利用移位后的序列和原序列进行相关运算。u=1N=128n=np.arange(N)x=np.exp(-1j*np.pi*u*n*(n+1)/(N-1))corr=np.fft.fftshift(np.fft.fft(x))*np.conj(np.fft.fftshift(np.fft.fft(x)))plt.subplot(2,1,1)plt.plot(np.abs(np.fft.ifftshift(np.fft.ifft(corr))))x_r=np.roll(x,10)#右移corr=np.fft.fftshift(np.fft.fft(x_r))*np.conj(np.fft.fftshift(np.fft.fft(x)))plt.subplot(2,1,2)plt.plot(np.abs(np.fft.ifftshift(np.fft.ifft(corr))))plt.show()从下图中可以发现相关运算完成后会产生一个相关峰,并且相关峰的值很大,其能量比较集中,抗噪性较好能力,除了相关峰外,其他位置的相关值都为0或接近于0。而且,平移后的序列与原序列进行相关运算后,相干峰的位置也会平移到右边10位。因为这个相关的特性,在座的各位也应该明白为什么这个序列可以用来进行帧同步了。相关运算如果序列进行傅里叶变换,序列的特征是怎样的?u=1N=128n=np.arange(N)x=np.exp(-1j*np.pi*u*n*(n+1)/(N-1))fft_shift=np.fft.fft(x)plt.subplot(2,2,1)plt.plot(np.real(fft_shift))plt.subplot(2,2,2)plt.plot(np.imag(fft_shift))plt.subplot(2,2,3)plt.scatter(np.real(fft_shift),np.imag(fft_shift))fft_shift_r=np.roll(fft_shift,10)#Shiftrightcorr=np.fft.fftshift(np.fft.fft(fft_shift_r))*np.conj(np.fft.fftshift(np.fft.fft(fft_shift)))plt.subplot(2,2,4)plt.plot(np.abs(np.fft.ifftshift(np.fft.ifft(corr))))plt.show()从下图可以看出,结果很明显,经过傅里叶变换后的序列仍然具有相同的特征。如果傅里叶变换与不同根生成的ZC序列相关,会发生什么情况?接下来构造两个根为1和2的ZC序列u1=1u2=2N=128n=np.arange(N)x1=np.exp(-1j*np.pi*u1*n*(n+1)/(N-1))x2=np.exp(-1j*np.pi*u2*n*(n+1)/(N-1))corr=np.fft.fftshift(np.fft.fft(x2))*np.conj(np.fft.fftshift(np.fft.fft(x1)))plt.plot(np.abs(np.abs(np.fft.ifftshift(np.fft.ifft(corr)))))plt.show()两个不同的根序列相关运算后的结果如下图所示:不同根序列的相关运算我们从图中可以看出,对不同根的序列进行相关运算后,不会像上面的同根序列那样出现又高又细的相关峰。.好了,相信大家看了上面的仿真实验后,对CAZAC序列有了一定的了解。信号处理是一门很抽象的技术,但是不要害怕,我们通常需要大量的实验和练习才能慢慢掌握。本文转载自微信公众号“威尔的食堂”,可通过以下二维码关注。转载本文请联系威尔食堂公众号。
