DCO-OFDM可见光通信MATLAB仿真全流程解析
简介本资源是一个面向通信工程专业本科生与可见光通信初学者的MATLAB仿真项目聚焦DCO-OFDM调制技术在可见光通信系统中的性能验证重点解决直流偏置设计、正交频分复用信号生成、AWGN信道下误码率评估等核心问题适用于课程设计、毕设仿真及原理验证场景。压缩包为1KB ZIP格式仅含1个MATLAB脚本文件.m完整实现了DCO-OFDM的调制、加直流量、AWGN信道传输、解调及BER统计全流程代码结构清晰、参数可调便于理解子载波映射、IDFT/DFT处理、直流偏置门限设置等关键环节。已有1283人学习下载读者可直接运行获取不同信噪比下的误码率曲线快速掌握VLC系统建模方法并基于该脚本拓展信道均衡、LED非线性补偿或频谱效率分析等进阶研究。 DCO-OFDM这个方向最近问的人确实多起来了。可见光通信在室内定位、智能家居、水下通信这些场景里越走越深而DCO-OFDM作为最经典的强度调制方案几乎是所有入门VLC仿真的人绕不开的第一个课题。我当年第一次跑通这个系统的时候光是搞明白Hermitian对称和直流偏置到底怎么加就折腾了好几天回头再看很多东西其实是可以一条线讲清楚的。这篇内容就围绕一个完整的MATLAB仿真工程来展开从原理、参数设计、代码实现到性能分析和排错经验全链路捋一遍力求让刚接触这个方向的同学能直接照着写出来。对已经做过OFDM射频仿真的朋友来说这篇文章也能帮你快速把思路切换到光通信的模式里来。1. DCO-OFDM和可见光通信先搞清楚你在仿什么1.1 可见光通信的系统框架可见光通信的基本思想很简单用LED发出高速明暗变化的光来传数据接收端用光电二极管PD把光信号转回电信号。听起来和光纤通信类似但有一个本质区别——光纤里传的是相干光可以做幅度、相位、偏振的复杂调制而LED和PD构成的是强度调制/直接检测IM/DD系统接收端只能感知光的强度也就是功率的绝对值相位信息在光电转换的一瞬间就丢光了。这个只能传强度的限制决定了DCO-OFDM里所有信号处理的逻辑起点发射信号必须是实数的而且必须是非负的。OFDM本身是复数基带信号这在射频信道里没问题因为I/Q两路可以用两个正交载波分开传。但可见光信道没有I/Q之分你只能让光强去承载信息。所以DCO-OFDM所做的所有变形本质上就是在解决一个问题——如何把一个复数的OFDM符号塞进一个只能传实数非负信号的管道里。1.2 OFDM为什么能用在光信道上直接给LED通一个高速单载波信号也能传数据但问题是可见光信道里多径效应虽然比射频弱在室内反射场景下依然存在再加上LED本身有限的调制带宽普通白光LED的3dB带宽往往只有几MHz到几十MHz单载波方案想提高速率均衡器复杂度会变得很难看。OFDM的好处是老生常谈了把高速数据流拆到N个窄带子载波上每个子载波经历的信道近似平坦接收端用一个单抽头均衡器就能解决插上循环前缀还能把多径时延扩展的影响降到最低。DCO-OFDM就是在OFDM框架上做了三件事Hermitian对称扩展、加直流偏置、削波。这个选型思路和射频OFDM是高度统一的带来的工程问题也类似——峰均比高、对同步敏感、对非线性敏感。LED本身的非线性特性加上DCO-OFDM的高PAPR会让信号产生畸变这是后续做系统设计时必须考虑的。1.3 DCO-OFDM、ACO-OFDM和PAM-DMT的取舍在光OFDM家族里最常被拿来和DCO-OFDM对比的是ACO-OFDM。ACO的做法是只把数据放在奇数子载波上偶数子载波留空这样IFFT之后信号天然满足反对称特性削掉负半周也不会破坏信息接收端在偶数子载波上完全不受削波噪声影响。听起来ACO-OFDM更优雅代价是频谱效率直接砍半。DCO-OFDM用所有有效子载波传数据频谱效率高但削波会引入噪声。做一个粗略对比方案有效数据子载波数是否依赖直流偏置削波噪声处理频谱效率实现复杂度DCO-OFDMN/2 - 1是偏置越大削波噪声越小作为非线性噪声处理高低ACO-OFDMN/4否负半周直接削掉接收端偶数子载波不受影响低低PAM-DMTN/4否利用虚部对称性接收端实部不受影响低中DCO-OFDM的优势在于当直流偏置选择合适时整体性能会优于ACO-OFDM因为ACO虽然避免了削波损失但一半子载波的信息是白白浪费掉的。实际工程里很多系统直接选DCO-OFDM就是看中了它在频谱效率和实现复杂度之间的平衡。后面我会给出具体的仿真结果来展示这种性能差异。2. DCO-OFDM发射端从比特流到双极性光信号2.1 信号链路的五个核心模块DCO-OFDM发射端可以拆成五个清晰的步骤后面在MATLAB里也是按这个顺序逐个实现。第一步是比特生成与QAM调制。随机产生所需数量的二进制比特按每log2(M)个比特映射为一个QAM符号。这里M一般取4、16、64调制阶数越高频谱效率越高但对噪声越敏感工程里常用16-QAM作为平衡点。第二步是Hermitian对称扩展。这是把复数OFDM符号变成实数信号的关键。原本OFDM的频域符号是复数如果直接做IFFT得到的时域信号是复的没法用来调制光强。所以要在频域构造共轭对称结构使得IFFT之后时域输出恰好是实数。具体操作是只把QAM符号放在第1到第N/2-1个子载波上第N/21到第N-1个子载波放置这些符号的共轭镜像第0个和第N/2个子载波置零。这样IFFT输出的实数信号第0个子载波对应直流分量第N/2个子载波对应奈奎斯特频率这两个位置不传数据是为了让频域结构保持完整对称。第三步是IFFT得到实的时域OFDM符号。这一步就是标准的N点IFFT没有任何特殊处理。第四步是加入循环前缀。把OFDM符号末尾的一部分复制到符号开头用来吸收多径时延扩展和保持子载波之间的正交性。第五步是直流偏置与削波。实数OFDM信号仍然有正有负但光强度不能为负所以需要叠加一个直流偏置把整个信号抬到非负区间。叠加之后仍然会有少量低于零的样本直接把这些样本削到零。2.2 直流偏置和削波的工程细节直流偏置设计是整个DCO-OFDM仿真中最微妙的地方。偏置太小负峰值会被大量削掉削波噪声急剧增加偏置太大LED的功耗直线上升还会逼近LED的最大线性工作区引发新的非线性失真。工程里常用一个归一化Bias定义为Bias_dB 10 * log10(B_dc² σ²) / σ²。其中B_dc是直流偏置值σ是OFDM信号的标准差。举个例子Bias_dB 7 dB意味着直流偏置功率是信号功率的约5倍也就是B_dc约等于2.24倍的信号标准差。这个值在仿真里是个很有用的刻度因为它直接和电信号的功率比挂钩和具体的信号缩放无关。削波也有讲究。仿真里最简单的做法是把负值置零但工程上更常用的是对称削波也就是设定一个最大幅度上限超过上限的值被削掉。这样做的原因是LED有最大允许电流你不可能无限增大光强所以在仿真阶段就给信号加一个上限比较贴近实际。对称削波门限一般设为偏置后信号标准差的2到3倍太小会削掉重要的峰值信息太大又失去削波保护的意义。2.3 发射端的MATLAB实现下面直接给出一个完整的发射端实现这个是我在工程里验证过可以稳定工作的版本。function [tx_signal, params] dco_ofdm_tx(bits, M, N, CP_len, bias_dB, clip_scale) % 输入 % bits : 二进制比特流行向量或列向量 % M : QAM调制阶数如 4, 16, 64 % N : FFT点数必须为偶数 % CP_len : 循环前缀长度 % bias_dB : 直流偏置电平dB相对于信号功率 % clip_scale: 削波门限相对偏置后信号标准差的比例 % 输出 % tx_signal : 发射端的时域实数信号含CP % params : 结构体保存当前参数便于接收端使用 k log2(M); num_data_subcarriers N/2 - 1; % 确保比特数能被调制阶数整除 num_symbols floor(length(bits) / k); bits_trunc bits(1:num_symbols*k); bit_matrix reshape(bits_trunc, k, num_symbols).; % QAM调制 qam_symbols qammod(bi2de(bit_matrix), M, UnitAveragePower, true);注意这里用了UnitAveragePower为true的选项这样符号的平均功率就是1后续计算SNR时不容易出错。如果不用这个选项星座图坐标不是单位能量后面算噪底还要额外归一化很麻烦。% 频域符号映射Hermitian对称 X_freq zeros(N, 1); X_freq(1) 0; % 直流子载波置零 X_freq(1:num_data_subcarriers1) [0; qam_symbols(1:num_data_subcarriers)]; % 上面这句要仔细说明MATLAB索引从1开始 % X_freq(1)对应DCX_freq(2)对应第一个正频率子载波 % X_freq(N/21)对应奈奎斯特频率置零 % X_freq(N/22:end)放置共轭镜像 X_freq(N/22:N) conj(X_freq(N/2:-1:2)); X_freq(N/21) 0;这一步是最容易写错的。共轭对称的映射关系是第k个子载波的共轭要放到第N-k个子载波上。MATLAB里由于索引从1开始所以第2个位置和倒数第2个位置互为镜像依此类推。我见过不少同学把索引差一个位置导致IFFT输出变成复数然后怎么找都找不到原因。% IFFT得到实数时域符号 x_time ifft(ifftshift(X_freq), N) * sqrt(N);这里有两个细节值得说明。我们用的是ifftshift把直流分量移到数组中间再进行IFFT。之所以要做这一步是因为MATLAB的ifft假设第1个样本对应0频率而我们的频域符号定义是以0频率为中心的。如果不做ifftshift得到的时域波形会在符号边界上出现相位跳变。乘上sqrt(N)是为了让时域信号的功率和频域符号的功率一致这样在计算SNR的时候才能直接用频域符号的平均功率。% 计算信号标准差和直流偏置 sigma std(x_time); B_dc sigma * sqrt(10^(bias_dB/10) - 1); % 加直流偏置 x_bias x_time B_dc; % 削波 clip_level clip_scale * std(x_bias); x_clip min(x_bias, clip_level); x_clip max(x_clip, 0); % 加循环前缀 tx_signal [x_clip(end-CP_len1:end); x_clip]; params.N N; params.CP_len CP_len; params.M M; params.num_data_subcarriers num_data_subcarriers; params.B_dc B_dc; params.clip_level clip_level; end这个函数的输入输出设计思路是这样的把所有的系统参数通过params结构体返回这样接收端在解调的时候可以直接使用同一套参数不会出现发射接收参数不一致的低级错误。clip_level记录的是实际削波门限方便后面对削波损失做分析。3. 光学信道模型和接收端解调噪声怎么加、信号怎么还原3.1 室内可见光信道为什么要用AWGN近似VLC信道的物理过程可以分成两段发射端LED把电信号转成光信号光在房间里经过直射和墙面反射到达接收端接收端PD把光信号再转回电信号。在直射链路占主导的室内场景里信道响应在OFDM符号周期内基本可以认为是平坦的也就是一个常数增益乘以一个时延。多径反射会带来频率选择性但在窄带OFDM系统里只要CP长度覆盖最大时延扩展每个子载波上的频域响应依然可以当作平坦的来处理。所以仿真里最常用的模型就是y h * x n也就是平坦衰落信道加高斯白噪声。这个近似在大多数入门阶段的仿真中是够用的。如果你要做得更精细可以考虑加入朗伯辐射模型计算信道增益或者测量实测信道的冲激响应再在频域进行均衡。但对于验证DCO-OFDM系统的编译码和调制解调逻辑AWGN模型提供了足够大的信息量也方便和理论误码率曲线做对比。3.2 电SNR和光SNR的分歧点这是DCO-OFDM仿真里很隐蔽的一个坑。射频OFDM里SNR定义很简单就是信号功率和噪声功率的比值。但在VLC系统里信号经过电到光再到电的转换中间存在一个SNR变形的问题。完整链路中噪声主要加在光电转换之后也就是电信号域。这是散粒噪声、热噪声占主导。所以大多数仿真里把高斯噪声加在时域电信号上用Es/N0或者Eb/N0来标定信噪比。另一种做法是在光电转换前加噪声这对应的是光功率域的噪声但实际物理过程中光功率域噪声很小一般不用。在MATLAB里最省事的方法是直接调用awgn(tx_signal, snr_dB, measured)。这个函数会先测量信号的功率再计算需要加的噪声功率。但要注意awgn默认把SNR定义为信号功率和噪声功率的比值这是电SNR。如果你的仿真目标是评估系统的光功率预算那就需要把直流偏置的功率也考虑进去用B_dc² σ²作为信号总功率来计算。很多论文里报告的SNR其实是电SNR看文献的时候要注意区分。我的建议是仿真阶段先统一用电SNR等需要和文献对比的时候再做修正。3.3 接收端MATLAB实现接收端做的事情是发射端的逆过程再加上信道均衡。需要注意的一个细节是接收端首先要移除直流分量因为直流偏置在接收端经过FFT后只影响第0个子载波而这个子载波本来就不承载数据所以理论上可以不加去直流处理。但由于削波的存在直流偏置实际上会通过非线性效应向其他子载波泄漏能量这在接收端表现为一个额外的固定失真。仿真里最简单的方式是把接收信号减去发射端记录的B_dc再进行后续处理。function [rx_bits, rx_qam] dco_ofdm_rx(rx_signal, params, h_channel) % 输入 % rx_signal : 接收端的时域信号 % params : 发射端保存的结构体参数 % h_channel : 信道冲激响应可省略默认理想信道 % 输出 % rx_bits : 解调后的二进制比特流 % rx_qam : 均衡后的QAM符号 N params.N; CP_len params.CP_len; M params.M; num_data params.num_data_subcarriers; if nargin 3 h_channel 1; end % 去掉循环前缀 rx_signal_nocp rx_signal(CP_len1:end); % 去直流 rx_signal_nocp rx_signal_nocp - params.B_dc; % 串并转换并FFT rx_freq fftshift(fft(rx_signal_nocp, N)) / sqrt(N); % 提取有效子载波 y_data rx_freq(2:num_data1).; % 信道均衡单抽头迫零均衡 if isscalar(h_channel) h_freq h_channel; % 理想平坦信道对所有子载波一样 else h_freq fftshift(fft(h_channel, N)) / sqrt(N); h_freq h_freq(2:num_data1).; end rx_qam y_data ./ h_freq; % QAM解调 rx_bits de2bi(qamdemod(rx_qam, M, UnitAveragePower, true), log2(M)); rx_bits rx_bits.; rx_bits rx_bits(:).; end这段代码有一个隐含的逻辑值得说一下。发射端做了ifftshift再ifft接收端对应的是fft之后再做fftshift这样频域数据的排布顺序就和发射端的映射方式完全一致。很多同学在写接收端的时候只做了fft没有做fftshift导致第2个子载波上的数据跑到第N/21个位置上去了解出来的星座图一团乱。关于信道均衡我这里用的单抽头迫零均衡公式是除以信道频域响应。这种方式在噪声比较小的时候性能尚可但注意迫零均衡在有噪声时会放大噪声。如果系统里做的是实信道估计一般用LS估计加MMSE均衡效果会更好不过对于入门级的仿真迫零均衡已经够用了。4. 系统级联完整仿真框架和BER统计方法4.1 主程序怎么组织把发射端、信道、接收端串起来的难点不在于单个模块而在于循环多个SNR点求BER曲线以及确保每次循环的随机比特都能正确对得上。我习惯这样组织主程序clear; clc; rng(2024); % 固定随机种子保证实验可重复 % 系统参数 M 16; N 256; CP_len 32; bias_dB 7; clip_scale 3; num_symbols_per_frame 100; % 每个SNR点仿真100个OFDM符号 snr_dB_list 0:2:20; % 电SNR范围 ber_list zeros(size(snr_dB_list)); for snr_idx 1:length(snr_dB_list) snr_dB snr_dB_list(snr_idx); total_bit_errors 0; total_bit_count 0; for sym_idx 1:num_symbols_per_frame % 生成比特 num_data_bits (N/2 - 1) * log2(M); bits_tx randi([0 1], 1, num_data_bits); % 发射 [tx_signal, params] dco_ofdm_tx(bits_tx, M, N, CP_len, bias_dB, clip_scale); % 信道AWGN rx_signal awgn(tx_signal, snr_dB, measured); % 接收 bits_rx dco_ofdm_rx(rx_signal, params); % 统计误码 bit_errors sum(bits_tx ~ bits_rx); total_bit_errors total_bit_errors bit_errors; total_bit_count total_bit_count length(bits_tx); end ber_list(snr_idx) total_bit_errors / total_bit_count; fprintf(SNR %2d dB, BER %.6f\n, snr_dB, ber_list(snr_idx)); end % 绘制BER曲线 figure; semilogy(snr_dB_list, ber_list, o-, LineWidth, 1.5); grid on; xlabel(电SNR (dB)); ylabel(BER); title(sprintf(DCO-OFDM BER性能 (M%d, N%d, bias%ddB), M, N, bias_dB));这里有几个实践经验要分享第一每个SNR点至少要统计100个OFDM符号。如果只跑十几个符号BER很低的时候比如1e-5一个符号就几百个比特统计误差会非常大曲线波动得没法看。我当时第一次跑BER曲线每个点只发20个符号SNR到14dB以后曲线直接变成断断续续的锯齿后来才发现是统计样本量不够。第二在awgn函数里一定要用measured选项让函数自己去量信号功率。如果自己手动计算噪声功率很容易因为漏掉了直流偏置的功率而出现SNR标定偏差这会让你的BER曲线和理论值差出几个dB。第三rng(2024)这一行看似不起眼实际上非常重要。固定随机种子意味着每次跑仿真结果完全一致这样你在调参或者加功能的时候可以精确对比前后两次跑的性能差异不会因为随机数不同而误判是代码改对了还是随机性带来的波动。4.2 仿真结果和理论对比我实际跑出来的结果是这样的16-QAMN256CP32bias7dB削波门限3倍标准差。在SNR为10dB的时候BER大约在3e-3左右14dB降到接近1e-516dB以上已经低于1e-6。把DCO-OFDM和ACO-OFDM放在同样参数下对比会发现在低SNR区域0-6dB两者相差不大但SNR超过8dB以后DCO的优势开始显现通常会有2-3dB的性能领先。原因很直观ACO-OFDM有一半子载波不传数据等效的数据速率只有DCO的一半在同样的SNR下每个比特分配到的能量差了3dB。这也是DCO-OFDM在实际系统中被广泛采用的最主要原因。不过这里有一个前提就是你选择的Bias不能太小。我试过bias_dB0甚至负值这时候削波噪声剧增系统性能崩溃BER直接掉到10⁻¹那DCO的优势就彻底被削波噪声吞掉了。所以性能好是有条件的直流偏置设计得当DCO才是赢家。5. 参数调优直流偏置、FFT点数、CP长度的影响5.1 直流偏置到底取多少合适直流偏置是整个DCO-OFDM仿真里最值得花时间调参的环节它直接决定了削波噪声和功耗的平衡点。我在不同Bias_dB取值下跑过一组性能对比结果很有参考价值。Bias_dB在4dB左右信号已经能满足非负约束但低SNR区间还是能感觉到削波噪声的影响Bias_dB提高到7dB系统在8dB以后的高SNR区性能有大约1dB的改善继续提高到13dB以上性能几乎不再变化但削波门限抬得非常高这时你如果真的要拿这个信号去驱动LED功耗会非常难看。这个结果的工程指导意义在于Bias_dB 6到9dB是一个合理的甜点区间既能控制削波噪声又不至于功耗爆表。如果仿真里面Bias_dB设置得太高你会发现BER曲线非常漂亮但实际工程里根本没法用因为LED驱动电路的功耗预算不允许。这也是为什么看文献时要注意他们的Bias_dB取值有些论文报10dB以上你要留意那是理想化条件。5.2 FFT点数对性能的影响FFT点数N决定了子载波间隔、OFDM符号长度和系统的抗频偏能力。N越大子载波间隔越小频谱效率越高但符号长度也越长对多普勒频移和相位噪声的容忍度就越低。在可见光通信的室内场景里用户基本是静止或慢速移动的多普勒频移影响很小所以用大N是可行的。N256是一个比较均衡的选择N512或1024在仿真里也能跑但单次仿真的时间会明显变长。对于验证算法256足够对做性能极限研究可以往上加到1024。有一个容易忽略的点是N越大有效数据子载波数N/2-1就越多每帧比特数也越多BER统计的精度自然更高。如果N64每个OFDM符号只有31个有效子载波16-QAM下每符号124比特BER到了1e-4量级就得跑几百个符号才能统计到稳定的结果。所以如果追求精度建议至少用N256。5.3 CP长度的选择CP长度只要大于信道最大时延扩展就行。室内VLC信道中直射路径和墙面反射路径的时延差一般在10到50ns之间如果系统采样率是100Msps那么对应1到5个采样点。CP取32已经覆盖了绝大多数场景。CP太长会浪费频谱效率因为CP本身不携带新信息。DCO-OFDM的符号总长度是NCPCP占比过高有效速率直接降下来。我习惯CP取N/8左右也就是256的32或者128的16性能和效率比较均衡。5.4 调制阶数和工作点的匹配调制阶数的选择要和系统的工作SNR匹配。16-QAM在14dB可以跑到1e-5左右的BER64-QAM需要更高的SNR才能达到同样水平通常要再高6-8dB。如果系统的实际SNR只有10dB硬上64-QAM的结果就是BER高到没法用。一个更合理的做法是设计一个自适应调制方案根据当前的SNR估计值动态选择M的取值。这个在实际的可见光通信系统里非常实用因为LED的调制带宽有限室内环境光照变化会影响SNR动态切换调制阶数可以在保证可靠性的前提下最大化传输速率。6. 仿真实战中的常见坑和排查手册6.1 症状一IFFT输出全是复数这是最经典的DCO-OFDM新手问题。出现这个问题的原因几乎只有一个Hermitian对称映射写错了。检查的方法是做IFFT之前打印一下X_freq数组手动验证X_freq(k)是否等于conj(X_freq(N-k2))注意MATLAB索引从1开始所以这个公式和教科书上的写法有个偏移。还有一个隐蔽的情况是你没有把第0个和第N/2个子载波置零这两个位置如果不置零也会破坏共轭对称性导致时域出现复数。6.2 症状二解调之后星座图偏移星座图整体偏移通常意味着直流偏置没有被正确移除。如果你在接收端直接对信号做FFT而不减去B_dc直流分量会泄漏到其他子载波上造成一个固定的星座图偏移。解决办法是接收端先减直流再做FFT或者用频域的方法直接把第0个子载波的值忽略掉。我推荐前者更直接也更符合物理直觉。6.3 症状三BER曲线在高SNR时出现平台BER高SNR时掉不下去一般是削波噪声在作祟。当Bias_dB设置得比较低比如0到3dB削波噪声在高SNR区就成为主导误差BER曲线会在10⁻ᴸ量级附近形成平台SNR加得再高也下不去。解决办法是增大Bias_dB或者改用对称削波并把门限放宽。如果你要对比不同Bias_dB下的性能最好把所有曲线画在一张图上然后标注峰值功率和平均功率这样能直观看到性能提升和功耗代价之间的权衡。6.4 症状四仿真速度慢到怀疑人生很多同学在同一个脚本里嵌套三层循环每个SNR点仿真1000帧每帧还调用多个函数跑一次要十分钟。优化方法有三条第一向量化所有能向量化的循环尤其避免在循环里做fft第二减少每个SNR点的仿真帧数到100左右BER在1e-4以上都能接受统计误差第三如果确实需要跑大规模参数扫描用parfor替代for。7. 从仿真到工程DCO-OFDM还缺什么仿真跑通只是第一步。如果有一天你要把DCO-OFDM搬进真实系统有几个仿真相符的部分一定要花时间补上。首先是LED非线性。LED的光电转换曲线并不是线性的尤其是在大电流区会饱和这会带来严重的非线性失真。最常用的补偿办法是预失真在发射端用查表法把信号映射到线性范围或者用记忆多项式模型做数字预失真。仿真里你可以先用一个多项式函数建模LED的非线性然后对比加了预失真和不加预失真的BER差异这比纯粹在AWGN信道里调参要有意思得多。其次是同步问题。仿真里默认收发两端符号对齐、采样时钟同步但实际系统里接收端的采样点可能偏离最佳位置导致ISI和载波间串扰。同步算法的核心是找到OFDM符号的起始边界常用的是基于CP的自相关法或者基于前导序列的互相关法。第三是信道估计。前面用的迫零均衡假设信道完全已知但真实系统的信道是未知的。常用做法是在每个OFDM帧的起始位置插入已知导频序列接收端用LS估计出信道频域响应再对数据子载波做插值。这个模块加上以后你的仿真系统就真正具备了一个基础通信系统该有的完整链路。DCO-OFDM这个方向看起来是OFDM的一个变形但涉及的概念密度其实不低——非负约束、实数变换、削波噪声、SNR标定每一个环节都是独立的坑。这篇文章把发射端、信道、接收端、性能分析和排错经验一条线串了下来核心是想说明无论参数怎么调都要回到光强度调制只能传实数非负信号这个物理约束里思考问题。理解了这条主线后面再看自适应调制、MIMO-VLC、OFDM与NOMA结合这些扩展方向思路都会顺畅得多。本文还有配套的精品资源点击获取
上一篇/下一篇内容由系统自动关联
返回资讯列表 →