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