📄 main.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 + -