📄 ofdm_syn.m
字号:
%%
%*****************************参数设置******************************
SNR=10; %信噪比取值,dB
fl=853; %设置FFT长度,(子载波数)
Ns=5; %设置一帧结构中OFDM信号的个数
para=853; %设置并行传输的子载波个数
Tu=224; %设置符号周期 uS
gl=(1024)*1/8; %设置循环前缀的长度
Signal=rand(1,para*Ns*2)>0.5; %产生0,1随机数列,符号个数为para*2*Ns
%%
%%
%******************************发送端部分***************************
%串并转换,变换为行数为para,列数为2*Ns的矩阵
for i=1:para
for j=1:Ns*2
SigPara(i,j)=Signal(i*j);
end
end
%进行QPSK数据调制,将数据分为两个通道
for j=1:Ns
ich(:,j)=SigPara(:,2*j-1);
qch(:,j)=SigPara(:,2*j);
end
xx=[];
x=[];
for k=1:para
for n=1:Ns
if ich(k,n)==0
if qch(k,n)==0
xx=[xx,-0.70711+0.70711i];
else
xx=[xx,0.70711+0.70711i];
end
else
if qch(k,n)==0
xx=[xx,-0.70711-0.70711i];
else
xx=[xx,0.70711-0.70711i];
end
end
end
x=[x;xx];
xx=[];
end
%%
%**********************插入导频信号******************
%导频符号序列+4/3或-4/3
xx=rand(1,para)>0.5;
pilot=[];
for k=1:para
if xx(k)==0
pilot(k)=double(4/3);
else
pilot(k)=double(-4/3);
end
end
%插入连续导频 1K模式有25个连续导频
contin_pilot_addr=[1,49,55,88,142,157,193,202,256,280,283,334,433,451,484,526,532,619,637,715,760,766,787,814,853];
for l=1:Ns
for k=1:25
x(contin_pilot_addr(k),l)=pilot(contin_pilot_addr(k));
end
end
%插入散列导频 1K模式有71个散列导频
for l=0:Ns-1
scatt_pilot_addr=[(3*mod(l,4)+1):12:fl];
for k=1:length(scatt_pilot_addr)
x(scatt_pilot_addr(k),l+1)=pilot(scatt_pilot_addr(k));
end
end
%%
%*****************************************************************
y=ifft(x); %傅立叶反变换,将频域数据转换为时域数据
%***********插入保护间隔**********
y=[y(fl-gl+1:fl,:);y];
%***********并串转换**************
TrData=reshape(y,1,(fl+gl)*Ns);
%%
%*********** D/A转换 ************
T=Tu/fl; %码元周期
%Sendwave_real=[];
%Sendwave_imag=[];
h=T/20; % 步长
t=(0:h:length(TrData)*T); %连续波形持续时间
%输出数据插值变成连续的波形
Sendwave_real=0;
Sendwave_imag=0;
for k=1:length(TrData)
Sendwave_real=Sendwave_real+real(TrData(k))*sinc(pi*(t-k*T)/T);
end
for k=1:length(TrData)
Sendwave_imag=Sendwave_imag+imag(TrData(k))*sinc(pi*(t-k*T)/T);
end
%plot(t,Sendwave_imag);
%grid on
%%
time_error=[];
for kkkk=1:10
%*************************信道传输(加入多径干扰和高斯噪声)********************************
Sendwave=Sendwave_real+sqrt(-1)*Sendwave_imag;
Sendwave=Sendwave*1000;
%加入高斯噪声
Recwave=Sendwave;
%Recwave=awgn(Sendwave,SNR,'measured');
%加入瑞利多径干扰
chan=rayleighchan(h,0,[0 0.2 0.4 0.5 15 17.2],[0 -2.0 -4 -7 -6 -12]);
chan_recwave=filter(chan,Recwave);
chan_recwave=chan_recwave/1000;
%**********************************************************************
%%
%%
%*************接收端**********************************************************
%*************符号粗同步*****************
f_obj=[];
for m=0:(gl-1)*20
xx=0;
yy=0;
for k=1+m:m+(gl-1)*20/4
xx=xx+(real(chan_recwave(k))-sqrt(-1)*imag(chan_recwave(k)))*chan_recwave(k+fl*20);
xx=xx+(real(chan_recwave(k+(fl+gl)*20))-sqrt(-1)*imag(chan_recwave(k+(fl+gl)*20)))*chan_recwave(k+(fl+gl)*20+fl*20);
xx=xx+(real(chan_recwave(k+2*(fl+gl)*20))-sqrt(-1)*imag(chan_recwave(k+2*(fl+gl)*20)))*chan_recwave(k+2*(fl+gl)*20+fl*20);
xx=xx+(real(chan_recwave(k+3*(fl+gl)*20))-sqrt(-1)*imag(chan_recwave(k+3*(fl+gl)*20)))*chan_recwave(k+3*(fl+gl)*20+fl*20);
yy=yy+(real(chan_recwave(k)))^2+(imag(chan_recwave(k)))^2+(real(chan_recwave(k+fl*20)))^2+(imag(chan_recwave(k+fl*20)))^2;
yy=yy+(real(chan_recwave(k+(fl+gl)*20)))^2+(imag(chan_recwave(k+(fl+gl)*20)))^2+(real(chan_recwave(k+(fl+gl)*20+fl*20)))^2+(imag(chan_recwave(k+(fl+gl)*20+fl*20)))^2;
yy=yy+(real(chan_recwave(k+2*(fl+gl)*20)))^2+(imag(chan_recwave(k+2*(fl+gl)*20)))^2+(real(chan_recwave(k+2*(fl+gl)*20+fl*20)))^2+(imag(chan_recwave(k+2*(fl+gl)*20+fl*20)))^2;
yy=yy+(real(chan_recwave(k+3*(fl+gl)*20)))^2+(imag(chan_recwave(k+3*(fl+gl)*20)))^2+(real(chan_recwave(k+3*(fl+gl)*20+fl*20)))^2+(imag(chan_recwave(k+3*(fl+gl)*20+fl*20)))^2;
end
f_obj=[f_obj, 2*sqrt((real(xx))^2+(imag(xx))^2)-yy];
end
%求目标函数最大值出现位置
xx=max(f_obj);
for m=1:length(f_obj)
if f_obj(m)>=xx*1.08
symbol_coase_location=m; %粗同步位置
end
end
%%
%确定FFT变换的符号,去掉循环前缀
RecvData=[];
for k=(symbol_coase_location):20:(symbol_coase_location+(fl-1)*20)
RecvData=[RecvData, chan_recwave(k)];
end
for k=(symbol_coase_location+(fl+gl)*20):20:(symbol_coase_location+(fl+gl)*20+(fl-1)*20)
RecvData=[RecvData, chan_recwave(k)];
end
for k=(symbol_coase_location+(fl+gl)*40):20:(symbol_coase_location+(fl+gl)*40+(fl-1)*20)
RecvData=[RecvData, chan_recwave(k)];
end
for k=(symbol_coase_location+(fl+gl)*60):20:(symbol_coase_location+(fl+gl)*60+(fl-1)*20)
RecvData=[RecvData, chan_recwave(k)];
end
Recv_x=reshape(RecvData,fl,4);
%FFT变换
Recv_y=fft(Recv_x);
%取出导频位置符号,与已知导频相除
xx=[];
rot=[];
for k=1:12:fl
xx=[xx,(Recv_y(k,1)/pilot(k))];
end
for k=1:70
rot=[rot,xx(k+1)/xx(k)]; %相邻导频相除,得到旋转因子项
end
symbol_really_time=2581+20;
symbol_line_time=acos(real(mean(rot))/sqrt((real(mean(rot)))^2+(imag(mean(rot)))^2))*fl/24/pi;
symbol_time=symbol_line_time*20+symbol_coase_location;
time_error=[time_error,(symbol_time-symbol_really_time)/20];
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -