📄 mimoofdm_est.asv
字号:
clc;clear;
scmpar=scmparset;
linkpar=linkparset(1); % 10 links
%linkpar.MsVelocity=0;
scmpar.NumMsElements=2;
scmpar.NumBsElements=2;
antpar=antparset;
[H delays out]=scm(scmpar,linkpar,antpar);
% Initialize the parameters
NumLoop = 68;%帧长
NumSubc = 32;%IFFT和FFT的点数
carrier_count=100;%子载波个数
NumCP =8;%循环前缀
TI=6 ; %导频之间的间隔,梳状导频
Np=ceil(NumLoop/TI)+1;%导频数 %加1的原因:使最后一列也是导频
carriers=1:NumSubc;
delta_t = out.delta_t;
f_sym = 3.84e6; % sample frequency
osr = floor((1/f_sym)/scmpar.DelaySamplingInterval); % over sample rate
ts = 1/(f_sym*osr); % sample time_step
h_delay = round(delays./ts)+1; % multipath delay array: samples
u = scmpar.NumMsElements;
s = scmpar.NumBsElements;
n = scmpar.NumPaths;
h_tmp = zeros(1,NumSubc*osr);
h = zeros(s,u,NumSubc);
for ss = 1:s
for uu = 1:u
h_tmp(h_delay(1:n)) = H(uu,ss,1:n,1);
h(ss,uu,:) = resample(h_tmp,1,osr); % downsample by osr to
end
end
h11 = squeeze(h(1,1,:)); %H11 = fft(h11);
h21 = squeeze(h(1,2,:));% H21 = fft(h21).';
h12 = squeeze(h(2,1,:)); %H12 = fft(h12);
h22 = squeeze(h(2,2,:)); %H22 = fft(h22).';
BitsTx = floor(rand(1,2*NumLoop*NumSubc)*2);
% Generate the random binary stream for transmit test
SymQAMtmp = reshape(BitsTx,NumLoop*NumSubc,2); %64000行2列
SymQAMtmptmp = bi2de(SymQAMtmp,2,'left-msb'); %64000行1列 把二进制数转换成十进制数
%00->-1-i,01->-1+i,10->1-i,11->1+i
QAMTable = [-1-i -1+i 1-i 1+i];
SymQAM = QAMTable(SymQAMtmptmp+1)/2; %64000行1列
%A=size(SymQAM,1)*size(SymQAM,2)=1024000
% for ii = 1:2:NumLoop*NumSubc/2
% T1_data(ii) = SymQAM(ii);
% T2_data(ii) = SymQAM(ii+1);
% T1_data(ii+1) = -conj(SymQAM(ii+1));
% T2_data(ii+1) = conj(SymQAM(ii));
% end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%STBC编码
T1_data = zeros(NumSubc,NumLoop);
T2_data = zeros(NumSubc,NumLoop);
SymIFFTtmp = reshape(SymQAM,NumSubc,NumLoop);
for ii=1:2:NumSubc
T1_data(ii,:)=SymIFFTtmp(ii,:);
T2_data(ii,:)=SymIFFTtmp(ii+1,:);
T1_data(ii+1,:)=-conj(SymIFFTtmp(ii+1,:));
T2_data(ii+1,:)=conj(SymIFFTtmp(ii,:));
end
% Modulate_training (generates QAM symbols)
training_symbols0 = floor(rand(1,2*NumSubc)*2);
training_symbols1 = reshape(training_symbols0,NumSubc,2);
training_symbols2 = bi2de(training_symbols1,2,'left-msb');
training_symbols3 = QAMTable(training_symbols2+1)/sqrt(2);
training_symbols3 = training_symbols3';
training_symbols_input=repmat(training_symbols3,1,Np);
training_symbols=repmat(training_symbols3,1,Np);
%disp(training_symbols)
pilot=1:TI+2:NumLoop+2*Np-1;
if length(pilot)~=Np
pilot=[pilot,NumLoop+2*Np-1];
end
%--------------------------------------------------------
%串并转换
%X2=reshape(X1,NumSubc,NumLoop);
Trans_x1=reshape(T1_data,NumSubc,NumLoop);
Trans_x2=reshape(T2_data,NumSubc,NumLoop);
%---------------------------------------------------------
%插入导频
signal=1:NumLoop+2*Np;
signal(pilot)=[];
pilot1=1:TI+1:NumLoop+Np;
if length(pilot1)~=Np
pilot1=[pilot1,NumLoop+Np];
end
signal(pilot1)=[];
Transmit_x1(:,pilot)=training_symbols;
Transmit_x1(:,pilot+1)=training_symbols;
Transmit_x1(:,signal)=Trans_x1;
Transmit_x2(:,pilot)=training_symbols;
Transmit_x2(:,pilot+1)=-training_symbols;
Transmit_x2(:,signal)=Trans_x2;
%IFFT_modulation_x1=zeros(NumSubc,NumLoop+2*Np);
%IFFT_modulation_x1(carriers,:)=X3;
%IFFT_modulation(:,conjugate_carriers)=conj(X3);
IFFT_modulation_x1=ifft(Transmit_x1,NumSubc,1);
IFFT_modulation_x2=ifft(Transmit_x2,NumSubc,1);
% Add cyclic prefix
NumAddPrefix = NumSubc+ NumCP;
RowPrefix = (NumSubc - NumCP + 1):NumSubc; % 复制
IFFT_modulation_x1_cp= [IFFT_modulation_x1(RowPrefix,:);IFFT_modulation_x1];
IFFT_modulation_x2_cp= [IFFT_modulation_x2(RowPrefix,:);IFFT_modulation_x2];
%并串转换
%X6=X5(:);
Time_x1=IFFT_modulation_x1_cp(:);
Time_x2=IFFT_modulation_x2_cp(:);
Rec_x11 = filter(h11,1,Time_x1);
Rec_x12 = filter(h12,1,Time_x2);
Rec_x21 = filter(h21,1,Time_x1);
Rec_x22 = filter(h22,1,Time_x2);
snr=0:2:40;
M=length(snr);
ber_n=zeros(M,1);
ber=zeros(M,1);
for kk=1:M
% code_power_x1=0;
% code_power_x1=[norm(Rec_x1)]^2/(length(Rec_x1));%信号的符号功率
% bit_power_x1=code_power_x1/2;%比特功率
% noise_power_x1=10*log10((bit_power_x1/(10^(snr(i)/10))));%噪声功率(db)
% noise_x1=wgn(length(Rec_x1),1,noise_power_x1,'complex');%产生GAUSS白噪声信号
%
% Receiv_x1=Rec_x1+noise_x1;
% code_power_x2=0;
% code_power_x2=[norm(Rec_x2)]^2/(length(Rec_x2));%信号的符号功率
% bit_power_x2=code_power_x2/2;%比特功率
% noise_power_x2=10*log10((bit_power_x1/(10^(snr(i)/10))));%噪声功率(db)
% noise_x2=wgn(length(Rec_x2),1,noise_power_x2,'complex');%产生GAUSS白噪声信号
Rec_Nx11 = awgn(Rec_x11,snr(kk),'measured');
Rec_Nx12 = awgn(Rec_x12,snr(kk),'measured');
Rec_Nx21 = awgn(Rec_x21,snr(kk),'measured');
Rec_Nx22 = awgn(Rec_x22,snr(kk),'measured');
% Receiv_x2=Rec_x2+noise_x2;
Receiv_1=Rec_Nx11+Rec_Nx12;
Receiv_2=Rec_Nx21+Rec_Nx22;
%串并变换,去保护间隔
ReceivS_1=reshape(Receiv_1,NumAddPrefix,NumLoop+2*Np);
ReceivS_2=reshape(Receiv_2,NumAddPrefix,NumLoop+2*Np);
%ReceivS_x2=reshape(Receiv_x2,NumAddPrefix,NumLoop+Np);
%Y2 = reshape(Y1,NumAddPrefix,NumLoop+Np);
ReCp_1 = ReceivS_1((NumCP+1):NumAddPrefix,:);
ReCp_2 = ReceivS_2((NumCP+1):NumAddPrefix,:);
% Y3 = Y2((NumCP+1):NumAddPrefix,:);
%ReCp_x2 = ReceivS_2((NumCP+1):NumAddPrefix,:);
FFT_y1 =fft(ReCp_1,NumSubc,1);
FFT_y2 =fft(ReCp_2,NumSubc,1);
%FFT_x2 =fft(ReCp_x2,NumSubc,1);
%Y4 = fft(Y3,NumSubc,1);
% Y5=Y4(carriers,:);
%LS信道估计
%H11=[];
%H12=[];
%Y6=Y5(:,signal);
%Rx_training_symbols=Y5(:,pilot);
%Rx_training_symbols0=reshape(Rx_training_symbols,carrier_count*Np,1);
ReData_y1=FFT_y1(:,signal);
ReData_y2=FFT_y2(:,signal);
%ReData_x2=FFT_x2(:,signal);
Rx_training_symbols_1=FFT_y1(:,pilot);
Rx_training_symbols_2=FFT_y1(:,pilot+1);
Rx_training_add_11 = Rx_training_symbols_1+Rx_training_symbols_2;%对应H11
Rx_training_minus_11= Rx_training_symbols_1-Rx_training_symbols_2;%对应H21
Rx_training_symbols_3=FFT_y2(:,pilot);
Rx_training_symbols_4=FFT_y2(:,pilot+1);
Rx_training_add_22 = Rx_training_symbols_3+Rx_training_symbols_4;%对应H11
Rx_training_minus_22= Rx_training_symbols_3-Rx_training_symbols_4;%对应H21
Rx_training_add_1=reshape( Rx_training_add_11,NumSubc*Np,1);
Rx_training_minus_1=reshape(Rx_training_minus_11,NumSubc*Np,1);
Rx_training_add_2=reshape( Rx_training_add_22,NumSubc*Np,1);
Rx_training_minus_2=reshape(Rx_training_minus_22,NumSubc*Np,1);
training_symbol0=reshape(training_symbols,1,NumSubc*Np);
training_symbo_diag=diag(training_symbol0);
%disp(training_symbols)
training_symbo_inv=inv(training_symbo_diag);
Hls_11=training_symbo_inv*Rx_training_add_1/2;
Hls_12=training_symbo_inv*Rx_training_minus_1/2;
Hls_21=training_symbo_inv*Rx_training_add_2/2;
Hls_22=training_symbo_inv*Rx_training_minus_2/2;
Hls11=reshape(Hls_11,NumSubc,Np);
Hls12=reshape(Hls_12,NumSubc,Np);
Hls21=reshape(Hls_21,NumSubc,Np);
Hls22=reshape(Hls_22,NumSubc,Np);
%Hls11[] and Hls21[]
Hls=zeros(2,2,NumSubc,Np);
HLs=zeros(2,2,NumSubc,Np);
Hls(1,1,:,:)=Hls11;
Hls(1,2,:,:)=Hls12;
Hls(2,1,:,:)=Hls21;
Hls(2,2,:,:)=Hls22;
HLs=zeros(2,2,NumSubc,NumLoop);
for xx =1:2
for yy =1:2
% HLs(xx,yy,:,:) =[];
%HLs=zeros(2,2,NumSubc,NumLoop);
if ceil(NumLoop/TI)==NumLoop/TI
for k=1:Np-1
%HLs2=zeros(2,2,NumSubc,TI);
for t=1:TI
HLs(xx,yy,:,(k-1)*TI+t)=(Hls(xx,yy,:,k+1)-Hls(xx,yy,:,k))*t/(TI+2)+Hls(xx,yy,:,k);
%HLs2(xx,yy)=[HLs2(xx,yy) HLs1(xx,yy)];
end
% HLs(xx,yy)=[HLs(xx,yy) HLs2(xx,yy)];
end
else
for k=1:Np-2
%HLs2(xx,yy)=[];
for t=1:TI
HLs(xx,yy,:,(k-1)*TI+t)=(Hls(xx,yy,:,k+1)-Hls(xx,yy,:,k))*t/(TI+2)+Hls(xx,yy,:,k);
%HLs2(xx,yy)=[HLs2(xx,yy) HLs1(xx,yy)];
end
%HLs(xx,yy)=[HLs(xx,yy) HLs2(xx,yy)];
end
%HLs3(xx,yy)=[];
for t=1:mod(NumLoop,TI)
HLs(xx,yy,:,(Np-2)*TI+t)=(Hls(xx,yy,:,Np)-Hls(xx,yy,:,Np-1))*t/(mod(NumLoop,TI)+2)+Hls(xx,yy,:,Np-1);
%HLs3(xx,yy)=[HLs3(xx,yy) HLs1(xx,yy)];
end;
%HLs(xx,yy)=[HLs(xx,yy) HLs3(xx,yy)];
end
end
end
H11(:,:)=HLs(1,1,:,:);
H12(:,:)=HLs(1,2,:,:);
H21(:,:)=HLs(2,1,:,:);
H22(:,:)=HLs(2,2,:,:);
R_Data = zeros(NumSubc,NumLoop);
for jj = 1:NumLoop
for ii = 1:2:NumSubc-1
R_Data(ii,jj) = conj(H11(ii,jj))*ReData_y1(ii,jj) + H12(ii+1,jj)*conj(ReData_y1(ii+1,jj))+...
conj(H21(ii,jj))*ReData_y2(ii,jj) + H22(ii+1,jj)*conj(ReData_y2(ii+1,jj));
R_Data(ii+1,jj) = conj(H12(ii,jj))*ReData_y1(ii,jj) - H11(ii+1,jj)*conj(ReData_y1(ii+1,jj))+...
conj(H22(ii,jj))*ReData_y2(ii,jj) - H21(ii+1,jj)*conj(ReData_y2(ii+1,jj));
end
end
R_Data=R_Data(:);
SymDec = zeros(NumLoop*NumSubc,2);
for m = 1:NumLoop*NumSubc
Real = real(R_Data(m));
Imag = imag(R_Data(m));
if( abs((Real -1)) < abs((Real +1 )) )
SymDec(m,1) = 1;
else
SymDec(m,1) = 0;
end
if( abs((Imag -1)) < abs((Imag +1 )) )
SymDec(m,2) = 1;
else
SymDec(m,2) = 0;
end
end
BitsRx=SymDec(:)';
% Bit Error
%[Num_n,Ber_n] = symerr(BitsTx,Y9);
%ber_n(i)=Ber_n;
[Num,Ber] = symerr(BitsTx,BitsRx);
ber(kk)=Ber;
end
figure(1)
axis([0,40,0,1]);
%semilogy(snr,ber_n,'b');
hold on
semilogy(snr,ber,'r');
xlabel('SNR(dB)');
ylabel('BER');
%title('ls vs no estimation');
%legend('none','ls');
hold on
grid on
%ber_n
%ber
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -