班长聊通信原理 | 系列文章请至主页“文章”查阅
通信中的很多调制都有一个把串行数据转换为并行数据的过程,QPSK就是一个典型的例子。
其实不光QPSK,其他的调制方法都是这个模式。
很多小伙伴最近都在问关于QPSK的问题,很多人在串并转换地方就犯糊涂了。我之前也写过QPSK的文章:
本文将从实际Matlab仿真角度,直观的阐述这个问题。
先从发送信息开始
无论如何,我们先假定我们需要发送一组信息。
为了方便,我们跳过传感器采集-采样-编码等环节,直接定义一组数据:
10位二进制数,10个比特。
0-1-0-1-1-1-0-0-1-1
data=[0 1 0 1 1 1 0 0 1 1];%准备发送的信息
通过Matlab的stem绘图函数,可以画出原始信息。定义图形标题为“准备发送的信息”,设置坐标轴范围,横坐标0~11,纵坐标0~1.5。
figure(1)
stem(data, 'linewidth',3), grid on;% 画出杆状图,线宽度设置为3号
title(' 准备发送的信息 ');% 定义图形标题
axis([ 0 11 0 1.5]);% 设置坐标轴范围
得出原始数据杆状图1:
再对数据简单处理
将原始信息,改成NRZ(Nonreturn - To - Zero)非归零双极性编码,就是我们最常见的编码。
根据信号是否归零,还可以划分为归零码和非归零码,归零码码元中间的信号回归到0电平,例如"1"为正电平,"0"为负电平,每个数据表示完毕后,都会回归到零电平状态,而非归零码没有回归到零电平的过程,例如"1"为高电平,"0"为低电平。
而双极性,就是用正负电平的脉冲分别表示二进制代码1和0。
data_NZR=2*data-1; % 将数据改成NRZ编码格式
data数据改成NRZ形成编码,在Matlab中也是简单的一句命令即可,具体波形如图3中“串”波形。
数据流串→并转换?
很多程序中,会用reshape函数一句话,实行了数据比特的串并转换。
s_p_data=reshape(data_NZR,2,length(data)/2); % 数据串并转换
关于"A = reshape(A,m,n)"函数的作用,就是将A的行列排列成m行n列。它对我们输入data_NZR的作用就如图4所示。
就是把一串数据,按照m行n列重新排列。
我们为什么要把一串数据,如图4中“串”形数列转换为并行呢?
还得先从MPSK的原理说起
这里的M代表多进制,M=2,4,8...,通常取2的正整数幂。
也就是常说的2PSK,4PSK/QPSK,8PSK......
一个三角函数sk(t),我们通常用三个参数就可以唯一确定,分别为振幅A,频率f/ω,初始相位θk。
我们这里讨论的是相位调制,所以振幅A和频率f/ω不会变化。
θk的变化,如图5所示。
如果定义θk等于π或者0两种情况,那么sk(t)就有两种唯一的波形,分别为
- A cos( ωt + 0 )
- A cos( ωt + π )
这两种波形,正好对应二进制的0和1,这就是2PSK/BPSK调制。
那么4PSK/QPSK调制呢?
以此类推,按照θk的公式,我们可以取0,π/2,π,3π/2四种初相位,对应4种sk(t)波形
- A cos( ωt + 0 )
- A cos( ωt + π/2 )
- A cos( ωt + π )
- A cos( ωt + 3π/2 )
这四种波形,可以表示四种二进制组合01,00,10,11,这就是4PSK/QPSK调制。
同样是sk(t)波形,在QPSK中可以同时传输两个bit,所以理论上4/QPSK调制的数据传输速率是2PSK的两倍。
如何产生QPSK信号?
生成QPSK信号,就是上文的sk(t)信号。
sk(t)是一个三角函数,根据三角展开式,我们可以进行如下展开:
sk(t)波形被展开成两个正弦波的叠加,且初始相位均为0,二者相位差π/2(cos与sin相位差π/2)。
载波信号coswt很容易获得,sinwt信号在cosωt的基础上做一个π/2移相,也可以获得。
那么根据图3所示,当数据流串并转换之后,分成2路,一路为ak,一路为bk;
分别与cos和sin相乘之后,再进行叠加,输出QPSK信号。
我们用图3中的串行数据-1 +1 -1 +1 +1 +1 -1 -1 +1 +1作为输入。
- ak = -1 或者 +1
- bk = -1 或者 +1
当ak=-1,bk=+1,输入为(0,1)时,
sk(t)=-1*cosωt+(+1)sinωt=√2 * cos(ωt + 5π/4 ),θ3 = 5π/4;
当ak=+1,bk=+1,输入为(1,1)时,
sk(t)=+1*cosωt+(+1)sinωt=√2 * cos(ωt + 3π/4 ),θ4 = 7π/4;
当ak=-1,bk=-1,输入为(0,0)时,
sk(t)=-1*cosωt+(-1)sinωt=√2 * cos(ωt + 7π/4 ),θ2 = 3π/4;
当ak=+1,bk=-1,输入为(1,0)时,
sk(t)=+1*cosωt+(-1)sinωt=√2 * cos(ωt + π/4 ),θ1 = π/4;
嘿嘿,这也是四个相位,那么这也是QPSK。
自此,我们发现之所以要串行转换为并行,就是为了方便调制cos和sin载波,然后叠加,形成QPSK信号。
那么,我们可以生产QPSK信号如下图7所示。同相信号Inphase和正交Quadrature信号叠加,形成最终QPSK信号。
for(i=1:length(data)/2)
y1=s_p_data(1,i)*cos(2*pi*f*pt); % 同相分量
y2=s_p_data(2,i)*sin(2*pi*f*pt) ;% 正交分量
y_in=[y_in y1]; % 同相信号向量
y_qd=[y_qd y2]; % 正交信号向量
y=[y y1+y2]; % 调制信号
end
总结
文中的仿真其实还是有改进之处的,班长在此抛出3个思考,大家可以思考下,会加深对QPSK的理解。
QPSK可是4G、5G中的重要调制技术,尤其在信号覆盖较差的时候,一点也不过时啊。
思考1:为什么一般的程序中要用NRZ编码这种形式,用其他的编码形式可以吗?
思考2:图7中最后红色的QPSK信号,在"0.4"位置处,出现了不连续,或者说是突变?这对信号传输有影响吗?能否改进?
思考3:图6中的对应方式,即
- θ1→(1,0)
- θ2→(0,0)
- θ3→(0,1)
- θ4→(1,1)
为什么要这么排列,可以打乱顺序么?格雷码是什么?
看到这里,帮文章点个赞吧!
欢迎您在评论区留言讨论!
本文暂时没有评论,来添加一个吧(●'◡'●)