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

📄 ofdm_block_ideal.m

📁 这个是关于OFDM固定比特仿真平台的源程序代码
💻 M
字号:
%%*************************************************************************
%%Function information:
%%
%%-------------------------------------------------------------------------
%%
%%-------------------------------------------------------------------------
%%*************************************************************************


clear all;
clc;


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%   System Parameters
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
NumOfSubcarrier = 256;
LengthOfGI = 16;  % the subcarriers GI(guard interval)contains
modulation_mode = 4;% QAM
RMS_Delay = 4;
Max_Delay = 16;
NumOfTaps = 6;
NumOfAntennas = 1;


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Control Parameters
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
NumOfSymbolPerFrame=7;
NumOfPreamblePerFrame=2;
NumOfFrames=100;
SNR_in_dB=[8:2:20];



%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Preamble Initialization 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Preamble=zeros(1,NumOfSubcarrier);
rand_ini = randint(1,NumOfSubcarrier);
for i = 1:NumOfSubcarrier
    if  rand_ini(i) == 0
        Preamble(i) =-1;
    end
end   

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Channel Parameter Initialization
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
[Path_Delay,Path_Average_Power] = Multipath_Channel_Init_TypeV(RMS_Delay,Max_Delay,NumOfTaps,NumOfAntennas);


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% 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/(snr));	  	  	              % noise variance
  
    %Clear the all the counters 
   
    Total_Error_Bit=0;
    SampleIndex=0;
   
    for Frame_counter = 1:NumOfFrames,
            
        %--------------------------------------------------------------------------------------------
        %                                        Tx
        %--------------------------------------------------------------------------------------------
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        %% Source Bit Sequence 
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  
        Source_Bits=randint(1,NumOfSubcarrier*2*(NumOfSymbolPerFrame-NumOfPreamblePerFrame));
        
     
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        %% QPSK Modulation
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        Modulated_Sequence=modulation(Source_Bits,modulation_mode); 
        
     
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        %% Combine Preambles and Modulated Data together
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%   
        Frame_Combined=[Preamble Preamble Modulated_Sequence];
        
        
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        %% IFFT
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%   
        IFFT_In_Data = reshape(Frame_Combined,NumOfSubcarrier,NumOfSymbolPerFrame);
        %% converting the data symbols from frequency domain to time domain , IFFT
        IFFT_Out_Data(:,:) =sqrt(NumOfSubcarrier)* ifft (IFFT_In_Data(:,:)); 

        
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        %% 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
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        Transmited_Signal = reshape(GI_Added_Frame,1,NumOfSymbolPerFrame*(NumOfSubcarrier+LengthOfGI));

        %--------------------------------------------------------------------------------------------
        %                                    CHANNEL
        %--------------------------------------------------------------------------------------------
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        % Multipath_Rayleigh channel
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        [Signal_OutAWGN_Rayleigh,Fading_Weight]=Multipath_Channel_V(Transmited_Signal,(NumOfSubcarrier+LengthOfGI)*NumOfSymbolPerFrame,NumOfTaps,Path_Delay,Path_Average_Power,NumOfAntennas);
       
        

        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        %% 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=Signal_OutAWGN_Rayleigh+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) ;
        
    
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        %% FFT
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%   
        Freq_Rx_Signal= fft(Parallel_Rx_Signal)/sqrt(NumOfSubcarrier);
        %  1st preamble ,frequency domain
        Freq_Rx_1st_Preamble = reshape(Freq_Rx_Signal(:,1),1,NumOfSubcarrier) ;
        %  2nd preamble ,frequency domain
        Freq_Rx_2nd_Preamble= reshape(Freq_Rx_Signal(:,2),1,NumOfSubcarrier) ;  
        % convert the Data from time domain to frequency domain
        FFT_Out = conj(Freq_Rx_Signal(:,3:NumOfSymbolPerFrame)');
        Serial_Output= reshape(conj(FFT_Out'),1,NumOfSubcarrier*(NumOfSymbolPerFrame-NumOfPreamblePerFrame)); 
        
        
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        %  Ideal Channel estimation
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        H_Ideal= fft(Fading_Weight,NumOfSubcarrier);%/sqrt(NumOfSubcarrier);        
        
        Conj_H_Ideal = conj( H_Ideal );      %  conjugate of H
        M_Ideal = (Conj_H_Ideal.*H_Ideal);
        for ii = 1:( NumOfSymbolPerFrame-NumOfPreamblePerFrame)
            Detection_Out_Ideal(ii,:) = Conj_H_Ideal.*FFT_Out(ii,:)./M_Ideal;
        end
        Detec_Out_Ideal = reshape(conj(Detection_Out_Ideal'),1,length(Serial_Output));
        
        
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        %% Demodulation
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        Demod_Sequence= demodulation(Detec_Out_Ideal,modulation_mode);  
         
         
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        %% Calculate the BER
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        NumOfErrorBit = 0; 
        if Frame_counter > 4
           for jj = 1:length(Source_Bits) 
               if  Demod_Sequence(jj) ~= Source_Bits(jj) 
                   NumOfErrorBit = NumOfErrorBit + 1; 
               end
           end
           Total_Error_Bit=Total_Error_Bit+NumOfErrorBit;
        end
        
    end
    BER(counter) = Total_Error_Bit/((NumOfFrames-4)*NumOfSubcarrier*2*(NumOfSymbolPerFrame-NumOfPreamblePerFrame));
   
end

%---------------------------------------------%
%% Draw BER figure
%---------------------------------------------% 
semilogy(SNR_in_dB,BER,'r*-');
xlabel('Eb/N0(dB)');
ylabel('BER(bit error rate)');
title( 'BER performance of OFDM');
grid on ;

⌨️ 快捷键说明

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