可见光通信(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 抑制 在调制前加 ptsslm 算法
硬件部署 生成 VHDL/Verilog:FFT→削波→并串转换

posted @ 2025-09-05 09:20  kiyte  阅读(3)  评论(0)    收藏  举报