📄 dab1.asv
字号:
% a=0;
% for i=1:2047
% a(i+1)=mod(13*a(i)+511,2048);
% end;
% % b=[1:1535];
% for k=256:1792;
% for j=1:2047;
% if k==a(j);
% m(k-255)=j;
% end;
% end;
% end;
clear all;
close all;
tic;
global N
N=256;
global L
L=63;
global Zeronum
Zeronum=32; %insert zero
num=192; % information number
%------------------------------------------ phase reference channel--------------------------------------------------------------%
% n=[1 2 0 1 3 2 2 3 2 1 2 3 1 2 3 3 2 2 2 1 1 3 1 2 3 1 1 1 2 2 1 0 2 2 3 3 0 2 1 3 3 3 3 0 3 0 1 1];
n=[2 3 0 2 2 2];
% h=[0 2 0 0 0 0 1 1 2 0 0 0 2 2 1 1 0 2 0 0 0 0 1 1 2 0 0 0 2 2 1 1
% ;0 3 2 3 0 1 3 0 2 1 2 3 2 3 3 0 0 3 2 3 0 1 3 0 2 1 2 3 2 3 3 0
% ;0 0 0 2 0 2 1 3 2 2 0 2 2 0 1 3 0 0 0 2 0 2 1 3 2 2 0 2 2 0 1 3
% ;0 1 2 1 0 3 3 2 2 3 2 1 2 1 3 2 0 1 2 1 0 3 3 2 2 3 2 1 2 1 3 2];
h=[0 2 0 0 0 0 1 1 2 0 0 0 2 2 1 1 0 2 0 0 0 0 1 1 2 0 0 0 2 2 1 1
;0 3 2 3 0 1 3 0 2 1 2 3 2 3 3 0 0 3 2 3 0 1 3 0 2 1 2 3 2 3 3 0
;0 0 0 2 0 2 1 3 2 2 0 2 2 0 1 3 0 0 0 2 0 2 1 3 2 2 0 2 2 0 1 3];
fai_reg=[];
fai=[];
% for k=1:12;
for k=1:2
% for i=1:4;
for i=1:3
% fai_reg(i,:)=(pi/2)*(h(i,:)+n(i+(k-1)*4));
fai_reg(i,:)=(pi/2)*(h(i,:)+n(i+(k-1)*3));
end;
fai=[fai; fai_reg];
end;
fai_s=[];
for i=1:6;
fai_s=[fai_s fai(i,:)]; %phase
end;
z0=exp(j*fai_s); %1536 symbol for phase reference
reference_phase_temp=[zeros(1,Zeronum) z0 zeros(1,Zeronum)];
reference_phase=sqrt(N)*ifft(reference_phase_temp);
% coarse_freq=[];
% fin_freq=[];
% ml_coarse_freq_var=[];
% ml_freq_var=[];
% freq_offset=[];
% ml_time_offset=[];
% ml_freq_offset=[];
% freq_offset_mean_1=[];
% freq_offset_mean_2=[];
% freq_offset_mean_3=[];
% temp=[];
% sum_temp=[];
% offset=[];
signal_power_temp=[];
signal_power=[];
% bit_erro_ratio=[];
bit_erro_ratio1=[];
% timing_offset=[];
Zk_frame=[];
abrupt_cmp_data=[];
abrupt_fft_data=[];
abrupt_correct_fft_data=[];
%--------------------------------------------------TRANSMIT SYMBOL(source)----------------------------------------------------------------%
ofdm_frame=[];
transmit_signal=[];
transmit_signal_frame=[];
frame_num=5; %共200桢
symnum=9; %每桢的符号数
len=num*symnum*2;
frame_length=(N+L)*(symnum+1);
tracking_num=1;
slid_freq_num=2000;
for k=1:frame_num; %产生数据源
% input=randint(1,1024);
% pn_add_data=pn_add(input);
% punc_code_temp=conv_en_FIC_III(pn_add_data);
% punc_code=[punc_code punc_code_temp];
% for frame_no=1:frame_num;
[ofdm_frame]=transmit( N,L,len,num,symnum,Zeronum,z0); %产生OFDM一帧的数据 一个OFDM帧有symnum个OFDM符号,第一个符号为相位参考
%m=(symnum+1)*(frame_no-1);
% Zk_frame=[Zk_frame;Zk([2:symnum+1],:)]; %每帧只取后面的数据,没有相位参考符号
transmit_signal=[transmit_signal,ofdm_frame]; %产生frame_num帧 总数据源
end;
transmit_signal_power=sum(abs(transmit_signal).^2)/length(transmit_signal); %统计OFDM发射信号的平均功率
%------------------------------------------------------------------------------------------------------------------------------------
coarse_fft_data_temp=[];
fin_fft_data_temp=[];
SNR=25;
% cnt=zeros(1,SNR) ;
%
% cntf0=zeros(1,SNR) ;
% cntf1=zeros(1,SNR) ;
% cntf2=zeros(1,SNR) ;
% cntf3=zeros(1,SNR) ;
% Pef0=zeros(1,SNR);
% Pef1=zeros(1,SNR);
% Pef2=zeros(1,SNR);
% Pef3=zeros(1,SNR);
%for snr=1:SNR;
snr=10
%-----------------------------------------------初使化--------------------------------------%
ml_freq_vco(snr,1)=0; coarse_ml_freq_vco(snr,:)=zeros(1,frame_num); fin_freq_correct=0;
phase_vco(snr,:)=zeros(1,frame_num); a1(snr,:)=zeros(1,frame_num);
a2(snr,:)=zeros(1,frame_num); b1(snr,:)=zeros(1,frame_num);
b2(snr,:)=zeros(1,frame_num); fin_freq(snr,:)=zeros(1,frame_num);freq_correct(snr,:)=zeros(1,frame_num);
coarse_ml_freq_vco_correct(snr)=0; fft_data1_temp=[];
ml_time_trace=[];
%--------------------------------------------------------------------------------------------%
freq_offset=4.2;%0.1*snr;
[transmit_signal_freq]=channel(frame_num,symnum,N,L,transmit_signal,freq_offset); %帧信号加频偏和不加频偏
power=sum(abs(transmit_signal_freq).^2)/length(transmit_signal_freq);
n=7; %循环前缀产生的功率损失和过采样的损失
[noise_p(snr),w_1]=awgn_noise(n,1,transmit_signal_power,transmit_signal_freq) ; %产生高斯噪声
transmit_signal_freq_w=transmit_signal_freq+w_1; %加性高斯噪声
for k=1:frame_num;
transmit_signal_frame(k,:) =transmit_signal_freq_w((k-1)*frame_length+1:k*frame_length); %接收端分割为帧信号
end;
%--------------------------------------------------------------------------------------------------------------------------------------------
%-------------------------------------------仅有粗偏估计-----------------------------------------------------------------%
%------------------------------------------------------------------捕获-------------------------------------------------------------------------------%
[coarse_ml_time_offset(snr,:),coarse_ml_freq_offset_1(snr,:)]=ML(transmit_signal_frame(1,:),snr+3+n,L,N); %对第一帧进行ML估计
coarse_ml_freq_vco(snr,1)=(round(mean(coarse_ml_freq_offset_1(snr,:))*10^2))*10^(-2);
[coarse_timing_fft_data_cmp1,coarse_timing_phase_fft_data_cmp1,coarse_timing_phase_correct_cmp1,coarse_timing_frame_correct_L_cmp1, coarse_ml_time_correct_cmp1(snr,:)]=...
coarse_freq_offset_compensate(frame_num,symnum+1,N,L,0,coarse_ml_time_offset(snr,:), coarse_ml_freq_vco(snr,1),transmit_signal_frame(1,:)); %对第一帧进行补偿
[Td(snr,1),coarse_integer_freq_offset(snr,1)]=integer_freq_offset_fin_timing_estimate(N,L,coarse_timing_phase_fft_data_cmp1,reference_phase_temp); %由该帧的相位参考符号估计出来的精符号定时和整数倍频偏
% if Td(snr,s) ==0
% SymbolTrace_temp(snr,:)=64*ones(1,symnum+1);
%
% else
SymbolTrace_temp(1,:) =coarse_ml_time_offset(snr,:)-mod( 256, Td(snr,1))*ones(1,symnum+1);%+fix(SymFinTiming(snr,s+1))*ones(1,symnum+1);
% end;
coarse_ml_freq_vco(snr,1)=coarse_integer_freq_offset(snr,1)+coarse_ml_freq_vco(snr,1); % 粗小数倍频偏和整数倍频偏实现的频偏的捕获
% if coarse_timing_offset_temp(snr,k)== coarse_ml_time_offset(snr,1);
% cnt(1,snr)=cnt(1,snr)+1;
%
% else
% cnt(1,snr)=cnt(1,snr);
% end;
%
%
%
% if abs(abs(coarse_integer_freq_offset(snr,k)) -4)==0;
% cntf0(1,snr)=cntf0(1,snr)+1;
% cntf3(1,snr)=cntf3(1,snr);
% cntf1(1,snr)=cntf1(1,snr);
%
% elseif abs(abs(coarse_integer_freq_offset(snr,k)) -4)==1
%
% cntf1(1,snr)=cntf1(1,snr)+1;
% cntf3(1,snr)=cntf3(1,snr);
% cntf0(1,snr)=cntf0(1,snr);
%
%
% else
% cntf0(1,snr)=cntf0(1,snr);
% cntf1(1,snr)=cntf1(1,snr);
%
% cntf3(1,snr)=cntf3(1,snr)+1;
% end;
% if freq_offset>=0.5
% if coarse_integer_freq_offset(snr,k)==0
% cnt(1,snr)=cnt(1,snr)+1;
% else
% cnt(1,snr)=cnt(1,snr);
% end;
% elseif freq_offset<0.5
% if coarse_integer_freq_offset(snr,k)==0
% cnt(1,snr)=cnt(1,snr)+1;
% else
% cnt(1,snr)=cnt(1,snr);
% end;
% end;
% Pe(1,snr) =cnt(1,snr)/frame_num;
% Pef0(1,snr)= cntf0(1,snr)/frame_num;
% Pef1(1,snr)= cntf1(1,snr)/frame_num;
%
% Pef3(1,snr)= cntf3(1,snr)/frame_num;
% end; %snr
% plot([0.1:0.1:1],Pe);
% toc;
% a=Pe;
%-------------------------------------------------------跟踪---------------------------------------------
for k=0:frame_num-2;
[ml_coarse_fft_data,ml_phase_fft_data,ml_coarse_path_correct,coarse_path_correct_L,coarse_ml_time_3]=...
coarse_freq_offset_compensate(frame_num,symnum+1,N,L,k+1,SymbolTrace_temp(k+1,:),coarse_ml_freq_vco(snr,k+1),transmit_signal_frame(k+2,:));
coarse_ML_frame(k+2,:)=coarse_path_correct_L; %第三帧经过补偿的数据
[coarse_ml_time_offset(snr,:),coarse_ml_freq_offset(snr,:)]=ML(coarse_ML_frame(k+2,:),snr+3+n,L,N); %对第三帧进行ML估计
[Td(snr,k+2),integer_freq_offset_trace(snr)]=integer_freq_offset_fin_timing_estimate(N,L,ml_phase_fft_data,reference_phase_temp); %由第二帧的相位参考符号估计出来的精符号定时和整数倍频偏
SymbolTrace_temp(k+2,:) =coarse_ml_time_offset(snr,:)-mod( 256, Td(snr,k+2))*ones(1,symnum+1);%+fix(SymFinTiming(snr,s+1))*ones(1,symnum+1);
[fin_freq(snr,k+1),fin_phase_ACC(snr,k+2)]=fin_freq_offset_estimate(symnum+1,N,L,k+1,ml_coarse_path_correct,reference_phase); %由第三帧估计出的细小偏
coarse_ml_freq_vco_correct(snr)=(round(mean(coarse_ml_freq_offset(snr,:))*10^2))*10^(-2);
coarse_ml_freq_vco(snr,k+2)= coarse_ml_freq_vco(snr,1)+coarse_ml_freq_vco_correct(snr)+fin_freq(snr,k+1);
end;
ml_time_trace=[];
%end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -