????本仿真系統主要針對光OFDM系統,但需要注意的是,本系統還不能夠直接用于采用強度調制直接檢測(IM/DD)的光通信系統,因為采用IM/DD的光通信系統,其發送端是把要傳送的資訊轉變為電流信號注入LD或LED,從而獲得相應的光信號,這就要求要傳送的信號必須為正且實的信號,然而經本系統中IFFT得到的時域信號雖然全為實的,但含有負數,這對于采用IM/DD的光通信系統是不行的,
????對此有兩種解決方案,一是在得到的時域信號上加直流偏置(對應DCO-OFDM),使信號全變為正值,這樣只需要在接收端去直流偏置即可得到原信號,但是這種方法浪費發射功率,而且會導致峰值過大,可能使LD或LED作業在非線性區域;二是修改埃爾米特對稱的結構,使所有的偶數位子載波均不傳輸資料(對應ACO-OFDM),這樣經IFFT變換后的資料遵循半波對稱原則,可以在不丟失任何資訊的情況下去掉復數信號,然后在接收端在相應位置恢復即可,但這種方法雖然克服了第一種方法的缺點,但有一半的子載波不傳輸資料,因此具有較低的頻譜利用率,在實際應用中,將根據實際經權衡后作出合理的選擇,
仿真代碼(MATLAB)如下:
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;%回圈前綴長度
TS_length=Nt_carr+CP_length;%訓練序列長度
SNR=20;
%==================================================
%================信號產生===================================
baseband_out_length=Np_carr * Sig_per_carr * bits_per_symbol; %所輸入的位元數目 500*256*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=(1:Np_carr)+1;%共軛對稱子載波映射 復數資料對應的IFFT點坐標
conjugate_carriers=Nt_carr-carriers+2;%共軛對稱子載波映射 共軛復數對應的IFFT點坐標
IFFT_modulation=zeros(Sig_per_carr,Nt_carr);%添0組成IFFT_bin_length IFFT 運算
IFFT_modulation(:,carriers )=complex_carrier_matrix1 ;%未添加導頻信號 ,子載波映射在此處
IFFT_modulation(:,conjugate_carriers )=conj(complex_carrier_matrix1);%共軛復數映射
%=================IFFT===========================
time_wave_matrix=ifft(IFFT_modulation,Nt_carr,2);%OFDM調制 即IFFT行變換
%時域波形矩陣,行為每載波所含符號數,列IFFT點數,N個子載波映射在其內,每一行即為一個OFDM符號
%=====================計算峰均比PARR====================================
PAPR=10*log10(Sig_per_carr*Nt_carr*(max(max(time_wave_matrix)))^2/sum(sum(time_wave_matrix.^2)));
%==============降PAPR預操作====================================
b=[exp(pi/4*1i) exp(5*pi/4*1i)];
for i=3:Np_carr
complex_carrier_matrix1(:,i)=b(1)*complex_carrier_matrix1(:,i);
end
PAPR_temp=zeros(1,4);
for i=1:2
for j=1:2
complex_carrier_matrix1_temp=[b(i)*complex_carrier_matrix1(:,1) b(j)*complex_carrier_matrix1(:,2) complex_carrier_matrix1(:,3:Np_carr)];
carriers=(1:Np_carr)+1;
conjugate_carriers=Nt_carr-carriers+2;
IFFT_modulation=zeros(Sig_per_carr,Nt_carr);
IFFT_modulation(:,carriers )=complex_carrier_matrix1_temp ;
IFFT_modulation(:,conjugate_carriers )=conj(complex_carrier_matrix1_temp);
time_wave_matrix=ifft(IFFT_modulation,Nt_carr,2);
PAPR_temp((i-1)*2+j)=10*log10(Sig_per_carr*Nt_carr*(max(max(time_wave_matrix)))^2/sum(sum(time_wave_matrix.^2)));
end
end
[~,index]=min(PAPR_temp);
complex_carrier_matrix1_temp=[b(ceil(index/2))*complex_carrier_matrix1(:,1) b(index-2*(ceil(index/2)-1))*complex_carrier_matrix1(:,2) complex_carrier_matrix1(:,3:Np_carr)];
carriers=(1:Np_carr)+1;
conjugate_carriers=Nt_carr-carriers+2;
IFFT_modulation=zeros(Sig_per_carr,Nt_carr);
IFFT_modulation(:,carriers )=complex_carrier_matrix1_temp ;
IFFT_modulation(:,conjugate_carriers )=conj(complex_carrier_matrix1_temp);
time_wave_matrix=ifft(IFFT_modulation,Nt_carr,2);
figure;
stem(0:Nt_carr-1, abs(IFFT_modulation(2,1:Nt_carr)),'b*-')%第一個OFDM符號的頻譜
grid on
axis ([0 Nt_carr -0.5 4.5]);
ylabel('Magnitude');
xlabel('IFFT Bin');
title('第一個OFDM符號各頻率對應的幅度(幅頻回應)');
figure;
stem(0:Nt_carr-1, (180/pi)*angle(IFFT_modulation(2,1:Nt_carr)), 'b*-')
hold on
plot(0:Nt_carr-1, (180/pi)*angle(IFFT_modulation(2,1:Nt_carr)), 'go')
axis ([0 Nt_carr -200 +200])
grid on
ylabel('Phase (degrees)')
xlabel('IFFT Bin')
title('第一個OFDM符號各頻率對應的相位(相頻回應)')
figure;
subplot(211)
plot(0:Nt_carr-1,time_wave_matrix(1,:));%第一個OFDM符號的時域波形
axis([0,Nt_carr-1+CP_length, -0.6, 0.6]);
grid on;
ylabel('Amplitude');
xlabel('Time');
title('發送端第一個OFDM符號的時域波形');
%=====================添加回圈前綴CP====================================
CP=time_wave_matrix(:,Nt_carr-CP_length+(1:CP_length));
time_wave_matrix_add_CP=[CP,time_wave_matrix];
subplot(212)
plot(0:Nt_carr-1+CP_length,time_wave_matrix_add_CP(1,:));%第一個OFDM符號的時域波形
axis([0,Nt_carr-1+CP_length, -0.6, 0.6]);
grid on;
ylabel('Amplitude');
xlabel('Time');
title('發送端第一個OFDM符號的時域波形(加CP)');
%=========================并串轉換======================================
time_wave_sequence=reshape(time_wave_matrix_add_CP',(Nt_carr+CP_length)*Sig_per_carr,1)';
%=====================添加訓練序列TS====================================
% TS_0=zeros(1,TS_length);
% BPSKTable=[-1-8i,1+8i];
% TS_0=2*sqrt(65)*randi([0,1],1,TS_length);
% TS_0=5*sqrt(2)*randi([0,1],1,TS_length);%干擾序列平均功率為TS序列的五倍
% TS_0=2*randi([0,1],1,TS_length)-1;%干擾序列平均功率與TS序列相當
TS_0=sqrt(2)*randi([0,1],1,TS_length);
BPSKTable=[-1,1];
TS_Schmidl_1=BPSKTable(randi([0,1],1,Nt_carr/2)+1);
TS_Schmidl=[TS_Schmidl_1(Nt_carr/2-CP_length+1:Nt_carr/2) TS_Schmidl_1 TS_Schmidl_1];
TS_Minn_1=BPSKTable(randi([0,1],1,Nt_carr/4)+1);
TS_Minn=[-TS_Minn_1(Nt_carr/4-CP_length+1:Nt_carr/4) TS_Minn_1 TS_Minn_1 -TS_Minn_1 -TS_Minn_1];
TS_Park_1=BPSKTable(randi([0,1],1,Nt_carr/4)+1);
TS_Park_2=zeros(1,Nt_carr/4);
for i=1:Nt_carr/4
TS_Park_2(i)=conj(TS_Park_1(Nt_carr/4-i+1));
end
TS_Park=[conj(TS_Park_2(Nt_carr/4-CP_length+1:Nt_carr/4)) TS_Park_1 TS_Park_2 conj(TS_Park_1) conj(TS_Park_2)];
TS=[TS_0 TS_Schmidl TS_0 TS_Minn TS_0 TS_Park TS_0];
time_wave_sequence_add_TS=[TS time_wave_sequence];
figure;
subplot(311)
plot(0:Nt_carr-1+CP_length,TS_Schmidl);%訓練序列波形
axis([0,Nt_carr-1+CP_length, -1.5, 1.5]);
grid on;
ylabel('Amplitude');
xlabel('Time');
title('Schmidl訓練序列波形');
subplot(312)
plot(0:Nt_carr-1+CP_length,TS_Minn);%訓練序列波形
axis([0,Nt_carr-1+CP_length, -1.5, 1.5]);
grid on;
ylabel('Amplitude');
xlabel('Time');
title('Minn訓練序列波形');
subplot(313)
plot(0:Nt_carr-1+CP_length,TS_Park);%訓練序列波形
axis([0,Nt_carr-1+CP_length, -1.5, 1.5]);
grid on;
ylabel('Amplitude');
xlabel('Time');
title('Park訓練序列波形');
%=====================經過高斯噪聲信道====================================
figure;
received_time_wave_sequence_add_TS=awgn(time_wave_sequence_add_TS,SNR,'measured');
received_TS=received_time_wave_sequence_add_TS(1:(7*TS_length));
received_TS_Schmidl=received_TS((TS_length+1):(2*TS_length));
received_TS_Minn=received_TS((3*TS_length+1):(4*TS_length));
received_TS_Park=received_TS((5*TS_length+1):(6*TS_length));
subplot(311)
plot(0:Nt_carr-1+CP_length,received_TS_Schmidl);%接收端Schmidl訓練序列波形
axis([0,Nt_carr-1+CP_length, -1.5, 1.5]);
grid on;
ylabel('Amplitude');
xlabel('Time');
title('接收端Schmidl訓練序列波形');
subplot(312)
plot(0:Nt_carr-1+CP_length,received_TS_Minn);%接收端Minn訓練序列波形
axis([0,Nt_carr-1+CP_length, -1.5, 1.5]);
grid on;
ylabel('Amplitude');
xlabel('Time');
title('接收端Minn訓練序列波形');
subplot(313)
plot(0:Nt_carr-1+CP_length,received_TS_Park);%接收端Park訓練序列波形
axis([0,Nt_carr-1+CP_length, -1.5, 1.5]);
grid on;
ylabel('Amplitude');
xlabel('Time');
title('接收端Park訓練序列波形');
%=====================Schmidl方法進行符號定時====================================
Syn_length=3*TS_length/2;
p_Schmidl=zeros(1,Syn_length);
R_Schmidl=zeros(1,Syn_length);
M_Schmidl=zeros(1,Syn_length);
Syn_Schmidl=received_TS(1:(3*TS_length));
for m=1+CP_length:Syn_length+CP_length
for k=0:Nt_carr/2-1
p_Schmidl(m-CP_length)=p_Schmidl(m-CP_length)+conj(Syn_Schmidl(m+k))*Syn_Schmidl(m+k+Nt_carr/2);
R_Schmidl(m-CP_length)=R_Schmidl(m-CP_length)+abs(Syn_Schmidl(m+k+Nt_carr/2))^2;
end
M_Schmidl(m-CP_length)=abs(p_Schmidl(m-CP_length))^2/R_Schmidl(m-CP_length)^2;
end
[maximum_Schmidl,max_index_Schmidl]=max(M_Schmidl);
%=====================Minn方法進行符號定時====================================
p_Minn=zeros(1,Syn_length);
R_Minn=zeros(1,Syn_length);
M_Minn=zeros(1,Syn_length);
Syn_Minn=received_TS((2*TS_length+1):(5*TS_length));
for m=CP_length+1:Syn_length+CP_length
for l=0:1
for k=0:Nt_carr/4-1
p_Minn(m-CP_length)=p_Minn(m-CP_length)+conj(Syn_Minn(m+k+l*Nt_carr/2))*Syn_Minn(m+k+l*Nt_carr/2+Nt_carr/4);
R_Minn(m-CP_length)=R_Minn(m-CP_length)+abs(Syn_Minn(m+k+l*Nt_carr/2+Nt_carr/4))^2;
end
end
M_Minn(m-CP_length)=abs(p_Minn(m-CP_length))^2/R_Minn(m-CP_length)^2;
end
[maximum_Minn, max_index_Minn]=max(M_Minn);
%=====================Park方法進行符號定時====================================
p_Park=zeros(1,Syn_length);
R_Park=zeros(1,Syn_length);
M_Park=zeros(1,Syn_length);
Syn_Park=received_TS((4*TS_length+1):(7*TS_length));
for m=CP_length+1:3*TS_length/2+CP_length
for k=0:Nt_carr/2-1
p_Park(m-CP_length)=p_Park(m-CP_length)+Syn_Park(m+k)*Syn_Park(m-k+Nt_carr-1);
R_Park(m-CP_length)=R_Park(m-CP_length)+abs(Syn_Park(m+k))^2;
end
M_Park(m-CP_length)=abs(p_Park(m-CP_length))^2/R_Park(m-CP_length)^2;
end
[maximum_Park, max_index_Park]=max(M_Park);
figure;
plot(1:Syn_length,M_Schmidl,'r')
hold on
plot(1:Syn_length,M_Minn,'g')
hold on
plot(1:Syn_length,M_Park,'b')
grid on;
% axis([0,400,0,1.1]);
title('三種方法得到的定時量度曲線');
legend('Schmidl演算法','Minn演算法','Park演算法')
xlabel('Time(sample)');
ylabel('Timing Metric');
%===========================串并轉換========================================
received_time_wave_matrix_add_CP=reshape(received_time_wave_sequence_add_TS((7*TS_length+1):end)',Nt_carr+CP_length,Sig_per_carr)';%去除訓練序列
figure;
subplot(311)
plot(0:Nt_carr-1+CP_length,received_time_wave_matrix_add_CP(1,:));%接收端第一個OFDM符號的時域波形(含CP)
axis([0,Nt_carr-1+CP_length, -0.6, 0.6]);
grid on;
ylabel('Amplitude');
xlabel('Time');
title('接收端第一個OFDM符號的時域波形(含CP)');
%=====================去除回圈前綴CP====================================
received_time_wave_matrix=received_time_wave_matrix_add_CP(:,CP_length+1:CP_length+Nt_carr);%去CP
subplot(312)
plot(0:Nt_carr-1,real(received_time_wave_matrix(1,:)));%接收端第一個OFDM符號的時域波形(含CP)
axis([0,Nt_carr-1+CP_length, -0.6, 0.6]);
grid on;
ylabel('Amplitude');
xlabel('Time');
title('接收端去除CP后的第一個OFDM符號的時域波形');
%=====================信道估計與均衡====================================
% TS_FFT=fft(TS_Schmidl((CP_length+1):TS_length));
% received_TS_FFT=fft(received_TS_Schmidl((CP_length+1):TS_length));
% H=received_TS_FFT./TS_FFT;
H=received_TS_Schmidl((CP_length+1):TS_length)./TS_Schmidl((CP_length+1):TS_length);
% H=fft(received_time_wave_matrix(1,:))./fft(time_wave_matrix(1,:));
received_time_wave_matrix_FFT=fft(received_time_wave_matrix,Nt_carr,2);
received_time_wave_matrix_equilibrium_FFT=received_time_wave_matrix_FFT./H;
received_time_wave_matrix_equilibrium=ifft(received_time_wave_matrix_equilibrium_FFT,Nt_carr,2);
subplot(313)
plot(0:Nt_carr-1,real(received_time_wave_matrix_equilibrium(1,:)));%接收端第一個OFDM符號的時域波形(含CP)
axis([0,Nt_carr-1+CP_length, -0.6, 0.6]);
grid on;
ylabel('Amplitude');
xlabel('Time');
title('接收端均衡后第一個OFDM符號的時域波形');
%=================================FFT======================================
received_equilibrium_Hermite=fft(received_time_wave_matrix_equilibrium,Nt_carr,2);
%===========================解埃爾米特映射==================================
received_equilibrium=received_equilibrium_Hermite(:,carriers);
%===========================降低PAPR后處理==================================
received_equilibrium(:,3:Np_carr)=received_equilibrium(:,3:Np_carr)/b(1);
received_equilibrium(:,1)=received_equilibrium(:,1)/b(ceil(index/2));
received_equilibrium(:,2)=received_equilibrium(:,2)/b(index-2*(ceil(index/2)-1));
%=============================并串轉換=====================================
received_complex_carrier_matrix1=reshape(received_equilibrium',Np_carr*Sig_per_carr,1)';
figure;
plot(received_complex_carrier_matrix1,'*r');%接收端星座圖
title('接收端(16QAM解調制前)星座圖');
axis([-5,5,-5,5]);
grid on %顯示網格線
axis square
%===========================16QAM解調==================================
demodu_baseband_out=deqam16(received_complex_carrier_matrix1);
[~,ber]=symerr(demodu_baseband_out,baseband_out);
ber_carriers=zeros(1,Np_carr);
for j=1:Np_carr
for i=1:Sig_per_carr
for k=1:bits_per_symbol
if demodu_baseband_out((i-1)*Np_carr*bits_per_symbol+(j-1)*bits_per_symbol+k)~=baseband_out((i-1)*Np_carr*bits_per_symbol+(j-1)*bits_per_symbol+k)
ber_carriers(j)=ber_carriers(j)+1;
end
end
end
end
figure;
plot(1:Np_carr,ber_carriers,'--r*');
title('各子載波誤碼個數')
ylabel('誤碼個數');
xlabel('子載波編號');
xlim([1 Np_carr]);
grid on;
OFDM框圖:

OFDM信號:



星座圖:



同步效果:


更多內容(誤碼率曲線、降PAPR等)請關注:https://blog.csdn.net/hyl1181/article/details/107490533
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/233066.html
標籤:其他
