ACO-OFDM系统
ACO-OFDM作为一种改进的OFDM技术,核心原理体现在子载波映射机制的优化设计。ACO-OFDM技术通过选择性地仅使用奇数子载波传输数据,而偶数子载波保持空闲状态,形成独特的频谱资源分配模式。ACO-OFDM系统框图如图:

这种设计虽然使频谱利用率降低了50%,但有效规避了偶数子载波可能引入的直流偏移问题,尤其适配可见光通信(VLC)系统中LED对单极性信号的传输需求。具体来说,输入数据信号经快速傅里叶变换(FFT)后,仅将复数符号映射至奇数子载波。
MIMO-ACO-OFDM空间调制系统框图如下:

ACO-OFDM系统发射端的输入数据,经星座映射变换后,会被同步拆解,分别加载到OFDM前
N/2个子载波里的奇数次载波上。

这里采用的星座映射形式包含PSK、QAM等。根据离散傅里叶变换的相关性质,能够得出FFT输出的时域信号具备奇谐对称的特征,下面为详细的推导步骤:

由上面两个公式得出:

ACO-OFDM解调光信号在信道中传输至接收端,通过光电探测器(PD)检测,将光信号转换为电信号。随后,电信号依次经过模数(A/D)转换和串并(S/P)转换,再对信号进行破零法检测,后进行快速傅里叶变换(FFT)。对于削波前序列xn,经FFT变换后的输出结果则有:

根据上述推导,对双极性实数奇谐信号执行非对称削波操作,也就是把负数信号变为零,并不会造成有用信息丢失。削除负值只是让奇数载波传输的数据在接收端缩减至原来的一半,后续通过逆限幅处理,再进行星座解映射,就能得到输出数据流。
基于MATLAB的MIMO-ACO-OFDM空间调制代码如下
%% MIMO-ACO-OFDM(2*2)
clear all;
clc;
%% System parameters
N = 128; % 子载波数
Nfft = 4*N; % 选择的FFT子载波
M = 256; % 调制阶数
numFrame = 10000; % OFDM帧数
% choose number
Nt = 2;%发射机数量
Nr = 2;
snr = [0:1:60];
%% 信号产生
nobits = log2(M)*N*numFrame;
sdata = randi([0,1],1,nobits);
sdata1 = sdata(1,1:log2(M)*(N-1)*numFrame);
%% 串并转换
s_input=reshape(sdata,Nt,[]);
l1_input = s_input(1,:);
l2_input = s_input(2,:);
%% QAM映射
%LED1映射
bits1 = size(l1_input,2);
sym_bits_t1 = reshape(l1_input,bits1/log2(M),log2(M));
sym_de_t1 = bi2de(sym_bits_t1,'left-msb'); % 二进制转十进制,用于下面符号调制
sym_i1 = qammod(sym_de_t1,M,'gray');
sym_t1 = reshape(sym_i1,N,numFrame/2);
%LED2映射
bits2 = size(l2_input,2);
sym_bits_t2 = reshape(l2_input,bits2/log2(M),log2(M));
sym_de_t2 = bi2de(sym_bits_t2,'left-msb');
sym_i2 = qammod(sym_de_t2,M,'gray');
sym_t2 = reshape(sym_i2,N,numFrame/2);
%% Hermitian对称
sym_f1 = flipud(sym_t1); % 上下翻转
sym_H1 = conj(sym_f1); % 共轭
sym_odd1 = [sym_t1; sym_H1];
sym_f2 = flipud(sym_t2); % 上下翻转
sym_H2 = conj(sym_f2); % 共轭
sym_odd2 = [sym_t2; sym_H2];
%% 只有奇数载波用于产生ACO-OFDM
tx_sym1 = zeros(Nfft, numFrame/2);
for j = 1:numFrame/2
for i = 2:2:Nfft
tx_sym1(i,j) = sym_odd1(i/2,j);
end
end
tx_sym2 = zeros(Nfft, numFrame/2);
for j = 1:numFrame/2
for i = 2:2:Nfft
tx_sym2(i,j) = sym_odd2(i/2,j);
end
end
%% IFFT
ofdm_sym1 = ifft(tx_sym1, Nfft);
ofdm_sym2 = ifft(tx_sym2, Nfft);
%% 裁切负值
ofdm_u1 = [];
for j = 1:1:numFrame/2
for i = 1:1:Nfft
if ofdm_sym1(i,j) > 0
ofdm_u1(i,j) = ofdm_sym1(i,j);
end
end
end
ofdm_u2 = [];
for j = 1:1:numFrame/2
for i = 1:1:Nfft
if ofdm_sym2(i,j) > 0
ofdm_u2(i,j) = ofdm_sym2(i,j);
end
end
end
%% MIMO发射
Le_1 = reshape(ofdm_u1,numFrame/2,Nfft);%串并转换
Le_2 = reshape(ofdm_u2,numFrame/2,Nfft);
%% MIMO信道2*2
H=10^(-5)*[0.4302 0.3933;0.3933 0.4302];
sm=zeros(numFrame,Nfft);
mimo_sig=zeros(numFrame,Nfft);
for i=1:1:numFrame/2
for j=1:1:Nfft
sm(2*i-1,j)=Le_1(i,j);
sm(2*i,j)=Le_2(i,j);
end
mimo_sig(2*i-1:2*i,:)=H*sm(2*i-1:2*i,:);
end
%% 添加高斯白噪声
for k = 1:1:length(snr)
mimo_channel = awgn(mimo_sig,snr(k),'measured');
%% —————–接收端检测—————–
H_1=inv(H);
re_sig=zeros(numFrame,Nfft);
for i=1:1:numFrame/2
re_sig(2*i-1:2*i,:) = H_1 * mimo_channel(2*i-1:2*i,:); % g=H-1*y
end
Le1_R = re_sig(1:2:numFrame,:);
Le2_R = re_sig(2:2:numFrame,:);
Le1_RE = reshape(Le1_R,Nfft,numFrame/2);
Le2_RE = reshape(Le2_R,Nfft,numFrame/2);
%% DHT
Rf1 = fft(Le1_RE, Nfft);
Rf2 = fft(Le2_RE, Nfft);
%% 提取奇数子载波,并将符号加倍
for j = 1:numFrame/2
for i = 1:N
Rf_odd1(i,j) = Rf1(2*i,j) *2;
end
end
for j = 1:numFrame/2
for i = 1:N
Rf_odd2(i,j) = Rf2(2*i,j) *2;
end
end
sym_deci_r1 = qamdemod(Rf_odd1,M,'gray'); % 得到十进制结果
sym_de_r1 = reshape(sym_deci_r1,N*numFrame/2,1);
sym_bits_r1 = de2bi(sym_de_r1,log2(M),'left-msb');
sym_deci_r2 = qamdemod(Rf_odd2,M,'gray'); % 得到十进制结果
sym_de_r2 = reshape(sym_deci_r2,N*numFrame/2,1);
sym_bits_r2 = de2bi(sym_de_r2,log2(M),'left-msb');
%% 并串转换
l1_out_put = reshape(sym_bits_r1,1,bits1);
l2_out_put = reshape(sym_bits_r2,1,bits2);
s_output = [l1_out_put;l2_out_put];
rdata = reshape(s_output,1,nobits);
rdata1 = rdata(1,1:log2(M)*(N-1)*numFrame);
% 误码率计算
[nume_sym,ber_sym]=biterr(rdata,sdata);
BER(k) = ber_sym;
end
%% ********************** 输出结果 ***************************
semilogy(snr,BER,'b-*', 'LineWidth', 1.5);
hold on;
axis([0 60 1e-5 1]);
grid on;
hold on;
title('')
xlabel('SNR (dB)');
ylabel('BER');
%******************** 结束 ***************************


