QPSK脉冲成型原理与MATLAB实现:从RRC滤波器到参数调优
2026/9/14 7:47:48 网站建设 项目流程

简介:QPSK调制解调与脉冲成型仿真资源,面向通信工程、信号处理方向的学生和入门工程师,帮助理解四相相移键控中基带映射、脉冲成型滤波、上变频与采样判决的完整链路。压缩包仅含6个MATLAB脚本文件,大小仅1KB,分别实现发送端QPSK映射与成型滤波、接收端匹配滤波与解映射,以及串并转换、采样判决等环节,文件命名清晰,可直接对照流程搭建小型基带仿真框架。目前已有198人学习下载。资源虽小,但结构完整:读者既能逐段运行代码,梳理二进制比特映射到四相波形、经信道传输后再恢复数据的全过程,也能借助升余弦或根升余弦滤波器观察频谱成形效果,调节滚降系数,理解带限传输与码间干扰的折中;还可在此基础上修改映射表或扩展为更高阶调制仿真,作为课程设计或系统仿真验证的轻量级参考。

1. 脉冲成型决定了QPSK信号走进信道前的最后一公里

在MATLAB仿真里,QPSK的星座图几乎是一步就能画出来的:映射、加噪声、判决,四个点清清楚楚。可一旦把信号从仿真搬到真实的射频链路,问题就出现了——矩形QPSK波形的频谱旁瓣衰减很慢,相邻信道只要离得不够远就会被干扰。脉冲成型就是在调制之后、发射之前,对符号波形做一次带限整形,让频谱能量收敛到主瓣里。整篇文章围绕QPSK脉冲成型展开:先讲升余弦和根升余弦的选型原理,再搭一条最小可复现的MATLAB链路,接着把滚降系数、符号跨度、每符号采样数这三个参数讲透,最后收在系数验证和定点化的具体技巧上。刚接触成型滤波器的人可以按步骤跑通代码,做过完整收发链路的人也能在参数边界和排错手法上找到可用的信息。

2. QPSK脉冲成型的原理与选型:RC为什么不够,RRC才是工程常态

2.1 从矩形脉冲说起:QPSK为什么不能直接发射

QPSK把比特两两映射成四种相位,每个符号在时域上对应一个持续时间为Ts的矩形电平。把这个矩形波直接送进DAC,时域看着干净,频域却是sinc函数:主瓣宽度2/Ts,旁瓣峰值只比主瓣低13dB,之后按1/f的速度衰减。对单载波系统来说,这个旁瓣正好落在相邻信道里,邻道接收机做下变频后会看到明显的干扰功率,整机频谱模板测试一上来就会挂掉。

更隐蔽的问题是带限信道里的符号间干扰。接收端必须用滤波器限制噪声和邻道信号,矩形QPSK的高频旁瓣被这个滤波器砍掉之后,时域波形会出现过冲和拖尾,符号采样点上的幅度不再纯净,星座图从四个点变成四团雾。基带仿真里这条链路经常被理想化,因为仿真没有射频前端和邻道干扰,不做脉冲成型也能正常解调;真正进入系统联调,第一轮邻近信道泄漏比测试就会让问题暴露出来。

脉冲成型解决的正是这两个问题:把频谱“修”成带外衰减足够快的形状,同时保证符号采样点上没有ISI。以符号周期Ts为一维约束,理想带限成型的频域形状就是升余弦。

2.2 RC与RRC:一次成型还是收发对拆

升余弦(RC)滤波器在频域从通带到阻带平滑过渡,它满足奈奎斯特第一准则——滤波器冲激响应在符号采样点上的值只有当前点非零,其他采样点恰好为零,因此单独使用时不引入符号间干扰。这听起来很理想,工程上却有个绕不开的矛盾:接收端做匹配滤波时,希望滤波器响应与发送波形共轭匹配,以此获得白噪声条件下的最大信噪比。发射端如果用RC一次性完成成型,接收端的匹配滤波就无法同时满足“带限”和“匹配”两个约束。

所以实际系统把RC的频率响应对半拆成两个根升余弦(RRC),一个放在发射端做脉冲成型,一个放在接收端做匹配滤波,级联之后的等效响应正好是RC。这个对拆正是“根”字的来历——根升余弦是升余弦在频域上开平方。发射端RRC负责把带外能量压下去,接收端RRC既匹配发送波形又完成最终的奈奎斯特整形,两条RRC串联后依然零ISI。

代价是每个符号的时域波形被拉长,信号峰均比(PAPR)比矩形脉冲高。功放如果工作在饱和区附近,峰值会被压缩,星座图外圈向内收缩,误码率抬高。系统设计要在频谱效率和功放回退之间找平衡,而不能只盯着滤波器本身。

有一种接口对接场景需要单独提醒:发射端用RRC成型,接收端以为用一个RC就能解调,两级串联后等效响应并不是零ISI。正确的组合要么是RRC+RRC,要么是RC单独用。仿真例程里这个错误不容易被发现,因为噪声和时钟偏差都被理想化了,换成实际采样钟和频偏之后误码率差异才会显现。

2.3 工程选型建议:按场景决定RC还是RRC

场景成型方案理由
单载波QPSK,收发都有数字基带RRC + RRC成型与匹配兼顾,噪声性能最优
接收端只做简单低通,不做匹配RC发射端一步成型,接收端要求低
测试仪器生成参考信号按协议模板选协议通常直接指定成型滤波器类型
多载波OFDM系统不做符号级成型OFDM靠循环前缀抗多径,符号级成型作用弱

LTE和NR上行QPSK走的是DFT-s-OFDM,单载波特性由DFT扩展获得,成型滤波的角色被弱化;而DVB-S系统、WiFi的HR/DSSS模式、卫星物联网链路,普遍采用RRC。在QPSK.rar这类例程包里碰到根升余弦系数,不用意外,这是单载波QPSK的工程常态。

另外,RAR包里解出来的成型系数可能有三种存在形式:时域抽头系数、频域响应采样值、归一化常数。三者是同一个滤波器的不同描述,时域系数拿去做卷积滤波,频域响应用于检查带外衰减,归一化常数只在恢复绝对信号幅度时才参与运算。混用这三类数据是解压后最常见的起步错误,先把它们区分清楚再跑主程序。

3. 用MATLAB搭一条最小QPSK脉冲成型链路

3.1 生成RRC系数:先学会用rcosdesign

Communications Toolbox 里的 rcosdesign 一条命令就能生成根升余弦系数:

% 生成根升余弦脉冲成型系数 span = 6; % 滤波器覆盖的符号数 sps = 8; % 每个符号的采样点数 beta = 0.35; % 滚降系数,范围 (0,1] rrcFilter = rcosdesign(beta, span, sps, 'sqrt');

四个入参分别是滚降系数、符号跨度、每符号采样数和成型类型。'sqrt' 表示返回根升余弦系数,省略这个参数时返回普通升余弦系数。滤波器长度由 span 和 sps 唯一确定,固定为 span*sps+1,这个关系在第五章验证系数时会直接用到。

如果环境里没有 Communications Toolbox,RRC系数也可以按频域定义手工计算:对幅频响应在 [-1/2, 1/2] 区间采样,乘上线性相位后做 IFFT 变换,截取中间 span*sps+1 个点。手工写法的频率采样点数要取得足够多,比如 2^16,否则系数边缘会变形,阻带衰减上不去。能用现成函数的时候,不建议重复造轮子。

3.2 随机QPSK符号映射后完成成型滤波

生成QPSK符号序列,再用 upfirdn 一次性完成上采样和成型滤波:

% --- 生成QPSK基带符号 --- bits = randi([0 1], 4000, 1); % 4000个随机比特 symbols = 1/sqrt(2) * (2*bits(1:2:end)-1 + 1j*(2*bits(2:2:end)-1)); % 相邻两比特映射为 I/Q 两路的 ±1/sqrt(2),功率归一化 % --- 脉冲成型:sps倍上采样 + 成型滤波 --- txSignal = upfirdn(symbols, rrcFilter, sps, 1); % 第一个参数是符号序列,第二个是成型系数, % 第三个参数表示内插倍数,第四个参数表示抽取倍数

映射代码把奇数位比特放I路、偶数位放Q路,系数 1/sqrt(2) 让符号总功率归一化到 1。upfirdn 内部先做 sps 倍零值内插,再与 rrcFilter 卷积,输出长度约等于 length(symbols)*sps + length(rrcFilter),比直接写循环高效得多。输出信号可以顺势做一次功率归一化,方便后续和理想频谱对比。

有人习惯先用 upsample 做内插再用 filter 滤波,两个步骤分开写。效果一样,但 upfirdn 会在边缘处理上更规范,尤其是滤波器延迟的补偿,一块处理不容易出错。在QPSK脉冲成型这条链路上,直接用 upfirdn 是最省事的做法。

3.3 用功率谱和眼图验证成型是否生效

成型滤波器有没有起作用,频谱图比星座图直观得多:

% --- 观察成型后信号的功率谱密度 --- Fs = 1e6; % 采样率,只影响横轴刻度 [psd_after, f] = pwelch(txSignal, [], [], 1024, Fs); % pwelch 用 Welch 平均法估计功率谱,FFT点数取1024 plot(f/1e3, 10*log10(psd_after)); xlabel('频率 (kHz)'); ylabel('功率谱密度 (dB)'); grid on;

pwelch 的第三个参数为空表示不重叠,第4个参数是 FFT 点数,点数越大频率分辨率越高,但估计方差也越大,1024 或 2048 对成型滤波器的验证足够。成型后信号在 ±(1+beta)/(2*Ts) 之外快速滚降,过渡带斜率由 beta 决定;如果看到频谱在某个边界突然反弹,说明内插倍数不足或滤波器长度截断太短。

眼图可以用 eyediagram(txSignal, 2sps) 直接观察,横轴取 2sps 表示两个符号周期。需要提前说明:发射端单独看 RRC 成型后的眼图,符号边界处有拖尾是正常的,零 ISI 特性要到接收端经过匹配滤波后才完整体现。看到边界不干净就急着调滤波器参数,属于误判。

4. 脉冲成型的3个核心参数:滚降系数、符号跨度与每符号采样数

4.1 滚降系数α:带宽和过冲的跷跷板

滚降系数 alpha 决定滤波器过渡带宽度,信号占用带宽 B = (1+alpha)·Rs/2,Rs 是符号速率。alpha 越小带宽越窄,频谱效率越高,但滤波器时域拖尾更长,对定时误差越敏感;alpha 越大,时域波形收敛越快,峰均比更低,对时钟恢复越友好,代价是带宽浪费。

以 Rs=1Msps 为例,不同 alpha 的带宽占用如下:

滚降系数占用带宽 (MHz)相对矩形QPSK典型场景
0.10.55110%频谱资源紧张的卫星链路
0.220.61122%部分卫星标准
0.350.675135%蜂窝系统常见折中值
0.50.75150%对邻道要求宽松的系统
1.01.0200%过渡带最宽,时域收敛最快

工程选型一般落在 0.2 到 0.5 之间。alpha 取 0.1 时看起来带宽最优,但对收发两端本振频偏极其敏感,频偏稍大,相邻符号干扰立刻显现;alpha 取 1.0 时成型最容易做,但一半的带宽都给了过渡带,频谱效率直接腰斩,大多数商用系统不会这么选。

4.2 span与sps:决定滤波器长度和混叠风险

span 是滤波器覆盖的符号数,sps 是每符号采样点数,抽头数 L = span*sps + 1。抽头越多,滤波器对理想 RRC 响应的逼近越精确,但群时延也越长,链路的符号对齐和时延补偿都要跟着改。

sps 必须大于 2,这是带限信号的奈奎斯特最低采样要求。工程常用 4、8、16。sps=4 时滤波器短、仿真快,但成型后频谱在 Fs/2 附近会出现镜像,需要靠后面的模拟低通滤除;sps=8 或 16 时离散化更细,对 DAC 重建滤波器的要求降低,代价是内存占用和计算时间成倍上升。仿真验证阶段用 8 最平衡。

span 常见取值是 4 到 8。span 太小,滤波器截断效应会让阻带衰减变差,带外辐射抬高;span 太大,滤波器时延变长,如果链路里还有定时同步环路,过长的群时延会影响环路稳定性。调参时建议固定 sps=8、alpha=0.35,只动 span,观察带外功率降到满足要求后,再回头精调 alpha。

4.3 参数设置里的三个常见坑

第一个坑是 sps 取 2 甚至更低。滤波器长度过短,成型后频谱在采样率附近出现周期性镜像,看起来带宽很干净,实际是欠采样造成的混叠假象,进 DAC 之后镜像会落到相邻信道。第二个坑是修改 span 后忘记重算滤波器长度,接收端匹配滤波还在用旧系数做符号对齐,星座图出现系统性旋转和散点。第三个坑是 alpha 小于 0.05,滤波器接近理想低通,时域冲击响应尾部衰减极慢,有限抽头截断带来明显振铃,眼图在符号边界出现尖锐毛刺。

排查方法也很固定:生成滤波器后打印 length(rrcFilter),确认等于 span*sps+1;用 freqz 检查幅频响应,阻带下降斜率应和 alpha 设定一致;如果星座图有规律性偏转,优先检查滤波器长度和采样对齐点,而不是怀疑映射逻辑。

5. 从RAR包到可复现工程:脉冲成型系数验证的一个技巧

5.1 用单位脉冲响应快速验证滤波器长度

解压 RAR 包拿到一组成型系数,不确定它是升余弦还是根升余弦、有没有归一化、存储顺序对不对时,最快的验证方法是构造一个单位冲激序列,把它过一遍滤波器:

impulse = [1, zeros(1, 200)]; y_imp = filter(rrcFilter, 1, impulse); % FIR滤波器,分母为1 stem(y_imp, 'filled'); grid on;

filter 的第一个入参是滤波器系数,第二个入参 1 表示分母为 1,对应 FIR 结构。输出序列长度约等于滤波器长度,前 L 个点就是滤波器的冲激响应。从这个波形能直观读出滤波器阶数、主瓣位置和系数对称性——RRC 系数是偶对称的,如果 stem 图明显不对称,说明系数在文件里的存储顺序反了或者读入时行列方向错了。

5.2 单位功率归一化还是单位峰值归一化

RRC 系数通常归一化到单位能量,此时 sum(rrcFilter.^2) 约等于 1/sps。如果把系数归一化到单位峰值,max(abs(rrcFilter)) 等于 1,符号波形整体幅度会变弱,后续需要借助自动增益控制或 DAC 满量程补偿。两种归一化没有绝对好坏,有 AGC 的链路用单位能量更通用,没有 AGC 的链路要保证峰值不打满,避免削波。

检查方式一行代码就能做:sum(rrcFilter.^2)。如果结果是 1/sps 量级,说明是单位能量归一化;如果结果是 1,说明被归一成单位功率了,增益上差了约 10*log10(sps) dB,链路预算直接按这个差值修正。

5.3 浮点转定点之前先对比频响

浮点 RRC 系数转成 16 位定点后,阻带衰减可能从 60dB 掉到 50dB 甚至更低。转换前把浮点和定点的幅频响应画在同一张图里,只看阻带部分:

fi_coef = fi(rrcFilter, true, 16, 15); % 16位有符号,15位小数 [H1, f1] = freqz(double(rrcFilter), 1, 2048); [H2, f2] = freqz(double(fi_coef), 1, 2048); plot(f1/pi, 20*log10(abs(H1)), f2/pi, 20*log10(abs(H2)));

fi 对象要先转成 double 再送进 freqz,否则数据类型不兼容画不出图。比较两条曲线的阻带包络,偏差超过 3dB 时就要提高量化位数,或者调整归一化方式,把系数动态范围压到定点格式能有效表示的区域里再做转换。这套验证手法对任何一组外来系数都适用:先看冲激响应,再查归一化类型,最后做频响对比,确认无误后再把系数接进完整链路。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询