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

📄 main.m

📁 OFDM系统仿真实现成功啦!欢迎下载。有什么好的意见欢迎提出哈。包含源代码
💻 M
字号:
%%*************************************************************************
%%This program perform the simulation of the transmitter and the receiver 
%%with the frequency estimation and correction,using ML 
%%Function information:
%%
%%-------------------------------------------------------------------------
%%Created by Wei Zhao           2003-04-17    (Version 1.0)                                       
%%-------------------------------------------------------------------------
%%*************************************************************************

%%-------------------------------------------------------------------------
%% Reference:
%%  
%%  
%% 
%%--------------------------------------------------------------------------
%%**************************************************************************

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

clear;
clc;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%   System Path Setup
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
addpath(path,'..\Tx');
addpath(path,'..\Rx');
addpath(path,'..\channel');
addpath(path,'..\results');

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%   System Parameters
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
NumOfSubcarrier = 64;
LengthOfGI = 16;  % the subcarriers GI(guard interval)contains
modulation_mode = 4;



%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Control Parameters
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
NumOfSymbolPerFrame=7;
NumOfPreamblePerFrame=2;
NumOfFrames=20000;
SNR_in_dB=[4:2:30];

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Preamble Initialization 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Preamble1=zeros(1,NumOfSubcarrier);
Preamble2=zeros(1,NumOfSubcarrier);
rand_ini = randint(1,NumOfSubcarrier);
for i = 1:NumOfSubcarrier*0.5
    if  rand_ini(i) == 0
        Preamble1(i) =-1;
        Preamble2(i+NumOfSubcarrier*0.5) =-1;
    end
end   
Frequency_Offset = zeros(length(SNR_in_dB),NumOfFrames);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% 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 
   
    NumOfErrorBit = 0;
    SampleIndex=0;
    for Frame_counter = 1:NumOfFrames
            
        %--------------------------------------------------------------------------------------------
        %                                        Tx
        %--------------------------------------------------------------------------------------------
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        %% Source Bit Sequence 
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  
        Source_Bits1=randint(1,NumOfSubcarrier*(NumOfSymbolPerFrame-NumOfPreamblePerFrame));
        Source_Bits2=randint(1,NumOfSubcarrier*(NumOfSymbolPerFrame-NumOfPreamblePerFrame));
        
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        %% QPSK Modulation
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        Modulated_Sequence1=modulation(Source_Bits1,modulation_mode);
        Modulated_Sequence2=modulation(Source_Bits2,modulation_mode);
        R_Modulated_Sequence1=reshape(Modulated_Sequence1,NumOfSubcarrier*0.5,(NumOfSymbolPerFrame-NumOfPreamblePerFrame));
        R_Modulated_Sequence2=reshape(Modulated_Sequence2,NumOfSubcarrier*0.5,(NumOfSymbolPerFrame-NumOfPreamblePerFrame));
        
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        %% IFFT
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%   
        IFFT_In_Data1(1:NumOfSubcarrier*0.5,:)=R_Modulated_Sequence1;
        IFFT_In_Data1((1+NumOfSubcarrier*0.5):NumOfSubcarrier,:)=0;
        IFFT_In_Data2(1:NumOfSubcarrier*0.5,1:(NumOfSymbolPerFrame-NumOfPreamblePerFrame))=0;
        IFFT_In_Data2((1+NumOfSubcarrier*0.5):NumOfSubcarrier,1:(NumOfSymbolPerFrame-NumOfPreamblePerFrame))=R_Modulated_Sequence2;
        IFFT_Out_Data1(:,:) =sqrt(NumOfSubcarrier)* ifft (IFFT_In_Data1(:,:));
        IFFT_Out_Data2(:,:) =sqrt(NumOfSubcarrier)* ifft (IFFT_In_Data2(:,:));
        
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        %% Combine Preambles and Modulated Data together
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%   
        Combined_In_Data1=reshape(IFFT_Out_Data1,1,NumOfSubcarrier*(NumOfSymbolPerFrame-NumOfPreamblePerFrame));
        Combined_In_Data2=reshape(IFFT_Out_Data2,1,NumOfSubcarrier*(NumOfSymbolPerFrame-NumOfPreamblePerFrame));
        Frame_Combined1=[Preamble1 Preamble1 Combined_In_Data1];
        Frame_Combined2=[Preamble2 Preamble2 Combined_In_Data2];
        
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        %% adding guard interval for DATA
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        GI_In_Data1=reshape(Frame_Combined1,NumOfSubcarrier,NumOfSymbolPerFrame);
        GI_In_Data2=reshape(Frame_Combined2,NumOfSubcarrier,NumOfSymbolPerFrame);
        GI_Added_Frame1(1:LengthOfGI,:) = GI_In_Data1((NumOfSubcarrier-LengthOfGI+1):NumOfSubcarrier,:);
        GI_Added_Frame1((LengthOfGI+1):(NumOfSubcarrier+LengthOfGI),:) = GI_In_Data1(1:NumOfSubcarrier,:);
        GI_Added_Frame2(1:LengthOfGI,:) = GI_In_Data2((NumOfSubcarrier-LengthOfGI+1):NumOfSubcarrier,:);
        GI_Added_Frame2((LengthOfGI+1):(NumOfSubcarrier+LengthOfGI),:) = GI_In_Data2(1:NumOfSubcarrier,:);
        
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        %% P -> S
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        Serial_Signal1 = reshape(GI_Added_Frame1,1,NumOfSymbolPerFrame*(NumOfSubcarrier+LengthOfGI));
        Serial_Signal2 = reshape(GI_Added_Frame2,1,NumOfSymbolPerFrame*(NumOfSubcarrier+LengthOfGI));
        
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        %adding frequency offset
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        for ii=1:NumOfSymbolPerFrame*(NumOfSubcarrier+LengthOfGI)
            Transmited_Signal1(ii)=Serial_Signal1(ii)*exp(j*2*pi*(ii-1)*0.1/NumOfSubcarrier);
            Transmited_Signal2(ii)=Serial_Signal2(ii)*exp(j*2*pi*(ii-1)*0.2/NumOfSubcarrier);
        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=Transmited_Signal1+Transmited_Signal2+noise(i);
        
        
        
        %--------------------------------------------------------------------------------------------
        %                                         Rx
        %--------------------------------------------------------------------------------------------
       
        
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        Preamble_first = Noised_Transmited_Signal(1:NumOfSubcarrier+LengthOfGI);
        Preamble_second =Noised_Transmited_Signal(NumOfSubcarrier+LengthOfGI+1:(NumOfSubcarrier+LengthOfGI)*2);
        conj_first = conj(Preamble_first);
        imag_sum1 = 0;
        imag_sum2 = 0;
        real_sum1 = 0;
        real_sum2 = 0;
        for ii=1:NumOfSubcarrier*0.5
            imag_sum_before1 = imag(Preamble_second(ii+LengthOfGI)*conj_first(ii+LengthOfGI));
            imag_sum1 = imag_sum1+imag_sum_before1;
            real_sum_before1 = real(Preamble_second(ii+LengthOfGI)*conj_first(ii+LengthOfGI));
            real_sum1 = real_sum1+real_sum_before1;
            imag_sum_before2 = imag(Preamble_second(ii+NumOfSubcarrier*0.5+LengthOfGI)*conj_first(ii+NumOfSubcarrier*0.5+LengthOfGI));
            imag_sum2 = imag_sum2+imag_sum_before2;
            real_sum_before2 = real(Preamble_second(ii+NumOfSubcarrier*0.5+LengthOfGI)*conj_first(ii+NumOfSubcarrier*0.5+LengthOfGI));
            real_sum2 = real_sum2+real_sum_before2;
        end
        sum_of_offset1= real_sum1+j*imag_sum1;
        sum_of_offset2= real_sum2+j*imag_sum2;
        frequency_offset1(Frame_counter) = angle(sum_of_offset1)*NumOfSubcarrier/2/pi/(NumOfSubcarrier+LengthOfGI);
        frequency_offset2(Frame_counter) = angle(sum_of_offset2)*NumOfSubcarrier/2/pi/(NumOfSubcarrier+LengthOfGI);
        
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        %%     %%
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        LengthOfData = length(Noised_Transmited_Signal) ;
        for ii = (NumOfSubcarrier+LengthOfGI)*2+1:LengthOfData                %  frequency offset correction for data symbols
            DataAfterCorrection1(ii-(NumOfSubcarrier+LengthOfGI)*2) = Noised_Transmited_Signal(ii)*exp(-j*2*pi*(ii-1)*frequency_offset1(Frame_counter)/NumOfSubcarrier);
            DataAfterCorrection2(ii-(NumOfSubcarrier+LengthOfGI)*2) = Noised_Transmited_Signal(ii)*exp(-j*2*pi*(ii-1)*frequency_offset2(Frame_counter)/NumOfSubcarrier);
        end    
        
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        %%  Remove the GI 
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        for jj=1:NumOfSymbolPerFrame-NumOfPreamblePerFrame
            for ii=1:NumOfSubcarrier
                GI_Removed_Rx_Signal1(ii+(jj-1)*NumOfSubcarrier)=DataAfterCorrection1(LengthOfGI*jj+ii+(jj-1)*NumOfSubcarrier);
                GI_Removed_Rx_Signal2(ii+(jj-1)*NumOfSubcarrier)=DataAfterCorrection2(LengthOfGI*jj+ii+(jj-1)*NumOfSubcarrier);
            end
        end        
        
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        %%  S -> P
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        Parallel_Rx_Signal1 = reshape(GI_Removed_Rx_Signal1,NumOfSubcarrier,NumOfSymbolPerFrame-NumOfPreamblePerFrame) ;
        Parallel_Rx_Signal2 = reshape(GI_Removed_Rx_Signal2,NumOfSubcarrier,NumOfSymbolPerFrame-NumOfPreamblePerFrame) ;
        
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        %% FFT
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%   
        Freq_Rx_Signal1 = fft(Parallel_Rx_Signal1)/sqrt(NumOfSubcarrier);
        Freq_Rx_Signal2 = fft(Parallel_Rx_Signal2)/sqrt(NumOfSubcarrier);
        Demod_In_Data1(1:NumOfSubcarrier*0.5,1:(NumOfSymbolPerFrame-NumOfPreamblePerFrame)) = Freq_Rx_Signal1(1:NumOfSubcarrier*0.5,1:(NumOfSymbolPerFrame-NumOfPreamblePerFrame));
        Demod_In_Data2(1:NumOfSubcarrier*0.5,1:(NumOfSymbolPerFrame-NumOfPreamblePerFrame)) = Freq_Rx_Signal2((1+NumOfSubcarrier*0.5):NumOfSubcarrier,1:(NumOfSymbolPerFrame-NumOfPreamblePerFrame));
        % convert the Data from time domain to frequency domain
        FFT_Out1 = conj(Demod_In_Data1(:,1:NumOfSymbolPerFrame-NumOfPreamblePerFrame)');
        FFT_Out2 = conj(Demod_In_Data2(:,1:NumOfSymbolPerFrame-NumOfPreamblePerFrame)');
        Serial_Output1 = reshape(Demod_In_Data1,1,NumOfSubcarrier*0.5*(NumOfSymbolPerFrame-NumOfPreamblePerFrame));
        Serial_Output2 = reshape(Demod_In_Data2,1,NumOfSubcarrier*0.5*(NumOfSymbolPerFrame-NumOfPreamblePerFrame));
        
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        %% Demodulation
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        Demod_Sequence1= demodulation(Serial_Output1,modulation_mode);
        Demod_Sequence2= demodulation(Serial_Output2,modulation_mode);
        
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        %% Calculate the BER
        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        for jj = 1:(length(Source_Bits1)) 
            if  Demod_Sequence1(jj) ~= Source_Bits1(jj) 
                NumOfErrorBit = NumOfErrorBit + 1; 
            end
            if  Demod_Sequence2(jj) ~= Source_Bits2(jj) 
                NumOfErrorBit = NumOfErrorBit + 1; 
            end
        end    
    end
    
    Frequency_Offset1(counter,:)= frequency_offset1;
    Frequency_Offset2(counter,:)= frequency_offset2;
    BER(counter) = NumOfErrorBit/(NumOfFrames*NumOfSubcarrier*2*(NumOfSymbolPerFrame-NumOfPreamblePerFrame));
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    % Save Temp Simulation Data
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    savefile = sprintf('../results/OFDM_FreqOffset_%d.txt',counter);
    save(savefile,'BER','-ASCII');
    
end
elapse=toc
%---------------------------------------------%
% Save Simulation Data
%---------------------------------------------%
clock_time = clock;
present = fix(clock_time)
savefile = sprintf('../results/OFDM_FreqOffset_%d_%d_%d_%d.txt',present(2),present(3),present(4),present(5));
save(savefile,'SNR_in_dB','BER','-ASCII');

%---------------------------------------------%
%% 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 + -