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