主要内容

QPSK发射机和接收机

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

简介

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

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

  • 模拟一个通用的无线通信系统,该系统能够成功地恢复由于各种模拟信道缺陷而损坏的消息。

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

初始化

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

prmQPSKTxRx = commqpsktxrx_init%#ok<*NOPTS> % QPSK系统参数useScopes = true;% true,如果要使用作用域printReceivedData = false;%true,如果要打印接收到的数据compileIt = false;% true,如果要编译代码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: 'Triangle' DesiredPower: 2 AveragingLength: 50 MaxPowerGain: 20 MaximumFrequencyOffset: 6000 PhaseRecoveryLoopBandwidth: 0.0100 PhaseRecoveryDampingFactor: 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字符生成消息,将字符转换为位,并为接收帧同步添加Barker代码。然后使用QPSK对数据进行调制,并用平方根提升余弦滤波器进行滤波。

通道

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

接收机

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

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

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

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

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

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

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

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

作用域

该组件为绘图提供可选的可视化:

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

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

有关系统组件的更多信息,请参见Simulink中的QPSK收发器仿真软件的例子。

被测系统

测试脚本中的系统主循环逐帧处理数据。设置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);%接收器如果useScopes运行qpskScopes (qpskScopes, rcvdSignal, RCRxSignal, timingRecSignal, freqRecSignal);绘制所有作用域结束

执行和结果

要运行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);其他的数量= 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收发器的例子。

总结

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

附录

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

参考文献

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

Baidu
map