目录
1.DQPSK原理简介
DQPSK(Differential Quadrature Phase - Shift Keying,差分正交相移键控)是数字通信领域中一种重要的调制技术。它脱胎于QPSK(四相相移键控),但在调制方式上进行了改进,以适应更复杂的通信环境。
在传统的 QPSK 调制体系里,载波的相位状态直接对应输入的绝对二进制数据。例如,通常会将 00 映射到载波相位 0,01 映射到 π/2,11 映射到 π,10 映射到 3π/2 。这种映射方式要求接收端在解调时必须精确恢复出与发送端同频同相的载波,只有这样才能准确地将载波相位还原为原始的二进制数据。然而,在实际的通信场景中,尤其是在无线通信环境下,精确的载波同步面临诸多挑战。
无线信道的时变性使得信号在传输过程中会经历各种衰落,如瑞利衰落、莱斯衰落等,这会导致载波的相位和频率发生随机变化。此外,收发两端的相对运动产生的多普勒频移也会破坏载波的稳定性。同时,在一些对成本和功耗有严格限制的通信设备中,实现高精度的载波同步电路可能会带来过高的成本和功耗。
DQPSK正是为了解决这些问题而诞生。它不再依赖于载波的绝对相位,而是通过相邻码元之间的相位变化来携带信息。具体而言,输入的二进制数据被编码为载波相位的相对变化量。例如,一种常见的映射规则是:相位变化 0 对应 “00”,π/2 对应 “01”,π 对应 “11”,3π/2 对应 “10”。发送端在发送信号时,根据当前输入的二进制数据以及前一个码元的相位状态,确定当前码元的载波相位。接收端在解调时,通过检测相邻码元之间的相位差,就能恢复出原始的二进制数据。
这种基于相位差分的调制方式赋予了DQPSK独特的优势。它极大地降低了对载波同步精度的要求,即使载波存在一定的相位抖动或频率漂移,只要相邻码元之间的相位差能够被准确检测,就不会影响数据的正确解调。这使得DQPSK在移动通信、卫星通信等对载波同步要求苛刻的领域得到了广泛应用。同时,DQPSK在频谱效率方面与QPSK相同,每个码元可以携带 2 个比特的信息,在有限的频谱资源下实现了较高的数据传输速率。
调制原理



2.DQPSK解调原理



由于DQPSK是基于相位差来传输信息,在一定程度上对信道衰落具有较好的抵抗能力。在无线信道中,信号的幅度可能会因为衰落而发生剧烈变化,但相位的变化相对较小。只要相位差能够被准确检测,就可以正确解调数据,这使得DQPSK在多径衰落等复杂信道环境下具有较好的通信性能。
3.Turbo编译码
Turbo码是一种极为复杂的信道编码技术,译码算法往往由于硬件实现的复杂度太高或者译码时延太长而难以实现。现目前Turbo码领域面临的主要问题是:在复杂度和时延都可以接受的前提下如何获得最佳的系统性能。Turbo码由分量码经由交织器级联而成。因此,分量码和交织器设计的好坏是决定Turbo码性能的关键因素。实际的通信系统中,为提高系统带宽效率,一种方法是通过删减部分校验比特来提高编码速率,称为删余。
Turbo码的编码过程实际上是一个利用强约束短码构造伪随机长码的过程。Turbo码的译码算法主要有两大类。是基于最大后验概率(MAP)的软输出算法,主要包括标准MAP算法、对数域上的Log.MAP算法和Max. Log-MAP算法、修正的MAP算法(M-MAP)、滑动窗MAP(SW-MAP)算法和只有前向递推的MAP算法(OSA)。其中,MAP算法是MAP算法的对数形式,它通过将大量的乘法运算转化为加法运算来简化算法的复杂性。
Turbo码由2个循环系统卷积码并行级联而成:译码采用迭代的串行译码交织器是Turbo 码所特有的,它可以使得信息序列随机化,增加各码字间的重量,从而提高码的保护能力 。
Turbo编码器的基本结构如图1所示:

从图1的仿真结果可知,Turbo码编码器主要由分量删余矩阵、两个分量编码器、复接器以及交织器组成。分量编码器是Turbo码编码器中的一个重要组成部分。Turbo码的分量编码器使用RSC编码,因为循环编码器可以改善码的比特误码率性能。删余矩阵是通过删除冗余的校验位来调节码率,Turbo码采用两个成员编器。交织器的作用是通过改变信息传输过程中的发送次序,将连续的突发错误分散化,尽可能的降低连续错误的持续时间。Turbo码,通过交织器,可以改变其行列重量分布,并将输入的码元符号的次序进行随机化输出,尽可能的降低码元之间的相关性,从而进一步提升算法的性能。
Turbo译码器主要包括如下几个结构:两个分量译码器模块,交织器模块,解交织器模块以及硬判决模块。

Turbo码的译码使用了迭代译码。利用EXIT图实现对迭代译码过程的跟踪,从而估计迭代译码的收敛性。利用EXIT图还可以预测实现一定性能要求时所必须的迭代译码次数。它为分析迭代译码过程和迭代译码方案的设计提供了有力的工具。
4.MATLAB程序
整个系统结构如下图所示:

部分matlab程序如下图所示:
73......................................
Ydemod1 = RQPSK.*CARRIERI;
Ydemod2 = RQPSK.*CARRIERQ;
w = hamming(127);
yfilter1 = filter(w,1,Ydemod1);
yfilter2 = filter(w,1,Ydemod2);
%将滤波器w进行量化,复制到FPGA的fir滤波器核中
w2 = round(1024*w')
for i = 1:127
fprintf('%d,',w2(i));
end
%判决
yod10 = [];
yod20 = [];
for i=1:Num/2
tmps1 = yfilter1(400*(i-1)+1:400*i);
if mean(tmps1)>0
yod10 = [yod10,1];
else
yod10 = [yod10,0];
end
tmps2 = yfilter2(400*(i-1)+1:400*i);
if mean(tmps2)>0
yod20 = [yod20,1];
else
yod20 = [yod20,0];
end
end
%差分译码
yod1 =yod10;
yod2 =yod20;
%差分编码
for i = 2:Num/2
%相邻码做异或
if yod1(i)==yod10(i-1)
yod1(i)=0;
else
yod1(i)=1;
end
if yod2(i)==yod20(i-1)
yod2(i)=0;
else
yod2(i)=1;
end
end
yod=zeros(1,Num);
yod(1:2:end)=yod1;
yod(2:2:end)=yod2;
x_hat = round(turbo_decode(2*yod(1:end-1)-1,max_iter));
figure % 创建图形窗口
subplot(521) % 创建3行1列的子图,并定位到第一个
plot(Ydemod1,'b','linewidth',1) % 绘制ASK调制信号
title('DQPSK I解调'); % 设置标题
grid on % 打开网格
subplot(522) % 创建3行1列的子图,并定位到第一个
plot(Ydemod2,'b','linewidth',1) % 绘制ASK调制信号
title('DQPSK Q解调'); % 设置标题
grid on % 打开网格
subplot(523) % 创建3行1列的子图,并定位到第一个
plot(yfilter1,'b','linewidth',1) % 绘制ASK调制信号
title('滤波I'); % 设置标题
grid on % 打开网格
subplot(524) % 创建3行1列的子图,并定位到第一个
plot(yfilter2,'b','linewidth',1) % 绘制ASK调制信号
title('滤波Q'); % 设置标题
grid on % 打开网格
subplot(525) % 定位到第二个子图
stairs(yod10,'b','linewidth',1) % 绘制载波信号
title('判决I输出'); % 设置标题
grid on % 打开网格
subplot(526) % 定位到第二个子图
stairs(yod20,'b','linewidth',1) % 绘制载波信号
title('判决Q输出'); % 设置标题
grid on % 打开网格
subplot(527) % 定位到第二个子图
stairs(yod1,'b','linewidth',1) % 绘制载波信号
title('差分译码I输出'); % 设置标题
grid on % 打开网格
subplot(528) % 定位到第二个子图
stairs(yod2,'b','linewidth',1) % 绘制载波信号
title('差分译码Q输出'); % 设置标题
grid on % 打开网格
subplot(5,2,[9,10]) % 定位到第二个子图
stairs(yod,'b','linewidth',1) % 绘制载波信号
title('并串输出'); % 设置标题
grid on % 打开网格
5.仿真结果



6.完整程序下载
完整可运行代码,博主已上传至CSDN,使用版本为matlab2022a:
(本程序包含程序操作步骤视频)
3540

被折叠的 条评论
为什么被折叠?



