⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ofdm_syn.m

📁 基于循环前缀的同步算法仿真
💻 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 + -