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

📄 main.asv

📁 MIMO-OFDM系统仿真
💻 ASV
字号:
clear all;
% close all;
clc;

rand('seed',0);
randn('seed',0);

SNR_array = 0:3:21;
N_FFT=64;                %FFT点数
N_SYMBOL=2;
N_BPSC=2;                %映射选择, 2:QPSK
RATE=1/3;                %编码码率, 
Multipath=6;             %多径条数
Tx=2;                    %发射天线 二者相等
Rx=2;                    %接收天线
CyclicNum=16;            %前缀长度
PACKET=1000;             %包数
DecodeDepth=28;          %译码深度
Interleave_Length=16;    %交织深度
Code_Zero=6;             %编码补零

%开关标记
BIT_RANDN = 1;           % 0:全0序列;1:随机序列
CHANNEL_ESTI=0;          %1时加SVD;0时不加
GAUSS_NOISE = 1;           %1时加噪声,0不加
CODE=0;                  %1时编码;0时不加
INTERLEAVE=0;            %1时交织;0时不加
CHANNEL_flag=2;          %CHANNEL_flag=  1:AWGN;2:平衰落;3:多径
CODE_UNQUANT=0;          %1:unquant方式译码,不做解映射,直接译码
EST_CHANNEL = 1;         % 1:加训练序列,做信道估计
EST_MODE = 3;            % 1:LMMSE;2:频域LS;3:时频精估计;4:角度域估计
CORRE_CHANNEL = 0.5;       % 0:i.i.d; 0<rou<1: 相关信道



if CODE==0
    N=N_BPSC*N_SYMBOL*N_FFT;               %每根天线上每包中的码元个数(N_FFT)
else
    if floor(N_BPSC*RATE)==N_FFT*RATE
        N=(N_FFT*N_SYMBOL)*N_FFT*RATE-Code_Zero;          %每根天线上每包中的码元个数(N_CBPS的整数倍)
    else
        N=floor(N_FFT*N_SYMBOL*N_FFT*RATE)-Code_Zero;        
    end
end

global STRU;              %卷积码生成矩阵
global INTERLEAVE_TABLE;  %交织映射表
global AddZero;           %编码后补零个数 

for SNR_i = 1:length(SNR_array)
    SNR = SNR_array(SNR_i)
    for Packet = 1:PACKET
        X_bit=BitGenerate(N,Tx,CODE,Code_Zero, BIT_RANDN);
        X_code=code(X_bit,RATE,CODE,N_FFT);
        X_interleave=interleave(X_code,INTERLEAVE,Interleave_Length);
        X_map=modulation(X_interleave,N_BPSC);
        
        H=Channel(Multipath,Tx,Rx,CHANNEL_flag, CORRE_CHANNEL);                       %信道产生,信道已经归一化
        
        if CHANNEL_ESTI==1
            X_SVD=TxSVD(X_map,H,N_FFT);
        else
            X_SVD=X_map;
        end
        
        X_IFFT=IFFT(X_SVD,N_FFT);
                
        X_Cycle=cycle(X_IFFT,CyclicNum);            %加前缀后,即是发送数据(二维矩阵)
        X_Pre = AddPreamble(X_Cycle, EST_CHANNEL, N_FFT);
        
        Y=AddChannel(X_Pre,H,GAUSS_NOISE,SNR);    %加信道(多径、白高斯噪声)
        
        if EST_CHANNEL == 1
            [Est_H, Yin, MSE_Ave] = ChanEsti(Y, EST_MODE, H);
        else
            Yin = Y;
            MSE_Ave=0;
            for i=1:Rx
                for j=1:Tx
                    Est_H(i,j,:)=fft(H(i,j,:),N_FFT);
                end
            end
        end   
        
        Y_Noncycle=noncycle(Yin,CyclicNum,N_FFT);     %去拖尾,去前缀
        Y_FFT=FFT(Y_Noncycle);                      %FFT后,再经过并串转换后
        
        if CHANNEL_ESTI==1
            X_Esti=SVD_Rx(Y_FFT,N_FFT,Tx,H,GAUSS_NOISE,SNR,CODE_UNQUANT);        %Y乘以U'后,再进行MMSE检测,得到的是对调制后信号的估计
        else
            X_Esti=Lmmse(Y_FFT,N_FFT,Est_H,GAUSS_NOISE,SNR);
        end
        if CODE_UNQUANT==0
            X_Demap=Demodulation(X_Esti,N_BPSC);
            X_Deinterleave=deinterleave(X_Demap,INTERLEAVE,Interleave_Length,CODE_UNQUANT);
            X_Decode=decode(X_Deinterleave,RATE,CODE,DecodeDepth,CODE_UNQUANT);       %X_Decode与X_bit对应
        else
            X_Demap=X_Esti;
            X_Deinterleave=deinterleave(X_Demap,INTERLEAVE,Interleave_Length,CODE_UNQUANT);
            X_Decode=decode(X_Deinterleave,RATE,CODE,DecodeDepth,CODE_UNQUANT);
        end
        
        MSE(Packet) = MSE_Ave;
        BER(Packet)=countBER(X_Decode,X_bit,N);
 %       BER_PerRx(Packet,:)=countBER_PerRx(X_Decode,X_bit);
    end
    
    FinalMSE(SNR_i) = sum(MSE)/PACKET;

    BERaverage(SNR_i)=sum(BER)/PACKET;
      
end




        
        
        
        
        
        

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -