QPSK收发机

这个例子展示了一个使用QPSK调制的数字通信系统。特别地,这个例子说明了解决实际无线通信问题的方法,如载波频率和相位偏移,定时恢复和帧同步。

实现

这个例子描述了QPSK收发器的MATLAB®实现。

MATLAB脚本使用系统对象™:commQPSKTransmitterReceiver.m

对于使用bl万博1manbetxock的Simulink®实现,请检查:commqpsktxrx.slx

介绍

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

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

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

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

初始化

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

prmQPSKTxRx = commqpsktxrx_init%#ok<*NOPTS> % QPSK系统参数useScopes = true;如果要使用作用域,%为真printReceivedData = false;如果要打印接收到的数据,%为真compileIt = false;如果要编译代码,%为真useCodegen = false;% true运行生成的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:“三角形”DesiredPower: 2 AveragingLength: 50 MaxPowerGain: 20 MaximumFrequencyOffset: 6000 PhaseRecoveryLoopBandwidth: 0.0100 PhaseRecoveryDampingFactor: 1 TimingRecoveryLoopBandwidth: 0.0100 TimingRecoveryDampingFactor: 1 TimingErrorDetectorGain: 5.4000 PreambleDetectorThreshold: 20 MessageBits: [11200 x1双]BerMask: [1540 x1双)

被测试系统的代码架构

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

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

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

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

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

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

单个组件的描述

发射机

该组件使用ASCII字符生成消息,将字符转换为位,并为接收帧同步预先添加吠叫器代码。该数据然后调制使用QPSK和滤波的平方根上升余弦滤波器。

通道

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

接收机

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

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

2)频率粗补偿:使用相关算法粗略估计频率偏移,然后进行补偿。对估计的粗频率偏移进行平均,以使细频率补偿能够锁定/收敛。因此,粗频偏估计使用acomm.CoarseFrequencyCompensator系统对象和平均公式;补偿是使用comm.PhaseFrequencyOffset系统对象。

3)定时恢复:通过闭环标量处理进行定时恢复,克服信道引入时延的影响,采用acomm.SymbolSynchronizer系统对象。该对象实现PLL来纠正接收信号中的符号计时错误。为本例中的对象选择旋转不变加德纳定时误差检测器;因此,定时恢复可以先于精确的频率补偿。对象的输入是一个固定长度的样本框架。对象的输出是一组符号,其长度可能因比特填充和剥离而变化,这取决于实际的信道延迟。

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

5)序号检测:用a检测输入中已知的呼叫码的位置comm.PreambleDetector系统对象。该对象实现了一种基于交叉相关的算法来检测输入中的已知符号序列。

6)帧同步:采用a进行帧同步,并将变长符号输入转换为定长输出FrameSynchronizer系统对象。该对象有一个二级输出,它是一个布尔标量,指示第一帧输出是否有效。

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

作用域

该组件通过绘制以下图表提供可选的可视化:

  • 一个谱示波器,描述了平方根提升余弦滤波前后的接收信号,

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

有关系统组件的详细信息,请参阅使用Simulink的QPSK发射机和接收机示例万博1manbetx

被测系统

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

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

对于count = 1:prmQPSKTxRx。FrameCount transmittedSignal = qpskTx();rcvdSignal = qpskChan(transmittedSignal, count);[RCRxSignal, timingRecSignal, freqRecSignal, BER] = qpskRx(rcvdSignal);runQPSKScopes(qpskScopes, rcvdSignal, RCRxSignal, timingRecSignal, freqRecSignal);%绘制所有端点范围

执行和结果

为了在测试脚本下运行系统并获得模拟QPSK通信的BER值,执行以下代码。当您运行模拟时,它会显示误码率数据和一些图形结果。显示的范围分别为:

1)的星座图上升余弦接收滤波器输出。

2)星座图符号同步器输出。

3)星座图细频率补偿输出。

的功率谱上升余弦接收滤波器输出。

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

交替执行选项

正如本节中已经提到的被测系统,通过使用示例开头的变量,可以与代码交互,探索系统对象和编码选项的不同方面。

默认情况下,变量useScopes和printReceivedData分别被设置为真和假。usescope变量允许在示例执行期间打开MATLAB范围。使用作用域,您可以看到模拟的子组件的行为,并更好地理解系统在模拟时的功能。当您将此变量设置为false时,在示例执行期间将不会打开作用域。当您将printReceivedData设置为true时,您还可以看到已解码的接收数据包打印在命令窗口中。另外两个变量compileIt和useCodegen与速度性能有关,可以用于分析设计折衷。

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

有关其他探索选项,请参考使用Simulink的QPSK发射机和接收机示例万博1manbetx

总结

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

附录

这个例子使用了下面的脚本和帮助函数:

参考文献

1.大米,迈克尔。数字通信-一个离散时间的方法。第1版。纽约,纽约:普伦蒂斯霍尔出版社,2008年。