1 Star 0 Fork 1

xiaodangshan/FBMC

forked from zhoub86/FBMC 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
NR_5G_BER_DoublySelectiveChannel.m 31.00 KB
一键复制 编辑 原始数据 按行查看 历史
Ronald Nissel 提交于 2018-03-29 22:40 . First upload
% =====================================================================
% Ronald Nissel, rnissel@nt.tuwien.ac.at
% (c) 2017 by Institute of Telecommunications, TU Wien
% www.nt.tuwien.ac.at
% =====================================================================
% This script simulates the bit error ratio over SNR in a time-variant
% multipath channel (doubly-selective channel) for different multicarrier
% modulation techniques:
% 1) OFDM with CP (worst spectral behaviour)
% 2) FBMC (best spectral properties, complex orthogonality is replaced by real orthogonality)
% 3) WOLA (windowed OFDM. The windowing is done at TX and RX)
% 4) FOFDM (filtered OFDM, sinc + Hann, filtering at TX and RX)
% 5) UFMC (filtered OFDM, subband-wise filtering, Dolph-Chebyshev window, cyclic prefix and zero padding are supported, filtering at TX and RX)
% Note that WOLA, FOFDM and UFMC have a high degree of freedom! Depending
% on the window/filter length and CP/ZP length they perform differently.
clear; close all;
addpath('./Theory');
% Sampling rate: should approximately match the power delay profile of the
% channel and must be larger than "SubcarrierSpacing*NumberOfSubcarriers".
SamplingRate = 15e3*14*14;
dt = 1/SamplingRate;
% Simulation parameters
Simulation_SNR_OFDM_dB = [-5:5:30]; % SNR for OFDM in dB. The average transmit power of all methods is the same! However, the SNR might be different due to filtering (in FOFDM and UFMC) or because a different bandwidth is used (different subcarrier spacing or different number of subcarriers).
Simulation_MonteCarloRepetitions = 500; % Number of Monte Carlo repetitions over which we take the average
Simulation_PlotSignalPowerTheory = true; % If true, plot also the expected transmit power over time (theory)
% Channel parameters
Channel_Velocity_kmh = 130; % Velocity in km/h. Note that [mph]*1.6=[kmh] and [m/s]*3.6=[kmh]
Channel_PowerDelayProfile = 'VehicularA'; % Power delay profile, either string or vector: 'Flat', 'AWGN', 'PedestrianA', 'PedestrianB', 'VehicularA', 'VehicularB', 'ExtendedPedestrianA', 'ExtendedPedestrianB', or 'TDL-A_xxns','TDL-B_xxns','TDL-C_xxns' (with xx the RMS delay spread in ns, e.g. 'TDL-A_30ns'), or [1 0 0.2] (Self-defined power delay profile which depends on the sampling rate)
Channel_DopplerModel = 'Jakes'; % Which Doppler model: 'Jakes', 'Uniform', 'Discrete-Jakes', 'Discrete-Uniform'. For "Discrete-", we assume a discrete Doppler spectrum to improve the simulation time. This however only works accuratly if the number of samples and the velocity is sufficiently high.
Channel_CarrierFrequency = 2.5e9; % Carrier Frequency (Hz)
% General modulation paramters
QAM_ModulationOrder = 64; % QAM sigal constellation order: 4, 16, 64, 256, 1024,...
% FBMC parameters
FBMC_NumberOfSubcarriers = 24; % Number of subcarriers
FBMC_NumberOfSymbolsInTime = 30; % Number FBMC symbols in time
FBMC_SubcarrierSpacing = 15e3; % Subcarrier spacing (Hz)
FBMC_PrototypeFilter = 'Hermite-OQAM'; % Prototype filter (Hermite, PHYDYAS, RRC) and OQAM or QAM.
FBMC_OverlappingFactor = 4; % Overlapping factor, 2,3,4,...
% OFDM parameters
OFDM_NumberOfSubcarriers = 24; % Number of subcarriers
OFDM_NumberOfSymbolsInTime = 14; % Number OFDM symbols in time
OFDM_SubcarrierSpacing = 15e3; % Subcarrier spacing (Hz)
OFDM_CyclicPrefixLength = 1/(14*OFDM_SubcarrierSpacing); % Length of the cyclic prefix (s)
% WOLA parameters
WOLA_NumberOfSubcarriers = 24; % Number of subcarriers
WOLA_NumberOfSymbolsInTime = 14; % Number WOLA symbols in time
WOLA_SubcarrierSpacing = 15e3; % Subcarrier spacing (Hz)
WOLA_CyclicPrefixLength = 0; % Length of the cyclic prefix (s) to combat the channel
WOLA_WindowLengthTX = 1/(14*2*WOLA_SubcarrierSpacing); % Length of the window overlapping (s) at the transmitter
WOLA_WindowLengthRX = 1/(14*2*WOLA_SubcarrierSpacing); % Length of the window overlapping (s) at the receiver
% FOFDM parameters
FOFDM_NumberOfSubcarriers = 24; % Number of subcarriers
FOFDM_NumberOfSymbolsInTime = 14; % Number FOFDM symbols in time
FOFDM_SubcarrierSpacing = 15e3; % Subcarrier spacing (Hz)
FOFDM_CyclicPrefixLength = 0; % Length of the cyclic prefix (s) to combat the channel
FOFDM_FilterLengthTX = 0.2*1/(FOFDM_SubcarrierSpacing); % Length of the transmit filter (s)
FOFDM_FilterLengthRX = 0.2*1/(FOFDM_SubcarrierSpacing); % Length of the receive filter (s)
FOFDM_FilterCylicPrefixLength = 1/(14*FOFDM_SubcarrierSpacing); % Length of the additional cyclic prefix (s) to combat ISI and ICI due to the filtering
% UFMC parameters
UFMC_NumberOfSubcarriers = 24; % Number of subcarriers
UFMC_NumberOfSymbolsInTime = 14; % Number UFMC symbols in time
UFMC_SubcarrierSpacing = 15e3; % Subcarrier spacing (Hz)
UFMC_CyclicPrefixLength = 0; % Length of the cyclic prefix (s) to combat the channel. If zero padding is used, this length reprents the zero guard length instead of the CP length.
UFMC_FilterLengthTX = 1/14*1/(UFMC_SubcarrierSpacing); % Length of the transmit filter (s)
UFMC_FilterLengthRX = 1/14*1/(UFMC_SubcarrierSpacing); % Length of the receive filter (s)
UFMC_FilterCylicPrefixLength = 1/(14*UFMC_SubcarrierSpacing); % Length of the additional cyclic prefix (or zero guard symbol if ZP is used) in seconds (s). Needed to combat ISI and ICI due to the filtering. However, small ICI and ISI is perfectly feasibly.
UFMC_ZeroPaddingInsteadOfCP = true; % TRUE for Zero Padding (ZP) and FALSE for a conventional Cyclic Prefix (CP)
%% Generate " +Modulation\" Objects
% FBMC Object
FBMC = Modulation.FBMC(...
FBMC_NumberOfSubcarriers,... % Number of subcarriers
FBMC_NumberOfSymbolsInTime,... % Number FBMC symbols in time
FBMC_SubcarrierSpacing,... % Subcarrier spacing (Hz)
SamplingRate,... % Sampling rate (Samples/s)
0,... % Intermediate frequency of the first subcarrier (Hz). Must be a multiple of the subcarrier spacing
false,... % Transmit real valued signal (sampling theorem must be fulfilled!)
FBMC_PrototypeFilter,... % Prototype filter (Hermite, PHYDYAS, RRC) and OQAM or QAM. The data rate of QAM is reduced by a factor of two compared to OQAM, but robustness in doubly-selective channels is inceased
FBMC_OverlappingFactor, ... % Overlapping factor (also determines oversampling in the frequency domain)
0, ... % Initial phase shift
true ... % Polyphase implementation
);
FBMC_BlockOverlapTime = (FBMC.PrototypeFilter.OverlappingFactor-1/2)*FBMC.PHY.TimeSpacing;
% OFDM Object
OFDM = Modulation.OFDM(...
OFDM_NumberOfSubcarriers,... % Number of subcarriers
OFDM_NumberOfSymbolsInTime,... % Number OFDM symbols in time
OFDM_SubcarrierSpacing,... % Subcarrier spacing (Hz)
SamplingRate,... % Sampling rate (Samples/s)
0,... % Intermediate frequency of the first subcarrier (Hz). Must be a multiple of the subcarrier spacing
false,... % Transmit real valued signal (sampling theorem must be fulfilled!)
OFDM_CyclicPrefixLength, ... % Length of the cyclic prefix (s)
FBMC_BlockOverlapTime ... % Length of the guard time (s), that is, zeros at the beginning and at the end of the transmission
);
% Windowed OFDM (WOLA)
WOLA = Modulation.WOLA(...
WOLA_NumberOfSubcarriers,... % Number subcarriers
WOLA_NumberOfSymbolsInTime,... % Number WOLA symbols in time
WOLA_SubcarrierSpacing,... % Subcarrier spacing (Hz)
SamplingRate,... % Sampling rate (Samples/s)
0,... % Intermediate frequency of the first subcarrier (Hz). Must be a multiple of the subcarrier spacing
false,... % Transmit real valued signal (sampling theorem must be fulfilled!)
0, ... % Length of the cyclic prefix (s)
FBMC_BlockOverlapTime-WOLA_WindowLengthTX/2, ... % Length of the guard time (s), that is, zeros at the beginning and at the end of the transmission
WOLA_WindowLengthTX, ... % Length of the window overlapping (s) at the transmitter
WOLA_WindowLengthRX ... % Length of the window overlapping (s) at the receiver
);
% FOFDM (Filtered OFDM)
FOFDM = Modulation.FOFDM(...
FOFDM_NumberOfSubcarriers,... % Number of subcarriers
FOFDM_NumberOfSymbolsInTime,... % Number FOFDM symbols in time
FOFDM_SubcarrierSpacing,... % Subcarrier spacing (Hz)
SamplingRate,... % Sampling rate (Samples/s)
0,... % Intermediate frequency of the first subcarrier (Hz). Must be a multiple of the subcarrier spacing
false,... % Transmit real valued signal (sampling theorem must be fulfilled!)
0, ... % Length of the cyclic prefix (s)
FBMC_BlockOverlapTime-FOFDM_FilterLengthTX/2, ... % Length of the guard time (s), that is, zeros at the beginning and at the end of the transmission
FOFDM_FilterLengthTX, ... % Length of the transmit filter (s)
FOFDM_FilterLengthRX, ... % Length of the receive filter (s)
FOFDM_FilterCylicPrefixLength ... % Length of the additional cyclic prefix (s). Needed to combat ISI and ICI due to the filtering. However, some small ICI and ISI is perfectly fine.
);
% UFMC (Subband Filtered OFDM)
UFMC = Modulation.UFMC(...
UFMC_NumberOfSubcarriers,... % Number of subcarriers
UFMC_NumberOfSymbolsInTime,... % Number UFMC symbols in time
UFMC_SubcarrierSpacing,... % Subcarrier spacing (Hz)
SamplingRate,... % Sampling rate (Samples/s)
0,... % Intermediate frequency of the first subcarrier (Hz). Must be a multiple of the subcarrier spacing
false,... % Transmit real valued signal (sampling theorem must be fulfilled!)
0, ... % Length of the cyclic prefix (s). If zero padding is used, this length reprents the zero guard length instead of the CP length
FBMC_BlockOverlapTime-UFMC_FilterLengthTX/2, ... % Length of the guard time (s), that is, zeros at the beginning and at the end of the transmission
UFMC_FilterLengthTX, ... % Length of the transmit filter (s)
UFMC_FilterLengthRX, ... % Length of the receive filter (s)
UFMC_FilterCylicPrefixLength, ... % Length of the additional cyclic prefix (or zero guard symbol if ZP is used) in seconds (s). Needed to combat ISI and ICI due to the filtering. However, some small ICI and ISI is perfectly fine.
UFMC_ZeroPaddingInsteadOfCP ... % TRUE for Zero Padding (ZP) and FALSE for a conventional Cyclic Prefix (CP)
);
% Number of samples
N_FBMC = FBMC.Nr.SamplesTotal;
N_OFDM = OFDM.Nr.SamplesTotal;
N_WOLA = WOLA.Nr.SamplesTotal;
N_FOFDM = FOFDM.Nr.SamplesTotal;
N_UFMC = UFMC.Nr.SamplesTotal;
N = max([N_FBMC N_OFDM N_WOLA N_FOFDM N_UFMC]);
ChannelModel = Channel.FastFading(...
SamplingRate,... % Sampling rate (Samples/s)
Channel_PowerDelayProfile,... % Power delay profile, either string or vector: 'Flat', 'AWGN', 'PedestrianA', 'PedestrianB', 'VehicularA', 'VehicularB', 'ExtendedPedestrianA', 'ExtendedPedestrianB', or 'TDL-A_xxns','TDL-B_xxns','TDL-C_xxns' (with xx the RMS delay spread in ns, e.g. 'TDL-A_30ns'), or [1 0 0.2] (Self-defined power delay profile which depends on the sampling rate)
N,... % Number of total samples
Channel_Velocity_kmh/3.6*Channel_CarrierFrequency/2.998e8,... % Maximum Doppler shift: Velocity_kmh/3.6*CarrierFrequency/2.998e8
Channel_DopplerModel,... % Which Doppler model: 'Jakes', 'Uniform', 'Discrete-Jakes', 'Discrete-Uniform'. For "Discrete-", we assume a discrete Doppler spectrum to improve the simulation time. This only works accuratly if the number of samples and the velocity is sufficiently large
200, ... % Number of paths for the WSSUS process. Only relevant for a 'Jakes' and 'Uniform' Doppler spectrum
1,... % Number of transmit antennas
1,... % Number of receive antennas
true ... % Gives a warning if the predefined delay taps of the channel do not fit the sampling rate. This is usually not much of a problem if they are approximatly the same.
);
% PAM and QAM Object
QAM = Modulation.SignalConstellation(QAM_ModulationOrder,'QAM');
if strcmp(FBMC.Method(end-3),'O')
% FBMC-OQAM transmission, only real valued data symbols
PAMorQAM = Modulation.SignalConstellation(sqrt(QAM_ModulationOrder),'PAM');
else
% FBMC-QAM transmission, complex valued data symbols
PAMorQAM = Modulation.SignalConstellation(QAM_ModulationOrder,'QAM');
end
% Pre-allocate Transmit Power
Ps_FBMC = zeros(N_FBMC,1);
Ps_OFDM = zeros(N_OFDM,1);
Ps_WOLA = zeros(N_WOLA,1);
Ps_FOFDM = zeros(N_FOFDM,1);
Ps_UFMC = zeros(N_UFMC,1);
% Pre-allocate Power Spectral Density
PSD_FBMC = zeros(N_FBMC,1);
PSD_OFDM = zeros(N_OFDM,1);
PSD_WOLA = zeros(N_WOLA,1);
PSD_FOFDM = zeros(N_FOFDM,1);
PSD_UFMC = zeros(N_UFMC,1);
%% Start Simulation
tic
for i_rep = 1:Simulation_MonteCarloRepetitions
% Update channel
ChannelModel.NewRealization;
% Binary data
BinaryDataStream_FBMC = randi([0 1], FBMC.Nr.Subcarriers * FBMC.Nr.MCSymbols * log2(PAMorQAM.ModulationOrder),1);
BinaryDataStream_OFDM = randi([0 1], OFDM.Nr.Subcarriers * OFDM.Nr.MCSymbols * log2(QAM.ModulationOrder),1);
BinaryDataStream_WOLA = randi([0 1], WOLA.Nr.Subcarriers * WOLA.Nr.MCSymbols * log2(QAM.ModulationOrder),1);
BinaryDataStream_FOFDM = randi([0 1], FOFDM.Nr.Subcarriers * FOFDM.Nr.MCSymbols * log2(QAM.ModulationOrder),1);
BinaryDataStream_UFMC = randi([0 1], FOFDM.Nr.Subcarriers * FOFDM.Nr.MCSymbols * log2(QAM.ModulationOrder),1);
% Transmitted data symbols (map binary data to symbol)
x_FBMC = reshape( PAMorQAM.Bit2Symbol(BinaryDataStream_FBMC) , FBMC.Nr.Subcarriers , FBMC.Nr.MCSymbols);
x_OFDM = reshape( QAM.Bit2Symbol(BinaryDataStream_OFDM) , OFDM.Nr.Subcarriers , OFDM.Nr.MCSymbols);
x_WOLA = reshape( QAM.Bit2Symbol(BinaryDataStream_WOLA) , WOLA.Nr.Subcarriers , WOLA.Nr.MCSymbols);
x_FOFDM = reshape( QAM.Bit2Symbol(BinaryDataStream_FOFDM) , FOFDM.Nr.Subcarriers , FOFDM.Nr.MCSymbols);
x_UFMC = reshape( QAM.Bit2Symbol(BinaryDataStream_UFMC) , UFMC.Nr.Subcarriers , UFMC.Nr.MCSymbols);
% Transmitted signal in the time domain
s_FBMC = FBMC.Modulation( x_FBMC );
s_OFDM = OFDM.Modulation( x_OFDM );
s_WOLA = WOLA.Modulation( x_WOLA );
s_FOFDM = FOFDM.Modulation( x_FOFDM );
s_UFMC = UFMC.Modulation( x_UFMC );
% Channel convolution
r_FBMC_noNoise = ChannelModel.Convolution( s_FBMC );
r_OFDM_noNoise = ChannelModel.Convolution( s_OFDM );
r_WOLA_noNoise = ChannelModel.Convolution( s_WOLA );
r_FOFDM_noNoise = ChannelModel.Convolution( s_FOFDM );
r_UFMC_noNoise = ChannelModel.Convolution( s_UFMC );
% Channel for one tap equalizer (represents only an approximation because pulseform is not taken into account)
h_FBMC = ChannelModel.GetTransferFunction( FBMC.GetTimeIndexMidPos , FBMC.Implementation.FFTSize , (1:FBMC.Nr.Subcarriers) + FBMC.Implementation.IntermediateFrequency);
h_OFDM = ChannelModel.GetTransferFunction( OFDM.GetTimeIndexMidPos , OFDM.Implementation.FFTSize , (1:OFDM.Nr.Subcarriers) + OFDM.Implementation.IntermediateFrequency);
h_WOLA = ChannelModel.GetTransferFunction( WOLA.GetTimeIndexMidPos , WOLA.Implementation.FFTSize , (1:WOLA.Nr.Subcarriers) + WOLA.Implementation.IntermediateFrequency);
h_FOFDM = ChannelModel.GetTransferFunction( FOFDM.GetTimeIndexMidPos , FOFDM.Implementation.FFTSize , (1:FOFDM.Nr.Subcarriers) + FOFDM.Implementation.IntermediateFrequency);
h_UFMC = ChannelModel.GetTransferFunction( UFMC.GetTimeIndexMidPos , UFMC.Implementation.FFTSize , (1:UFMC.Nr.Subcarriers) + UFMC.Implementation.IntermediateFrequency);
% Calculate the transmitted power over time
Ps_FBMC = Ps_FBMC + abs(s_FBMC).^2;
Ps_OFDM = Ps_OFDM + abs(s_OFDM).^2;
Ps_WOLA = Ps_WOLA + abs(s_WOLA).^2;
Ps_FOFDM = Ps_FOFDM + abs(s_FOFDM).^2;
Ps_UFMC = Ps_UFMC + abs(s_UFMC).^2;
% Calculat the power spectral density
PSD_FBMC = PSD_FBMC + abs(fft(s_FBMC)/sqrt(N_FBMC)).^2;
PSD_OFDM = PSD_OFDM + abs(fft(s_OFDM)/sqrt(N_OFDM)).^2;
PSD_WOLA = PSD_WOLA + abs(fft(s_WOLA)/sqrt(N_WOLA)).^2;
PSD_FOFDM = PSD_FOFDM + abs(fft(s_FOFDM)/sqrt(N_FOFDM)).^2;
PSD_UFMC = PSD_UFMC + abs(fft(s_UFMC)/sqrt(N_UFMC)).^2;
for i_SNR = 1:length(Simulation_SNR_OFDM_dB)
% Add noise
SNR_OFDM_dB = Simulation_SNR_OFDM_dB(i_SNR);
Pn_time = 1/OFDM.GetSymbolNoisePower(1)*10^(-SNR_OFDM_dB/10);
noise = sqrt(Pn_time/2)*(randn(N,1)+1j*randn(N,1));
r_FBMC = r_FBMC_noNoise + noise(1:N_FBMC);
r_OFDM = r_OFDM_noNoise + noise(1:N_OFDM);
r_WOLA = r_WOLA_noNoise + noise(1:N_WOLA);
r_FOFDM = r_FOFDM_noNoise + noise(1:N_FOFDM);
r_UFMC = r_UFMC_noNoise + noise(1:N_UFMC);
% Demodulate FBMC signal
y_FBMC = FBMC.Demodulation(r_FBMC);
y_OFDM = OFDM.Demodulation(r_OFDM);
y_WOLA = WOLA.Demodulation(r_WOLA);
y_FOFDM = FOFDM.Demodulation(r_FOFDM);
y_UFMC = UFMC.Demodulation(r_UFMC);
% One-tap equalizer
y_OneTapEqualizer_FBMC = y_FBMC./h_FBMC;
y_OneTapEqualizer_OFDM = y_OFDM./h_OFDM;
y_OneTapEqualizer_WOLA = y_WOLA./h_WOLA;
y_OneTapEqualizer_FOFDM = y_FOFDM./h_FOFDM;
y_OneTapEqualizer_UFMC = y_UFMC./h_UFMC;
% Detect symbols (quantization and demapping to bits)
DetectedBitStream_OneTapEqualizer_FBMC = PAMorQAM.Symbol2Bit(y_OneTapEqualizer_FBMC(:));
DetectedBitStream_OneTapEqualizer_OFDM = QAM.Symbol2Bit(y_OneTapEqualizer_OFDM(:));
DetectedBitStream_OneTapEqualizer_WOLA = QAM.Symbol2Bit(y_OneTapEqualizer_WOLA(:));
DetectedBitStream_OneTapEqualizer_FOFDM = QAM.Symbol2Bit(y_OneTapEqualizer_FOFDM(:));
DetectedBitStream_OneTapEqualizer_UFMC = QAM.Symbol2Bit(y_OneTapEqualizer_UFMC(:));
% Calculate the BER
BER_FBMC_OneTapEqualizer(i_SNR,i_rep) = mean( BinaryDataStream_FBMC~=DetectedBitStream_OneTapEqualizer_FBMC );
BER_OFDM_OneTapEqualizer(i_SNR,i_rep) = mean( BinaryDataStream_OFDM~=DetectedBitStream_OneTapEqualizer_OFDM );
BER_WOLA_OneTapEqualizer(i_SNR,i_rep) = mean( BinaryDataStream_WOLA~=DetectedBitStream_OneTapEqualizer_WOLA );
BER_FOFDM_OneTapEqualizer(i_SNR,i_rep) = mean( BinaryDataStream_FOFDM~=DetectedBitStream_OneTapEqualizer_FOFDM );
BER_UFMC_OneTapEqualizer(i_SNR,i_rep) = mean( BinaryDataStream_UFMC~=DetectedBitStream_OneTapEqualizer_UFMC );
end
TimeNeededSoFar = toc;
if mod(i_rep,25)==0
disp([int2str(i_rep/Simulation_MonteCarloRepetitions*100) '% Completed. Time Left, approx. ' int2str(TimeNeededSoFar/i_rep*(Simulation_MonteCarloRepetitions-i_rep)/60) 'min, corresponding to approx. ' int2str(TimeNeededSoFar/i_rep*(Simulation_MonteCarloRepetitions-i_rep)/3600) 'hour'])
end
end
% Take "average"
Ps_FBMC = Ps_FBMC/Simulation_MonteCarloRepetitions;
Ps_OFDM = Ps_OFDM/Simulation_MonteCarloRepetitions;
Ps_WOLA = Ps_WOLA/Simulation_MonteCarloRepetitions;
Ps_FOFDM = Ps_FOFDM/Simulation_MonteCarloRepetitions;
Ps_UFMC = Ps_UFMC/Simulation_MonteCarloRepetitions;
PSD_FBMC = PSD_FBMC/Simulation_MonteCarloRepetitions;
PSD_OFDM = PSD_OFDM/Simulation_MonteCarloRepetitions;
PSD_WOLA = PSD_WOLA/Simulation_MonteCarloRepetitions;
PSD_FOFDM = PSD_FOFDM/Simulation_MonteCarloRepetitions;
PSD_UFMC = PSD_UFMC/Simulation_MonteCarloRepetitions;
% Define colors for different modulation schemes
ColorFBMC = [0 0 1]*0.5;
ColorOFDM = [1 0 0];
ColorWOLA = [1 0 1];
ColorFOFDM = [1 1 0]*0.7;
ColorUFMC = [0 1 0]*0.5;
% Plot BER
figure(1);
semilogy( Simulation_SNR_OFDM_dB , mean(BER_FBMC_OneTapEqualizer,2) ,'x-','color',ColorFBMC); hold on;
semilogy( Simulation_SNR_OFDM_dB , mean(BER_OFDM_OneTapEqualizer,2) ,'o-','color',ColorOFDM); hold on;
semilogy( Simulation_SNR_OFDM_dB , mean(BER_WOLA_OneTapEqualizer,2) ,'s-','color',ColorWOLA); hold on;
semilogy( Simulation_SNR_OFDM_dB , mean(BER_FOFDM_OneTapEqualizer,2) ,'d-','color',ColorFOFDM); hold on;
semilogy( Simulation_SNR_OFDM_dB , mean(BER_UFMC_OneTapEqualizer,2) ,'*-','color',ColorUFMC); hold on;
ylabel('Bit Error Ratio');
xlabel('Signal-to-Noise Ratio for OFDM [dB]');
% Theoretical bit error probability
if strcmp(Channel_PowerDelayProfile,'AWGN')
SNR_morePoints = linspace(min(Simulation_SNR_OFDM_dB),max(Simulation_SNR_OFDM_dB),100);
BitErrorProability = BitErrorProbabilityAWGN(SNR_morePoints,QAM.SymbolMapping,QAM.BitMapping);
semilogy( SNR_morePoints , BitErrorProability ,'black'); hold on;
ylim([10^-5 1]);
legend({'FBMC','OFDM','WOLA','f-OFDM','UFMC','Theory(OFDM)'},'Location','SouthWest');
else
SNR_morePoints = linspace(min(Simulation_SNR_OFDM_dB),max(Simulation_SNR_OFDM_dB),100);
BitErrorProability = BitErrorProbabilityDoublyFlatRayleigh(SNR_morePoints,QAM.SymbolMapping,QAM.BitMapping);
semilogy( SNR_morePoints , BitErrorProability ,'black'); hold on;
legend({'FBMC','OFDM','WOLA','f-OFDM','UFMC','Theory (Doubly-Flat, OFDM)'},'Location','SouthWest');
end
% Plot simulated power
figure(2);
time_FBMC = ((0:N_FBMC-1) *dt-FBMC_BlockOverlapTime);
time_OFDM = ((0:N_OFDM-1) *dt-FBMC_BlockOverlapTime);
time_WOLA = ((0:N_WOLA-1) *dt-FBMC_BlockOverlapTime);
time_FOFDM = ((0:N_FOFDM-1)*dt-FBMC_BlockOverlapTime);
time_UFMC = ((0:N_UFMC-1) *dt-FBMC_BlockOverlapTime);
plot( time_FBMC/1e-3 , Ps_FBMC, 'color',ColorFBMC); hold on;
plot( time_OFDM/1e-3 , Ps_OFDM, 'color',ColorOFDM); hold on;
plot( time_WOLA/1e-3 , Ps_WOLA, 'color',ColorWOLA); hold on;
plot( time_FOFDM/1e-3 , Ps_FOFDM, 'color',ColorFOFDM); hold on;
plot( time_UFMC/1e-3 , Ps_UFMC, 'color',ColorUFMC); hold on;
ylabel('Signal Power');
xlabel('Time [ms]');
legend({'FBMC','OFDM','WOLA','f-OFDM','UFMC'});
title('Simulation');
% Theory
if Simulation_PlotSignalPowerTheory
figure(5);
plot( time_FBMC/1e-3 , FBMC.PlotTransmitPower , 'color',ColorFBMC); hold on;
plot( time_OFDM/1e-3 , OFDM.PlotTransmitPower , 'color',ColorOFDM); hold on;
plot( time_WOLA/1e-3 , WOLA.PlotTransmitPower , 'color',ColorWOLA); hold on;
plot( time_FOFDM/1e-3 , FOFDM.PlotTransmitPower, 'color',ColorFOFDM); hold on;
plot( time_UFMC/1e-3 , UFMC.PlotTransmitPower , 'color',ColorUFMC); hold on;
ylabel('Signal Power');
xlabel('Time [ms]');
legend({'FBMC','OFDM','WOLA','f-OFDM','UFMC'});
title('Theory');
end
figure(3);
frequency_FBMC = (0:N_FBMC -1) / (N_FBMC *dt);
frequency_OFDM = (0:N_OFDM -1) / (N_OFDM *dt);
frequency_WOLA = (0:N_WOLA -1) / (N_WOLA *dt);
frequency_FOFDM = (0:N_FOFDM -1) / (N_FOFDM*dt);
frequency_UFMC = (0:N_UFMC -1) / (N_UFMC *dt);
plot( frequency_FBMC /1e6 , 10*log10(PSD_FBMC/max(PSD_FBMC)) ,'color',ColorFBMC); hold on;
plot( frequency_OFDM /1e6 , 10*log10(PSD_OFDM/max(PSD_FBMC)) ,'color',ColorOFDM); hold on;
plot( frequency_WOLA /1e6 , 10*log10(PSD_WOLA/max(PSD_FBMC)) ,'color',ColorWOLA); hold on;
plot( frequency_FOFDM/1e6 , 10*log10(PSD_FOFDM/max(PSD_FBMC)),'color',ColorFOFDM); hold on;
plot( frequency_UFMC /1e6 , 10*log10(PSD_UFMC/max(PSD_FBMC)) ,'color',ColorUFMC); hold on;
ylabel('Power Spectral Density [dB]');
xlabel('Frequency [MHz]');
ylim([-100 0]);
legend({'FBMC','OFDM','WOLA','f-OFDM','UFMC'});
title('Simulation');
% Note that the bitrate assumes infinitly many time symbols
fprintf('===========================================================================================\n');
fprintf('================== Basic Settings (guard time and band are ignored) =======================\n');
fprintf(' |(complex)TF-Spacing| Bandwidth(FL)| Time(KT) | BitRate \n');
fprintf('OFDM (with CP) |%17.2f |%8.2f MHz |%8.2f ms |%8.2f Mbit/s | \n', OFDM.PHY.TimeSpacing*OFDM.PHY.SubcarrierSpacing , OFDM.PHY.SubcarrierSpacing*OFDM.Nr.Subcarriers/1e6 , OFDM.PHY.TimeSpacing*OFDM.Nr.MCSymbols/1e-3 , length(DetectedBitStream_OneTapEqualizer_OFDM) /(OFDM.PHY.TimeSpacing*OFDM.Nr.MCSymbols)/1e6 );
fprintf('FBMC-OQAM |%17.2f |%8.2f MHz |%8.2f ms |%8.2f Mbit/s | \n', FBMC.PHY.TimeSpacing*FBMC.PHY.SubcarrierSpacing*2 , FBMC.PHY.SubcarrierSpacing*FBMC.Nr.Subcarriers/1e6 , FBMC.PHY.TimeSpacing*FBMC.Nr.MCSymbols/1e-3 , length(DetectedBitStream_OneTapEqualizer_FBMC) /(FBMC.PHY.TimeSpacing*FBMC.Nr.MCSymbols)/1e6 );
fprintf('WOLA |%17.2f |%8.2f MHz |%8.2f ms |%8.2f Mbit/s | \n', WOLA.PHY.TimeSpacing*WOLA.PHY.SubcarrierSpacing , WOLA.PHY.SubcarrierSpacing*WOLA.Nr.Subcarriers/1e6 , WOLA.PHY.TimeSpacing*WOLA.Nr.MCSymbols/1e-3 , length(DetectedBitStream_OneTapEqualizer_WOLA) /(WOLA.PHY.TimeSpacing*WOLA.Nr.MCSymbols)/1e6 );
fprintf('FOFDM |%17.2f |%8.2f MHz |%8.2f ms |%8.2f Mbit/s | \n', FOFDM.PHY.TimeSpacing*FOFDM.PHY.SubcarrierSpacing , FOFDM.PHY.SubcarrierSpacing*FOFDM.Nr.Subcarriers/1e6 , FOFDM.PHY.TimeSpacing*FOFDM.Nr.MCSymbols/1e-3 , length(DetectedBitStream_OneTapEqualizer_FOFDM)/(FOFDM.PHY.TimeSpacing*FOFDM.Nr.MCSymbols)/1e6 );
fprintf('UFMC |%17.2f |%8.2f MHz |%8.2f ms |%8.2f Mbit/s | \n', UFMC.PHY.TimeSpacing*UFMC.PHY.SubcarrierSpacing , UFMC.PHY.SubcarrierSpacing*UFMC.Nr.Subcarriers/1e6 , UFMC.PHY.TimeSpacing*UFMC.Nr.MCSymbols/1e-3 , length(DetectedBitStream_OneTapEqualizer_UFMC) /(UFMC.PHY.TimeSpacing*UFMC.Nr.MCSymbols)/1e6 );
fprintf('===========================================================================================\n');
fprintf('===========================================================================================\n');
fprintf('=============================== Transmitted Power =========================================\n');
fprintf(' | (Sim.) Trans. Energy | Time | (Sim.) Av. Power | SNR rel. to OFDM | \n');
fprintf('OFDM (with CP) | %17.2f mJ |%8.2f ms |%14.2f W |%14.2f dB | \n', sum(Ps_OFDM)*dt/1e-3 , OFDM.PHY.TimeSpacing*OFDM.Nr.MCSymbols/1e-3 , sum(Ps_OFDM)*dt/(OFDM.PHY.TimeSpacing*OFDM.Nr.MCSymbols) , 10*log10(OFDM.GetSymbolNoisePower(1) / OFDM.GetSymbolNoisePower(1)) );
fprintf('FBMC-OQAM | %17.2f mJ |%8.2f ms |%14.2f W |%14.2f dB | \n', sum(Ps_FBMC)*dt/1e-3 , FBMC.PHY.TimeSpacing*FBMC.Nr.MCSymbols/1e-3 , sum(Ps_FBMC)*dt/(FBMC.PHY.TimeSpacing*FBMC.Nr.MCSymbols) , 10*log10(OFDM.GetSymbolNoisePower(1) / FBMC.GetSymbolNoisePower(1)*(1+strcmp(FBMC.Method(end-3),'O'))));
fprintf('WOLA | %17.2f mJ |%8.2f ms |%14.2f W |%14.2f dB | \n', sum(Ps_WOLA)*dt/1e-3 , WOLA.PHY.TimeSpacing*WOLA.Nr.MCSymbols/1e-3 , sum(Ps_WOLA)*dt/(WOLA.PHY.TimeSpacing*WOLA.Nr.MCSymbols) , 10*log10(OFDM.GetSymbolNoisePower(1) / WOLA.GetSymbolNoisePower(1)) );
fprintf('FOFDM | %17.2f mJ |%8.2f ms |%14.2f W |%14.2f dB | \n', sum(Ps_FOFDM)*dt/1e-3 , FOFDM.PHY.TimeSpacing*FOFDM.Nr.MCSymbols/1e-3 , sum(Ps_FOFDM)*dt/(FOFDM.PHY.TimeSpacing*FOFDM.Nr.MCSymbols) , 10*log10(OFDM.GetSymbolNoisePower(1) / mean(mean(FOFDM.GetSymbolNoisePower(1))) ) );
fprintf('UFMC | %17.2f mJ |%8.2f ms |%14.2f W |%14.2f dB | \n', sum(Ps_UFMC)*dt/1e-3 , UFMC.PHY.TimeSpacing*UFMC.Nr.MCSymbols/1e-3 , sum(Ps_UFMC)*dt/(UFMC.PHY.TimeSpacing*UFMC.Nr.MCSymbols) , 10*log10(OFDM.GetSymbolNoisePower(1) / mean(mean(UFMC.GetSymbolNoisePower(1))) ) );
fprintf('===========================================================================================\n');
fprintf('===========================================================================================\n');
figure(4);
% Plot also the power delay profile.
ChannelModel.PlotPowerDelayProfile;
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Matlab
1
https://gitee.com/chenxuanlut/FBMC.git
git@gitee.com:chenxuanlut/FBMC.git
chenxuanlut
FBMC
FBMC
master

搜索帮助

0d507c66 1850385 C8b1a773 1850385