Function list
Common functions
#
DigitalComm.avgPower
— Method
Calculate the average power of the input signal σ = 1 / N Σ | x[n] | ^2
--- Syntax
σ = avgPower(x);
--- Input parameters
-
x : Input signal [Array{Any}]
--- Output parameters
-
σ : Estimated power [Float64]
---
v 1.0 - Robin Gerzaguet.
#
DigitalComm.getSIR
— Function
Returns the Signal to interference ratio expressed in dB (or in linear) between a obersvation signal d(n) and a reference signal u(n) The ratio is expressed as 10*log10( E[ || d(n) - u(n) || / E[||u(n)||^2] ) with E the expectation wrt to time The 2 vectors d and u should have the same length L
--- Syntax
sir = getSIR( d, u , type="dB")
--- Input parameter
-
d : Observation signal [Array{Any}]
-
u : Reference signal [Array{Any}]
-
type: Output unit [String]: "dB" or "Linear" (default, "dB")
--- Output parameters
-
sir : Signal to interference ratio in unit
type
---
v 1.0 - Robin Gerzaguet.
#
DigitalComm.qFunc
— Method
Returns the Q function used for Bit error rate computation in digital system Q(x)= 1/2 erfc(x/sqrt(2)) erfc is the Complexmplementary error function, i.e. the accurate version of 1-erf(x) for large x erfc is inherited from DSP
--- Syntax
y = qfunc(x)
--- Input parameters
-
x: Input [Float64]
--- Output parameters
-
y: Q(x)[Float64]
---
v 1.0 - Robin Gerzaguet.
#
DigitalComm.Waveform
— Type
Abstract type gathering all waveform configuration
v 1.0 - Robin Gerzaguet.
Quadrature Amplitude Modulation
#
DigitalComm.genBitSequence
— Function
Create a binary sequence and return a buffer with nbBits bits The array is of type UInt8 with x00 or x01) If stated, randSeed controls the seed of the random generator
--- Syntax
genBitsequence(nbBits,randSeed=-1);
--- Input parameters
-
nbBits : Number of bits to generate [Int]
-
randSeed : Seed of random process (default -> -1) [Int]
--- Output parameters
-
buffer : Populated buffer [Array{UInt8}]
#
DigitalComm.genBitSequence!
— Function
Create a binary sequence and populate input buffer with bits The array is of type UInt8 with x00 or x01) If stated, randSeed controls the seed of the random generator
--- Syntax
genBitsequence!(buffer,nbBits,randSeed=-1);
--- Input parameters
-
buffer : Buffer to populate [Array{UInt8,nbBits}]
-
nbBits : Number of bits to generate [Int]
-
randSeed : Seed of random process (default -> -1, no seed is used)
--- Output parameters
-
buffer : Populated buffer [Array{UInt8}]
#
DigitalComm.genByteSequence
— Function
Create a byte sequence and return a populated buffer with nbytes bytes The array
--- Syntax
genByteSequence(nbBytes,randSeed=-1);
--- Input parameters
-
nbBytes : Number of byte to generate [Int]
-
randSeed : Seed of random process (default -> -1)
--- Output parameters
-
buffer : Populated buffer [Array{UInt8}]
---
v 1.0 - Robin Gerzaguet.
#
DigitalComm.genByteSequence!
— Function
Create a byte sequence and populate input buffer with nbytes bytes The array is of type UInt8 with x00 to xff If stated, randSeed controls the seed of the random generator
--- Syntax
genByteSequence!(buffer,nbBytes,randSeed=-1);
--- Input parameters
-
buffer : Buffer to populate [Array{UInt8,nbByte}]
-
randSeed : Seed of random process (default -> -1)
--- Output parameters
-
buffer : Populated buffer [Array{UInt8}]
---
v 1.0 - Robin Gerzaguet.
#
DigitalComm.bitMappingQAM!
— Method
Quadrature Amplitude Modulation (QAM) function Apply symbol mapping to a input binary sequence (of size 1xL) with constellation size M. Output is a vector (1xN) with N = L / log2(M) Conventional gray mapping is used. Output constellation is casted in float, with unitary average power Supported constellation
-
QPSK
-
16-QAM
-
64-QAM
-
256-QAM
--- Syntax
bitMappingQAM!(qamMat,M,bitSeq)
--- Input parameters
-
qamMat : Complex Vector to populate of size length(bitSeq) / log2(M) [Array{Complex{Float64}}]
-
M : Modulation size (i.e from 4 to 256) such as bit per symbol is log2(M) [Int]
-
bitSeq : Binary sequence to be transformed into QPSK symbols [Array{UInt8}]
--- Output parameters
-
[]
#
DigitalComm.bitMappingQAM
— Method
Quadrature Amplitude Modulation (QAM) function Apply symbol mapping to a input binary sequence (of size 1xL) with constellation size M. Output is a vector (1xN) with N = L / log2(M) Conventional gray mapping is used. Output constellation is casted in float, with unitary average power Supported constellation
-
QPSK
-
16-QAM
-
64-QAM
-
256-QAM
--- Syntax
qamMat = bitMappingQAM(M,bitSeq)
--- Input parameters
-
M : Modulation size (i.e from 4 to 256) such as bit per symbol is log2(M) [Int]
-
bitSeq : Binary sequence to be transformed into QPSK symbols [Array{UInt8}]
--- Output parameters
-
qamMat : Complex Vector to populate of size length(bitSeq) / log2(M) [Array{Complex{Float64}}]
#
DigitalComm.bitDemappingQAM!
— Method
Quadrature Amplitude Modulation (QAM) hard decoding function Apply symbol hard demapping to a input symbol sequence (of size 1xN) with constellation size M. Output is a binary (1xL) with N = L / log2(M) Conventional gray demapping is used. Input constellation is Array{Complex{Float64}} Output bitsream is Array{Int8}
--- Syntax
bitDemappingQAM!(hardBits,M,qamVect)
--- Input parameters
-
hardBits : Vector of bits to populate [Array{UInt8}, length(qamVect)/log2(M)]
-
M : Constellation size (i.e from 4 to 256)
-
qamVect : Complex observation vector to decode.
--- Output parameters
-
[]
#
DigitalComm.bitDemappingQAM
— Method
Quadrature Amplitude Modulation (QAM) hard decoding function Apply symbol hard demapping to a input symbol sequence (of size 1xN) with constellation size M. Output is a binary (1xL) with N = L / log2(M) Conventional gray demapping is used. Input constellation is Array{Complex{Float64}} Output bitsream is Array{Int8}
--- Syntax
hardBits = bitDemappingQAM!(hardBits,M,qamVect)
--- Input parameters
-
M : Constellation size (i.e from 4 to 256)
-
qamVect : Complex observation vector to decode.
--- Output parameters
-
hardBits : Vector of bits to populate [Array{UInt8}, length(qamVect)/log2(M)]
#
DigitalComm.hardConstellation!
— Method
Quadrature Amplitude Modulation (QAM) hard decoding function Return the hard decoded constellation with voronoi baseds decision. The difference with bitDeMapping is that bitDeMapping returns the decoded bit sequence whereas hardConstellation returns the closest constellation point. This can be use to compute raw EVM estimation (assuming a sufficiently high SNR to avoid errors).
--- Syntax
hardConstellation!(qamDec,M,qamMat)
--- Input parameters
-
qamDec : Vector to populate [Array{Complex{Float64},N}] with N = length(qamMat)
-
M : Constellation size (i.e 4 to 256)
-
qamMat : Vector to decode
--- Output parameters
-
[]
#
DigitalComm.hardConstellation
— Method
Quadrature Amplitude Modulation (QAM) hard decoding function Return the hard decoded constellation with voronoi baseds decision. The difference with bitDeMapping is that bitDeMapping returns the decoded bit sequence whereas hardConstellation returns the closest constellation point. This can be use to compute raw EVM estimation (assuming a sufficiently high SNR to avoid errors).
--- Syntax
qamDec = hardConstellation!(qamDec,M,qamMat)
--- Input parameters
-
M : Constellation size (i.e 4 to 256)
-
qamMat : Vector to decode
--- Output parameters
-
qamDec : Vector to populate [Array{Complex{Float64},N}] with N = length(qamMat)
#
DigitalComm.calcLLR
— Method
Returns the final LLR value based on input distances
--- Syntax
llr = calcLLR(e0,e1,c)
--- Input parameters
-
e0 : Minimal distance 1
-
e1 : Minimal distance 2
-
c : Channel estimate
--- Output parameters
-
llr : Max likelihood estimate
---
v 1.0 - Robin Gerzaguet.
#
DigitalComm.llrToHardBits!
— Method
Returns hard binary value from soft LLR estimate (no FEC decoder, only hard decision here!)
--- Syntax
llrToHardBits(hardD,llr)
--- Input parameters
-
hardD : Hard binary decision [Array{UInt},N]
-
llr : Input LLR (Float64 or UInt8 array) [Union{[Array{UInt}],[Array{Float64}]}]
--- Output parameters
-
[]
---
v 1.0 - Robin Gerzaguet.
#
DigitalComm.llrToHardBits!
— Method
Returns hard binary value from soft LLR estimate (no FEC decoder, only hard decision here!)
--- Syntax
llrToHardBits(hardD,llr)
--- Input parameters
-
hardD : Hard binary decision [Array{UInt},N]
-
llr : Input LLR (Float64 or UInt8 array) [Union{[Array{UInt}],[Array{Float64}]}]
--- Output parameters
-
[]
---
v 1.0 - Robin Gerzaguet.
#
DigitalComm.llrToHardBits
— Method
Returns hard binary value from soft LLR estimate (no FEC decoder, only hard decision here!)
--- Syntax
hardD = llrToHardBits(llr)
--- Input parameters
-
llr : Input LLR (Float64 or UInt8 array) [Union{[Array{UInt}],[Array{Float64}]}]
--- Output parameters
-
hardD : Hard binary decision [Array{UInt},N]
---
v 1.0 - Robin Gerzaguet.
#
DigitalComm.llrToHardBits
— Method
Returns hard binary value from soft LLR estimate (no FEC decoder, only hard decision here!)
--- Syntax
hardD = llrToHardBits(llr)
--- Input parameters
-
llr : Input LLR (Float64 or UInt8 array) [Union{[Array{UInt}],[Array{Float64}]}]
--- Output parameters
-
hardD : Hard binary decision [Array{UInt},N]
---
v 1.0 - Robin Gerzaguet.
#
DigitalComm.llrToUInt!
— Method
Convert a LLR floating array to a UInt LLR Some method (espcially C functions as in libfec) expect LLR to be UInt value from 0 (Likely a 0) to 255 (Likely a 1). symbolDemappingQAM create a Float64 array from -infty (likely a 0) to nfty (Likely a 1). This function take a Float64 LLR estimate and output a UInt8 vector
--- Syntax
llrToUInt!(llrUInt,llr)
--- Input parameters
-
llrUInt : Output LLR in UInt [Array{UInt},N]
-
llr : Input LLR [Array{Float64},N]
--- Output parameters
-
[]
---
v 1.0 - Robin Gerzaguet.
#
DigitalComm.llrToUInt
— Method
Convert a LLR floating array to a UInt LLR Some method (espcially C functions as in libfec) expect LLR to be UInt value from 0 (Likely a 0) to 255 (Likely a 1). symbolDemappingQAM create a Float64 array from -infty to infty. This function take a Float64 LLR estimate and output a UInt8 vector
--- Syntax
llrUInt = llrToUInt(llr)
--- Input parameters
-
llr : Input LLR [Array{Float64},N]
--- Output parameters
-
llrUInt : Output LLR in UInt [Array{UInt},N]
---
v 1.0 - Robin Gerzaguet.
#
DigitalComm.symbolDemappingQAM!
— Method
--- Description
Returns the log likelihood ratio of the incoming sequence qamSeq based on the channel estimates channelIn qamSeq is an input noisy QAM sequence with same size of channel estimate vector Output is populated by soft output binary sequence to be fed in a FEC
--- Syntax
output = :symbolDemappingQAM(mcs,qamSeq,channel)
--- Input parameters
-
output : Soft bits [Array{UInt8},N*log2(mcs)]
-
mcs : Constellation size (from 4 to 256) [Int]
-
qamSeq : Complex noisy received sequence (after equalization) [Array{Float64},N]
-
channel : Complex channel estimate [Array{Float64},N]
--- Output parameters
-
[]
---
v 1.0 - Robin Gerzaguet.
#
DigitalComm.symbolDemappingQAM
— Method
--- Description
Returns the log likelihood ratio of the incoming sequence qamSeq based on the channel estimates channelIn. Max log approximation is considered qamSeq is an input noisy QAM sequence with same size of channel estimate vector Output is a vector of soft output binary sequence to be fed in a FEC
--- Syntax
output = symbolDemappingQAM(mcs,qamSeq,channel)
--- Input parameters
-
mcs : Constellation size (from 4 to 256) [Int]
-
qamSeq : Complex noisy received sequence (after equalization) [Array{Float64},N]
-
channel : Complex channel estimate [Array{Float64},N]
--- Output parameters
-
output : Soft bits [Array{UInt8},N*log2(mcs)]
Channels
#
DigitalComm.addNoise
— Method
Add a white additive circular gaussian noise to input signal Added noise is real if input signal is real and computedlex is input signal is complex Noise level is controled by the second input parameter which is the signal to noise ratio (SNR) Signal power powSig is computed based in the input sequence power (average power in time domain) although a third parameter (theoretical power of input signal is given). In that case, snr is computed based on the value powSig output parameters are the signal with noise, and the noise samples See the bang methods for non-buffer alloc.
--- Syntax
[y,n] = addNoise(x,snr,powSig);
--- Input parameters
-
x= Input signal [Array{Real{Float64}}, Array{Complex{Float64}}] of size N
-
snr= Desired signal to noise ratio [Float64]
-
powSig= Power of input signal. If not given, power is evaluated based on input signal x
--- Output parameters
-
y= Signal with noise [Array{Real{Float64}}, Array{Complex{Float6464}}] of size N
-
n= noise samples [Array{Real{Float64}}, Array{Complex{Float64}}] of size N
---
v 1.0 - Robin Gerzaguet.
#
DigitalComm.rayleighChan
— Function
Generates a correlated random rayleigh sequence of size N, parametrized by the doppler frequency fd and the sampling frqeuency fs. The method uses IFFT approach described in [1]
--- Syntax
α = rayleighChan(nbPath,N,fs,fd,seed=-1)
--- Input parameters
-
nbPath : Number of path to be generated (>0) [Int]
-
N : Size of desired output (size of FFT) [Union{Int,Float64}]
-
fs : Sampling frequency [Union{Int,Float64}]
-
fd : doppler frequency [Union{Int,Float64}]
-
seed: Seed for random generation ([Int], default =-1)
--- Output parameters
-
α : Complex rayleigh coefficient [Array{Complex{Float64},N}]
--- References
[1] D. J. Young and N. C. Beaulieu, "The generation of correlated Rayleigh random variates by inverse discrete Fourier transform," in IEEE Transactions on Communications
---
#
DigitalComm.getChannel
— Function
Create a channelImpl based on desired channel model and number of realisations
--- Syntax
channelImpl = getChannel(nbSamples,channelModel,randSeed=-1)
--- Input parameters
-
nbSamples : Number of samples on which channel will be applied [Int]
-
channelModel : Channel object [ChannelModel]
-
randSeed : Desired seed (default -1)
--- Output parameters
-
channelImpl : Channel implementation
---
#
DigitalComm.getFIRResponse
— Function
Returns a complete FIR response based on the power profile (in linear scale), the delay profile (in s) and the sampling frequency.
--- Syntax
cir = getFIRResponse(delayProfile:,powerProfile,freq,sincSupport=5,interpSystem=0)
--- Input parameters
-
delayProfile : Vector of delay in second [Union{Array{Int},Array{Float64}}]
-
powerProfile : Vector of attenuation with same size of delayProfile in linear scale with rayleigh distribution
-
freq : Sampling frequency
-
sincSupport : Size of interpolator (default 5)
-
interpSystem : Forcing extra delay for all samples to have proper interpolation of the FIR beginning (default 0)
--- Ouput parameters
-
cir : Finite impulse response [Array{Complex{Float64}},max(delayProfile)+sincSupport]
---
#
DigitalComm.initChannel
— Method
Create a channel object associated to physical parameters and propagation profile.
--- Syntax
channObj = initChannel(profile,carrierFreq,samplingFreq,dopplerFreq;powerProfile=[],delayProfile=[],randSeed=-1)
--- Input parameters
-
profile : Multipath profile (see below) [String]
-
carrierFreq : Carrier frequency in Hz [Union{Int,Float64}]
-
samplingFreq: baseband sampling frequency [Union{Int,Float64}]
-
speed : Velocity (km/h) [Float64]
-
powerProfile : User defined power profile (default []). In case when it is defined, delayProfile should also be defined and profile is not used. [Array{Float}]
-
delayProfile : User defined delay profile in second [Array{Float64}]
-
randSeed : Seed if necessary (default: -1) [Float64]
--- Output parameters
-
channel : Julia Channel Object [Channel]
--- Channel models
-
ETU : Extended Typical Urban - EVA : Extended Vehicular area - TDLC : - Rayleigh : Single tap rayleigh channel model
---
#
DigitalComm.ChannelImpl
— Type
Object with channel realisations
--- Syntax
-
timeVarying : Flag for constant vs time varying channel [Int]
-
cir : CIR matrix (nbTap x nbChannel) [Union{Array{Int},Array{Float64},Array{Complex{Float64}}}]
-
channelModel : Model use for generation [DigitalComm.ChannelModel]
-
powerLin : Power distribution with the rayleigh distribution [Array{Complex{Float64}}]
-
randSeed : Seed use for rayleigh generation
---
v 1.0 - Robin Gerzaguet.
#
DigitalComm.ChannelModel
— Type
Channel model object
--- Syntax
-
profile : Name of profile [String]
-
carrierFreq : Carrier frequency [Union{Int,Float64}]
-
samplingFreq : Sampling frequency [Union{Int,Float64}]
-
speed : Desired speed (km/h) [Union{Int,Float64}]
-
powerProfile : Distribution of power values in dB [Array{Float64}]
-
delayProfile : Distribution of delay values in s link:same size as powerProfile[Array{Float64}]
-
dopplerFreq : Doppler frequency (inherited from samplingFreq and speed)
-
delaySpread : Max support of CIR in samples [Int]
---
Waveforms
Common functions
#
DigitalComm.decodeSig
— Method
Create a signal based on a waveform dictionnary and a desired configuration (i.e the key)
--- Syntax
sigId = decodeSig(qamMat,dWav,key)
--- Input parameters
-
signal : Time domain signal
-
qamMat : Time frequency complex QAM matrix [Array{Complex{Float64}}]
-
dWav : Waveform dictionnary (see initWaveforms)
-
key : Desired waveform configuration
--- Output parameters
---
v 1.0 - Robin Gerzaguet.
#
DigitalComm.decodeSig
— Method
Decode a time domain signal for a given multicarrier waveform and returns a T/F QAM constellation. Input are the compelx baseband signal and the Waveform structure.
--- Syntax
qamDec = decodeSig(signal,struc);
--- Input parameters
-
signal : Time domain signal
-
struc : Waveform structure
--- Output parameters
-
qamDec : Time frequency complex QAM matrix [Array{Complex{Float64}}]
---
v 1.0 - Robin Gerzaguet.
#
DigitalComm.genSig
— Method
Generate a time domain signal for a given multicarrier waveform. Input are the Time-Frequency matrix qamMat and the Waveform structure.
--- Syntax
sigId = genSig(qamMat,struc::Waveform)
--- Input parameters
-
qamMat : Time frequency complex QAM matrix [Array{Complex{Float64}}]
-
struc : Waveform structure
--- Output parameters
-
sigId : Time domain signal
---
v 1.0 - Robin Gerzaguet.
#
DigitalComm.genSig
— Method
Create a signal based on a waveform dictionnary and a desired configuration (i.e the key)
--- Syntax
sigId = genSig(qamMat,dWav,key)
--- Input parameters
-
qamMat : Time frequency complex QAM matrix [Array{Complex{Float64}}]
-
dWav : Waveform dictionnary (see initWaveforms)
-
key : Desired waveform configuration
--- Output parameters
-
sigId : Time domain signal
---
v 1.0 - Robin Gerzaguet.
#
DigitalComm.getWaveformName
— Method
Returns the waveform name based on input type structure
--- Syntax
name = getWaveformName(struc)
--- Input parameters
-
struc : Waveform structure [Waveform]
--- Output parameters
-
name : String associated to waveform name
---
v 1.0 - Robin Gerzaguet.
#
DigitalComm.initWaveforms
— Method
Create a dictionnary of waveform configurations. To compare and use the same script for different waveform configuration, we propose to add a dictionnary to have a container that contains all waveform configuraton. The function is called with every desired waveform structure. The dictionnary as a key associated to the waveform name, and a field associated to the waveform structure. If the waveform is present several times (several configuration with same waveform type, for instance FBMC with different overlapping factor values), a counter index is added to the waveform key.
--- Syntax
dWav = initWaveforms(x1,x2,...)
--- Input parameters
-
x : Waveform structure [Waveform]
--- Output parameters
-
dWav : Dictionnary of waveforms.
---
v 1.0 - Robin Gerzaguet.
#
DigitalComm.genZCSequence
— Function
Constant Modulus Zero Autocorrelation (CAZAC) sequence generation. Sequence can be used as preamble sequences for OFDM systems. The function generate the ZC sequence in frequency domain. Generates a Zadoff-Chu sequence on allocated subcarrier mapped on nFFT vector with generated kernel muPSS and power boost zcBoost
--- Syntax
zcSeq = genZCSequence(nFFT,allocatedSubcarrier,muPSS=0,zcBoost=0)
--- Input parameters
-
nFFT : FFT size for output [Int]
-
allocatedSubcarrier : vector of allocated subcarrier [Array{Int,L}].
-
muPSS : Kernel for ZC sequence [Int] — default 0
-
zcBoost : Power boost (in dB) applied to sequence [Float32] — default 0.
--- Output parameters
-
zcSeq : ZC sequence [Array{Complex{Float64}},nFFT]
---
v 1.0 - Robin Gerzaguet.
#
DigitalComm.getLTEAlloc
— Method
Returns the vector of allocated subcarriers associated to Long Term evolution frequency mapping. In LTE, depending on FFT size, only few subcarriers are allocated (45-55%). This function takes a FFT size as input and returns an array of size nbSubcarriers
--- Syntax
allocatedSubcarrier = getLTEAlloc(nFFT)
--- Input parameters
-
nFFT : Desired FFT size (128, 256, 512, 1024, 1536, 2048, 4096) [Int]
--- Output parameters
-
allocatedSubcarrier : Vector of subcarriers index [Array{Int}]
---
v 1.0 - Robin Gerzaguet.
BF-OFDM
#
DigitalComm.getBFOFDMFilter
— Method
Returns prototype fitlering matrix for BF-OFDM with specified by overlapping factor K, PPN size nFBMC, filter type. Additional parameters are the CP size of the precoding stage (set to optimal value by default) and filter structure for specific parameter overset.
--- Syntax
(p,pF) = getBFOFDMFilter(K,nFBMC,filter;GI,BT,filterStopBand,fS)>
--- Input parameters
-
K : Overlapping factor [Int]
-
nFBMC : PPN size (Number of FBMC carriers) [Int]
-
filter: Filter type: "Gaussian","phydyas","FS","DC": [String]
-
BT : Bandwidth time product for custom gaussian filter (used with "gaussian") [Float64]
-
filterStopBand : Attenuation with custom DC window (used with "DC") [Float64]
-
fS : Frequency sampling custom coefficients (Array{Float64,K}) (used with "fs")
--- Output parameters
-
p : Filter impulse response [Array{Float64,K*nFBMC}].
-
pF : Filter coefficient in frequency domain (For Frequency sampling implementation)
Filter types All filter type can be called with 2 ways. "filter" and "filteropt". When "filteropt" is used, the filter coefficient are obtained through numerical optimisation (SIR optimisation). Otherwise, it uses its associated parameter to extract appropriate coefficients. See [1] and [2] for filter optimisation principles. See [4] for special cases about 5G-NR compatibilty. The supported filter/windows are:
-
Gaussian : Gaussian filter shape, specified by BT. Optimized Gaussian shape can be used [1]
-
phydyas : Classic FBMC pulse shape defined in frequency domain [3]
-
FS : Coefficient defined in frequency domain. Filter coefficient are based on intrinsic SIR optimisation [1]
-
DC : Dolph Chebyshev window. Can be based on window optimisation (SIR optimisation) or defined by filterStopBand parameter.
---
References
-
[1] Demmer, D and Gerzaguet, R and Doré, J-B and Le Ruyet, D. and Kténas, D, "Filter Design for 5G BF-OFDM Waveform", 2017.
-
[2] A. Sahin, I. Guvenc, and H. Arslan, "`A Survey on Multicarrier Communications: Prototype Filters, Lattice Structures, and Implementation Aspects", 2014
-
[3] Phydyas project, "Deliverable D5.1 : Prototype filter and structure optimization", 2009
-
[4] Demmer, D and Rostom, Z and Gerzaguet, R and Doré, J-B and Le Ruyet, D. "Study of OFDM Precoded Filter-Bank Waveforms", 2018
Examples
Get a classic FBMC filter with phydyas and an overlapping factor of 4, with a input PPN of size 64. The precodinng stage is a OFDM of size 64 and a GI of size 4.
# --- phydyas filter ( hphydyas,hFphydyas ) = getBFOFDMFilter(4,64,"phydyas"); # --- Gaussian shape ( hGaussian,hFGaussian ) = getBFOFDMFilter(4,64,"Gaussian_opt",GI=4); # --- Custom Gaussian window ( hGaussianC,hFGaussianC ) = getBFOFDMFilter(4,64,"Gaussian",GI=4,BT=0.5)
---
v 1.0 - Robin Gerzaguet.
#
DigitalComm.bfofdmSigGen
— Method
Creates a Block Filtered - OFDM (BF-OFDM) signal parametrized by its numerlogy and its waveform parameter. Generate a time domain signal based on the input matrix qamMat. The input matrix is a T/F matrix of size (nRe x nbSymb) with nRe the number of allocated subcarrier and nbSymb the number of symbols.
The waveform is parametrized by the PPN size (number of carriers) nFBMC, the size of the precoding stage nOFDM, the CP size of the precoding stage GI and the compression factor parameter δ. See [1], [2] for waveform description and [3,5] for importance and design of compression rate (set to 0.5 in former works on BF-OFDM).
BF-OFDM is characterized by its pulse shape filter. Pulse shape can be automatically tuned to optimal (in terms of innterference management) [4]. In such a case, filterType should be a string (can be "gaussianopt", "dcopt" and "fs_opt"). For a specific pulse shape filter, an array of the nFBMC*K filter taps should be given (and generated for example with getBFOFDMFilter).
--- Syntax
sigId =bfofdmSigGen(qamMat,nFBMC,nOFDM,K,GI,δ,allocatedSubcarriers,filterType;typeTx="PPN")
--- Input parameters
-
qamMat : T/F symbols to transmit (QAM symbols) [Array{Complex{Float64},nRe,nbSymb] with nbSymb number of BF-OFDM symbols and nRe number of allocated subcarriers.
-
nFBMC : PPN size
-
nOFDM : OFDM precoding size
-
GI : CP size of precoding stage
-
K : Overlapping factor
-
δ : Compression rate
-
allocatedSubcarriers : Vector or allocated subcarriers Array{Int,nRe} with maximum(nRe) < nOFDMnFBMCδ
-
filterType : Pulse shape type. Can be a string (see getBFOFDMFilter) or a vector of size K x nFBMC with filter taps.
-
typeTx : Filterbank architecture. Can be "PPN" (polyphase network) or "FS" (frequency spreading) if filterType is of type "fs" or "fs_opt".
--- Output parameters
-
sigId : Time domainn BF-OFDM signal. [Array{Complex{Float64},nChip}.
---
References
-
[1] Gerzaguet, R and Demmer, D and Doré, J-B and Le Ruyet, D. and Kténas, D, "Block-Filtered OFDM: A new Promising Waveform for Multi-service Scenarios", 2017
-
[2] Demmer, D and Gerzaguet, R and Doré, J-B and Le Ruyet, D. and Kténas, D, "Block-filtered OFDM: A novel waveform for future wireless technologies", 2017.
-
[3] Demmer, D and Rostom, Z and Gerzaguet, R and Doré, J-B and Le Ruyet, D. "Study of OFDM Precoded Filter-Bank Waveforms", 2018
-
[4] Demmer, D and Gerzaguet, R and Doré, J-B and Le Ruyet, D. and Kténas, D, "Filter Design for 5G BF-OFDM Waveform", 2017.
-
[5] Demmer, D.; Zakaria, R.; Gerzaguet, R.; Doré, J. & Le Ruyet, D. Study of OFDM Precoded Filter-Bank Waveforms, IEEE Transactions on Wireless Communications, 2019.
v 1.0 - Robin Gerzaguet.
#
DigitalComm.initBFOFDM
— Method
BF-OFDM initialisation
--- Syntax
bfofdm = initBFOFDM(nFBMC::Int,nOFDM::Int,K::Int,GI::Int,δ::Float64,allocatedSubcarriers::Array{Int},filterType::String;BT=-1,filterStopBand=-1,fS=[],nFFT=-1,nCP=-1)
--- Input parameters
-
nFBMC : Number of carriers (PPN size)
-
nOFDM : Number of subbcarriers per carrier (OFDM precoder size)
-
K : Overlapping factor of the PPN
-
GI : CP size of the precoder
-
δ : Rate factor (compression factor)
-
allocatedSubcarriers : Vector of allocated subcarriers
-
filterName : Type of filter used (name)
-
filterTaps : FIR coefficient values
-
BT : Gaussian parameters (if gaussian filter is used)
-
filterStopBand : DolphChebyshev attenuation factor (if DC is used)
-
fS : Frqeuency spreading coefficients (if FS filter is used)
-
nFFT : Equivalent OFDM FFT size
-
nCP : Equivalent OFDM CP size
--- Output parameters
bfofdm : BF-OFDM structure
---
v 1.0 - Robin Gerzaguet.
#
DigitalComm.StrucBFOFDM
— Type
BF-OFDM structure
--- Syntax
-
nFBMC : Number of carriers (PPN size)
-
nOFDM : Number of subbcarriers per carrier (OFDM precoder size)
-
K : Overlapping factor of the PPN
-
GI : CP size of the precoder
-
δ : Rate factor (compression factor)
-
allocatedSubcarriers : Vector of allocated subcarriers
-
filterName : Type of filter used (name)
-
filterTaps : FIR coefficient values
-
BT : Gaussian parameters (if gaussian filter is used)
-
filterStopBand : DolphChebyshev attenuation factor (if DC is used)
-
fS : Frqeuency spreading coefficients (if FS filter is used)
-
nFFT : Equivalent OFDM FFT size
-
nCP : Equivalent OFDM CP size
---
v 1.0 - Robin Gerzaguet.
#
DigitalComm.bfofdmSigDecode
— Method
Demodulate a BF-OFDM signal and returns the obtained T/F matrix composed of QAM symbols (without equalisation). Based on bfofdmSigGen.jl
--- Syntax
qamRx = bfofdmSigDecode(sigRx,nFBMC,nOFDM,K,GI,δ,allocatedSubcarriers;posWindow="end")
--- Input parameters
-
sigRx : Complex baseband signal to decode [Array{Complex{Float64}}]
-
nFBMC : PPN size [Int]
-
nOFDM : FFT precoder size [Int]
-
K : Overlapping factor [Int]
-
GI : CP size of precoder [Int]
-
δ : Compression rate [Float64]
-
allocatedSubcarriers : Vector of allocated subcarriers [Array{Int}]
-
posWindow : Receiver window position. By default window is at same place as OFDM (i.e drop CP). For BF-OFDM, middle window position can also be considered with small delay spread channel (reduce ISI incuded by PPN). In that case, a phase rotation must be applied (see [1])
--- Output parameters
-
qamRx : Decoded constellation [Array{Complex{Float64}}]
References
-
[1] : Demmer, D.; Zakaria, R.; Gerzaguet, R.; Doré, J. & Le Ruyet, D. Study of OFDM Precoded Filter-Bank Waveforms, IEEE Transactions on Wireless Communications, 2019.
---
v 1.0 - Robin Gerzaguet.
#
DigitalComm.getBFOFDM_carrierFromSubcarriers
— Method
Get the index of the allocated carriers based on the index of the subcarriers. We consider here that a FBMC carriers bear data (i.e is allocated) is at least one of its subcarrier is enable.
--- Syntax
fbmcCarriers = getBFOFDM_carrierFromSubcarriers(nFBMC,nOFDM,δ,subcarrier)
--- Input parameters
-
nFBMC : FBMC carrier size (number of carriers) [Int]
-
nOFDM : OFDM subcarrier size [Int]
-
δ : Rate factor [Float64]
-
fbmcCarriers : Vector of allocated carrier [Array{Int,L}], L < nFBMCnOFDMδ
--- Output parameters
-
fbmcCarriers : Vector of allocated carriers [Array{Int, P ] P < nFBMC
---
v 1.0 - Robin Gerzaguet.
#
DigitalComm.getBFOFDM_oversampledGridSubcarriers
— Method
Returns the oversampled grid at the subcarrier level for BF-OFDM. In BF-OFDM as we use a nOFDMnFBMC grid with nOFDMδ allocated subcarrier per carriers (for a precodinng stage of size nOFDM), it can be usefull to get all the index of the allocated subcarrier per carrier. The output is a vector of the allocated subcarrier index in the oversampled frequency grid.
--- Syntax
subcarrierTx = getCarrierFromSubcarriers(nOFDM,δ,fbmcCarriers)
--- Input parameters
-
nOFDM : OFDM subcarrier size [Int]
-
δ : Rate factor [Float64]
-
fbmcCarriers : Vector of allocated carrier [Array{Int,L}], L < nFBMCnOFDMδ
--- Output parameters
-
subcarrierTx : Vector of allocated carriers [Array{Int, LnOFDMδ ]
---
v 1.0 - Robin Gerzaguet.
#
DigitalComm.getBFOFDM_subCarrierFromFBMCCarriers
— Method
Get the index of the oversampled carrier (i.e subcarriers index in the precoding field) based on the index of the allocated carriers. It is assumed that for each carriers, all subcarriers are enable (with orthogonality, i.e Nδ allocated subcarriers).
--- Syntax
subcarriers = getBFOFDM_subCarrierFromFBMCCarriers(nFBMC,nOFDM,δ,fbmcCarriers)
--- Input parameters
-
nFBMC : FBMC carrier size (number of carriers) [Int]
-
nOFDM : OFDM subcarrier size [Int]
-
δ : Rate factor [Float64]
-
fbmcCarriers : Vector of allocated carrier [Array{Int,L}], L < nFBMC
--- Output parameters
-
subcarriers : Vector of allocated subcarriers [Array{Int, L δ ]
v 1.0 - Robin Gerzaguet.
FBMC
#
DigitalComm.fbmcSigGen
— Method
Generate a FBMC-OQAM signal in time domain, based on input complex matrix (before OQAM processing) and FBMC parameters.
Transmitter is based on Polyphase Network implementation, with PHYDIAS filter (parametrized by overlapping factor).
--- Syntax
fbmcSigGen(qamMat,nFFT,K,allocatedSubcarriers)
--- Input parameters
-
qamMat : Complex QAM Time-Frequency matrix [Array{Complex{Float64}}]
-
nFFT : FFT size [Int]
-
K : Overlapping factor [Int]
-
allocatedSubcarriers : Vector of allocated subcarriers [Array{Int}]
--- Output parameters
-
sigId : Complex baseband signal in time domain [Array{Complex{Float64}},nbEch]; nbEch = (2nbSymb-1)nFFT/2+nFFTK)
---
v 1.0 - Robin Gerzaguet.
#
DigitalComm.getFBMCFilter
— Method
Returns the PHYDIAS time domain impulse response of desired FBMC filter parametrized by its overlapping factor and FFT size
--- Syntax
p = getFBMCFilter(K,nFFT,type);
--- Input parameters
-
K : Overlapping factor
-
nFFT: FFT size
--- Output parameters
-
p : FBMC time impulse response
---
v 1.0 - Robin Gerzaguet.
#
DigitalComm.initFBMC
— Method
Initiate FBMC structure
--- Syntax
fbmc = initFBMC(nFFT,K,allocatedSubcarriers)
--- Input parameters
-
nFFT : FFT size
-
K : Overlapping factor
-
allocatedSubcarriers : Vector of allocated subcarriers [Array{Int}]
--- Output parameters
-
fbmc : FBMC structure [StrucFBMC]
---
v 1.0 - Robin Gerzaguet.
#
DigitalComm.oqamMapping
— Method
Apply OQAM pre-processing to incoming matrix qamMat of size nbSubcarriers x nbSymb
--- Syntax
oqamMat = oqamConversion(qamMat)
--- Input parameters
-
qamMat : Input complex qam Matrix [Array{Complex{Float64,nbSubcarriers,nbSymb}}]
--- Output parameters
-
oqamMat : OQAM matrix (pure real and pure imag. alterns) [Array{Complex{Float64,nbSubcarriers,nbSymb*2}}]
---
v 1.0 - Robin Gerzaguet.
#
DigitalComm.StrucFBMC
— Type
FBMC waveform structure
--- Syntax
-
nFFT : FFT size
-
K : Overlapping factor
-
allocatedSubcarriers : Vector of allocated subcarriers [Array{Int}]
---
v 1.0 - Robin Gerzaguet.
#
DigitalComm.fbmcSigDecode
— Method
Demodulate FBMC waveform based on the dual operation of fbmcSigGen
FBMC is parametrized by its FFT size, its cyclic prefix length (in samples) and the allocSubcarriers vector
Syntax
sigId = fbmcSigDecode(sigRx,nFFT,K,allocSubcarriers)
--- Input parameters
-
sigRx : Time domain FBMC signal [Array{Complex{Float64},nbEch}]
-
nFFT : FFT size [Int]
-
K : Overlapping factor [Int]
allocSubcarriers : Vector of index of allocated subcarriers [Array{Int,nbSubcarriers}]
--- Output parameters
-
qamMat : Time frequency matrix : [Array{Complex{Float64},nbSubcarriers,nbSymb}]
---
v 1.0 - Robin Gerzaguet.
#
DigitalComm.oqamDemapping
— Method
Apply OQAM demapping to incoming OQAM matrix qamMat of size nbSubcarriers x 2nbSymb
--- Syntax
qamMat = oqamDemapping(qamMat)
--- Input parameters
-
oqamMat : OQAM matrix (pure real and pure imag. alterns) [Array{Complex{Float64,nbSubcarriers,nbSymb*2}}]
--- Output parameters
-
qamMat : Output complex qam Matrix [Array{Complex{Float64,nbSubcarriers,nbSymb}}]
---
v 1.0 - Robin Gerzaguet.
OFDM
#
DigitalComm.initOFDM
— Method
Create OFDM structure
--- Syntax
ofdm = initOFDM(nFFT,nCP,allocatedSubcarriers)
--- Input parameters
-
nFFT : FFT size [Int]
-
nCP : Cyclic prefix size [Int]
-
allocatedSubcarrier : Vector of allocated subbcarriers [Array{Int}]
--- Output parameters
-
ofdm : OFDM structure [StrucOFDM]
---
v 1.0 - Robin Gerzaguet.
#
DigitalComm.ofdmSigGen!
— Method
Populate a OFDM signal in time domain based on input T/F matrix and OFDM parameters
qamMat is a complex symbol matrix (for instance QPSK) of size length(allocatedSubcarriers) x nbSymb
The output signal in time domain is of size (nFFT+nCP)xnbSymb.
--- Syntax
ofdmSigGen!(sigId,qamMat,nFFT,nCP,allocatedSubcarriers)
--- Input parameters
-
sigId : Signal in time domain [Array{Complex{Float64}},(nFFT+nCP)xnbSymb]
-
qamMat : Complex T/F matrix to map [Array{Float64},length(allocatedSubcarriers),nbSymb]
-
nFFT : FFT size [Int]
-
nCP : Cylic prefix size [Int]
-
allocatedSubcarrier : Vector of allocated subbcarriers [Array{Int}]
--- Output parameters
-
[]
---
v 1.0 - Robin Gerzaguet.
#
DigitalComm.ofdmSigGen!
— Method
Populate a OFDM signal in time domain based on input T/F matrix and OFDM structure
qamMat is a complex symbol matrix (for instance QPSK) of size length(allocatedSubcarriers) x nbSymb
The output signal in time domain is of size (nFFT+nCP)xnbSymb.
--- Syntax
ofdmSigGen!(sigId,qamMat,nFFT,nCP,allocatedSubcarriers)
--- Input parameters
-
sigId : Signal in time domain [Array{Complex{Float64}},(nFFT+nCP)xnbSymb]
-
qamMat : Complex T/F matrix to map [Array{Float64},length(allocatedSubcarriers),nbSymb]
-
ofdm : OFDM structure [StrucOFDM]
--- Output parameters
-
[]
---
v 1.0 - Robin Gerzaguet.
#
DigitalComm.ofdmSigGen
— Method
Create OFDM signal in time domain based on input T/F matrix and OFDM parameters
qamMat is a complex symbol matrix (for instance QPSK) of size length(allocatedSubcarriers) x nbSymb
The output signal in time domain is of size (nFFT+nCP)xnbSymb.
--- Syntax
sigId = ofdmSigGen(qamMat,nFFT,nCP,allocatedSubcarriers)
--- Input parameters
-
qamMat : Complex T/F matrix to map [Array{Float64},length(allocatedSubcarriers),nbSymb]
-
nFFT : FFT size [Int]
-
nCP : Cylic prefix size [Int]
-
allocatedSubcarrier : Vector of allocated subbcarriers [Array{Int}]
--- Output parameters
-
sigId : Signal in time domain [Array{Complex{Float64}},(nFFT+nCP)xnbSymb]
---
v 1.0 - Robin Gerzaguet.
#
DigitalComm.ofdmSigGen
— Method
Create OFDM signal in time domain based on input T/F matrix and OFDM structure
qamMat is a complex symbol matrix (for instance QPSK) of size length(allocatedSubcarriers) x nbSymb
The output signal in time domain is of size (nFFT+nCP)xnbSymb.
--- Syntax
sigId = ofdmSigGen(qamMat,nFFT,nCP,allocatedSubcarriers)
--- Input parameters
-
qamMat : Complex T/F matrix to map [Array{Float64},length(allocatedSubcarriers),nbSymb]
-
ofdm : OFDM structure [StrucOFDM]
--- Output parameters
-
sigId : Signal in time domain [Array{Complex{Float64}},(nFFT+nCP)xnbSymb]
---
v 1.0 - Robin Gerzaguet.
#
DigitalComm.StrucOFDM
— Type
Structure for OFDM
--- Syntax
-
nFFT : FFT size [Int]
-
nCP : Cyclic prefix size [Int]
-
allocatedSubcarriers : Vector of allocated subbcarriers [Array{Int}]
---
v 1.0 - Robin Gerzaguet.
#
DigitalComm.ofdmSigDecode!
— Method
ofdmSigDecode!
Decodes a time domain OFDM signal and populate the T/F matrix with decoded QAM symbols
--- Syntax
ofdmSigDecode(qamRx,sigId,nFFT,nCP,allocSubcarriers);
--- Input parameters
-
qamRx : Time frequency matrix : [Array{Complex{Float64},nbSubcarriers,nbSymb}]
-
sigId : OFDM signal in time domain [Array{Complex{Float64},nbEch}] ,(nbEch : Number of samples: nbSymb*(nFFT+nCp))
-
nFFT : FFT size [Int]
-
nCp : Cyclic prefix size (in samples) [Int]
allocSubcarriers : Vector of index of allocated subcarriers [Array{Int,nbSubcarriers}]
--- Output parameters
-
[]
v 1.0 - Robin Gerzaguet.
#
DigitalComm.ofdmSigDecode!
— Method
ofdmSigDecode!
Decodes a time domain OFDM signal and returns a T/F matrix with decoded QAM symbols
--- Syntax
qamRx = ofdmSigDecode!(qamRx,sigId,ofdm);
--- Input parameters
-
qamRx : Time frequency matrix : [Array{Complex{Float64},nbSubcarriers,nbSymb}]
-
sigId : OFDM signal in time domain [Array{Complex{Float64},nbEch}] ,(nbEch : Number of samples: nbSymb*(nFFT+nCp))
-
ofdm : OFDM structure [StrucOFDM]
--- Output parameters
-
[]
---
v 1.0 - Robin Gerzaguet.
#
DigitalComm.ofdmSigDecode
— Method
ofdmSigDecode
Decodes a time domain OFDM signal and returns a T/F matrix with decoded QAM symbols
--- Syntax
qamRx = ofdmSigDecode(sigId,nFFT,nCP,allocSubcarriers);
--- Input parameters
-
sigId : OFDM signal in time domain [Array{Complex{Float64},nbEch}] ,(nbEch : Number of samples: nbSymb*(nFFT+nCp))
-
nFFT : FFT size [Int]
-
nCp : Cyclic prefix size (in samples) [Int]
allocSubcarriers : Vector of index of allocated subcarriers [Array{Int,nbSubcarriers}]
--- Output parameters
-
qamRx : Time frequency matrix : [Array{Complex{Float64},nbSubcarriers,nbSymb}]
---
v 1.0 - Robin Gerzaguet.
#
DigitalComm.ofdmSigDecode
— Method
ofdmSigDecode
Decodes a time domain OFDM signal and returns a T/F matrix with decoded QAM symbols
--- Syntax
qamRx = ofdmSigDecode(sigId,ofdm);
--- Input parameters
-
sigId : OFDM signal in time domain [Array{Complex{Float64},nbEch}] ,(nbEch : Number of samples: nbSymb*(nFFT+nCp))
-
ofdm : OFDM structure [StrucOFDM]
--- Output parameters
-
qamRx : Time frequency matrix : [Array{Complex{Float64},nbSubcarriers,nbSymb}]
---
v 1.0 - Robin Gerzaguet.
SC-FDMA
#
DigitalComm.convT
— Method
Perform time domain naive convolution. For UF-OFDM, size of filter is small so doing it in frequency domain is not appropriate
--- Syntax
c = convT(a,b);
--- Input parameters
-
a : First signal
-
b : Second signal
--- Output parameters
-
c : a * b
---
v 1.0 - Robin Gerzaguet.
#
DigitalComm.initUFOFDM
— Method
Create UF-OFDM structure
--- Syntax
ufofdm = initUFOFDM(nFFT,L,allocatedSubcarriers;sizeRB=12,applyPD=1,attenuation=40)
--- Input parameters
-
nFFT : FFT size [Int]
-
L : Filter size [Int]
-
allocatedSubcarriers : Vector of allocated subbcarriers [Array{Int}]
-
sizeRB : Carrier size in terms of subcarrier (often 12) [Array{Int}]
-
applyPD : Apply Pre-distortion at Tx stage (default 1, 0 : not applied) [Int=0 or 1]
-
attenuation : dolphChebyshev filter attenation
-
filterTaps : Filter impulse response coefficient [Array{Float64}]-
--- Output parameters
-
ufofdm : UF-OFDM structure [StrucUFOFDM]
---
v 1.0 - Robin Gerzaguet.
#
DigitalComm.ufofdmSigGen
— Method
Apply Universal Filtered Orthogonal Frequency Division Multiplexing (UF-OFDM) to the time frequency matrix qamMat and returns a time domain UF-OFDM signal [1,2]
ufofdm is parametrized by its FFT size, the filter length (in samples) and the allocatedSubcarriers vector. Optional parameters are carrier size in subcarrier (by default RB size which is 12) Dolph-Chebyshev window attenuation (40) and predistortion application (set to 1)
--- Syntax
sigId = genereSignalufofdm(qamMat,nFFT,nCp,allocatedSubcarriers;sizeRB=12,applyPD=1,attenuation=40)
--- Input parameters
-
qamMat : Time frequency matrix : [Array{Complex{Float64},nbSubcarriers,nbSymb}]
-
nbSymb : Number of ufofdm symbol tro be transmitted
-
nbSubcarriers : Number of allocated subcarriers (shall be < nFFT)
-
nFFT : FFT size [Int]
-
L : Dolph Chebyshev filter length [Int]
-
allocatedSubcarriers : Vector of index of allocated subcarriers [Array{Int,nbSubcarriers}]
-
sizeRB : Carrier size in subcarriers (default : LTE RB size: 12) [Int]
-
applyPD : Filter shape compensation (enabled by default) [Int]
-
attenuation : DC filter attenation in dB (default: 90) [Float64]
-
filterTaps : Filter coefficient (default empty and recreated)
-
pdCoeffs : Predistortion Filter coefficient (default empty and recreated)
--- Output parameters
-
sigId : ufofdm signal in time domain [Array{Complex{Float64},nbEch}]
References
-
[1] R. Gerzaguet and al. The 5G candidate waveform race: a comparison of complexity and performance. EURASIP Journal on Wireless Communications and Networking, 2017
-
[2] V. Vakilian and al: Universal-filtered multi-carrier technique for wireless systems beyond LTE. Proc. IEEE Globecom Workshops (GC Wkshps), 2013
---
v 1.0 - Robin Gerzaguet.
#
DigitalComm.ufofdmSigGen
— Method
Apply Universal Filtered Orthogonal Frequency Division Multiplexing (UF-OFDM) to the time frequency matrix qamMat and returns a time domain UF-OFDM signal [1,2]
ufofdm is parametrized by its FFT size, the filter length (in samples) and the allocatedSubcarriers vector. Optional parameters are carrier size in subcarrier (by default RB size which is 12) Dolph-Chebyshev window attenuation (40) and predistortion application (set to 1)
--- Syntax
sigId = genereSignalufofdm(qamMat,ufofdm);
--- Input parameters
-
qamMat : Time frequency matrix : [Array{Complex{Float64},nbSubcarriers,nbSymb}]
-
ufofdm : UF-OFDM structure [StrucUFOFDM]
--- Output parameters
-
sigId : ufofdm signal in time domain [Array{Complex{Float64},nbEch}]
References
-
[1] R. Gerzaguet and al. The 5G candidate waveform race: a comparison of complexity and performance. EURASIP Journal on Wireless Communications and Networking, 2017
-
[2] V. Vakilian and al: Universal-filtered multi-carrier technique for wireless systems beyond LTE. Proc. IEEE Globecom Workshops (GC Wkshps), 2013
---
v 1.0 - Robin Gerzaguet.
#
DigitalComm.StrucUFOFDM
— Type
Structure for UFOFDM
--- Syntax
-
nFFT : FFT size [Int]
-
L : Filter size [Int]
-
allocatedSubcarriers : Vector of allocated subbcarriers [Array{Int}]
-
sizeRB : Carrier size in terms of subcarrier (often 12) [Array{Int}]
-
applyPD : Apply Pre-distortion at Tx stage (default 1, 0 : not applied) [Int=0 or 1]
-
attenuation : dolphChebyshev filter attenation
-
filterTaps : Filter impulse response coefficient [Array{Float64}]
-
pd : PD coefficients [Array{Complex{Float64}}]
---
v 1.0 - Robin Gerzaguet.
UF-OFDM
#
DigitalComm.initSCFDMA
— Method
Create SCFDMA structure
--- Syntax
ofdm = initSCFDMA(nFFT,nCP,allocatedSubcarriers)
--- Input parameters
-
nFFT : FFT size [Int]
-
nCP : Cyclic prefix size [Int]
-
allocatedSubcarrier : Vector of allocated subbcarriers [Array{Int}]
-
sizeDFT : Size of DFT precoder (classic value is 12) [Int]
--- Output parameters
-
scfdma: SCFDMA structure [StrucSCFDMA]
---
v 1.0 - Robin Gerzaguet.
#
DigitalComm.scfdmaSigGen
— Method
Create SCFDMA signal in time domain based on input T/F matrix and SCFDMA parameters. SCFDMA apply a precoder before the IFFT at the transmitter side in order to lower the signal fluctuation
qamMat is a complex symbol matrix (for instance QPSK) of size length(allocatedSubcarriers) x nbSymb
The output signal in time domain is of size (nFFT+nCP)xnbSymb.
--- Syntax
sigId = scfdmaSigGen(qamMat,nFFT,nCP,allocatedSubcarriers)
--- Input parameters
-
qamMat : Complex T/F matrix to map [Array{Float64},length(allocatedSubcarriers),nbSymb]
-
nFFT : FFT size [Int]
-
nCP : Cylic prefix size [Int]
-
allocatedSubcarrier : Vector of allocated subbcarriers [Array{Int}]
-
sizeDFT : Size of DFT precoder (classic value is 12) [Int]
--- Output parameters
-
sigId : Signal in time domain [Array{Complex{Float64}},(nFFT+nCP)xnbSymb]
---
v 1.0 - Robin Gerzaguet.
#
DigitalComm.StrucSCFDMA
— Type
Structure for SCFDMA
--- Syntax
-
nFFT : FFT size [Int]
-
nCP : Cyclic prefix size [Int]
-
allocatedSubcarriers : Vector of allocated subbcarriers [Array{Int}]
-
sizeDFT : Size of DFT precoder (classic value is 12) [Int]
---
v 1.0 - Robin Gerzaguet.
#
DigitalComm.scfdmaPostProcessing
— Method
Apply Post processing for SC-FDMA (i.e DFT post-processing stage). This function can be called if scfdmaSigDecode is called with post processing flag to 0 (if frequency egalisation is done for example)
--- Syntax
qamPost = scfdmaPostProcessing(qamMat,sizeDFT)
--- Input parameters
-
qamMat : T/F matrix after Rx FFT (and before Rx IDFT) [Array{Complex{Float64}},nbSubcarriers,nbSymb]
-
sizeDFT : Precoder bloc size (often 12)
--- Output parameters
-
qamPost : T/F matrix after IDFT processing [Array{Complex{Float64},nbSubcarriers,nbSymb}]
---
v 1.0 - Robin Gerzaguet.
#
DigitalComm.scfdmaSigDecode
— Function
Apply SCFDMA demodulator to input signal and returns the T/F QAM matrix
--- Syntax
qamRx = scfdmaSigDecode(sigId,nFFT,nCP,allocSubcarriers,sizeDFT);
--- Input parameters
--- Input parameters
-
sigId : SCFDMA signal in time domain [Array{Complex{Float64},nbEch}]
-
scfdma : SCFDMA structure [StrucSCFDMA]
-
doPostProcessing : Do the post processing stage (IDFT): Default 1. In some case, we need the raw data (i.e data before postprocessing stage) such as in channel equalisation. In this case, the post processing should be done in a separate step (with the call of scfdmaPostProcessing function)
--- Output parameters
-
qamRx : Time frequency matrix : [Array{Complex{Float64},nbSubcarriers,nbSymb}]
---
v 1.0 - Robin Gerzaguet.
#
DigitalComm.scfdmaSigDecode
— Function
Apply SCFDMA demodulator to input signal and returns the T/F QAM matrix
--- Syntax
qamRx = scfdmaSigDecode(sigId,nFFT,nCP,allocSubcarriers,sizeDFT);
--- Input parameters
--- Input parameters
-
sigId : SCFDMA signal in time domain [Array{Complex{Float64},nbEch}]
-
nFFT : FFT size [Int]
-
nCp : Cyclic prefix size (in samples) [Int]
-
allocSubcarriers : Vector of index of allocated subcarriers [Array{Int,nbSubcarriers}]
-
sizeDFT : Post processing size (DFT size)
-
doPostProcessing : Do the post processing stage (IDFT): Default 1. In some case, we need the raw data (i.e data before postprocessing stage) such as in channel equalisation. In this case, the post processing should be done in a separate step (with the call of scfdmaPostProcessing function)
--- Output parameters
-
qamRx : Time frequency matrix : [Array{Complex{Float64},nbSubcarriers,nbSymb}]
---
v 1.0 - Robin Gerzaguet.
WOLA
#
DigitalComm.initWOLA
— Method
Create and initiate a WOLA waveform structure
--- Syntax
wola = initWOLA(nFFT,nCP,allocatedSubcarriers,winFuncTx,winLengthTx,winFuncRx,winLengthRx;windowTx=[],windowRx=[])
--- Input parameters
-
nFFT : FFT size [Int]
-
nCP : CP size [Int]
-
allocatedSubcarriers : Vector of allocated subcarriers [Array{Int}]
-
winFuncTx : Name of window used @Tx
-
winLengthTx : Size of window @Tx
-
winFuncRx : Name of window used @Rx
-
winLengthRx : Size of window @Rx
-
windowTx : Coefficient of Tx window. By default it is empty. To force a given window, populate this vector. If let empty, the window will be created based on winLengthTx and winFuncTx
-
windowRx : Coefficient of Rx window. By default it is empty. To force a given window, populate this vector. If let empty, the window will be created based on winLengthRx and winFuncRx
--- Output parameters
-
wola : Waveform structure
---
v 1.0 - Robin Gerzaguet.
#
DigitalComm.wolaSigGen
— Function
Apply Weighted Overlap and Add Orthogonal Frequency Division Multiplexing (WOLA-OFDM) to the time frequency matrix qamMat and returns a time domain OFDM signal OFDM is parametrized by its FFT size, its cyclic prefix length (in samples) and the allocSubcarriers vector. The WOLA part is parametrized by the window applied at each beginning and ending of symbols. The window size can be (and is likely to be) higher than the length of the CP and pure OFDM compatibility is ensured by overlapping the symbols. The interested reader can refer to [1] [2] and [3] for WOLA principle description.
---
Syntax
sigId = wolaSigGen(qamMat,nFFT,nCP,allocSubcarriers,winFunc,winLength=0)
--- Input parameters
-
qamMat : Time frequency matrix : [Array{Complex{Float64},nbSubcarriers,nbSymb}]
-
nbSymb : Number of OFDM symbol tro be transmitted
-
nbSubcarriers : Number of allocated subcarriers (shall be < nFFT)
-
nFFT : FFT size [Int]
-
nCP : Cyclic prefix size (in samples) [Int]
-
allocSubcarriers : Vector of index of allocated subcarriers [Array{Int,nbSubcarriers}]
-
winFunc : Type of window. Can be a string of supported window or directly the window taps.
-
winLength : Length of window. This parameter is not used if winFunc is an array of the window tap.
--- Output parameters
-
sigId : WOLA-OFDM signal in time domain [Array{Complex{Float64},nbEch}]. nbEch : Number of samples: nbSymb*(nFFT+nCP)
---
Supported window
-
"Triangle" : Triangle window - "srrc" : Square Root Raised Cosine - "Meyer" : Meyer window (See [1])
---
References
-
[1] R. Zayani, Y. Medjahdi, H. Shaiek and D. Roviras, "WOLA-OFDM: A Potential Candidate for Asynchronous 5G," 2016.
-
[2] Y. Medjahdi and al, "On the road to 5G: Comparative study of Physical layer in MTC context", 2017.
-
[3] R. Gerzaguet and al, "Comparison of Promising Candidate Waveforms for 5G: WOLA-OFDM Versus BF-OFDM", 2017.
---
v 1.0 - Robin Gerzaguet.
#
DigitalComm.StrucWOLA
— Type
WOLA waveform structure
--- Syntax
-
nFFT : FFT size [Int]
-
nCP : CP size [Int]
-
allocatedSubcarriers : Vector of allocated subcarriers [Array{Int}]
-
windowTx : Window used @ transmitter side
-
windowRx : Window used @ recevier side
---
v 1.0 - Robin Gerzaguet.
#
DigitalComm.wolaSigDecode
— Function
Apply WOLA-OFDM demodulator to input signal and returns the T/F QAM matrix
---
Syntax qamRx = wolaSigDecode(sigId,nFFT,nCP,allocSubcarriers);
--- Input parameters
-
sigId : OFDM signal in time domain [Array{Complex{Float64},nbEch}]
-
nbEch : Number of samples: nbSymb*(nFFT+nCP)
-
nFFT : FFT size [Int]
-
nCP : Cyclic prefix size (in samples) [Int]
-
allocSubcarriers : Vector of index of allocated subcarriers [Array{Int,nbSubcarriers}]
-
winLengthTx : Window size @Tx side (FFT rotation)
-
doTailBiting : Do tail biting approach (by default 1) [Int]
-
winFunc : Type of window. Can be a string of supported window or directly the window taps.
-
winLength : Length of window. This parameter is not used if winFunc is an array of the window tap.
--- Output parameters
-
qamMat : Time frequency matrix : [Array{Complex{Float64},nbSubcarriers,nbSymb}]
---
Supported window
-
"Triangle" : Triangle window - "srrc" : Square Root Raised Cosine - "Meyer" : Meyer window (See [1])
---
References
-
[1] R. Zayani, Y. Medjahdi, H. Shaiek and D. Roviras, "WOLA-OFDM: A Potential Candidate for Asynchronous 5G," 2016.
-
[2] Y. Medjahdi and al, "On the road to 5G: Comparative study of Physical layer in MTC context", 2017.
-
[3] R. Gerzaguet and al, "Comparison of Promising Candidate Waveforms for 5G: WOLA-OFDM Versus BF-OFDM", 2017.
---
v 1.0 - Robin Gerzaguet.