
简介基于Matlab的QPSK发射机接收机仿真工程面向计算机、电子信息工程、数学等专业学习者完整实现了从发射机调制、成型滤波、Farrow过采样到接收机解调、捕获、载波同步与位同步的通信链路可作为课题设计或课程项目的参考实现。资源包共36个文件以23个Matlab脚本.m为源码主体附5个.mat仿真数据文件、2个PNG波形示意图以及docx、pdf格式的同步说明与均衡文档整体压缩包大小17.59MB目录结构清晰方便按模块查阅。已有401人学习适合希望通过完整工程案例对照理解QPSK基带同步处理流程的读者。源码包含AGC测试、Gardner定时同步、Farrow插值、PLL载波同步、帧同步等多个可运行脚本配套数据文件能让初学者直接运行观察中间结果文档与注释则辅助梳理同步环路和均衡设计思路便于在参考基础上自行调试与扩展。1. 从QPSK仿真谈起为什么成型滤波和Farrow过采样是核心做通信物理层仿真的人迟早会撞上QPSK这条标准链路。调制、解调谁都会写但真正让仿真结果贴近真实信道、并在接收端把误码率压到理论值附近的往往是两个容易被跳过的环节成型滤波和定时同步。标题把这套仿真拆成了“发射机接收机”两条路径又专门点出Farrow过采样说明这不是一个只画星座图的玩具工程而是要处理码间串扰、频偏和符号定时漂移的完整基带验证平台。这类仿真适合两类人一是刚接触通信系统的学生想用Matlab把课本里的正交调制、匹配滤波和锁相环串成一条可观测的链路二是已经做过简单BPSK仿真、想往工程化方向多走一步的工程师。这里的“工程化”体现在三件事用根升余弦滤波器控制频谱宽度用Farrow结构实现任意倍率定时调整以及用环路而不是开环估计来跟踪残余频偏和相位噪声。读懂这三件事标题里剩下的解调、捕获、载波同步和位同步本质上都是围绕它们展开的配套逻辑。2. 发射机路径QPSK调制、成型滤波与Farrow过采样实现2.1 QPSK符号映射与基带I/Q生成QPSK的核心思想是把每两个比特映射成一个复符号。常见映射方式有Gray编码两个比特分别控制I路和Q路相邻星座点只差1 bit这样错判一个符号时只产生一个比特错误。Matlab里生成基带I/Q不需要循环直接对输入比特流做矢量化处理即可data randi([0 1], 1, Nbits); % 随机二进制数据 syms 2*data(1:2:end) - 1 1j*(2*data(2:2:end) - 1); % I 2*b_i - 1, Q 2*b_q - 1映射到 (±1, ±1)这段代码把奇数位比特映射到实部偶数位映射到虚部。得到syms后每个符号需要先按过采样倍数插入零值再送入成型滤波器。注意这里没有做功率归一化等到滤波器系数确定后统一处理。位宽和映射方式决定了解调端Costas环的相位模糊范围。QPSK有四个相位状态载波同步环路只能把相位锁定到某个整数倍π/2的偏移上所以接收端必须做差分编码或者依靠帧头来消解模糊。这个逻辑在捕获阶段就要预留接口。2.2 成型滤波根升余弦滚降系数与滤波器长度选择成型滤波有两个作用限制发射信号带宽、抑制码间串扰。在收发两端都使用根升余弦滤波器并且滚降系数相同时整个链路的余弦滚降响应满足Nyquist第一准则。Matlab中可以用rcosdesign直接生成系数rolloff 0.35; % 滚降系数 span 6; % 滤波器覆盖的符号数 sps 8; % 每个符号的采样点数 rrcFilter rcosdesign(rolloff, span, sps, sqrt);滚降系数越大频谱滚降越快过渡带越宽占用带宽越大但对定时偏差的容忍度越高。工程上选择0.2到0.5是常见做法。span控制滤波器阶数实际阶数为span*sps1。这里span6意味着滤波器覆盖前后各3个符号如果取值过小频域截断会造成带外泄漏过大则时延链和乘法器开销增大。在纯仿真中span8精度更高但诱发的群时延也更大需要记录滤波器时延并在接收端对齐。成型滤波的关键参数是滚降系数、每个符号采样点数和滤波器长度。sps8意味着后续如果在符号级做定时同步最小定时调整步长是1/8个符号周期。这个精度不足以满足高速链路要求所以需要Farrow结构插值器来提供分数间隔的定时调整。2.3 Farrow结构可变分数延迟实现过采样与定时调整Farrow结构本质上是把插值滤波器设计成多项式系数使得滤波器响应可以随分数延迟参数μ连续变化。与传统M倍插值后再抽取任意点不同Farrow结构只改变μ值就能输出任意相位采样点非常适合定时同步环路里“每个符号采一个点”的动态调整。一个经典实现是四阶Farrow结构的Lagrange插值每个输出样本由输入序列与一组预计算的多项式系数卷积得到。Matlab中如果不想手写卷积可以用内置interp函数替代演示但那不是真正的Farrow。真正要仿真时一般按以下方式实现function y farrow_interp(x, time_advance, Nsegments) % x : 输入基带采样序列 % time_advance : 输出采样点相对输入的分数延迟0~1 % Nsegments : 每段多项式阶数常见为4 len length(x); y zeros(1, len); % 这里假设输出采样数与输入相同实际应按时钟生成 % 对每个输出时间索引计算插值位置 ... end实际使用中定时同步环路会连续计算一个随时间累加的“定时误差”根据误差符号调整μ的增减。常见的做法是在每个符号周期内用一个小数步进累加器mu 0; % 当前分数延迟 step fs_sym/fs_samp; % 名义上的输出速率/输入速率 for n 1:Nsymbols idx_base floor(mu*n); % 整数基址 frac mu*n - idx_base; % 小数部分 [0,1) y(n) farrow_at(x, idx_base, frac); % 插值一个符号样点 mu mu 1; % 固定步进定时误差环会调制这个步进 end分数延迟的精度决定了定时误差调整的残余量。Farrow结构是“输入采样率固定、输出采样率可任意变化”的思路所以标题里写“Farrow过采样”本质上是说先用一个较高的固定采样率完成匹配滤波和捕获在符号率附近用Farrow插值代替可变速率重采样。这样环路更新的是μ值而不是重新设计一组滤波器运算开销低且相位连续。实现Farrow时最常踩的坑是边界处理。插值器需要前后若干历史样本数据流起始处需要构造前导零。另一个坑是μ的取值范围。如果定时误差累积超过1整数部分必须进位到索引中否则会出现周期性的相位跳跃。调试这段时我一般会直接打印输出符号序列的星座点观察是否有跨象限跳变。3. 接收机解调与捕获匹配滤波、频偏估计与帧同步3.1 下变频与匹配滤波后的典型信号形态发射机输出信号经过信道后接收端先要把射频或中频信号搬回基带。仿真中通常直接用复基带模型省去载波调制但需要在信号上叠加频偏和相偏来验证同步算法。收到实信号时用NCO生成本振做正交解调得到I和Q两路t (0:length(rx)-1)/Fs; rx_i rx .* cos(2*pi*fc*t); rx_q rx .* -sin(2*pi*fc*t);下变频后有镜像分量必须通过低通滤波器或匹配滤波器滤除。成型滤波器的平方根特性此时发挥第二次作用接收端再经过一个相同的根升余弦滤波器后整个链路的频域响应就是余弦滚降匹配滤波器同时最大化信噪比。匹配滤波后信号的信噪比达到最大值但符号仍处于过采样状态。此时不直接抽取而是先做捕获因为频偏未消除时抽取出的星座点会围绕原点旋转。3.2 捕获基于延迟相关的粗频偏估计与帧检测捕获要解决两个问题一是找到数据帧的大致起点二是估计出频率偏移的粗略值。工程仿真中最常用的方法是延迟自相关利用前导码或已知序列的周期性。假设前导码重复周期为D个符号接收信号延迟D个符号做共轭相关相关峰位置对应帧起始点相关峰的相位差对应频偏D 32; % 前导码重复长度 corr rx(1:end-D) .* conj(rx(1D:end)); auto_corr conv(conj(rx), fliplr(rx(1:D))); % 或用滑动相关 [~, t0] max(abs(auto_corr)); % 找到帧头 freq_est angle(corr(t0:end)) / (2*pi*D*Ts); % 平均相位差/时间这里freq_est是粗频偏值。延迟相关估计的频偏范围受限于D最大无模糊频偏为±1/(2DTs)。D越大估计越精确但范围越小。如果要覆盖的频偏是符号速率的1%D选64或128都可行。3.3 捕获阈值与前导码设计的选择捕获判决门限不能拍脑袋定。常见做法是计算归一化相关峰超过峰值的一半再配合一个最小时间间隔来防止假锁。有时需要做两级捕获先以符号速率的一半做延迟相关得到一个较宽的频率范围粗估计再用FFT细化频偏值。Farrow插值器可以在这个阶段把数据重采样到一个便于FFT的网格上这是它作为捕获预处理单元的优势。捕获帧的拐弯点在于频偏估计由相位旋转速率决定但在噪声较大时直接求angle会产生野值。通常做法是取多个相关值的平均相位角度即用复数的平均相位而非平均幅度再取相位。这样噪声对称分布时相位估计无偏。前导码设计上可以用一组双重复的“A A”结构也可以用“A -A A -A”结构。后者字头处会出现符号翻转更有利于检测帧边界。仿真时如果发现捕获概率不高先检查前导码的自相关性是否足够尖锐其次才怀疑频偏算法本身。4. 载波同步与位同步Costas环、Gardner与环路参数调节4.1 载波恢复Costas环实现QPSK相位解模糊捕获完成之后粗频偏已消除但残余频偏和相位偏移仍会导致星座点旋转。载波同步的作用是持续跟踪残余频偏和相位噪声。QPSK调制是抑制载波的恢复载频最经典的是Costas环。其基本结构是NCO、鉴相器和环路滤波器。对QPSK鉴相器的常见实现是四象限反正切误差error atan2(Q_decision, I_decision) - atan2(Q_signal, I_signal);其中I_signal和Q_signal是环路输入的基带信号I_decision和Q_decision是判决出的最近星座点。这种鉴相器增益与输入幅度有关因此通常要归一化。工程上常用一种简化的极性判决Costas环避免复杂除法err sign(I) * Q - sign(Q) * I;这个误差函数在星座点附近近似线性锁定后误差趋近于零。环路滤波器用二阶环路输出分别控制NCO的频率和相位freq_accum freq_accum Ki * err; phase_accum phase_accum Kp * err freq_accum; nco exp(1j * phase_accum); out_signal rx_signal .* nco;设计时比例系数Kp决定环路带宽与捕获速度积分系数Ki决定稳态频率跟踪。环路带宽如果设得过大噪声容易串入NCO控制端星座点发散如果设得太小捕获时间长高位动态多普勒场景会跟不住。QPSK仿真中常用环路带宽为符号速率的1%3%。Costas环在QPSK里有四重相位模糊。锁定状态可能稳定在任何一个π/2相位上。解模糊的手段是差分编码或使用唯一字。仿真时常见做法是发射端做差分QPSK编码接收端差分译码。另一种做法是在帧头中嵌入UW序列捕获后做模式识别将整帧数据旋转到正确相位。我一般倾向于帧头旋转法因为对误码率影响更直接也便于调试。4.2 位同步Gardner定时误差检测与环路滤波器载波同步恢复正常符号旋转后采样点仍然可能落在偏离最佳判决点的地方。位同步的目的就是找出每个符号的“眼睛睁开最大”位置。Gardner算法是QPSK位同步最常用的定时误差检测器之一它没有载波相位敏感性因此可以放在载波同步前也能工作。Gardner误差计算公式为err_t real(y_odd) * (real(y_early) - real(y_late)) ... imag(y_odd) * (imag(y_early) - imag(y_late));其中y_early,y_late,y_odd分别表示每个符号周期内的两个采样点和中间误差点。符号率两倍采样时一个符号内取两个采样点中间点就是误差计算位置。位同步环路的驱动器是第2.3节的Farrow插值器。环路每输出一个符号计算当前误差经过由Kp和Ki构成的滤波器更新Farrow的小数步进。典型实现步骤如下for n 2:Nsymbols y(n) farrow_interp(rx_filt, idx(n)mu(n), mu(n)); early y(n-1); % 前一个符号 late farrow_interp(rx_filt, idx(n)mu(n)0.5, mu(n)0.5); err real(y(n)) * (real(early) - real(late)) imag(y(n)) * (imag(early)-imag(late)); mu(n1) mu(n) - mu_gain * err; % 调整分数相位 end这一步通常不需要载波相位彻底收敛到零Gardner也能工作但在载波恢复之前做位同步会增加一个相互拖拽的问题所以仿真顺序一般先粗略载波恢复再做位同步最后再精调载波。4.3 位同步与载波同步的参数表及仿真发散排查环路参数不能靠肉眼拍。以下是一组经过常见链路仿真验证的参数区间可根据符号速率和滚降系数做微调参数建议范围说明Kp载波比例0.05 ~ 0.3越大捕获越快太大则星座点抖动增大Ki载波积分Kp/10 ~ Kp/100用来消除残余频偏造成的稳态相位误差mu_gain位同步增益mu_gain 在 0.01 ~ 0.1过大时定时振荡过小时收敛缓慢环路带宽0.005 ~ 0.03 Rsym带宽窄收敛慢但对噪声鲁棒Farrow阶数3 ~ 5高阶插值更准但时延更长仿真发散的表现通常是星座点从一个环形逐渐变厚直至模糊成一团。排查顺序先看输入频偏是否超出了捕获范围再看载波环路是否锁到了错误相位最后看位同步的mu_gain是否过大并引起抖动。我经常会在环路每个关键点插入临时可视化画出误差值和NCO相位值的变化轨迹如果误差一直不收敛多半是环路极性反了或者信号幅度太大超过了鉴相特性曲线的线性区。5. 验证技巧用眼图、星座图和误码率曲线确认同步收敛仿真的最后一步不是看到星座图好看就算完而是要量化验证。三个指标很有用眼图张开度、误差向量幅度EVM以及误码率曲线是否逼近理论值。眼图用来检验位同步质量。将接收信号按符号周期切段、重叠画在同一个窗口内如果定时准确眼图张开最大处无散焦。QPSK信号分别画I路和Q路眼图成形滤波滚降系数越小眼图的十字交叉越窄定时容差越小。如果同步环工作正常眼图中心区域几乎没有拖尾。eyediagram(rx_filt(1001:end), sps, sps);画眼图时注意要跳过前导序列和捕获瞬态部分否则前几百个符号的收敛过程会把眼图拉乱。一般从帧中部开始取一段长度约为2000符号的数据。EVM是更直接反映星座聚集度的指标定义为误差矢量幅度与理想星座幅度的比值error_vec rx_sync - tx_symbols; evm sqrt(mean(abs(error_vec).^2)) / sqrt(mean(abs(tx_symbols).^2)) * 100;EVM小于10%时QPSK误码率已经接近理论值。若EVM大于15%重点检查载波恢复后的残余频偏是否被完全压掉以及Farrow插值是否存在周期性相位跳变。误码率曲线是最严格的验证方式。按Eb/N0从0到10每2dB取一个点每个点一次性发射几十万比特统计误码数。QPSK的理论误码率公式为0.5*erfc(sqrt(Eb/N0))。把仿真曲线和公式画在一起如果两者差异在0.5dB以内说明同步链路整体工作正常。如果曲线出现地板效应比如Eb/N0增大后误码率不下降通常是存在固有相位模糊未解或定时偏差残余这比信噪比本身更值得追查。本文还有配套的精品资源点击获取