基于MATLAB的MIMO-ACO-OFDM空间调制

内容分享7天前发布
0 0 0

ACO-OFDM系统


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

基于MATLAB的MIMO-ACO-OFDM空间调制

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


MIMO-ACO-OFDM空间调制系统框图如下:

基于MATLAB的MIMO-ACO-OFDM空间调制

ACO-OFDM系统发射端的输入数据,经星座映射变换后,会被同步拆解,分别加载到OFDM前

N/2个子载波里的奇数次载波上。

基于MATLAB的MIMO-ACO-OFDM空间调制

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

基于MATLAB的MIMO-ACO-OFDM空间调制

由上面两个公式得出:

基于MATLAB的MIMO-ACO-OFDM空间调制

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

基于MATLAB的MIMO-ACO-OFDM空间调制

根据上述推导,对双极性实数奇谐信号执行非对称削波操作,也就是把负数信号变为零,并不会造成有用信息丢失。削除负值只是让奇数载波传输的数据在接收端缩减至原来的一半,后续通过逆限幅处理,再进行星座解映射,就能得到输出数据流。


基于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');

%******************** 结束 ***************************

© 版权声明

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
none
暂无评论...