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

📄 mimoofdm_est.asv

📁 block_mimo_ ofdm_channelestimation编码 很好的程序
💻 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 + -