
简介面向通信系统与信号处理研究者的超奈奎斯特FTN信道容量分析MATLAB资源包聚焦奈奎斯特准则与FTN传输理论的对照验证帮助用户从理想信道带宽极限出发理解超奈奎斯特信号处理如何在不增加频谱资源的前提下提升数据传输速率并为后续系统设计提供可量化依据。压缩包共18个文件整体约37.36MB其中9个M脚本承担信道建模、容量计算、正交与非正交方案对比等任务5个MAT数据文件存储升余弦、根升余弦成型脉冲以及不同滚降因子与截断长度下的仿真结果4个FIG图形则直观展示多组参数下容量随信噪比变化的曲线便于研究时快速提取结论、完成图形化分析。包内示例涉及alpha0.8、beta[0.2 0.5]、T0.5等典型配置并包含无噪声Eve场景的演示有助于对比不同参数对FTN系统容量与误码率的影响脚本间逻辑连贯从脉冲成型到容量计算均有清晰注释适合作为入门模板。该资源适合通信专业高年级本科生、研究生及工程师用于理论学习、算法验证和容量优化研究目前已有149人学习下载可帮助使用者省去重复搭建仿真环境的时间。1. 从 capacity.zip 说起容量数据被装进压缩包时超奈奎斯特系统在算什么收到一个命名极朴素的capacity.zip里面没有华丽注释的工程代码只有一组按压缩因子tau排列的容量数据、发射波形和配置 JSON。对做过超奈奎斯特faster-than-nyquistFTN评估的人来说这个包的名字已经说明了一切它装的是“带宽不增加、把符号率硬顶过奈奎斯特极限之后系统容量还剩多少”的答案。奈奎斯特第一准则规定无码间串扰的代价是符号率上限而超奈奎斯特传输主动打破这个上限再用接收机算法把 ISI 抹掉。这篇文章会沿拿到capacity.zip之后的完整流程展开先读懂容量定义再解包恢复波形用 Python 重新计算容量曲线最后用三个技巧验证数据是否可信。2. 奈奎斯特第一准则与超奈奎斯特容量先搞清楚容量在算什么2.1 奈奎斯特第一准则无码间串扰的符号率上限奈奎斯特第一准则是数字通信里所有“速率上限”的源头。它说的是若基带信道等效带宽为 W无码间串扰ISI的最大符号速率是 2W 波特一旦超过这个速率相邻符号的时域响应会在采样点互相踩踏。这个结论对任何线性、时不变传输链路都成立与调制阶数无关。脉冲成形里的升余弦滤波器、根升余弦滤波器之所以无处不在正是因为它们在采样点只保留当前符号能量其他时刻的响应精确过零。工程上更常用滚降系数 β 来写Rs 2W/(1β)。β 越小频谱利用率越高但脉冲时域拖尾越长对定时同步越敏感。这段关系在capacity.zip的配置 JSON 里几乎必然出现因为在 FTN 评估中β 决定了“奈奎斯特基线”的精确位置。拿到数据先看 β 值再做任何容量对比都不迟。2.2 超奈奎斯特FTN把符号间隔压缩到 T 以下超奈奎斯特传输的出发点很直接如果不再要求采样点无 ISI允许相邻符号的波形部分重叠符号速率就能超过 2W。设奈奎斯特符号周期为 TFTN 以τT为间隔发送τ 1 就是压缩因子速率提升为1/τ倍。例如 τ 0.8 时同样的带宽里塞进 25% 的额外符号基带频谱效率接近2W/(τ(1β))。代价是每个采样点都叠着邻近符号的干扰接收机必须把这层 ISI 掀开才能解出数据。关键问题是主动引入的 ISI 会不会吃掉所有增益Mazo 在 1975 年的结果表明对理想带限信道上的二进制 PAM最小欧氏距离在 τ ≥ 0.802 时并不随 τ 缩小而下降这就是著名的 Mazo 限制。它意味着在符号率提高约四分之一的情况下理论误码性能不劣化是 FTN 最核心的“白吃午餐”区间。实际系统使用根升余弦脉冲时Mazo 限制会随滚降系数移动β 越小越接近理论值。2.3 容量评估的两种视角与参数表FTN 的容量分析存在两个容易混淆的视角。第一种是香农信道容量在固定带宽和功率下FTN 不能突破B log2(1SNR)因为那是由物理信道决定的与波形打包方式无关。第二种是工程意义上“给定星座、脉冲和接收机结构”所能达到的频谱效率capacity.zip里的曲线通常属于第二种并且会区分“高斯输入容量上界”和“实际星座互信息”两种口径。评估前需要确认三个参数的取值符号速率对应的名义带宽、压缩因子 τ、接收机均衡算法类型。下面是 FTN 容量评估的典型参数表。参数含义常见取值影响τ符号间隔压缩因子0.75 ~ 1.0小于 0.802 后距离损失加剧β脉冲滚降系数0.1 ~ 0.35越小 Mazo 限制越接近理论值SNR每符号信噪比5 ~ 25 dB决定容量曲线上限过采样率每符号仿真采样点数8 ~ 16不足时引起奈奎斯特混叠均衡器长度接收机记忆长度5 ~ 21 个符号过短时容量损失变大容量计算没有统一闭式解工程上常用三条路径高斯输入在频域做积分给上界离散星座用蒙特卡洛互信息估计带 ISI 时用 BCJR 或近似消息传递。后面两章会实际跑出其中两条路径。3. 解包 capacity.zip 并恢复 FTN 波形数据3.1 先看文件清单再动手收到压缩包的第一步不是解压后立刻跑脚本而是先弄清里面装的是结果文件、原始波形还是完整工程。常见做法是先列表再决定加载方式下面的命令组合能在一分钟内摸清结构unzip -l capacity.zip unzip capacity.zip -d capacity_ftnfind capacity_ftn -type f | sort | head -20解压后我先打开config.json和readme.txt。config.json记录仿真参数载波频率、符号速率、脉冲滚降、过采样率、SNR 列表、τ 列表readme.txt说明每个文件对应哪组实验。不要跳过这一步FTN 仿真里同样的 CSV 字段名在不同参数下含义可能完全不同。如果包里只有数据文件没有配置就需要靠采样率和符号速率反推 τ工作量会明显增加。3.2 读取容量数据与配置容量结果文件通常是 CSV 或 MAT每行是一组(snr_db, tau)下的速率值和频谱效率。用 pandas 读取并归并成宽表方便后续画曲线import json, zipfile, pandas as pd with zipfile.ZipFile(capacity.zip, r) as z: z.extractall(capacity_ftn) config json.load(open(capacity_ftn/config.json)) eta_df pd.read_csv(capacity_ftn/capacity_results.csv) eta_df[spectral_efficiency] eta_df[rate_bps] / config[nominal_bandwidth] pivot eta_df.pivot_table( indexsnr_db, columnstau, valuesspectral_efficiency ) print(pivot.head())rate_bps是每符号比特数与符号率的乘积除以nominal_bandwidth得到频谱效率单位是 bit/s/Hz。把 τ 放列、SNR 放行是 FTN 容量曲线最常见的组织方式方便直接在同一个 SNR 下对比不同 τ 的效率差异。config[nominal_bandwidth]必须取信号占用的名义带宽而不是采样率拿采样率当带宽会把频谱效率算得异常低。3.3 恢复发射波形并检查奈奎斯特混叠如果包里带waveforms.npz下一步是恢复基带波形并做频谱完整性校验。FTN 仿真最容易出的问题是为省内存把过采样率压得太低导致频谱尾部折叠进带内容量被高估。检查方法是对波形做 FFT看名义带宽外侧的能量分布import numpy as np import matplotlib.pyplot as plt data np.load(capacity_ftn/waveforms.npz) signal data[tx_waveform] fs config[sample_rate] spec np.fft.rfft(signal) freq np.fft.rfftfreq(len(signal), d1/fs) power_db 20 * np.log10(np.abs(spec) 1e-12) band_mask freq config[nominal_bandwidth] out_band_db power_db[~band_mask].max() print(f带外峰值 {out_band_db:.2f} dB)带外峰值低于 -30 dB 通常说明没有明显混叠如果出现 -10 dB 左右的高频平台就要提高过采样率重新仿真。需要留意的是 FTN 波形在带外并非严格为零滚降边缘有平滑衰减突然抬升的谱尾才是奈奎斯特混叠的典型信号。对 16QAM 这类高阶星座混叠造成的容量虚高可达每符号 0.3 bit 以上。4. 用 Python 从波形重算容量从匹配滤波到互信息估计4.1 匹配滤波与等效离散 ISI 信道提取从波形重新算容量需要先把连续波形降到符号率。对 FTN 来说这一步与普通奈奎斯特系统一样做匹配滤波但采样间隔是τT而不是T。设rrc_taps是发射端已知的根升余弦脉冲系数等效做法是求信号与共轭反序脉冲的卷积再按 FTN 符号周期抽取matched_taps np.conj(waveform_config[rrc_taps][::-1]) y np.convolve(signal, matched_taps, modefull) samples y[::config[samples_per_symbol_ftn]]samples_per_symbol_ftn是每个 FTN 符号对应的仿真采样点数等于int(samples_per_symbol * tau)。抽取步长必须与 τ 严格对应否则后续容量计算的 SNR 基准会偏移。验证抽取是否正确打印解调符号功率它应约等于星座平均能量的 τ 倍——这个倍率来自重叠符号对能量的累加很多仿真代码会漏掉这步检查而直接用理想星座能量做归一化。4.2 高斯输入容量上界估计在等效离散模型中高斯输入容量给出 FTN 系统在该信道上的理论上限实际星座永远无法超越。快速估计可将匹配滤波后的序列做 FFT把信号功率谱与噪声功率之比代入并行高斯信道的互信息积分。FTN 噪声严格说是色噪声理想情况下要先做白化但工程上先用平均噪声功率折算可以快速判断容量曲线的量级。n_fft len(samples) spec_signal np.fft.fft(samples) psd_signal np.abs(spec_signal) ** 2 / n_fft def capacity_waterfilling_gauss(psd, snr_db): snr 10 ** (snr_db / 10) noise np.mean(psd) / snr snr_per_freq psd / noise c np.sum(np.log2(1 snr_per_freq)) / n_fft return c for snr in [5, 10, 15]: c capacity_waterfilling_gauss(psd_signal, snr) print(fSNR{snr} dB, 高斯输入FTN容量约 {c:.4f} bit/symbol)这段代码把离散频谱视为一组并行高斯信道每个频点做log2(1SNR)再平均。n_fft取全序列长度频率分辨率足够如果样本点数少应该用 Welch 谱估计替代直接 FFT否则单次 FFT 的方差太大。这一结果比实际星座容量普遍高出 20% 到 40%属于正常现象它的主要用途是判定星座互信息有没有计算过头。4.3 离散星座互信息的蒙特卡洛估计实际系统使用 QPSK、16QAM 等离散星座容量应看互信息I(x;y)。AWGN 下可以直接用蒙特卡洛估计不需要构造信道矩阵。下面的函数完全向量化可以直接复制执行import numpy as np from scipy.special import logsumexp def awgn_mutual_information(constellation, snr_db, n_symbols50000, seed42): rng np.random.default_rng(seed) snr 10 ** (snr_db / 10) es np.mean(np.abs(constellation) ** 2) sigma2 es / snr m len(constellation) log2_m np.log2(m) idx rng.integers(0, m, sizen_symbols) x constellation[idx] noise (rng.normal(0, np.sqrt(sigma2 / 2), n_symbols) 1j * rng.normal(0, np.sqrt(sigma2 / 2), n_symbols)) y x noise d2 np.abs(y[:, None] - constellation[None, :]) ** 2 log_p_y_given_x -d2 / (2 * sigma2) log_p_y logsumexp(log_p_y_given_x, axis1) - np.log(m) log_p_y_true -np.abs(y - x) ** 2 / (2 * sigma2) mi np.mean(log2_m - (logsumexp(log_p_y_given_x, axis1) - log_p_y_true)) return mi qpsk np.array([11j, 1-1j, -11j, -1-1j]) / np.sqrt(2) for snr in [5, 10, 15]: mi awgn_mutual_information(qpsk, snr) print(fSNR{snr} dB, QPSK互信息 {mi:.4f} bit/symbol)logsumexp在这里是数值稳定的关键直接np.sum(np.exp())在高信噪比下会溢出。公式第二项logsumexp(log_p_y_given_x) - log_p_y_true估计的是log Σ_x p(y|x) / p(y|x_true)即后验概率与真值条件概率之比整个式子的期望等价于互信息的定义。snr_db按每符号能量es定义必须和capacity.zip数据里的标注一致否则对比曲线错位。低于 20 dB 时 5 万样本足够把互信息误差控制在 0.02 bit 以内。FTN 信道带 ISI 后上述单符号独立性假设不再成立互信息估计需要把符号序列当马尔可夫源用 BCJR 计算符号后验概率再通过后验与先验的 KL 散度估算速率。如果只需要快速验证数据包可以先用“忽略噪声相关性的逐符号估计”得到容量下界再决定是否投入 BCJR 的实现工作量。4.4 生成容量对照曲线把 FTN 互信息与奈奎斯特基线画在同一张图上是判断增益是否真实的最直接方法import matplotlib.pyplot as plt snr_list np.arange(0, 21, 2.5) rates_ftn [awgn_mutual_information(qpsk, s) / 0.8 for s in snr_list] rates_nyq [awgn_mutual_information(qpsk, s) for s in snr_list] plt.plot(snr_list, rates_nyq, labelNyquist tau1.0) plt.plot(snr_list, rates_ftn, labelFTN tau0.8) plt.xlabel(SNR (dB)) plt.ylabel(spectral efficiency (bit/s/Hz)) plt.legend() plt.grid(True) plt.show()rates_ftn除以 τ 是因为 FTN 在同样带宽里承载了1/τ倍的符号互信息需要按符号率折算到频谱效率。比较的重点不是绝对大小而是差值的斜率中高 SNR 下 FTN 应保持稳定增益如果曲线交叉或低于奈奎斯特基线优先检查脉冲能量归一化和噪声方差口径。真实 Mazo 区间的容量差异通常在 20% 到 25% 的频谱效率提升若差距过大数据包大概率存在参数标注问题。5. 验证 capacity.zip 容量数据的三个实用技巧5.1 用匹配滤波器界校验上界匹配滤波器界MFB给出无 ISI 情况下单符号检测的容量或误码率上界。FTN 系统的容量曲线永远不会超过 MFB。将capacity.zip里的容量数据与该界相减如果出现正值说明仿真里有符号能量归一化错误或噪声方差重复叠加。差值在 0.1 bit 以内可判定为蒙特卡洛波动超过 0.3 bit 则要认真回查信道矩阵构造和抽取步长。5.2 用奈奎斯特混叠检测判断过采样率合理性奈奎斯特混叠是 FTN 仿真里最隐蔽的坏数据来源。当samples_per_symbol * tau小于 4 时脉冲成形器带外衰减不足频谱折叠会让容量虚高。检查方法对匹配滤波前的波形做 Welch 谱估计找频带外最后 20% 区间的平均功率若高于带内平均功率的 1%就需要提高过采样率并重新生成数据。不要试图在事后用滤波器修补波形一旦混叠信息已经不可逆丢失。5.3 在重型蒙特卡洛前检查机器内存FTN 容量仿真的蒙特卡洛样本数通常要过 20 万16QAM 下距离矩阵是 20 万乘 16 的复数数组叠加 ISI 信道矩阵后内存占用会快速增长。批量跑实验之前用下面命令快速检查本机内存配置wmic memorychip get manufacturer, capacity, speed, memorytype, partnumber一次列出每条内存条的厂商、容量、速率、类型和部件号。总容量确定后按“每 100 万符号、均衡长度 16 时约需 1.2 GB”粗略估算内存需求若内存不足把样本数拆成多个批次或者把capacity.zip里的波形切片分段处理。验证工作做到这一步基本能过滤掉八成仿真或采参错误剩下的数据差异才是 FTN 系统本身的设计余量和性能边界。本文还有配套的精品资源点击获取