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

📄 ofdm_awgn_new.m

📁 OFDM系统仿真实现成功啦!欢迎下载。有什么好的意见欢迎提出哈。包含源代码
💻 M
字号:
%%*************************************************************************
%%此程序用来仿真OFDM+空时编码系统在AWGN信道中的误码特性 
%%Function information:
%%*************************************************************************

%%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
%%                                  MAIN PROGRAM 
%%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

clear;
clc;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%   System Parameters
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
number_of_symbols = 10000;  % 待发送的符号总数
NumOfSubcarrier = 64;  % 
LengthOfGI = 16;       % the subcarriers GI(guard interval)contains
modulation_mode = 4;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Simulation Parameters
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
NumOfSymbolPerFrame=5;
NumOfFrames=100;
SNR_in_dB=[0:2:10];

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Simulation Starting!!!
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
tic;
for counter=1:length(SNR_in_dB) 
    P=1;				  	                      % energy per symbol
    snr=10^(SNR_in_dB(counter)/10);	 	      % signal to noise ratio
    sgma=sqrt(P/(2*snr));	  	  	              % noise variance
  
    %Clear the all the counters 
   
    NumOfErrorBit = 0;
    SampleIndex=0;
    for Frame_counter = 1:NumOfFrames
        %--------------------------------------------------------------------------------------------
        %                                        Tx
        %--------------------------------------------------------------------------------------------
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        %% Source Bit Sequence 二进制信源
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  
        Source_Bits=randint(1,2*NumOfSubcarrier*NumOfSymbolPerFrame);
        
        
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        %% QPSK Modulation
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        Modulated_Sequence=modulation(Source_Bits,modulation_mode);
        R_Modulated_Sequence=reshape(Modulated_Sequence,NumOfSubcarrier,NumOfSymbolPerFrame);
        
        
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        %% IFFT
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%   
        IFFT_Out_Data(:,:) =sqrt(NumOfSubcarrier)* ifft (R_Modulated_Sequence);
       
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        %% adding guard interval for DATA
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        GI_Added_Frame(1:LengthOfGI,:) = IFFT_Out_Data((NumOfSubcarrier-LengthOfGI+1):NumOfSubcarrier,:);
        GI_Added_Frame((LengthOfGI+1):(NumOfSubcarrier+LengthOfGI),:) = IFFT_Out_Data(1:NumOfSubcarrier,:);
    
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        %% P -> S需要更改
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        
        %%原来的
        %%Serial_Signal = reshape(GI_Added_Frame,1,NumOfSymbolPerFrame*(NumOfSubcarrier+LengthOfGI));
        
        %产生衰落信道
        randn('state',sum(100*clock));
        h_vector = complex(randn(1,number_of_symbols),randn(1,number_of_symbols));
        
        %%20070419加入(空时编码)
        %发端编码机制
				%  -s2*  s1   天线1
				%   s1*  s2   天线2
				%  Ts+t  t
        for index=1:2:number_of_symbols,
            Serial_Signal(index)   =  h_vector(index)*GI_Added_Frame(index)         + h_vector(index+1)*GI_Added_Frame(index+1);
            Serial_Signal(index+1) = -h_vector(index)*conj(GI_Added_Frame(index+1)) + h_vector(index+1)*conj(GI_Added_Frame(index));
        end;
        
        
        %%%------------------------------------------------------------------------------------------------------------
        %%                                              CHANNEL
        %%%------------------------------------------------------------------------------------------------------------
        %--------------------------------------------------------------------------------------------
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        %% AWGN channel
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        for i=1:NumOfSymbolPerFrame*(NumOfSubcarrier+LengthOfGI)
            [n_I n_Q]=gngauss(sgma);
            noise(i)=n_I+j*n_Q;
        end
        Noised_Transmited_Signal=Serial_Signal+noise;
        
        
        %--------------------------------------------------------------------------------------------
        %                                         Rx
        %--------------------------------------------------------------------------------------------
 
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        %%  Remove the GI 
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        for jj=1:NumOfSymbolPerFrame
            for ii=1:NumOfSubcarrier
                GI_Removed_Rx_Signal(ii+(jj-1)*NumOfSubcarrier)=Noised_Transmited_Signal(LengthOfGI*jj+ii+(jj-1)*NumOfSubcarrier);
            end
        end 
        
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        %%  S -> P需要更改
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        %Parallel_Rx_Signal = reshape(GI_Removed_Rx_Signal,NumOfSubcarrier,NumOfSymbolPerFrame);
            
            
        %接收机处的合并机制
        %s1' = h1**y1 + h2*y2*
        %s2' = h2**y1 - h1*y2*
        for index=1:2:number_of_symbols,
            Parallel_Rx_Signal(index)   = conj(h_vector(index))*GI_Removed_Rx_Signal(index)  + h_vector(index+1)*conj(GI_Removed_Rx_Signal(index+1));
            Parallel_Rx_Signal(index+1) = conj(h_vector(index+1))*GI_Removed_Rx_Signal(index) - h_vector(index)*conj(GI_Removed_Rx_Signal(index+1));
        end;
        
        
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        %% FFT
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%   
        Freq_Rx_Signal = fft(Parallel_Rx_Signal)/sqrt(NumOfSubcarrier);
        Demod_In_Data(1:NumOfSubcarrier,1:NumOfSymbolPerFrame) = Freq_Rx_Signal(1:NumOfSubcarrier,1:NumOfSymbolPerFrame);
        FFT_Out = conj(Demod_In_Data(:,1:NumOfSymbolPerFrame)');
        Serial_Output = reshape(Demod_In_Data,1,NumOfSubcarrier*NumOfSymbolPerFrame);
        
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        %% Demodulation
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        Demod_Sequence= demodulation(Serial_Output,modulation_mode);
        
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        %% Calculate the BER
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        for jj = 1:(length(Source_Bits)) 
            if  Demod_Sequence(jj) ~= Source_Bits(jj) 
                NumOfErrorBit = NumOfErrorBit + 1; 
            end
        end
    end
        
    BER(counter) = NumOfErrorBit/(NumOfFrames*NumOfSubcarrier*2*NumOfSymbolPerFrame);
end
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    % Simulation Completed
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    
    elapse=toc
    
    clock_time = clock;
    present = fix(clock_time)  
    
%---------------------------------------------%
%% Draw BER figure
%---------------------------------------------% 
h=figure;
semilogy(SNR_in_dB,BER,'r*-');
xlabel('SNR(dB)');
ylabel('BER(bit error rate)');
title( 'BER performance of OFDM  in AWGN Channel');
grid on ;

        
        

⌨️ 快捷键说明

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