QPSK星座映射
星座图映射是指按一定规则(PSK或QAM)将输入比特对应到I/Q坐标系中的复数点。复数点越多,则频谱效率越高,抗噪声能力越强。
我们都知道QPSK调制每个符号有2-bits,用4种不同相位的载波分别表示00、01、10和11。QPSK星座映射是指将4种不同相位的载波信号用I路和Q路两条支路表示。有两种映射方式,一种用0、π/2、π、3π/2四个相位,另一种用π/4、3π/4、5π/4、7π/4四个相位。本文采用第二种映射方式,关系如下表:
实现时通常还会做归一化处理,即乘一个系数1/sqrt(2)。输出I支路和Q支路的数据位宽根据系统来设定。经过信道传输后,I/Q支路上的数据都会因各种干扰而发生变化。解映射时要计算每个I+jQ到4个标准星座点之间的距离,判断该数据原本属于哪个星座点,从而恢复原始bit流数据。
对bit流进行星座映射处理主要有两个好处:(1).规范数据格式,根据硬件平台与系统参数选择合适的数据格式;(2).bit数据转换为复数数据,适合于IFFT和FFT的处理。OFDM系统便是星座映射的一个典型应用。
MATLAB设计
使用MATLAB仿真QPSK星座映射和解映射的过程,可以使用MATLAB提供的现成函数pskmod和pskdemod,也可以自己编写。本设计仿真时和第26、27篇中的设计结合,数据流为:原始序列->加扰器->卷积编码->QPSK星座映射->信道->QPSK星座解映射->Viterbi译码->解扰器。与QPSK星座映射相关的核心代码如下:%%% --------- QPSK星座映射 --------- %%%
qpskData = zeros(1,1500);
for i = 1 : 1500 %要归一化
if (codeData(2*(i-1)+1)==0 && codeData(2*(i-1)+2)==0)
qpskData(i) = complex(sqrt(2)/2,sqrt(2)/2); %00 1+j
elseif (codeData(2*(i-1)+1)==1 && codeData(2*(i-1)+2)==0)
qpskData(i) = complex(-sqrt(2)/2,sqrt(2)/2); %10 -1+j
elseif (codeData(2*(i-1)+1)==1 && codeData(2*(i-1)+2)==1)
qpskData(i) = complex(-sqrt(2)/2,-sqrt(2)/2); %11 -1-j
elseif (codeData(2*(i-1)+1)==0 && codeData(2*(i-1)+2)==1)
qpskData(i) = complex(sqrt(2)/2,-sqrt(2)/2); %01 1-j
end
end
上述代码中使用i作为循环控制变量,因此构建复数时使用complex函数完成。与QPSK星座解映射相关的核心代码如下:%%% -------- QPSK星座解映射 -------- %%%
deqpskData_p = zeros(1,1500); %复数形式
deqpskData_s = zeros(1,3000); %bit流形式
a = complex(sqrt(2)/2,sqrt(2)/2); %00
b = complex(-sqrt(2)/2,sqrt(2)/2); %10
c = complex(-sqrt(2)/2,-sqrt(2)/2); %11
d = complex(sqrt(2)/2,-sqrt(2)/2); %01
for i = 1 : 1500
comp1 = receive(i) - a; comp2 = receive(i) - b;
comp3 = receive(i) - c; comp4 = receive(i) - d;
dis1 = abs(comp1); dis2 = abs(comp2); dis3 = abs(comp3); dis4 = abs(comp4);
if (dis1
deqpskData_p(i) = complex(sqrt(2)/2,sqrt(2)/2);
deqpskData_s(2*(i-1)+1:2*(i-1)+2) = [0,0];
elseif (dis2
deqpskData_p(i) = complex(-sqrt(2)/2,sqrt(2)/2);
deqpskData_s(2*(i-1)+1:2*(i-1)+2) = [1,0];
elseif (dis3
deqpskData_p(i) = complex(-sqrt(2)/2,-sqrt(2)/2);
deqpskData_s(2*(i-1)+1:2*(i-1)+2) = [1,1];
elseif (dis4
deqpskData_p(i) = complex(sqrt(2)/2,-sqrt(2)/2);
deqpskData_s(2*(i-1)+1:2*(i-1)+2) = [0,1];
end
end
使用awgn函数为信号添加噪声时要注意Eb/N0、Es/N0和SNR之间的关系。在MATLAB帮助中搜索“AWGN Channel”可以查阅到具体描述,转换公式如下:
使用Scatter绘制复数的散点图。标准QPSK星座图如下:
经过高斯白噪声信道传输后,接收到的信号如下图所示(左图Eb/N0=10dB,右图Eb/N0=4dB)
可以看到当噪声干扰太大时,某些点甚至已经跨越到了其它象限,必然会导致解映射出现错误。但据第27篇中讲述,卷积编译码可以对传输过程中受到的干扰具有一定纠错能力。因此在上面右图的情况下,据程序统计,星座映射与解映射有0.9%的误码率,但编译码、加扰与解扰的误码率为0,仍然可以正确恢复出原始数据。
FPGA设计
稍后补充