主要内容

QPSK发射机和接收机

本例展示了用MATLAB®实现QPSK发射机和接收机。特别地,这个例子说明了解决实际无线通信问题的方法,如载波频率和相位偏移,定时恢复和帧同步。有关同一系统的S金宝appimulink®实现,请参阅Simulink中的QPSK发射机和接收机金宝app的例子。

简介

传输的QPSK数据经历了模拟无线传输影响的损伤,如添加加性高斯白噪声(AWGN),引入载波频率和相位偏移,以及定时漂移。为了解决这些问题,本例提供了一个实用数字接收机的参考设计。该接收机包括基于相关的粗频补偿、基于锁相环的细频补偿、基于锁相环的符号定时恢复、帧同步和相位模糊消除。

这个例子有两个主要目的:

  • 建立一个通用的无线通信系统,该系统能够成功地恢复被各种模拟信道损坏的消息。

  • 说明关键通信工具箱™同步组件的使用,包括粗载波频率补偿和细载波频率补偿、带位填充和剥离的闭环定时恢复、帧同步和载波相位模糊解决。

初始化

commqpsktxrx_init.m脚本初始化模拟参数并生成结构prmQPSKTxRx。

prmQPSKTxRx = commqpsktxrx_init%#ok<*NOPTS> % QPSK系统参数useScopes = true;% true如果要使用作用域printReceivedData = false;%true表示接收到的数据将被打印compileIt = false;% true,如果要编译代码useCodegen = false;运行生成的mex文件
prmQPSKTxRx =结构体字段:ModulationOrder: 4插值:2大量毁灭:1 Rsym: 50000 Tsym: 2.0000 e-05 Fs: 100000 TotalFrame: 1000 BarkerCode: [1 1 1 1 1 1 1 1 1 1 1 1 1] BarkerLength: 13 HeaderLength: 26日消息:“Hello world”MessageLength: 16 NumberOfMessage: 20 PayloadLength: 2240 FrameSize: 1133 FrameTime: 0.0227 RolloffFactor: 0.5000 ScramblerBase: 2 ScramblerPolynomial: [1 1 1 0 1] ScramblerInitialConditions: [0 0 0 0] RaisedCosineFilterSpan: 10 PhaseOffset: 47 EbNo:13 FrequencyOffset: 5000 DelayType: 'Triangle' DesiredPower: 2 AveragingLength: 50 MaxPowerGain: 20 MaximumFrequencyOffset: 6000 phaserrecoveryloopbandwidth: 0.0100 phaserrecoverydampingfactor: 1 TimingRecoveryLoopBandwidth: 0.0100 TimingRecoveryDampingFactor: 1 TimingErrorDetectorGain: 5.4000 PreambleDetectorThreshold: 20 MessageBits: [11200x1 double] BerMask: [1540x1 double]

被测系统的代码体系结构

本例模拟了一个使用QPSK调制的数字通信系统。这个函数runQPSKSystemUnderTest.m建模此通信环境。本脚本中的QPSK收发器模型分为以下四个主要组件。

1)QPSKTransmitter.m:生成比特流,然后进行编码、调制和滤波。

2)QPSKChannel.m:用载波偏移量、时序偏移量和AWGN对信道进行建模。

3)QPSKReceiver.m:对接收机进行建模,包括相位恢复、定时恢复、解码、解调等组件。

4)QPSKScopes.m:可选地可视化信号使用时间范围,频率范围,星座图。

每个组件都使用System对象建模。要查看四个主要System对象组件的构造,请参阅runQPSKSystemUnderTest.m

单个组件的描述

发射机

该组件使用ASCII字符生成消息,将字符转换为位,并为接收帧同步添加一个巴克码。然后使用QPSK对数据进行调制,并使用平方根凸起余弦滤波器进行滤波。

通道

该组件模拟空中传输的效果。它用相位和频率偏移来降低传输信号,一个时变延迟来模拟发射机和接收机之间的时钟倾斜,以及AWGN。

接收机

该组件重新生成原始传输的消息。它分为七个子部分。

1)自动增益控制:将其输出功率设置为一个水平,确保相位和定时误差检测器的等效增益随时间保持恒定。AGC放在凸起余弦接收滤波器因此,信号振幅可以测量过采样因子为2。这个过程提高了估计的准确性。

2)粗频率补偿:使用基于相关的算法粗略估计频率偏移,然后对其进行补偿。对估计的粗频偏取平均值,以便允许细频补偿锁定/收敛。因此,粗频偏用a来估计comm.CoarseFrequencyCompensator系统对象及平均公式;补偿是使用comm.PhaseFrequencyOffset系统对象。

3)定时恢复:利用闭环标量处理进行定时恢复,以克服信道引入的延迟影响comm.SymbolSynchronizer系统对象。该对象实现一个锁相环来纠正接收信号中的符号计时错误。在本例中,对象选择旋转不变的Gardner定时误差检测器;因此,定时恢复可以先于精细频率补偿。对象的输入是一个固定长度的样本帧。对象的输出是一帧符号,其长度可以根据实际的信道延迟而因位填充和剥离而变化。

4)精细频率补偿:进行闭环标量处理,精确补偿频偏comm.CarrierSynchronizer系统对象。该对象实现了一个锁相环(PLL)来跟踪输入信号中的剩余频率偏移和相位偏移。

5)前导检测:检测输入中已知巴克码的位置comm.PreambleDetector系统对象。该对象实现了一个基于互相关的算法来检测输入中的已知符号序列。

6)帧同步:执行帧同步,并将可变长度的符号输入转换为固定长度的输出,使用FrameSynchronizer系统对象。该对象有一个次要输出,该输出是一个布尔标量,指示第一帧输出是否有效。

7)数据解码器:进行相位模糊解析和解调。此外,数据解码器将重新生成的消息与传输的消息进行比较并计算误码率。

作用域

这个组件提供了可选的可视化绘图:

  • 描述平方根提升余弦滤波前后接收信号的频谱范围,

  • 星座图显示接收信号经过接收机滤波,定时恢复,然后经过精细频率补偿。

有关系统组件的详细信息,请参阅Simulink中的QPSK发射机和接收机金宝app金宝app仿真软件的例子。

测试中的系统

测试脚本中的系统主循环逐帧处理数据。MATLAB变量设置compileIt为true才能生成代码。可以通过使用codegen由MATLAB Coder™产品提供的命令。的codegen命令将MATLAB®函数转换为MEX文件,生成加速执行的代码。生成的C代码比原始的MATLAB代码运行快几倍。对于本例,设置useCodegen生成的代码codegen而不是MATLAB代码。

的内环runQPSKSystemUnderTest.m使用前面提到的四个System对象。在这个文件中,在被测系统周围有一个for循环,每次处理一帧。

for count = 1:prmQPSKTxRx。FrameCount transmittedSignal = qpskTx();rcvdSignal = qpskChan(transmittedSignal, count);[RCRxSignal, timingRecSignal, freqRecSignal, BER] = qpskRx(rcvdSignal);% Receiver if useScopes runQPSKScopes(qpskScopes, rcvdSignal, RCRxSignal, timingRecSignal, freqRecSignal);绘制所有作用域end end

执行和结果

要运行System Under Test脚本并获得模拟QPSK通信的BER值,执行以下代码。当您运行模拟时,它将显示误码率数据和一些图形结果。显示的作用域为星座图凸起余弦接收滤波器输出时,符号同步器输出,而精细频率补偿输出,和功率谱的关系凸起余弦接收滤波器输出。

如果compileIt codegen报告runQPSKSystemUnderTest.marg游戏{coder.Constant (prmQPSKTxRx) coder.Constant (useScopes) coder.Constant (printReceivedData)}% #好吧结束如果useCodegen BER = runQPSKSystemUnderTest_mex(prmQPSKTxRx,useScopes,printReceivedData);其他的BER = runQPSKSystemUnderTest(prmQPSKTxRx,useScopes,printReceivedData);结束流('错误率= %f.\n'BER (1));流('检测到的错误数= %d.\n'BER (2));流('比较样本总数= %d.\n'BER (3));
错误率= 0.000238。检测到的错误数= 366。比较样本总数= 1536920。

备选执行选项

如本节所述测试中的系统,通过使用示例开头的变量,可以与代码交互,以探索System对象和编码选项的不同方面。

默认情况下,变量useScopes而且printReceivedData分别设置为true和false。的useScopes变量使MATLAB作用域在示例执行期间打开。使用作用域,您可以看到所模拟的子组件的行为,也可以更好地理解系统在模拟时的功能。当您将此变量设置为false时,在示例执行期间范围将不会打开。当你设置printReceivedData如果为true,还可以在命令窗口中看到解码后的接收报文。另外两个变量,compileIt和useCodegen,与速度性能有关,可用于分析设计权衡。

当您将compileIt设置为true时,这个示例脚本将使用MATLAB Coder™功能编译脚本runQPSKSystemUnderTest以加速执行。这个命令将创建一个MEX文件(runQPSKSystemUnderTest_mex)并将其保存在当前文件夹中。一旦将useCodegen设置为true以运行mex文件,该示例就能够更快地运行用MATLAB实现的系统。该特性对于实时系统的实现是必不可少的,是一个重要的仿真工具。若要最大化模拟速度,请设置useScopes虚假和useCodegen为true,运行mex文件。

有关其他探索选项,请参阅Simulink中的QPSK发射机和接收机金宝app的例子。

总结

这个例子模拟了AWGN信道上的数字通信。它展示了如何建模QPSK系统的几个部分,如调制、频率和相位恢复、定时恢复和帧同步。它通过计算误码率来衡量系统的性能。它还表明,生成的C代码运行速度比原始的MATLAB代码快几倍。

附录

本例使用了以下脚本和helper函数:

参考文献

1.大米,迈克尔。数字通信-一种离散时间方法.纽约州纽约:普伦蒂斯大厅,2008年。