基于16QAM调制的ACO-OFDM仿真实现(matlab)
之前看到了一篇大神写的有关OFDM系统的仿真实现的MATLAB(文章链接在最后),在文章中他讲到:
本系统中IFFT得到的时域信号虽然全为实的,但含有负数,这对于采用IM/DD的光通信系统是不行的。
所以我就写了一篇ACO-OFDM系统的MATLAB仿真。众所周知,ACO-OFDM系统架构在奇数子载波在讯号,偶数子载波不载讯号。在埃尔米特对称处理之后,实数信号且保持反对称之特性,此特性使每一信号在对应位置上皆有其相反数存在。随后再将得到之信号做对零做限幅处理,使发送信号皆为正实数,满足强度调制/直接检测技术之要求。在接收器方面在经过快速傅立叶转换成频率域信号并经过等化器消除信道增益后,只取奇数子载波部份之结果,即为发送器之资讯。
在此声明,本人小白,第一次在CSDN上写文章,也是刚刚学习OFDM,所以我的代码中有大量的借鉴。并且,在源代码的基础上去除了对PAPR处理的操作、TS训练序列和信道均衡。我想做一个简化版的MATLAB程式码,以供像我这样的初学者学习。
代码在下方,有人也许会问为什么代码复制了无法运行,因为里面的qam16是源代码中的一个function,没有这个当然无法运行了。想要完整程式码,请认准源代码作者,就当支持一下这位大神博主了。
clc
clear all;
close all;
Nt_carr=256; %子载波数=FFT点数---256
Np_carr=Nt_carr/2-1; %实际子载波数---127
Sig_per_carr=500; %每子载波含符号数---500
bits_per_symbol=4; %每符号含比特数,16QAM调制---4
CP_Ratio=1/8;
CP_length=CP_Ratio*Nt_carr;%循环前缀长度
SNR=20;
%==================================================
%================信号产生===================================
baseband_out_length=Np_carr * Sig_per_carr * bits_per_symbol; %所输入的比特数目 127*500*4
% rand( 'twister',0);
baseband_out=round(rand(1,baseband_out_length));%输出待调制的二进制比特流
%==============16QAM调制====================================
complex_carrier_matrix=qam16(baseband_out);%列向量
figure;
plot(complex_carrier_matrix,'*r');%16QAM调制后星座图
title('16QAM调制星座图');
axis([-5,5,-5,5]);
grid on %显示网格线
axis square
%==============串并变换====================================
%矩阵转置时附加有取共轭
complex_carrier_matrix1=reshape(complex_carrier_matrix',Np_carr,Sig_per_carr)';%串并变换Sig_per_carr*Nt_carr 矩阵
%complex_carrier_matrix1=conj(reshape(complex_carrier_matrix',Nt_carr,Sig_per_carr)')%两次转置
%==============埃尔米特映射====================================
carriers=