一、从QPSK点簇继续走向bit流
在上小节软件无线电实验(4)阶段性总结:从bit流到QPSK点簇——基于P201Pro和GNU Radio的简单收发系统中已经大致说明了从发射端bit流到接收端的点簇了,但是并没有对发射端怎么映射和解调端怎么解bit,这一小节将详细规范发射端的映射和接收端的解映射。
这一小节最重要的还是,新写那个分析bit流的gui模块。
二、构造一组可验证的发送bit流
2.1 用MATLAB生成“Hello, World”测试数据
用于发送的二进制bit是用matlab生成的,其代码如下:
info = 'Hello,World';
bitsM = int2bit(double(info), 8);
bits = reshape(bitsM, [], 1);
其过程表示为:
| H | e | l | l | o | , | W | o | r | l | d | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| ASII | 72 | 101 | 108 | 108 | 111 | 44 | 87 | 111 | 114 | 108 | 100 |
| bit | 01001000 | 01100101 | 01101100 | 01101100 | 01101111 | 00101100 | 01010111 | 01101111 | 01110010 | 01101100 | 01100100 |
将上面bit连起来得到这个bits的值如下:
0100100001100101011011000110110001101111001011000101011101101111011100100110110001100100
2.2 在GNU Radio中观察发送bit流
然后将这串bit流用:File Source模块读出来,这里给大家介绍下,我写的一个观察bit流的GUI模块,可以看到发送bit,如下:
附带搜索功能,这样就可以看到发送端传输的bit了。
三、两个bit如何映射为一个QPSK符号
3.1 QPSK映射关系
QPSK的映射表如下:
| bits | 00(0) | 01(1) | 11(3) | 10(2) |
|---|---|---|---|---|
| QPSK符号 |
3.2 从串行bit流到QPSK星座点
然后可以将上述的二进制比特流分组映射到星座上去,如下图分组:
四、P201Pro收发链路与实验条件
4.1 发射端:bit映射与脉冲成形
发射端仍然用[[阶段性总结:从bit流到QPSK点簇——基于P201Pro和GNU Radio的简单收发系统]]中的流图,但是将成型滤波器改成RC滤波器,因为我发现我天线离得近了,不用匹配滤波器反而显示更加清楚,得到如下图:!
发射设备为P201Pro。
4.2 接收端:从射频信号到QPSK点簇
接收端相对:[[阶段性总结:从bit流到QPSK点簇——基于P201Pro和GNU Radio的简单收发系统]]有所改进啊,这里因为天线很近,所以发射端不用RRC,所以接收端没有做匹配滤波。
然后看这个效果接收的相当好啊。
4.3 天线状态对接收效果的影响
这里来纠正[[阶段性总结:从bit流到QPSK点簇——基于P201Pro和GNU Radio的简单收发系统]]中的图:
之所以这么差,是我之前天线用了棒状天线:
然后不知道怎么掰扯的,接收一直很差,我还以为是频偏和定时不对,浪费我不少时间。后面偶然动了一下天线效果突然变好了。再之后为了方便就不用这个天线了,转用:
这个的效果就直线上升了。就是上面效果很好的那个样子。
五、从QPSK点簇到符号编号:硬判决
从costasloop出来之后,用这些模块进行符号的判决:
5.1 Constellation Decoder如何完成象限判决
QPSK硬判决:Constellation Decoder: 经过 Costas Loop 后,星座图已经形成四个点簇,但此时输出仍然是带有噪声的复数采样值,并不是可以直接读取的数字符号。Constellation Decoder的作用,就是把每个接收点判给距离它最近的理想星座点:
其中, 是接收点, 是第 个理想QPSK星座点。对于本文使用的QPSK映射,判决边界就是 和 :
| 判决区域 | 输出符号 | 对应bit |
|---|---|---|
| 0 | 00 | |
| 1 | 01 | |
| 2 | 10 | |
| 3 | 11 |
如下图:
5.2 Repack Bits如何恢复串行bit流
需要注意,Constellation Decoder 实际输出的是符号编号 0~3,并不是串行bit。因此,后面使用 Repack Bits,按照 MSB First 将每个QPSK符号拆成两个bit。 经过这个模块之后我们就得到了bit流:
六、点簇已经收敛,为什么bit仍然错误
这个接收比特流有一个问题,明明接收星座图已经收敛的那么好了,但是我们将发送的bit流:
0100100001100101011011000110110001101111001011000101011101101111011100100110110001100100
进行搜索的时候,并没有搜索到这些bit。 这里的原因是:相位旋转;
6.1 QPSK的载波相位模糊
相位旋转 发射端和接收端分别使用各自的本地振荡器,两者的初始相位并不完全一致,同时无线信道和收发硬件也会引入额外相位偏移。因此,接收到的QPSK信号通常可以表示为:
其中, 为发送符号, 为收发载波之间的相位差, 为噪声。相位差会使所有星座点围绕原点整体旋转。 Costas Loop可以估计并消除连续的载波相位误差,但QPSK星座每旋转 后形状完全相同,因此环路无法只根据星座形状判断哪一个方向才是发送端规定的参考方向。最终可能稳定锁定在四种方向之一:
这就是QPSK的载波相位模糊。此时点簇已经稳定,说明载波同步基本完成,但星座象限与bit之间的对应关系可能仍然错误。也就是整体旋转 、、 或 。旋转后的星座仍然表现为四个清晰点簇,但每个象限所代表的bit可能已经改变。我们按照原来的方式进行判决就会产生下图这种误判
6.2 使用Multiply Const完成象限校正
因此,在 Constellation Decoder前加入 Multiply Const,将星座反向旋转到发送端规定的方向:
| 接收星座偏转 | Multiply Const |
|---|---|
| 1 | |
| -1j | |
| -1 | |
| 1j |
6.3 手动尝试四种相位方向
现在我不知道到底偏移了多少度数,所以我把每种旋转都做矫正,看看在哪个相位补偿后正确,如下图:
到这里,其实我们已经成功接收并解映射bit了,其和发送一致。但是这里的相位旋转问题是手动解决的,这点将放在后面前导码的内容添加。
七、P201Pro实测:发送bit与接收bit完成对应
收发设备还是下面这个结构:
信号收发如下所示:
八、总结:接收机终于恢复出bit流
至此,接收机已经完成了从QPSK点簇、符号硬判决到串行bit流恢复的完整过程。当前实验通过手动尝试四种相位方向解决QPSK相位模糊,后续将结合前导码完成自动相位识别与校正。