📄 block_mimoofdm_est.m
字号:
clc;clear;
scmpar=scmparset;
linkpar=linkparset(6); % 10 links
%linkpar.MsVelocity=0;
scmpar.NumMsElements=2;
scmpar.NumBsElements=2;
antpar=antparset;
[H delays out]=scm(scmpar,linkpar,antpar);
% Initialize the parameters
NumLoop = 90;%帧长
carrier_count=80;%子载波个数
carriers=1:carrier_count;
NumSubc = 128;%IFFT和FFT的点数
NumCP =8;%循环前缀
NT=20 ; %导频之间的间隔,块状导频
Np=ceil(NumLoop/NT)+1;%导频数 %加1的原因:使最后一列也是导频
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*carrier_count)*2);
% Generate the random binary stream for transmit test
SymQAMtmp = reshape(BitsTx,NumLoop*carrier_count,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列
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%STBC编码
T1_data = zeros(carrier_count,NumLoop);
T2_data = zeros(carrier_count,NumLoop);
SymIFFTtmp = reshape(SymQAM,carrier_count,NumLoop);
for ii=1:2:carrier_count
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*carrier_count)*2);
training_symbols1 = reshape(training_symbols0,carrier_count,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)
%--------------------------------------------------------
%串并转换
%X2=reshape(X1,NumSubc,NumLoop);
Trans_x1=reshape(T1_data,carrier_count,NumLoop);
Trans_x2=reshape(T2_data,carrier_count,NumLoop);
%---------------------------------------------------------
%插入导频
pilot=1:NT+2:NumLoop+2*Np-1;
if length(pilot)~=Np
pilot=[pilot,NumLoop+2*Np-1];
end
signal=1:NumLoop+2*Np;
signal(pilot)=[];
pilot1=1:NT+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变换
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];
%并串转换
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:1:20;
M=length(snr);
ber=zeros(M,1);
for kk=1:M
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_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);
ReCp_1 = ReceivS_1((NumCP+1):NumAddPrefix,:);
ReCp_2 = ReceivS_2((NumCP+1):NumAddPrefix,:);
%fft变换
FFT_y1 =fft(ReCp_1,NumSubc,1);
FFT_y2 =fft(ReCp_2,NumSubc,1);
%LS信道估计
ReData_y1=FFT_y1(:,signal);
ReData_y2=FFT_y2(:,signal);
FFT_y11=FFT_y1(carriers,:);
FFT_y22=FFT_y2(carriers,:);
Rx_training_symbols_1=FFT_y11(:,pilot);
Rx_training_symbols_2=FFT_y11(:,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;%对应H12
Rx_training_symbols_3=FFT_y22(:,pilot);
Rx_training_symbols_4=FFT_y22(:,pilot+1);
Rx_training_add_22 = Rx_training_symbols_3+Rx_training_symbols_4;%对应H21
Rx_training_minus_22= Rx_training_symbols_3-Rx_training_symbols_4;%对应H22
Rx_training_add_1=reshape( Rx_training_add_11,carrier_count*Np,1);%H11
Rx_training_minus_1=reshape(Rx_training_minus_11,carrier_count*Np,1);%H12
Rx_training_add_2=reshape( Rx_training_add_22,carrier_count*Np,1);%H21
Rx_training_minus_2=reshape(Rx_training_minus_22,carrier_count*Np,1);%H22
training_symbol0=reshape(training_symbols,1,carrier_count*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;%H11
Hls_12=training_symbo_inv*Rx_training_minus_1/2;%H12
Hls_21=training_symbo_inv*Rx_training_add_2/2;%H21
Hls_22=training_symbo_inv*Rx_training_minus_2/2;%H22
Hls11=reshape(Hls_11,carrier_count,Np);
Hls12=reshape(Hls_12,carrier_count,Np);
Hls21=reshape(Hls_21,carrier_count,Np);
Hls22=reshape(Hls_22,carrier_count,Np);
Hls=zeros(2,2,carrier_count,Np);
Hls(1,1,:,:)=Hls11;
Hls(1,2,:,:)=Hls12;
Hls(2,1,:,:)=Hls21;
Hls(2,2,:,:)=Hls22;
HLs=zeros(2,2,carrier_count,NumLoop);
for xx =1:2
for yy =1:2
if ceil(NumLoop/NT)==NumLoop/NT
for k=1:Np-1
for t=1:NT
HLs(xx,yy,:,(k-1)*NT+t)=(Hls(xx,yy,:,k+1)-Hls(xx,yy,:,k))*t/(NT+2)+Hls(xx,yy,:,k);
end
end
else
for k=1:Np-2
for t=1:NT
HLs(xx,yy,:,(k-1)*NT+t)=(Hls(xx,yy,:,k+1)-Hls(xx,yy,:,k))*t/(NT+2)+Hls(xx,yy,:,k);
end
end
for t=1:mod(NumLoop,NT)
HLs(xx,yy,:,(Np-2)*NT+t)=(Hls(xx,yy,:,Np)-Hls(xx,yy,:,Np-1))*t/(mod(NumLoop,NT)+2)+Hls(xx,yy,:,Np-1);
end;
end
end
end
H11(:,:)=HLs(1,1,:,:);
H12(:,:)=HLs(1,2,:,:);
H21(:,:)=HLs(2,1,:,:);
H22(:,:)=HLs(2,2,:,:);
%STBC译码
R_Data = zeros(carrier_count,NumLoop);
for jj = 1:NumLoop
for ii = 1:2:carrier_count-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
%由QPSK转换二进制码
R_Data=R_Data(:);
SymDec = zeros(NumLoop*carrier_count,2);
for m = 1:NumLoop*carrier_count
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,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,'b');
xlabel('SNR(dB)');
ylabel('BER');
%title('ls vs no estimation');
%legend('none','ls');
hold on
grid on
%ber
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -