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

📄 alamouti_ofdm.m

📁 STBC-OFDM中Alamouti的仿真实现,包括信道编译码和二进制信源
💻 M
字号:
%Simulation program to realize Alamouti-OFDM transmission system on
%rayleigh multipath channel
clear all;
  
%********************** preparation part ***************************
Nt=2;       % transmit antenna Nt
Nr=1;       % Receive antenna Nr                                                   
para=512;   % Number of parallel channel to transmit (points)
fftlen=1024; % FFT length
Nc=512;     % Number of carrier
frame=10;    %number of zheng 
average=10;
N_ofdm=4;  % Number of information OFDM symbol for per frame
nd=2;       % two time slot
level=2;       % Modulation level : QPSK
sr=250000;  % Symbol rate
br=sr.*level;  % Bit rate per carrier
gilen=128;      % Length of guard interval (points)
L=3;

for jj=1:average
    
    for kk=1:frame
        L1=norepeatint(1,L,[0 20]);
        L2=norepeatint(1,L,[0 20]);

        for ebn0=0:3:21
        %************************** main loop part **************************
            number=0;   %Number of error bit
            ratio=0;      %ratio of error bit
            err_sig=0;   %total number of error signal

            for i=1:(N_ofdm/nd)
            %************************** transmitter *********************************
                %************************** Data generation **************************** 
                Source_data=randint(1,para*nd,2^level);  %1*(128*2)  rand : built in function

                %************************** QPSK modulation ***************************** 
                Modul_data=pskmod(Source_data,2^level)/sqrt(Nt);         %128*2

                %****************************STBC**************************************
                for m=1:para*nd/2
                    STBC_data(:,(2*m-1):2*m)=[Modul_data(2*m-1) -conj(Modul_data(2*m));Modul_data(2*m) conj(Modul_data(2*m-1))];
                end
                STBC_data1=STBC_data(1,:);
                STBC_data2=STBC_data(2,:);

                %****************** Serial to parallel conversion ***********************
                SP_data1=conj(reshape(STBC_data1,2,para))';
                SP_data2=conj(reshape(STBC_data2,2,para))';

                %******************* IFFT ************************
                Prep_data1=crmapping(SP_data1,para,fftlen,nd);     %128*6
                Ifft_data1=ifft(Prep_data1)*sqrt(fftlen);      %  ifft : built in function

                Prep_data2=crmapping(SP_data2,para,fftlen,nd);     %128*6
                Ifft_data2=ifft(Prep_data2)*sqrt(fftlen);

                %********* Gurad interval insertion **********    
                Gii_data1=[Ifft_data1(fftlen-gilen+1:fftlen,:);Ifft_data1];    %160*6
                Gii_data2=[Ifft_data2(fftlen-gilen+1:fftlen,:);Ifft_data2];    %160*6

                %******************P/S**************************
                PSdata1=reshape(Gii_data1,1,(fftlen+gilen)*nd);
                PSdata2=reshape(Gii_data2,1,(fftlen+gilen)*nd);

                fftlen2=fftlen+gilen;

                %********* Attenuation Calculation *********
                spow=sum(abs(PSdata1).^2+abs(PSdata2).^2)/(Nt*nd*fftlen2);  %  sum : built in function %signal power???每个符号的能量
                attn=sqrt(spow/(2*level*(10.^(ebn0/10))));   
                noise1=attn.*(randn(1,fftlen+gilen)+j*randn(1,fftlen+gilen));
                noise2=attn.*(randn(1,fftlen+gilen)+j*randn(1,fftlen+gilen));

                %******************channel*********************************        
                L_diff1=L1-L1(1);          
                hh1=10.^(-L_diff1/10);
                h1=hh1/sqrt(sum(abs(hh1).^2));
                H1=fft(h1,fftlen);

                L_diff2=L2-L2(1);          
                hh2=10.^(-L_diff2/10);
                h2=hh2/sqrt(sum(abs(hh2).^2)); 
                H2=fft(h2,fftlen);
                %***********************end*******************************


                %***************************  Receiver  *****************************
                A1=PSdata1(1:(fftlen+gilen));A2=PSdata1((fftlen+gilen+1):(fftlen+gilen)*nd);
                B1=PSdata2(1:(fftlen+gilen));B2=PSdata2((fftlen+gilen+1):(fftlen+gilen)*nd);

                r1 = filter(h1,1,A1) + filter(h2,1,B1) + noise1;                                                             
                r2 = filter(h1,1,A2) + filter(h2,1,B2) + noise2;    
                R=[r1 r2];

                %******************S/P********************************
                SPdata=reshape(R,fftlen2,nd);

                %****************** Guard interval removal *********
                Gir_data=SPdata(gilen+1:fftlen2,:);            %128*6

                %******************  FFT  ******************
                fft_data=fft(Gir_data)/sqrt(fftlen);   	% fft : built in function
                Fft_data=crdemapping(fft_data,para,fftlen,nd);
                

                %********************P/S*********************************   
                PS_data=reshape(Fft_data,1,para*nd);

                %*******************STBC Decode****************************
                GG=reshape(conj(reshape(PS_data,para,nd))',1,para*nd);
                HH1=conj(crdemapping(conj(H1)',para,fftlen,1))';
                HH2=conj(crdemapping(conj(H2)',para,fftlen,1))';
                for n=1:para*nd/2
                    x1=GG(2*n-1);
                    x2=GG(2*n);    
                    De_STBC(2*n-1)=(x1*conj(HH1(n))+conj(x2)*HH2(n));%/(abs(HH1(n)).^2+abs(HH2(n)).^2);
                    De_STBC(2*n)=(x1*conj(HH2(n))-conj(x2)*HH1(n));%/(abs(HH1(n)).^2+abs(HH2(n)).^2);
                end
      
                %***************** demoduration **************************   
                Demodul_data=pskdemod(De_STBC*sqrt(Nt),2^level);   

                %************************** Signal Error Rate (SER) ****************************
                [number,ratio]=symerr(Source_data,Demodul_data);
                 err_sig=err_sig+number;

            end
            SS(kk,ebn0)=err_sig;
        end        
    end
    ser(jj,:)=sum(SS)/para/N_ofdm/frame;
end
SER=sum(ser)/average;

%********************** Output result ***************************
ebn0=0:3:21;
semilogy(ebn0,SER,'-*r')
%******************** end of file *********************************

⌨️ 快捷键说明

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