简介:面向通信系统与信号处理研究者的超奈奎斯特(FTN)信道容量分析MATLAB资源包,聚焦奈奎斯特准则与FTN传输理论的对照验证,帮助用户从理想信道带宽极限出发,理解超奈奎斯特信号处理如何在不增加频谱资源的前提下提升数据传输速率,并为后续系统设计提供可量化依据。压缩包共18个文件,整体约37.36MB;其中9个M脚本承担信道建模、容量计算、正交与非正交方案对比等任务,5个MAT数据文件存储升余弦、根升余弦成型脉冲以及不同滚降因子与截断长度下的仿真结果,4个FIG图形则直观展示多组参数下容量随信噪比变化的曲线,便于研究时快速提取结论、完成图形化分析。包内示例涉及alpha=0.8、beta=[0.2 0.5]、T=0.5等典型配置,并包含无噪声Eve场景的演示,有助于对比不同参数对FTN系统容量与误码率的影响;脚本间逻辑连贯,从脉冲成型到容量计算均有清晰注释,适合作为入门模板。该资源适合通信专业高年级本科生、研究生及工程师用于理论学习、算法验证和容量优化研究,目前已有149人学习下载,可帮助使用者省去重复搭建仿真环境的时间。
1. 从 capacity.zip 说起:容量数据被装进压缩包时,超奈奎斯特系统在算什么
收到一个命名极朴素的capacity.zip,里面没有华丽注释的工程代码,只有一组按压缩因子tau排列的容量数据、发射波形和配置 JSON。对做过超奈奎斯特(faster-than-nyquist,FTN)评估的人来说,这个包的名字已经说明了一切:它装的是“带宽不增加、把符号率硬顶过奈奎斯特极限之后,系统容量还剩多少”的答案。奈奎斯特第一准则规定无码间串扰的代价是符号率上限,而超奈奎斯特传输主动打破这个上限,再用接收机算法把 ISI 抹掉。这篇文章会沿拿到capacity.zip之后的完整流程展开:先读懂容量定义,再解包恢复波形,用 Python 重新计算容量曲线,最后用三个技巧验证数据是否可信。
2. 奈奎斯特第一准则与超奈奎斯特容量:先搞清楚容量在算什么
2.1 奈奎斯特第一准则:无码间串扰的符号率上限
奈奎斯特第一准则是数字通信里所有“速率上限”的源头。它说的是:若基带信道等效带宽为 W,无码间串扰(ISI)的最大符号速率是 2W 波特;一旦超过这个速率,相邻符号的时域响应会在采样点互相踩踏。这个结论对任何线性、时不变传输链路都成立,与调制阶数无关。脉冲成形里的升余弦滤波器、根升余弦滤波器之所以无处不在,正是因为它们在采样点只保留当前符号能量,其他时刻的响应精确过零。
工程上更常用滚降系数 β 来写:Rs = 2W/(1+β)。β 越小频谱利用率越高,但脉冲时域拖尾越长,对定时同步越敏感。这段关系在capacity.zip的配置 JSON 里几乎必然出现,因为在 FTN 评估中,β 决定了“奈奎斯特基线”的精确位置。拿到数据先看 β 值,再做任何容量对比都不迟。
2.2 超奈奎斯特(FTN):把符号间隔压缩到 T 以下
超奈奎斯特传输的出发点很直接:如果不再要求采样点无 ISI,允许相邻符号的波形部分重叠,符号速率就能超过 2W。设奈奎斯特符号周期为 T,FTN 以τT为间隔发送,τ < 1 就是压缩因子,速率提升为1/τ倍。例如 τ = 0.8 时,同样的带宽里塞进 25% 的额外符号,基带频谱效率接近2W/(τ(1+β))。代价是每个采样点都叠着邻近符号的干扰,接收机必须把这层 ISI 掀开才能解出数据。
关键问题是:主动引入的 ISI 会不会吃掉所有增益?Mazo 在 1975 年的结果表明,对理想带限信道上的二进制 PAM,最小欧氏距离在 τ ≥ 0.802 时并不随 τ 缩小而下降,这就是著名的 Mazo 限制。它意味着在符号率提高约四分之一的情况下,理论误码性能不劣化,是 FTN 最核心的“白吃午餐”区间。实际系统使用根升余弦脉冲时,Mazo 限制会随滚降系数移动,β 越小越接近理论值。
2.3 容量评估的两种视角与参数表
FTN 的容量分析存在两个容易混淆的视角。第一种是香农信道容量:在固定带宽和功率下,FTN 不能突破B log2(1+SNR),因为那是由物理信道决定的,与波形打包方式无关。第二种是工程意义上“给定星座、脉冲和接收机结构”所能达到的频谱效率,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( index='snr_db', columns='tau', values='spectral_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), d=1/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, mode='full') 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(f'SNR={snr} dB, 高斯输入FTN容量约 {c:.4f} bit/symbol')这段代码把离散频谱视为一组并行高斯信道,每个频点做log2(1+SNR)再平均。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_symbols=50000, seed=42): 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, size=n_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, axis=1) - 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, axis=1) - log_p_y_true)) return mi qpsk = np.array([1+1j, 1-1j, -1+1j, -1-1j]) / np.sqrt(2) for snr in [5, 10, 15]: mi = awgn_mutual_information(qpsk, snr) print(f'SNR={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, label='Nyquist tau=1.0') plt.plot(snr_list, rates_ftn, label='FTN tau=0.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 系统本身的设计余量和性能边界。
本文还有配套的精品资源,点击获取