Python带你理解用于信号同步的CAZAC序列

开发 后端
在无线通信系统中同步是非常关键的一个过程,这对信号正确的传输有着非常的重要意义。通常,我们常用CAZAC序列(Const Amplitude Zero Auto-Corelation)进行帧同步,CAZAC序列全称恒包络零自相关序列。

在无线通信系统中同步是非常关键的一个过程,这对信号正确的传输有着非常的重要意义。通常,我们常用CAZAC序列(Const Amplitude Zero Auto-Corelation)进行帧同步,CAZAC序列全称恒包络零自相关序列。它主要包括有ZC序列、Frank序列、Golomb多相序列和Chirp序列等。因为其有很好的自相关特性,广泛用于无线通信领域,雷达、CDMA、LTE、5G NR等需要进行信号同步的通信方式。

下面我们以ZC序列为例,利用Python画图来直观的理解这种序列。

ZC序列全称是Zadoff Chu序列,由于其是由Zadoff和Chu提出,所以便由他们的名字来命名,它可以用下面的公式来表示:

式中的u就是它的根。

根据ZC序列的公式,我们就可以方便的画出ZC序列的图形,话不多说,直接撸代码。

  1. u = 1 
  2. N = 128 
  3. n = np.arange(N) 
  4. x = np.exp(-1j * np.pi*u*n*(n+1)/(N-1)) 
  5. plt.subplot(2,1,1) 
  6. plt.plot(np.real(x)) 
  7. plt.subplot(2,1,2) 
  8. plt.plot(np.imag(x)) 
  9. plt.show() 

这里序列根取1,N取128,如下图是它的时域图形,是不是觉得上面的图形看上去似乎有一些规则性。

ZC序列

那么,它特别的地方在哪里呀?我们可以换个角度来看这个序列,下面我们在用复数坐标系上把这个序列画出来看看是什么样子。

  1. u = 1 
  2. N = 128 
  3. n = np.arange(N) 
  4. x = np.exp(-1j * np.pi*u*n*(n+1)/(N-1)) 
  5. plt.scatter(np.real(x), np.imag(x)) 
  6. plt.show() 

图中横坐标为实部I,纵坐标为虚部Q,从图中我们可以看出序列在复平面上是一个圆,也就是说其幅值是恒定的。

复数坐标系下的ZC序列

从序列的公式上看它是一个以e为底的复指数函数,所以大家可以根据之前的文章《谈谈欧拉公式与复指数信号》来理解。

如果把两个序列进行相关运算会发生什么情况呢?关于相关运算实际上就是卷积运算,为了方便计算我们先将序列转到频域进行计算,因为对于时域上卷积运算实际就是频域上相乘,如下卷积计算公式:

将时域进行傅立叶变换:

整理公式得:

推导总是一堆让人头大的公式,不过早就有大佬帮我们总结好了,这里大家需要记住卷积定理即可。

时域卷积定理即时域内的卷积对应频域内的乘积;频域卷积定理即频域内的卷积对应时域内的乘积。

我们继续看下面的代码,我们先将序列向右循环移位10位生成一个新的序列,然后,再用移位后的序列和原序列进行相关运算。

  1. u = 1 
  2. N = 128 
  3. n = np.arange(N) 
  4. x = np.exp(-1j * np.pi*u*n*(n+1)/(N-1)) 
  5. corr = np.fft.fftshift(np.fft.fft(x)) * np.conj(np.fft.fftshift(np.fft.fft(x))) 
  6. plt.subplot(2,1,1) 
  7. plt.plot(np.abs(np.fft.ifftshift(np.fft.ifft(corr)))) 
  8.  
  9. x_r = np.roll(x, 10) #右移 
  10. corr = np.fft.fftshift(np.fft.fft(x_r)) * np.conj(np.fft.fftshift(np.fft.fft(x))) 
  11. plt.subplot(2,1,2) 
  12. plt.plot(np.abs(np.fft.ifftshift(np.fft.ifft(corr)))) 
  13. plt.show() 

从下面的图中可以发现,在做完相关运算之后会产生一个相关峰,而且相关峰的值非常的大,它的能量较为集中有较好的抗噪能力,除了相关峰外其他位置的相关值都为0或接近于0。而且,经过移位后的序列和原序列进行相关运算之后,相干峰的位置也会向右偏移10位。由于这种相关特性,这里大家也应该清楚了为什么说可以使用这种序列进行帧同步了。

相关运算

如果序列经过傅立叶变换之后,序列的特性又会是什么样呢?

  1. u = 1 
  2. N = 128 
  3. n = np.arange(N) 
  4. x = np.exp(-1j * np.pi*u*n*(n+1)/(N-1)) 
  5. fft_shift = np.fft.fft(x) 
  6. plt.subplot(2,2,1) 
  7. plt.plot(np.real(fft_shift)) 
  8. plt.subplot(2,2,2) 
  9. plt.plot(np.imag(fft_shift)) 
  10. plt.subplot(2,2,3) 
  11. plt.scatter(np.real(fft_shift), np.imag(fft_shift)) 
  12.  
  13. fft_shift_r = np.roll(fft_shift, 10) #右移 
  14. corr = np.fft.fftshift(np.fft.fft(fft_shift_r)) * np.conj(np.fft.fftshift(np.fft.fft(fft_shift))) 
  15. plt.subplot(2,2,4) 
  16. plt.plot(np.abs(np.fft.ifftshift(np.fft.ifft(corr)))) 
  17. plt.show() 

从下图可以看出,结果显而易见,经过傅立叶变换之后的序列仍然具有同样的特性。

傅立叶变换

如果不同根产生的ZC序列进行相关运算会发生什么情况呢?下面我们构造两个根为1和2的ZC序列。

  1. u1 = 1 
  2. u2 = 2 
  3. N = 128 
  4. n = np.arange(N) 
  5. x1 = np.exp(-1j * np.pi*u1*n*(n+1)/(N-1)) 
  6. x2 = np.exp(-1j * np.pi*u2*n*(n+1)/(N-1)) 
  7.  
  8. corr = np.fft.fftshift(np.fft.fft(x2)) * np.conj(np.fft.fftshift(np.fft.fft(x1))) 
  9. plt.plot(np.abs(np.abs(np.fft.ifftshift(np.fft.ifft(corr))))) 
  10. plt.show() 

两个不同根序列相关运算后的结果如下图:

不同根序列相关运算

我们从图上看出,对于不同根的序列再进行相关运算之后,不会产生像上面相同根的序列那样会产生又高又细的相关峰。

好了,相信看了上面的几个仿真实验大家都对CAZAC序列有一定的认识。信号处理一个非常抽象的技术,但是大家不要害怕,我们平时需要多多进行实验和练习,才能慢慢的掌握它。

本文转载自微信公众号「Will的大食堂」,可以通过以下二维码关注。转载本文请联系Will的大食堂公众号。

 

责任编辑:武晓燕 来源: Will的大食堂
相关推荐

2021-08-05 13:49:39

Python工具开发

2018-01-22 17:02:48

Python字符编码ASCII

2010-07-14 15:48:00

Telnet Sync

2022-10-10 14:36:44

Python时间序列机器学习

2017-11-20 11:05:23

数据库MongoDB索引

2022-12-20 08:22:42

CommitMuation

2018-03-25 20:51:07

语音合成深度前馈序列记忆网络

2023-02-07 16:21:37

时间序列列数据集

2020-03-26 17:00:53

HashMapputJava

2022-03-29 10:56:46

Pythonblinker信号库

2021-04-13 09:20:15

鸿蒙HarmonyOS应用开发

2023-09-07 08:15:58

场景同步异步

2020-05-17 16:15:49

RPCJava代码

2022-02-28 11:10:42

ZGCG1收集器

2022-03-10 08:31:51

REST接口规范设计Restful架构

2022-09-21 23:41:40

机器学习开源数据

2019-10-11 08:41:35

JVM虚拟机语言

2021-12-07 09:12:32

Iptables 原理工具

2023-03-06 07:28:57

RPC框架序列化

2024-01-18 09:39:00

Python折线图时间序列分析
点赞
收藏

51CTO技术栈公众号