简介:本资源面向通信工程、信号处理方向的研究者与高年级学生,围绕超奈奎斯特(Faster-than-Nyquist)传输下的信道容量问题,提供一套可运行的MATLAB计算与仿真程序包。资源核心涵盖信道建模、信号调制与恢复、误码率分析,并配有升余弦与根升余弦成形滤波、不同滚降系数与时间压缩因子下的容量仿真图,可帮助用户直观理解FTN系统如何突破传统奈奎斯特速率限制,并研究非正交传输条件下的容量变化规律。压缩包共18个文件,包括9个m脚本、5个mat数据文件和4个fig图像文件,整体大小约37.36MB。m脚本用于容量计算、功率谱密度计算与正交/非正交对比,mat文件保存了不同滚降系数下的仿真结果,fig文件则直接呈现alpha=0.8、beta=[0.2 0.5]、T=0.5等参数下的波形与容量曲线,便于快速查看典型场景。已有149人学习下载,适合用于课程设计、科研复现或通信系统性能预研。
1. 超奈奎斯特容量分析:压缩时间轴换频谱效率,这笔账没有免费午餐
发端把符号往奈奎斯特间隔里硬塞,匹配滤波输出端一片 ISI,这时候再谈“容量涨没涨”,问题就比教科书复杂得多。FTN(Faster-Than-Nyquist,超奈奎斯特)信号的核心卖点,是在不增加带宽和功率的前提下用更密的符号间隔换频谱效率;代价是人为制造一个有记忆的信道,容量必须重算。这套 capacity.zip 的价值,就是把容量推导从论文公式搬到可执行脚本,让做波形设计和评估非正交传输方案的人,能直接看到不同加速因子下的容量上界。本文按“理论边界 → 可复现实验 → 参数扫描 → 踩坑记录”的顺序把整条链路走一遍。
2. 先立住理论:FTN 容量计算依赖哪几个边界条件
2.1 匹配滤波与 ISI:奈奎斯特条件在 FTN 下为什么失效
奈奎斯特第一准则说的是:基带脉冲成型加匹配滤波之后,只要整体脉冲 p(t) 满足 p(kT)=δ(k),接收端在每个符号间隔上采样就不会看到来自其他符号的干扰。工程上发端用根升余弦(RRC)脉冲,收端配套匹配滤波器,两者卷积得到的 p(t) 就是升余弦,滚降系数 β 决定超出零滚降的部分带宽。这时的最大符号率是 1/T = 2B/(1+β),也就是通常说的奈奎斯特速率。
FTN 的做法是把符号间隔从 T 压缩到 τT,其中 0<τ<1。代入 p(t) 后,p(kτT) 不再等于零,而是一串确定的非零系数。这串系数不像无线信道随机多径那样不可预知:发端知道脉冲形状,接收端做完信道估计也能把整体响应学出来,所以它是一串“可用的记忆”,不是一堆只能当噪声扔掉的干扰。于是,FTN 信道模型从“无记忆 AWGN”变成“有记忆 ISI 信道”,容量公式也随之换了一套。
这里要纠正一个常见直觉:FTN 没有把带宽变宽,也没有把发射功率变大,它只是把时间轴上符号的摆放密度提高。带宽由脉冲形状决定,只要还在发同样的 RRC 脉冲,占用带宽就一点没变。因此,AWGN 信道下 FTN 并不能突破香农容量,它改变的是“用多复杂的接收机才能逼近香农界”。论文里那些容量曲线上穿香农界的图,基本都是把频谱效率当容量、或者带宽定义没写清楚造成的,这一点后面做数据验证时还会碰见。
为什么不能简单地在香农公式里把速率乘一个 1/τ?因为每个符号除了承担噪声,还要承担来自邻居符号的确定性干扰。把符号率翻倍,等价于把噪声和干扰一起翻倍塞进同样的频带,净增益必须看接收机怎么处理这串记忆。所以 FTN 容量分析的核心,就是给这套“人为 ISI”量化一个账:加速因子给多少,接收机复杂度买多少,容量曲线最后落在哪。
2.2 四个核心量:加速因子、滚降系数、频谱效率、容量
做 FTN 容量实验前,先把四个量在注释里写清楚,不然跑出来的曲线自己都解释不了。
| 量 | 符号 | 典型区间 | 工程含义 |
|---|---|---|---|
| 加速因子 | τ | 0.6~1.0 | 符号间隔压缩倍数,越小压得越狠 |
| 滚降系数 | β | 0~1 | 脉冲占用带宽超出零滚降的比例 |
| 信噪比 | SNR / EbN0 | 0~20 dB | 容量曲线的横轴 |
| 频谱效率 | η | 0.5~2.5 bps/Hz | 容量除以实际占用带宽后的纵轴 |
τ 是最核心的参数,直接决定符号间隔和 ISI 记忆长度。τ=1 就是奈奎斯特速率,τ 每下降 0.1,符号率提升约 11%,但 ISI 能量增长远快过这个比例,因为升余弦旁瓣在采样点上不是线性衰减的。β 决定旁瓣衰减速度:β 越大,滚降越陡,旁瓣越小,相同 τ 下的 ISI 越轻,但占用带宽也越大,频谱效率的基数被摊薄。SNR 是横轴,没有争议。
真正容易翻车的是“容量”和“频谱效率”的单位。每符号互信息(bit/symbol)和每带宽互信息(bps/Hz)之间差着一个 1/τ 因子。τ=0.7 时,每符号互信息可能只降到奈奎斯特情况的 85%,但符号率是 1/0.7≈1.43 倍,乘起来频谱效率反而提升到约 1.21 倍。如果你把两者搞混,算出来的曲线会整体偏移一个比例常数,趋势看起来还对,但数值完全是错的。
2.3 容量公式的适用边界:什么时候可以直接套香农
香农公式 C=B·log₂(1+SNR) 的成立条件是平稳 AWGN 信道、给定带宽和功率,且接收机可以做任意复杂的联合检测。FTN 系统在发端和收端之间引入的 ISI 是确定性的,带宽没有变,功率没有变,所以理论上限仍然由香农界给出。换句话说,FTN 的容量结论不是“超过香农”,而是“在符号率超过奈奎斯特速率时,理论上仍能逼近香农,但需要接收机具备状态记忆”。
明白了这个边界,就有了一个很好用的自检手段:固定带宽和功率,把 τ 从 1 扫到 0.6,容量结果不应该上穿 τ=1 时的香农容量。如果扫出来的曲线上穿了,先检查是不是把频谱效率当成了容量,或者是不是在计算中悄悄缩小了带宽定义。比如有人把 FTN 的“有效带宽”重新定义为只包含主瓣,那么同样的香农公式分母变小,数值自然变大,这不是 FTN 的功劳,是换了套度量标准。
所以在动手跑数据前,先确定三个边界条件:信道模型是 AWGN 还是有记忆 ISI,容量单位是 bit/symbol 还是 bps/Hz,带宽定义是 -3dB 带宽还是零滚降带宽。三个条件没定,后面所有结论都是空中楼阁。接下来的代码实验,也会反复遇到这三个条件带来的坑。
3. 把 capacity.zip 落地:目录结构、最小复现与参数扫描
3.1 先看目录:解压之后确认入口脚本与依赖
拿到这类单主题代码包,我建议先不要急着点开最大的源码文件读,而是先跑一遍自带 demo。单主题包的目录通常不会太复杂,常见布局是 src 放核心函数、scripts 放批处理入口、data 放预计算的仿真结果,根目录放一个 README 说明依赖和用法。入口脚本一般叫 run_all.m 或者 demo_capacity.m,如果你看到的是这种结构,直接先运行入口脚本,把输出图和数据表拿到手,再回头看实现。
这一步的意义是先把黑匣子打开一条缝:跑通之后你知道输入参数长什么样、输出是什么格式、运行时长大致多少。之后再改参数、加扫描维度,就有了基准线。如果一上来就深挖实现细节,很容易被脉冲成型、匹配滤波、信噪比归一化这些代码细节带偏,忘了整个包的目标是输出一张容量曲线。
依赖方面,这类包通常只需要 MATLAB 或 Octave 基本环境,不依赖通信工具箱。个别包会用并行池或包含大矩阵预计算,跑之前确认一下内存和并行设置。第一次跑建议用小参数集,比如 tau 只扫 3 个点、SNR 只扫 4 个点,确认脚本链路通了再放开。
3.2 最小复现:单点容量计算的完整流程
以“给定 (τ, β, SNR) 计算每符号可达容量”为最小单元,常见做法是在匹配滤波输出端把升余弦脉冲按 τT 间隔采样,得到一组 ISI 抽头,然后用等效信干噪比估算容量下限。脚本结构如下。
% ftn_capacity_single.m % 计算单个 (tau, beta, SNR) 组合下的 FTN 可达容量 % 思路:匹配滤波后的整体脉冲为升余弦,按 tau*T 采样得到 ISI 抽头 clear; clc; tau = 0.8; % 加速因子,小于 1 表示符号间隔被压缩 beta = 0.3; % 滚降系数 snr_db = 10; % 接收端信噪比 L = 10; % 单侧 ISI 考察长度,L 越大越接近真实信道 t = (-L:L) * tau; denom = 1 - (2 * beta * t).^2; denom(abs(denom) < 1e-6) = 1e-6; % 防止除零,升余弦在奇点处是有界的 h = sinc(t) .* cos(pi * beta * t) ./ denom; h = h / max(abs(h)); % 峰值归一化,主抽头能量设为 1 main_idx = L + 1; isi_power = sum(h([1:main_idx-1, main_idx+1:end]).^2); snr = 10^(snr_db / 10); % 等效信干噪比:ISI 与高斯噪声不相关,按功率叠加 sndr = (h(main_idx)^2 * snr) / (1 + isi_power * snr); C = 0.5 * log2(1 + sndr); % 每符号互信息(实基带每维度) fprintf('tau=%.2f beta=%.2f SNR=%.1fdB -> SNDR=%.3fdB C=%.4f bit/sym\n', ... tau, beta, snr_db, 10*log10(sndr), C);这段脚本的关键在升余弦的采样。匹配滤波后的整体冲激响应是升余弦,不是根升余弦;正确做法是对升余弦在压缩后的符号时间点 kτT 上采样。很多新手在这里直接用根升余弦采样,得到的 ISI 结构完全不对,容量偏差能到 0.5 bit/symbol 以上。L 取 10 对大多数 τ 和 β 组合已经够用,τ 小于 0.6 时建议把 L 提到 15,因为旁瓣衰减变慢,截断误差会显现。
容量公式里的 0.5 因子对应实基带单个维度。如果你仿真用的是复基带等价模型,每符号容量公式没有这个 0.5,直接 log₂(1+SNDR)。两种写法没有对错之分,但同一篇报告里必须只用一种,混用会让曲线整体差一倍。最后提醒一句,这个 SNDR 近似把 ISI 当作加性不相关干扰,是低复杂度接收机的容量下限,不是理论容量;做方案预筛选可以用,写结论时必须注明。
3.3 参数扫描:三个必调参数与推荐首扫区间
单点函数跑通后,下一步就是参数扫描。我一般写一个两层循环,外层扫 τ,内层扫 β,SNR 固定在一两个值上看趋势。
% ftn_parameter_scan.m % 扫描 tau 与 beta,看每符号容量随加速因子的变化趋势 tau_list = 0.6:0.05:1.0; beta_list = 0.1:0.2:0.5; snr_db = 10; cap = zeros(length(tau_list), length(beta_list)); for i = 1:length(tau_list) for j = 1:length(beta_list) cap(i,j) = ftn_capacity_single(tau_list(i), beta_list(j), snr_db); end end imagesc(beta_list, tau_list, cap); xlabel('滚降系数 beta'); ylabel('加速因子 tau'); colorbar; title('FTN 每符号容量 (bit/sym)');扫描参数的推荐首扫区间,我总结成一张表:
| 参数 | 首选扫描区间 | 为什么这样设 |
|---|---|---|
| τ | 0.6~1.0,步进 0.05 | 小于 0.6 后均衡器状态数指数膨胀,方案可行性急剧下降 |
| β | 0.1~0.5,步进 0.1 | 大于 0.5 带宽浪费太明显,小于 0.1 旁瓣衰减太慢 |
| SNR | 0~20 dB,步进 2 dB | 覆盖低信噪比到香农饱和区,曲线形状完整 |
τ 的扫描步进不要小于 0.025,因为升余弦旁瓣在采样点上的变化不是单调的,更细的步进会在某些点上出现看似异常的尖峰,那往往是采样点和旁瓣零点对齐造成的数值巧合,不是物理规律。β 的扫描可以粗一些,先确定哪个方向收益大再细化。SNR 扫描建议用对数坐标画横轴,容量曲线在低信噪比段的差别更明显。
跑完第一次扫描,你会看到 τ 越小、每符号容量越低,这是正常的。每符号容量下降不等于频谱效率下降,因为符号率已经按 1/τ 倍提升。把这个因子乘进去再画 bps/Hz 曲线,才是 FTN 真正要看的收益。这一步也是最容易出错的地方,下面单独展开。
4. 避坑手册:FTN 容量实验里的五个高频踩坑点
4.1 误码率平台期不等于容量瓶颈:先看均衡器收敛没有
现象:τ=0.8 时误码率曲线在 10⁻² 附近出现平台,怎么提高信噪比都压不下去,于是判定 FTN 方案不可行。
原因:线性均衡器对付不了 FTN 引入的深频域凹陷。符号率超出奈奎斯特速率后,频谱在部分频点接近零点,MMSE 均衡器在这些频点放大噪声,误码率自然卡住。这不是容量到头了,是接收机复杂度没跟上。
解决:把线性均衡换成最大似然序列估计或 BCJR 检测,或者加 turbo 迭代。FTN 的 ISI 是确定性的,状态数固定,BCJR 在 L=5 时状态数为 32,对现代处理器毫无压力。换了接收机再跑误码率,平台通常会消失,曲线继续往下走。
4.2 “无损压缩”假象:频谱效率的定义陷阱
现象:τ=0.8 时符号率提升 25%,有人直接把香农容量乘以 1.25,声称频谱效率提升 25%。
原因:这个计算只算了符号率收益,漏掉了 ISI 带来的信噪比损失。τ=0.8 时升余弦旁瓣叠加在采样点上,等效信干噪比比发射信噪比低 2~4 dB,每符号容量相应下降。一块钱的收入扣掉八毛的成本,净收益远没有 25% 那么多。
解决:先跑第 3.2 节的单点脚本,把 SNDR 算出来再乘。正确做法是每符号容量乘 1/τ,得到频谱效率,再和奈奎斯特基线做差值。差值如果是负的,说明这个加速因子在这个滚降系数下没有收益,换组参数再试。
4.3 蒙特卡洛点数不够,低信噪比段毛刺严重
现象:容量曲线在 SNR 小于 5 dB 的区间剧烈抖动,相邻两点差 0.5 bit/symbol 以上,完全看不出趋势。
原因:仿真用的符号块太短,或者块数太少。低信噪比条件下,互信息估计的方差本身就大,蒙特卡洛收敛速度慢,几千个符号根本不够。
解决:每符号按照 5 万到 10 万跑,分 20 块取平均,置信区间画出来。跑批量扫描时先把块数降到 5 做粗扫,锁定候选参数后,再用大点数精算。否则一个全网格扫描跑一整晚,最后发现低信噪比段的结果都不可信,白费时间。
4.4 匹配滤波器初始相位不对,整条曲线下移
现象:同一组 (τ, β, SNR) 参数,换一个随机种子重跑,容量曲线整体移动 1~2 dB。
原因:匹配滤波器输出的最佳采样点不在符号中心。FTN 压缩符号间隔后,脉冲主瓣被邻居压缩,采样时刻的微小偏移会直接把旁瓣能量带入主抽头。很多代码包默认 t=0 采样,忽略了分数延迟补偿。
解决:在仿真链路里加入采样相位搜索。常见做法是扫 4 到 8 个分数相位,取容量最大的那个作为结果。这个操作在理论容量仿真中很常见——容量计算假设接收机可以做理想的时序同步,工程实现里的定时偏差在仿真阶段不应该计入容量损失。
4.5 把 ISI 当均匀噪声算容量,低估了 FTN 的收益
现象:用第 3.2 节的 SNDR 方法算 τ=0.8 的容量,结果低于奈奎斯特基线,结论是 FTN 没有意义。
原因:(1 + isi_power * snr)这个式子默认 ISI 和噪声一样不可利用。但 FTN 的 ISI 是确定的、有结构的,接收机用 BCJR 或其它序列估计可以从中提取信息。把结构性干扰当成随机噪声,得到的是容量下限,不是容量本身。
解决:明确标注这是低复杂度接收机的可达速率下限。真实容量介于这个下限和香农上限之间,需要做互信息估计才能定位。如果你只是做方案预研,下限已经够用;如果你要下“FTN 无收益”的结论,请先跑互信息精算,否则这个结论站不住。
5. 进阶验证:用互信息替代误码率,给你的容量结论上保险
5.1 为什么要用互信息做最后一棒
误码率曲线只能证明某个特定接收机在这组参数下做到了什么水平,证明不了信道本身能承载多少速率。容量结论的最终裁判是互信息。对 FTN 这种人为制造 ISI 的信道,接收机复杂度决定实际可达速率,所以容量仿真必须覆盖“复杂度下限”和“理论容量”两头:SNDR 近似给出下限,BCJR 辅助的互信息估计给出接近理论容量的上界。
一个高效的互信息估计算法,是对发送符号做 BCJR 前向后向递推,得到每个符号的后验概率,然后按互信息公式把后验概率对数的均值统计出来。这个做法在 FTN 文献里很常见,实现时不需要每个符号都存,跑完一批符号更新一次统计量。符号块长取 2000、块数取 50,置信区间就足够小。你不需要修改第 3 章的结构,只需把“误码率统计”换成“后验概率统计”,框架不变。
5.2 验证容量结论的三个自检步骤
第一,用香农界做基线。τ=1 时的容量曲线就是香农容量曲线,把它画在同一坐标系里,FTN 的曲线无论多高都不应该穿过它。上穿意味着带宽定义或单位出了错。第二,检查 τ 与 β 的乘积约束。当 τ(1+β) 小于 1 时,符号率超过完全占用带宽,这个区间通常需要迭代接收机才能获得增益,线性接收机会显示负收益,这是正常的,别急着怀疑代码。第三,交换收发脉冲:把根升余弦换成矩形脉冲,容量曲线应明显变差,否则你的脉冲成型实现可能出了问题。
我自己做 FTN 评估时,第一遍永远用 SNDR 扫描排除明显不可行的区间,第二遍用互信息对候选点精算。血泪经验是:容量仿真和误码率仿真一定要分开跑,误码率平台期不能证明容量到头,互信息才是终审法官。希望这套流程对你有帮助。
本文还有配套的精品资源,点击获取