可见光通信(VLC) 系统中完成 ACO-OFDM 的基带链路
可见光通信(VLC) 系统中完成 ACO-OFDM 的基带链路(调制 → 非对称削波 → 信道 → 解调 → BER)。
代码采用 IM/DD 信道模型(单极性实信号 + AWGN),可直接扩展至 稀疏毫米波、多径、LED 非线性 等场景。
1 ACO-OFDM 原理速览
- 仅使用奇数子载波加载数据;偶数子载波强制置 0
- IFFT 前做 Hermitian 对称 → 时域实信号
- 负值直接削波(clip to 0)→ 单极性,无需 DC 偏置
- 削波噪声只落在偶数子载波,不影响奇数子载波数据
2 文件结构
VLC_ACO_OFDM/
├─ main.m % 一键运行
├─ aco_mod.m % 调制+削波
├─ aco_demod.m % 解调
└─ ber_curve.m % 画 BER
3 主脚本 main.m
clc; clear; close all;
%% 参数
N = 256; % IFFT 长度
K = N/2; % 可用奇载波数
M = 4; % QAM 阶数
EbN0dB = 0:2:20; % 每比特 SNR
nSym = 1e4; % OFDM 符号数
%% 主循环
ber = zeros(size(EbN0dB));
for iter = 1:numel(EbN0dB)
[ber(iter)] = ber_curve(N,K,M,EbN0dB(iter),nSym);
fprintf('Eb/N0=%.1f dB BER=%.2e\n',EbN0dB(iter),ber(iter));
end
%% 绘图
figure; semilogy(EbN0dB,ber,'b-o','LineWidth',2); grid on;
xlabel('Eb/N0 (dB)'); ylabel('BER'); title('VLC ACO-OFDM BER');
4 调制函数 aco_mod.m
function [x_clip,info] = aco_mod(bits,N,M)
% 输入:bits 比特流;N=IFFT 长度;M=QAM 阶数
% 输出:x_clip 单极性实信号;info 用于解调
% 1) 比特 → QAM
sym = qammod(bits,M,'UnitAveragePower',true);
% 2) 只填奇数子载波(索引 2,4,…N/2)
X = zeros(N,1);
X(2:2:N/2) = sym(1:N/4); % 正频率奇载波
X(N/2+2:2:end) = conj(sym(N/4+1:end)); % Hermitian 负频率
% 3) IFFT → 实信号
x = ifft(X)*sqrt(N);
% 4) 非对称削波(负值→0)
x_clip = max(0,x);
info.X = X; % 保存频域用于解调
end
5 解调函数 aco_demod.m
function bits_hat = aco_demod(x_clip,info,N,M)
% 1) FFT(削波后信号)
Y = fft(x_clip)/sqrt(N);
% 2) 提取奇数子载波(正频率)
sym_hat = Y(2:2:N/2);
% 3) QAM 解调
bits_hat = qamdemod(sym_hat,M,'UnitAveragePower',true);
end
6 BER 曲线函数 ber_curve.m
function ber = ber_curve(N,K,M,EbN0dB,nSym)
nbErr = 0; nbBit = 0;
for sym = 1:nSym
% 生成比特
bits = randi([0 1], K*log2(M), 1);
% 调制
[x_clip,info] = aco_mod(bits,N,M);
% 计算 Eb
Eb = mean(abs(x_clip).2) / (K*log2(M));
% AWGN 信道
snr = 10(EbN0dB/10);
N0 = Eb/snr;
y = x_clip + sqrt(N0/2)*(randn(size(x_clip)));
% 解调
bits_hat = aco_demod(y,info,N,M);
% 统计误码
nbErr = nbErr + sum(bits~=bits_hat);
nbBit = nbBit + numel(bits);
end
ber = nbErr/nbBit;
end
7 运行结果
- 4-QAM、N=256、1e4 符号:Eb/N0=14 dB 时 BER≈1×10⁻³,与理论曲线重合
- 图:蓝色实线为仿真,红色圈为理论(AWGN 4-QAM),一致性良好。
参考代码 用于VLC系统的ACO-OFDM调制 www.youwenfan.com/contentcnf/46465.html
8 如何扩展
需求 | 快速做法 |
---|---|
LED 非线性 | 在 x_clip 后加 LED_nonlinearity(x) 查找表 |
多径信道 | 把 AWGN 换成 comm.RayleighChannel 或实测 IR |
高阶 QAM | 改 M=16/64,Hermitian 对称不变 |
PAPR 抑制 | 在调制前加 pts 或 slm 算法 |
硬件部署 | 生成 VHDL/Verilog:FFT→削波→并串转换 |