尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

OFDM/OTFS/C-OFDM/C-OTFS误码率对比:宽带瑞丽信道仿真详解

发布时间:2026/9/28 1:28:27

资讯中心
01
ARTICLE

OFDM/OTFS/C-OFDM/C-OTFS误码率对比:宽带瑞丽信道仿真详解

OFDM/OTFS/C-OFDM/C-OTFS误码率对比:宽带瑞丽信道仿真详解
简介面向本硕博教研学习的宽带瑞丽衰减信道误码率对比MATLAB仿真代码包重点考察OFDM、OTFS、C-OFDM与C-OTFS四种波形在16QAM调制及宽带瑞丽衰落信道下的误码率表现。代码以Runme.m为唯一入口需在MATLAB 2021a及以上环境中运行配套操作录像演示了正确的路径设置与调用方式避免直接运行子函数导致的报错。包体小巧仅327KB共10个文件其中9个为.m脚本涵盖调制解调、均衡、多径信道生成以及SFFT/ISFFT变换等模块1个为avi操作录像便于对照学习和复现结果。资源内模块划分清晰可逐段比较不同方案对多径效应的抑制能力较适合通信课程设计、毕业设计或科研验证。已有1256人学习下载可作为教学演示与课题验证的参考。1. 宽带瑞丽信道下的误码率对比四种波形的性能分水岭在哪做物理层链路仿真的人迟早会遇到一个绕不开的问题同样一副信道模型为什么OFDM和OTFS的误码率曲线能差出好几个dB尤其是把信道换成多径时延较大的宽带瑞丽衰落时OFDM的子载波间隔、循环前缀长度这些参数会突然变得非常敏感而OTFS凭借时延-多普勒域的联合调制往往能比OFDM多扛几dB。但市场上关于OFDM、OTFS、C-OFDM、C-OTFS的对比资料大多停留在概念图真正给出一套能复现、能改参数、能量化差距的代码方案很少。这篇文章要做的就是把这四种波形放进同一个宽带瑞丽信道框架里用16QAM调制跑出一组可互相对照的误码率曲线并把每个环节的代码逻辑、参数设置和容易翻车的细节拆开讲清楚。这套方案适合三类读者一是刚入手OTFS、想用它替代OFDM做链路级仿真验证的通信算法工程师二是被论文里各种变换域数学符号劝退、想直接看时频网格怎么生成、怎么收发信号的研究生三是做系统级性能评估的平台开发人员需要一套能快速横向比较波形优劣的基准模型。2. 宽带瑞丽信道与四种波形的原理差异为什么不能用同一个均衡器解决所有问题2.1 宽带瑞丽信道的基本参数时延扩展、相干带宽与多普勒扩展宽带瑞丽信道的“宽带”二字不是指信号占用的频谱宽而是指信道本身的频率选择性。当多径时延扩展比如最大时延tau_max达到微秒级大于符号周期的倒数时信道在不同频点上呈现明显不同的衰落特性传统的单抽头均衡器就不再适用。仿真里我们常把信道建模为多抽头延迟线每径是一个瑞丽复高斯变量各径之间有独立的相位和时延接收端收到的信号就是发射信号与信道冲激响应的卷积叠加噪声。关键参数有三个最大多普勒频移f_d、最大时延扩展tau_max、径数L。f_d决定了信道随时间变化的快慢tau_max决定了信道的频率选择性L则影响分集增益的大小。在MATLAB代码里我通常用comm.RayleighChannel或stdchan函数生成这个模型用PathDelays和AveragePathGains两个向量来控制时延和每条径的功率。宽带场景里tau_max一般设为采样周期的整数倍比如采样率是10MHz时一条典型市郊微蜂窝信道可以设置为PathDelays [0 0.5 1.2 2.5]单位微秒对应功率为[0 -3 -6 -10]dBm这样信道冲激响应的频域变化就足够剧烈OFDM和OTFS的性能差异也能明显拉开。2.2 OFDM与OTFS的调制机理差异从频域并行传符号到时延多普勒域联合映射OFDM的核心思想是把高速串行数据流分成多路低速并行流每路调制到正交的子载波上用循环前缀消除多径造成的符号间干扰和子载波间干扰。在接收端把时域信号做FFT在每个子载波上做单抽头均衡相当于把频率选择性信道劈成了多个平坦衰落信道。这种方案在慢变、时延扩展适中的信道下非常成熟也是标题里OFDM子载波间隔比如15kHz或30kHz作为选型的核心参数。OTFS则完全不同。它把发射的二进制比特先映射到时延-多普勒域形成一个M × N的二维网格其中M是时延维的格点数N是多普勒维的格点数。然后通过二维逆辛傅里叶变换ISFFT把这个网格变换到时频域得到标准的时频资源格再通过海森堡变换即OFDM调制发射出去。接收端做维格纳变换还原到时频域再进行辛傅里叶变换SFFT得到时延-多普勒域的接收网格最后在这个域上做均衡和符号判决。这么做的本质是把时变的信道冲激响应在时延-多普勒域近似为一个稀疏且稳定的二维矩阵让衰落信道变得接近时不变从而获得时频分集增益。2.3 C-OFDM与C-OTFS循环前缀带来的差异标题里的C-OFDM、C-OTFS里的C指的是Cyclic前缀这是OFDM和OTFS的标准配置用来抵抗多径时延。在代码实现里标准OFDM就是C-OFDM它已经有循环前缀了。为了做对比我通常会把C-OFDM和“无循环前缀的OFDMN-OFDM”放在一起跑直观展示加CP与不加CP对误码率的影响。对于C-OTFS我把它拆解为带有循环前缀的OTFS即在时延-多普勒域的时延维上同样插入CP以保证时域卷积的循环性这是实际工程里最常部署的OTFS版本。从性能角度说C-OFDM在宽带瑞丽信道下如果子载波间隔不够大、CP不够长会在地面多径或移动场景下出现明显的误码平层而C-OTFS因为把时变信道变成了时不变准静止的二维卷积对多普勒频移更鲁棒在高移动速度下曲线的下降趋势会更陡。这四种波形的对比本质上就是在同一种信道模型下观察“保护间隔的取舍”和“调制域的选择”谁更能抵消信道退化。3. 用16QAM搭建最小可运行的仿真框架从信道生成到误码率统计3.1 搭建仿真骨架参数初始化、信道模型与16QAM映射常见做法是用MATLAB写一个可复用的蒙特卡洛脚本。第一步是固定全局参数包括子载波数、CP长度、信号采样率、信道径数以及仿真信噪比范围。为了统一比较OFDM和OTFS要占用相同的带宽、发射总功率和数据速率。我一般把OFDM的子载波间隔设为15kHz一个时隙14个OFDM符号OTFS的时延格点数M和普勒格点数N乘起来等于OFDM一帧的数据符号数保证频谱效率一致。% 仿真参数配置 M_qam 16; % 16QAM调制 num_bits_per_symbol log2(M_qam); N_subc 128; % OFDM子载波数对OTFS对应时延格点数 N_sym 14; % OFDM符号数对OTFS对应多普勒格点数 cp_len 16; % 循环前缀采样点长度 % 信道模型宽带瑞丽 fs 15e3 * N_subc; % 采样率 path_delays [0 1 3 5] / fs; % 时延0, 1个采样, 3个采样, 5个采样 path_powers [0 -2 -5 -8]; % 各径相对功率 dB chan comm.RayleighChannel(SampleRate, fs, PathDelays, path_delays, ... AveragePathGains, path_powers, MaximumDopplerShift, 100, ... RandomStream, mt19937ar with seed, Seed, 10, ... NormalizePathGains, true);这段代码把信道模型的时延扩展控制在了数个采样间隔内在15kHz子载波间隔下相当于频率选择性很强的宽带瑞丽场景。NormalizePathGains设为true后信道功率被归一化到0dB这样接收端噪声功率可以按信噪比推导不会出现输入信号功率过大或过小导致曲线偏移的问题。MaximumDopplerShift设为100Hz是相对温和的移动场景如果需要对比高速场景可以提高到500Hz或1000HzOTFS的优势会进一步显现。3.2 OFDM发射接收代码加CP、FFT和单抽头均衡的最小实现OFDM的发射端先把16QAM符号填充到N_subc x N_sym的时频网格上然后对每列做IFFT得到时域符号再在每个时域符号前复制末尾的cp_len个采样点作为循环前缀。接收端按符号去掉CP做FFT并利用信道频响做迫零均衡或MMSE均衡。% OFDM发射端 data_symbols randi([0 M_qam-1], N_subc, N_sym); % 生成16QAM范围内随机整数 mod_symbols qammod(data_symbols, M_qam, gray, InputType, integer); ofdm_time ifft(mod_symbols, N_subc, 1); % 子载波维做IFFT沿列变换 ofdm_time_cp [ofdm_time(end-cp_len1:end, :); ofdm_time]; % 每列前插入CP % 过信道 tx_signal ofdm_time_cp(:); % 串行发射 chan_info info(chan); chan.Seed 10; % 固定随机种子便于复现 [rx_signal, path_gains] chan(tx_signal); % 接收信号与路径增益 % 接收端处理 rx_time reshape(rx_signal, N_subccp_len, N_sym); rx_time rx_time(cp_len1:end, :); % 去CP rx_freq fft(rx_time, N_subc, 1); % FFT回到频域 % 频域单抽头均衡用信道频响做迫零 H_freq fft(path_gains(1, :)., N_subc, 1); % 基于第一径与信道冲激响应计算频响 % 实际应使用完整的信道冲激响应这里仅示意 eq_symbols rx_freq ./ H_freq; % 解映射 rx_bits qamdemod(eq_symbols, M_qam, gray, OutputType, bit); ber ber(data_bits(:), rx_bits(:));OFDM的关键点是均衡器的分母不能出现接近零的值否则噪声会被放大。实际代码里我会用H_freq ./ (abs(H_freq).^2 noise_var)来做MMSE均衡比迫零在高信噪比下更稳定特别是深衰落频点较多的场景。info(chan)可以取到信道对象的冲激响应生成方式最好在循环外先算一次频响避免每个信噪比点重复计算影响速度。3.3 OTFS发射接收代码时延-多普勒网格与辛傅里叶变换OTFS的最小实现需要做两层变换。第一层是把时延-多普勒域的16QAM符号矩阵做辛傅里叶变换到M × N的时频域矩阵X_tf。第二层是对时频矩阵的每一列对应一个OFDM符号做IFFT并加CP发射。接收端先做维格纳变换去CPFFT得到时频域矩阵再做二维辛傅里叶变换回到时延-多普勒域最后在这个域上做均衡。% OTFS参数 M_delay 64; % 时延维格点数 N_doppler 14; % 多普勒维格点数 % 发射端生成时延多普勒域数据 data_dd randi([0 M_qam-1], M_delay, N_doppler); mod_dd qammod(data_dd, M_qam, gray, InputType, integer); % 二维辛傅里叶变换ISFFT先沿时延维FFT再沿多普勒维IFFT X_tf fft(mod_dd, M_delay, 1); X_tf ifft(X_tf, N_doppler, 2); X_tf X_tf / sqrt(M_delay * N_doppler); % 归一化保持功率 % 海森堡变换对每列加CP tx_ofdm_symbols ifft(X_tf, M_delay, 1); tx_signal_otfs zeros(M_delaycp_len, N_doppler); for n 1:N_doppler tx_signal_otfs(:, n) [tx_ofdm_symbols(end-cp_len1:end, n); tx_ofdm_symbols(:, n)]; end tx_signal_otfs tx_signal_otfs(:); % 过信道同一个信道对象 chan.Seed 5; % 固定种子 [rx_signal_otfs, path_gains_otfs] chan(tx_signal_otfs); % 接收端维格纳变换 rx_otfs reshape(rx_signal_otfs, M_delaycp_len, N_doppler); rx_otfs rx_otfs(cp_len1:end, :); Y_tf fft(rx_otfs, M_delay, 1); % SFFT先沿多普勒维FFT再沿时延维IFFT回到时延多普勒域 Y_dd ifft(Y_tf, N_doppler, 2); Y_dd Y_dd / sqrt(M_delay * N_doppler); % 迫零均衡在时延多普勒域对信道做逆运算这里简化为单抽头 received_dd Y_dd ./ H_dd; % H_dd 为时延多普勒域信道系数矩阵 rx_bits_dd qamdemod(received_dd, M_qam, gray, OutputType, bit);这段代码里如果直接用Y_dd做判决不均衡也能出结果只是性能很差。实际需要计算二维信道矩阵H_dd可以借助path_gains_otfs和每个时延采样点做二维卷积的移位矩阵。对于新手建议先用理想信道参数即已知H_dd跑通再逐步换成估计信道。4. 把C-OFDM和C-OTFS也跑出来改动点与对比曲线绘制4.1 C-OFDM的代码改动去掉循环前缀后的性能对照C-OFDM和OFDM的代码几乎一样区别在于循环前缀是否存在。为了对照CP的价值我会在常规OFDM的代码基础上把加CP的一段注释掉其他部分不变得到无CP-OFDM的BER曲线。% 无CP的OFDM发送 ofdm_time_nocp ifft(mod_symbols, N_subc, 1); rx_time_nocp reshape(rx_signal_nocp, N_subc, N_sym); % 没有CP直接取连续块 % 注意由于没有CP多径时延会直接造成符号间串扰 % 这里不再有精确的采样点对齐只能按符号起点去截断这只是改动的一部分真正的区别在于信道卷积时会引入前后OFDM符号的混叠而接收端无法区分哪些采样点是对应符号的合法部分。因此在宽带信道下无CP-OFDM的高斯噪声和残余干扰会叠在一起BER曲线会提前进入平层。C-OFDM因为有CP即使CP不足够覆盖所有时延也能通过加窗减轻但无法根除残余的载波间干扰。4.2 C-OTFS的代码改动时延维循环前缀与检测复杂度取舍C-OTFS是在OTFS基础上保留了时延维的循环前缀。实际实现和3.3中的OTFS本质相同因为标准OTFS本来就带CP。如果要做“无CP-OTFS”的对比把CP部分稍作修改在时延维上完全不用循环前缀直接让不同时延格子的数据在时间上连续传输。这时候信道线性卷积拉长信号接收端只能靠估计信道矩阵来解决。改动较小但性能对时延扩展的容忍度会断崖式下降。为了体现“C”的用法我会在绘制曲线时同时跑两个版本一个CP长度等于最大路径时延的2倍一个CP长度等于最大路径时延的0.5倍。这样的对比才能真正说明CP长度是否覆盖最大时延扩展对BER的敏感度。4.3 四种波形在同一信道下的对比曲线绘制把所有仿真结果放在同一张图里横轴是Eb/No_dB从0到30dB纵轴是BER对数刻度。绘制代码很简单关键是保证各方案的帧长一致、信道种子一致、均衡器类型一致。两条置信度原则一是每个信噪比点至少要统计到50个误码比特再计算BER否则抖动会掩盖真实差距二是用同样的信道对象种子初始化所有波形保证快照一致。EbNo_dB 0:2:30; ber_ofdm zeros(size(EbNo_dB)); ber_otfs zeros(size(EbNo_dB)); for idx 1:length(EbNo_dB) ber_ofdm(idx) simulate_ofdm(chan_conf, EbNo_dB(idx), cp_on); ber_otfs(idx) simulate_otfs(chan_conf, EbNo_dB(idx), cp_on); % 每个仿真函数内都会固定信道随机种子避免统计不公平。 end semilogy(EbNo_dB, ber_ofdm, r-o, EbNo_dB, ber_otfs, b-s); grid on; xlabel(Eb/No (dB)); ylabel(BER); legend(C-OFDM, C-OTFS, Location, southwest);画这个图之前要检查有无“抖动跳变”如果某条点异常突跳多半是某个信噪比点恰好信道落在深衰落上而没有足够多的统计帧。不要怀疑算法先把NumSymbols提高一个数量级再跑。5. 避坑与常见问题为什么你的误码率曲线是震荡、平层或不收敛的5.1 第一坑16QAM比特映射不一致导致恒定0.5误码率现象在高信噪比下BER曲线仍然维持0.5完全看不出随信噪比下降。原因发射端用了qammod默认二进制映射而接收端用了qamdemod的格雷映射符号索引错位导致判决结果完全是随机打乱的。解决在发射端也明确指定gray且两端对应的OutputType保持一致都用bit或都用integer这是最容易遇到且不仔细看根本发现不了的低级错误。5.2 第二坑OFDM均衡器出现深衰落频点时噪声爆炸现象OFDM的BER曲线在中等信噪比段出现平台甚至随着信噪比升高BER反而变差。原因迫零均衡在信道频响极小的地方放大了噪声这种放大在高Eb/No下尤为突出。解决改用MMSE均衡分母加上噪声方差项并在信道频响接近零的位置做限幅限制最小分母绝对值。实践结果是在宽带瑞丽信道、径数较多时MMSE一般比迫零好2~3dB尤其是16QAM这类非恒模调制。5.3 第三坑OTFS接收端没有做二维化处理直接把时域信号硬切现象OTFS的误码率比加了CP的OFDM还差甚至出现乱码。原因接收端在解调前没有准确去掉CP并做SFFT而是直接对时域信号做解映射。解决确认接收端先做维格纳变换得到时频域再做SFFT不要跳过任何一步。最容易出错的是SFFT的方向和归一化因子需要在ISFFT和SFFT之间互为可逆操作不能一个除sqrt(M*N)一个不除。5.4 第四坑CP长度设置恰好等于整数个采样点时频域插值出问题现象把CP长度设置为floor(tau_max*fs)时BER反而比CP更长时更差而且误差集中在信道插值上。原因最大时延正好落在整数采样但信道在子载波频域上的响应在边缘有突然相位跳变插入导频估计时插值算法在边缘失真。解决CP长度多留1~2个采样点余量或者可以用fs的分数倍定义PathDelays来避免全整数。仿真里我一般把最大时延设为0, 0.3, 1.2, 2.7这样的非整数值能明显减少插值边界的奇异值。5.5 第五坑C-OTFS的检测器在高阶调制下迭代不收敛现象C-OTFS在16QAM下BER曲线低信噪比时和OFDM重合但高信噪比无法降到10^-3以下产生平台。原因使用的消息传递检测器对256点时延多普勒网格迭代次数不足、初始方差估计不准导致软信息收敛到局部极值。解决改用线性最小均方误差检测器先做一次粗均衡得到符号后验概率再把后验概率作为先验送给迭代检测另外把迭代次数从10次提高到30次并加入阻尼因子0.5~0.8。6. 验证仿真正确性的进阶手段从理论下界到多普勒扫描仿真是参数的镜子参数没调好结果就只能骗自己。拿到一组BER曲线后第一步是把单径瑞丽信道即多径只有1径的结果跑出来跟理论瑞丽信道16QAM符号误码率解析式做对比。对瑞丽平坦衰落信道理论误码率公式为P_b ≈ (3/8) * erfc(sqrt(3 * Eb/N0 / (2*(M-1))))的简单近似不再适用更准确的是用MGF方法推导。我一般直接用MATLAB的berawgn、berfading来生成参考曲线但要注意berfading默认是平坦慢衰落只适合单径场景。如果你的仿真在单径下和理论值差0.5dB以内说明收发链路本身没问题后续宽带瑞丽的结果差异就都是信道多径引起的。第二个进阶验证法是扫描最大多普勒频移。把fd从50Hz扫到500Hz观察C-OTFS和OFDM的性能间隔变化趋势。预期是fd较低时OFDM和OTFS差别不大fd大于200Hz后OFDM开始出现误码平台而OTFS曲线仍能继续下降。如果结果不符合这个趋势回查信道是不是被设置成了准静态或者时延-多普勒域矩阵生成时轴向搞反了。第三个验证法是自检信道功率。在收发两端分别计算接收信号总功率是否和发射总功率加上信道增益一致。如果功率低了几个dB说明接收端在截断或缩放时丢了能量BER曲线的绝对位置会偏右。这里有个好习惯在代码里用mean(abs(rx_signal).^2)检查。每次跑仿真之前先跑一次零噪声数据打印接收功率确保它和发射功率一致这比等曲线画出来再怀疑信道模型要快得多。我在做这类对比时还有一个习惯把同一组信道冲激响应存成.mat文件后续四种波形都调它来跑数据。这样可以保证每次对照试验中所有波形的信道实现完全相同比较的结果完全取决于波形本身而非信道随机性。你会发现自己辛苦调参得到的所谓“优势”在同一个信道快照下可能会缩小不少但留下来的差距才是真实的性能收益。希望这套对比方法和代码能帮你少走一些弯路。本文还有配套的精品资源点击获取
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。