clear all;
clc
tic;
% method=input('Please input a number :')
%%%%%% set simulation circle times %%%%%%
FrameNum = 10;
SNR_set = 10;
method=1; %method 取值范围,1,2,3,4
%%%%%%%%%%%%% parameters setting %%%%%%%%%%%%
v=120; name=['Parameters_' num2str(v)];
eval(name);
j=sqrt(-1);
%%%%%%%%%% set preamble in frequecy domain %%%%%
switch method
case {1,2,3}
cazac_pre = cazac(preamble_block_len,1);
preamble_t_1 = cazac_pre(1,:);
preamble_t_2 = conj(fliplr(cazac_pre(1,:)));
preamble_t(1,:) = [preamble_t_1,preamble_t_1]; %Schmidl 算法
preamble_f(1,:) = fft(preamble_t)/sqrt(ifftsize_pre);
case 4
cazac_pre = cazac(preamble_block_len/2,1);
preamble_t_1 = [cazac_pre,fliplr(cazac_pre)]; %fliplr, 矩阵的左右翻转
preamble_t(1,:) = [preamble_t_1,conj(preamble_t_1)];
preamble_f(1,:) = fft(preamble_t)/sqrt(ifftsize_pre); %Park算法
otherwise
disp('The method does not exit')
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
timing_offset_es_max = [];
for SNR_i = 1:length(SNR_set)
SNR = SNR_set(SNR_i);
syn_ratio_fine = zeros(1,rx_num*tx_num); %细同步
syn_ratio_coarse = zeros(1,rx_num); %粗同步
fre_offset_es_var = zeros(rx_num,FrameNum); %频率补偿
for Fth = 1:FrameNum
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% Transmit Process Part %%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for i_tx=1:tx_num
preamble_t(i_tx,:) = preamble_t(1,:);
end
g1_pre = preamble_t(:,(ifftsize_pre-Cp+1):ifftsize_pre);
OFDM_preamble = [g1_pre,preamble_t];
s_tx_tmp = OFDM_preamble;
% s_tx = s_tx_tmp./sqrt(tx_num);
s_tx = s_tx_tmp;
Frame_len = size(s_tx,2);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% Passing Channel Process %%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
data_ch = []; sig= []; s=[];
for m=1:rx_num
for n = 1:tx_num
for p = 1:path_total
% Channel_I = readdataB(RealChannelFileName((m-1)*(tx_num*path_total)+(n-1)*path_total+p,:),(Frame_len),Fth-1);
% Channel_Q = readdataB(ImagChannelFileName((m-1)*(tx_num*path_total)+(n-1)*path_total+p,:),(Frame_len),Fth-1);
Channel_I = ones(1,Frame_len);Channel_Q = zeros(1,Frame_len);
h = Channel_I+j*Channel_Q;
z0 = zeros(1,delay(p));
sig(p,:) = sqrt(PC(p))*[z0,s_tx(n,1:(Frame_len-delay(p)))];
sig(p,:) = sig(p,:).*h;
end
s(n,:) = sum(sig,1);
s_timing(n,:) = [zeros(1,timing_offset(m,n)),s(n,1:size(s,2)),zeros(1,length_timing-timing_offset(m,n)-size(s,2))];
end
data_ch_tmp = sum(s_timing,1); %将tx根天线上的信号叠加
%%%%%%%%%%%%%%%% Adding SFO, symbol timing offset %%%%%%%%
CFO = exp(j*2*pi*(0:size(data_ch_tmp,2)-1)*fre_offset/(ifftsize_pre));
data_ch_CFO = data_ch_tmp.*CFO;
data_ch(m,:)=data_ch_CFO;
end
%%%%%% ||* *|| Adding AWGN noise %%%%%
data_ch_awgn=data_ch;
% data_ch_awgn=awgn(data_ch,SNR,'measured');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% Receive Process Part %%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for i_rx = 1:rx_num
timing_offset_coarse = 533;
timing_offset_es = []; flag_timing=[];
synsignal(i_rx,:) = data_ch_awgn(i_rx,:);
switch method
case 1
preamble_t_used = preamble_t(:,1:preamble_block_len);
for i_syn=1:length(synsignal)-preamble_block_len+1
rr1=synsignal(i_rx,i_syn:preamble_block_len+i_syn-1);
flag_timing(1,i_syn) = rr1*conj(preamble_t_used(1,:).')/(preamble_t_used(1,:)*conj(preamble_t_used(1,:).'));
end
case 2
preamble_t_used = preamble_t(:,1:preamble_block_len*2);
for i_syn=1:length(synsignal)-preamble_block_len*2+1
rr1=synsignal(i_rx,i_syn:preamble_block_len*2+i_syn-1);
flag_timing(1,i_syn) = rr1*conj(preamble_t_used(1,:).')/(preamble_t_used(1,:)*conj(preamble_t_used(1,:).'));
end
case 3
for i_syn=1:length(synsignal)-preamble_block_len*2+1
rr1=synsignal(i_rx,i_syn:preamble_block_len+i_syn-1);
rr2=synsignal(i_rx,i_syn+preamble_block_len:preamble_block_len*2+i_syn-1);
flag_timing(1,i_syn) = (abs(conj(rr1)*(rr2.'))).^2/(abs((conj(rr2)*(rr2.')))).^2;
end
case 4
for i_syn=1:length(synsignal)-preamble_block_len*2+1
rr1=synsignal(i_rx,i_syn:preamble_block_len+i_syn-1);
rr2=synsignal(i_rx,i_syn+preamble_block_len:i_syn+preamble_block_len*2-1);
flag_timing(1,i_syn) = (abs(conj(rr1)*(rr2.'))).^2/(abs((conj(rr2)*(rr2.')))).^2;
%flag_timing(1,i_syn) = (abs(rr1*(fliplr(rr2).'))).^2/(abs((conj(rr2)*(rr2.')))).^2;
end
otherwise
disp('The method does not exit')
end
timing_offset_tmp = find(abs(flag_timing)>=max(abs(flag_timing)));
plot((1:length(flag_timing))-timing_offset(i_rx,1)-Cp-1,abs(flag_timing));
flag_timing_tmp = sort(abs(flag_timing),2,'descend');
for k=1:tx_num*preamble_block_num
timing_offset_es(1,k) = find(abs(flag_timing)==flag_timing_tmp(1,k)); % 最大的若干个
end
timing_offset_es_tmp = sort(abs(timing_offset_es),2,'ascend');
for k=1:tx_num
timing_offset_es_fine(i_rx,k) = timing_offset_es_tmp(1,k)-(K0)*(k-1)-Cp-1; % 最大的若干个
end
end
end
end
hold on
semilogy(SNR_set,1./(pi*pi*preamble_block_len*10.^(SNR_set./10)),'b')
% legend('Cramer-Rao bound','simulation')
grid on
toc;
- 1
- 2
前往页