%E:\大学课件&科学浏览器\大三下\光纤通信\光纤实验\ACO OFDM
clc;
clear all ;
global N_IFFT;
global N_sc;
N_IFFT=64;%IFFT点数
N_sc=128;%有效数据的子载波数
BitperSymbol=4;%每符号的比特数
DataSymlength=256;%传输的符号数
% Data_Bitlength=DataSymlength*N_sc*BitperSymbol;
N_cp=16;%循环前缀的个数
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%产生数据信号(X_Data,Y_Data),round四舍五入取整
X_BitSource=round(rand(1,DataSymlength*BitperSymbol*N_sc)); %131072
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%串并变换,每一行是一个子载波
X_input=reshape(X_BitSource,N_sc,[]);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%M-QAM调制
%SymbolOrder = Binary时
%0 4 8 12
%1 5 9 13
%2 6 10 14
%3 7 11 15
hI = modem.qammod('M',2^BitperSymbol, 'PhaseOffset', 0, 'SymbolOrder','Binary', 'InputType', 'bit');
X_Data = modulate(hI,X_input);
figure(1);
plot(X_Data,'*r');title('16QAM调制后的X-Data');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%矩阵调整
X1_zero=X_Data;
X1_zero_half=X1_zero(1:N_sc/8,:); %X路数据的一半
%奇数子载波上数据置0
for k=1:N_sc/2^BitperSymbol
X1_zero_half(2*k-1,1:DataSymlength*BitperSymbol)=zeros(1,DataSymlength*BitperSymbol);
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Hermitian对称,关于第17行共轭对称
X1_zero_j=conj(X1_zero_half); %求共轭
%初始化后半段信号
X1_zero_j_z=zeros(N_sc/8,DataSymlength*BitperSymbol);
for i = 1:N_sc/16
k=(N_sc/16+1)-i;
X1_zero_j_z(2*i,1:DataSymlength*BitperSymbol) = X1_zero_j(2*k,1:DataSymlength*BitperSymbol);
end
X1_zero = vertcat(X1_zero_half,X1_zero_j_z);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%ifft变换,结果为实数
X1_ifft_output=ifft(X1_zero);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%零值处限幅,小于0的置0
X1_ifft_output_x=X1_ifft_output;
X1_ifft_output_x(find(X1_ifft_output<0))=0;
figure(2);
subplot(2,1,1);
stem(X1_ifft_output,'r.');title('限幅前X1');
subplot(2,1,2);
stem(X1_ifft_output_x,'r.');title('限幅后X1');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%加cp
%头部加cp
X1_cp=vertcat(X1_ifft_output_x(((end-N_cp+1):end),:),X1_ifft_output_x);
figure(3);
subplot(2,1,1);
stem(X1_cp,'r');title('X1 with CP');
subplot(2,1,2);
stem(X1_ifft_output_x,'r');title('X1 without CP');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%并串变换
X1_OFDMSymbol=reshape(X1_cp.',[],1).';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%高斯白噪声信道
RX1=awgn(X1_OFDMSymbol,30);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%串并变换,加了16行的CP
RX1_para=reshape(RX1,[],N_sc/4+N_cp).';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%去掉CP,去掉前16行,剩下的是数据
RX1_cutCP=RX1_para(N_cp+1:N_cp+N_sc/4, : );
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%FFT运算
RX1_QAMSymbol=fft(RX1_cutCP);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%逆限幅
RX1_QAMSymbol_2=2*RX1_QAMSymbol;
RX1_QAMSymbol_2_z=RX1_QAMSymbol_2;
for i=1:16;
RX1_QAMSymbol_2_z((2*i)-1,:)=X_Data((2*i)-1,:); %奇数位恢复
end
figure(4);
plot(RX1_QAMSymbol_2_z,'r.');title('FFT后RX1');
axis([-4 4 -4 4]);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% %解码
% DX1_Bit=zeros(N_sc,DataSymlength*BitperSymbol);
%
% for i=1:32
% for j=1:1024
% if real(RX1_QAMSymbol_2_z(i,j)) > 2 && imag(RX1_QAMSymbol_2_z(i,j)) > 2 %1100
% DX1_Bit(BitperSymbol*(i-1)+1,j) = 1;
% DX1_Bit(BitperSymbol*(i-1)+2,j) = 1;
% DX1_Bit(BitperSymbol*(i-1)+3,j) = 0;
% DX1_Bit(BitperSymbol*(i-1)+4,j) = 0;
% end
% if real(RX1_QAMSymbol_2_z(i,j)) > 2 && imag(RX1_QAMSymbol_2_z(i,j)) < 2 && imag(RX1_QAMSymbol_2_z(i,j)) > 0 %1101
% DX1_Bit(BitperSymbol*(i-1)+1,j) = 1;
% DX1_Bit(BitperSymbol*(i-1)+2,j) = 1;
% DX1_Bit(BitperSymbol*(i-1)+3,j) = 0;
% DX1_Bit(BitperSymbol*(i-1)+4,j) = 1;
% end
% end
% end
% DX1_Bit=QAM_decoder(RX1_QAMSymbol_2_z,BitperSymbol);
%
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% %并串变换
% DX1_Bit_chuan=reshape(DX1_Bit.',1,[]);
%
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% %BER计算
% X_input_ceshi=X_input(1:128,:);
% DX1_Bit_ceshi=DX1_Bit(1:128,:);
% start_bit=BitperSymbol*N_sc*0+1;
% last_bit=BitperSymbol*DataSymlength*N_sc/8;
% X1_BER=BER_Compution(DX1_Bit_ceshi(start_bit:last_bit),X_input_ceshi(start_bit:last_bit));
%
% disp([' ']);
% disp(['=========>> X1_BER=',num2str(X1_BER),'; Y1_BER=',num2str(Y1_BER)]);
% disp([' BER=',num2str(X1_BER)]);
% disp('_______________________________________');
%