|

楼主 |
发表于 2022-12-20 18:24:28
|
显示全部楼层
我不是学通信的,对于相干解调也是一知半解。我觉得相干解调应该是要同频同相的。如果不同频,则解调出来的信号不是在直流附近(其实也还好),
但是如果不同相,那么解调结果会带一个cos(phi)的系数,这个phi是指本振与信号之间的额相位差。
为了验证一些想法,我随便写了一个Python程序(根据我对相干解调的理解)。程序如下,也可以在附件中下载。
大致思路是:首先产生一个均值为0, 标准差为20的高斯白噪声(这个标准差的平方可以达标噪声的能量)。然后,产生一个正弦波信号,信号幅度在-1~+1之间。接着把这两个信号加起来,就相当于收到了一个带噪声的信号。信噪比我不是很确信应该怎么计算,但是应该是一个负数了吧。如果把叠加后的时域波形显示出来,看不出正弦波的痕迹。
后面那一步是模拟相干解调。具体做法是:对前面产生的正弦波信号进行移位(本质上是移相),然后和噪声与信号的混合体相乘。为了形象的观察移相对解调结果的影响,我通过一个循环来遍历不同的相位偏移,并把每次的结果都存起来。
理论上,移相后的本地载波LO与带噪信号相乘之后,应该还要经过一个低通滤波器。这里我偷懒,直接对序列求均值(我认为这也是一个低通滤波器)。
为了做对比,我把移相后的本地载波LO也与纯噪声相乘,然后把均值也保存起来。
最终,我把这两个序列画出来。蓝色的曲线是带噪信号解调在不同相移条件下的结果。可以看出:当相移是0时,也就是载波与收到的信号同相位时,经过低通能检测到的输出是最大的。而对比纯噪声信号,则要小很多。
我想这已经能够证明:同频同相的相干解调技术,如果真的能完全做到同相位的话,的确很厉害。对于CW摩尔斯码这种OOK类型的信号,关键是检测信号的有无,应该可以做到负信噪比(S/N)接收。
当然,问题是如何做到本地载波与收到的信号同相。我觉得数字信号处理也许可行。举例来说:在模拟域变频到一个相对低中频后,模数转换到数字域,然后在数字域进行我程序中类似的移相搜索,找到值最大的那个相位差。当然,实现的时候可能没有这么简单,比如计算量的问题,比如判别门限的自适应学习等。
## ====== The Python Code ======
import numpy as np
from matplotlib import pyplot as plt
# 下面是产生正态分布的噪声,有两个参数
# mu 是均值,取0, sigma是标准差,取100 (非常大了)
mu = 0
sigma = 20
N = 10000 # 产生10000个随机数
noise = np.random.normal(mu, sigma, N)
# 下面是产生信号
step = 0.1
i = np.arange(0, N*step, step)
signal = np.sin(i) # 信号为正弦函数,范围是[-1, 1]
# 下面是将信号和噪声叠加在一起,模拟接收到的、含噪声
# 的信号。 这时的信噪比我也不知道是怎么算,但是一定是
# 小于0的, 因为噪声的幅度的标准差是100,而信号幅度是+/-1
noise_plus_signal = noise + signal
# 下面是模拟相干检波。相干检波理想情况下要求同频同相
# 我们直接使用signal数组来模拟本地载波,但是通过不同
# 的移位来模拟相位差异。当相位差为(3.14/0.1)的整数倍
# 时( 包括0 ),那么本地载波与接收到的信号是同频同相
# 理论上,这里还要做一个低通滤波,但我这里简化处理,直接
# 求均值(我认为这其实也是一种低通)
PI = 3.14
ret_1 = []
ret_2 = []
for phase in range(0,int(PI/0.1)*10):
# 将phase差异转变成要移位的位置数量
#shift_offset = int(10*phase)
#print("phase shift rotation: ", shift_offset)
# 通过移位产生本地载波
LO = np.roll(signal, phase)
# product_1是本地载波与接收到的噪声信号混合体相乘
product_1 = LO * noise_plus_signal
# product_2是本地载波与噪声信号相乘
product_2 = LO * noise
mean_1 = product_1.mean()
mean_2 = product_2.mean()
ret_1.append(mean_1)
ret_2.append(mean_2)
plt.plot(ret_1, "b", label="Signal+Noise N(0,20)")
plt.plot(ret_2, "r", label="noise only N(0,20)")
plt.legend(loc="upper right")
plt.grid(True)
plt.savefig("coherent_detector.jpg")
plt.show()
|
|