Function overview

Common functions

DigitalComm.avgPowerMethod

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.

source
DigitalComm.getSIRFunction

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.

source
DigitalComm.qFuncMethod

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.

source

NRZI Encoding

DigitalComm.decodeNRZIFunction
decodeNRZI(bits::AbstractVector, transitions::Symbol=:low)::AbstractVector

Decode a Non-Return-to-Zero Inverted (NRZI) encoded bit sequence. Expects a vector of bits, e.g. [0, 1, 1, 0, 0, 1, 0, 1, 0, 1].

Arguments

  • bits::AbstractVector: Vector of bits to encode.
  • transitions::Symbol: Symbol represented by a transition in the NRZI coded sequence (:low/:high). Defaults to :low.

Returns

  • decoded_bits::AbstractVector: Vector of decoded bits. The first bit of the output depends on a value of a memory bit in the decoder. this value is set to 0.

Examples

julia> decoded_bits = decodeNRZI(Int32[1, 1, 1, 0, 1, 1], :low);

julia> transpose(decoded_bits)
1×6 transpose(::Vector{Int32}) with eltype Int32:
 0  1  1  0  0  1

The example below shows how the transitions argument affects the decoded bit sequence.

julia> decoded_bits = decodeNRZI(Int32[0, 1, 0, 0, 0, 1], :high);

julia> transpose(decoded_bits)
1×6 transpose(::Vector{Int32}) with eltype Int32:
 0  1  1  0  0  1
source
DigitalComm.encodeNRZIFunction
encodeNRZI(bits::AbstractVector, transitions::Symbol=:low)::AbstractVector

Map a bit sequence to Non-Return-to-Zero Inverted (NRZI) encoded bits. Expects a vector of bits, e.g. [0, 1, 1, 0, 0, 1, 0, 1, 0, 1].

Arguments

  • bits::AbstractVector: Vector of bits to encode.
  • transitions::Symbol: Symbol indicating the symbol to transition on (:low/:high). Defaults to :low.

Returns

  • encoded_bits::AbstractVector: Vector of encoded bits.

Examples

julia> encoded_bits = encodeNRZI(Int32[0, 1, 1, 0, 0, 1], :low);

julia> transpose(encoded_bits)
1×6 transpose(::Vector{Int32}) with eltype Int32:
 1  1  1  0  1  1

The example below shows how the transitions argument affects the encoded bit sequence.

julia> encoded_bits = encodeNRZI(Int32[0, 1, 1, 0, 0, 1], :high);

julia> transpose(encoded_bits)
1×6 transpose(::Vector{Int32}) with eltype Int32:
 0  1  0  0  0  1
source

Quadrature Amplitude Modulation

DigitalComm.genBitSequenceFunction

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}]
source
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}]
source
DigitalComm.genByteSequenceFunction

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.

source
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.

source
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

  • []
source
DigitalComm.bitMappingQAMMethod

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}}]
source
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

  • []
source
DigitalComm.bitDemappingQAMMethod

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)]
source
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

  • []
source
DigitalComm.hardConstellationMethod

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)
source
DigitalComm.calcLLRMethod

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.

source
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.

source
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.

source
DigitalComm.llrToHardBitsMethod

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.

source
DigitalComm.llrToHardBitsMethod

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.

source
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.

source
DigitalComm.llrToUIntMethod

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.

source
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.

source
DigitalComm.symbolDemappingQAMMethod

–- 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)]
source

Channels

DigitalComm.addNoiseMethod

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.
[y,n] = addNoise(x,snr,powSig); addNoise!(y,x,powSig) # Fill y from x addNoise!(x,powSig) # Replace x

–- 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.

source
DigitalComm.rayleighChanFunction

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

–-

source
DigitalComm.applyChannelMethod

Apply a channel implementation to an input signal

–- Syntax

sigChan : applyChannel(sigId,channelImpl)

–- Input parameters

  • sigId : Input signal [Array{Any}]
  • channelImpl : Channel implementation [ChannelImpl]

–- Output parameters

  • sigChan : Output signal [Array{Any}]

–-

v 1.0 - Robin Gerzaguet.

source
DigitalComm.getChannelFunction

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

–-

source
DigitalComm.getFIRResponseFunction

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]

–-

source
DigitalComm.initChannelMethod

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

–-

source
DigitalComm.ChannelImplType

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.

source
DigitalComm.ChannelModelType

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 [Array{Float64}], same size as powerProfile
  • dopplerFreq : Doppler frequency (inherited from samplingFreq and speed)
  • delaySpread : Max support of CIR in samples [Int]

–-

source
DigitalComm.addCFOMethod

Adding Carrier Frequency Offset δ in Hz to the input signal x sampled at frequency samplingRate (In Hz) with initial phase ϕ (default 0) This function does not mutate the input signal. See addCFO! for mutating function. In case you want to add normalized CFO, set the samplingRate to 1.

–- Syntax

y = addCFO(x,delta,samplingRate)

–- Input parameters

  • x : Input signal
  • δ : Carrier frequency offset [Hz]
  • samplingRate : Sampling rate [Hz]

–- Output parameters

  • y : Signal with CFO
source

Windows and filters

DigitalComm.raisedCosineMethod

Returns the Finite Impulse Response of a Raised Cosine (RC) filter. The filter is defined by its span (evaluated in number of symbol N), its Roll-Off factor and its oversampling factor. The span corresponds to the number of symbol affected by filter before and after the center point.

Output is a Vector{Float64} array of size L= 2KN+1

SRRC definition is based on [1]

[1] 3GPP TS 25.104 V6.8.0 (2004-12). http://www.3gpp.org/ftp/Specs/archive/25_series/25.104/25104-680.zip

Syntax

	h	= raisedCosine(N,beta,ovS)

Input parameters

  • N : Symbol span (Int16)
  • beta : Roll-off factor (Float64)
  • ovS : Oversampling rate (Int16)

Examples

julia> h = raisedCosine(12,0.5,16);

julia> length(h)
385
source
DigitalComm.sqrtRaisedCosineMethod

Returns the Finite Impulse Response of a Square Root Raised Cosine (SRRC) filter.

The filter is defined by its span (evaluated in number of symbol N), its Roll-Off factor and its oversampling factor. The span corresponds to the number of symbol affected by filter before and after the center point.

Output is a Vector{Float64} array of size L= 2KN+1

SRRC definition is based on [1]

[1] 3GPP TS 25.104 V6.8.0 (2004-12). http://www.3gpp.org/ftp/ Specs/archive/25_series/25.104/25104-680.zip

Syntax

h = sqrtRaisedCosine(N,beta,ovS)

Input parameters

  • N : Symbol span (Int16)
  • beta : Roll-off factor (Float64)
  • ovS : Oversampling rate (Int16)

Examples

julia> h = sqrtRaisedCosine(12,0.5,16);

julia> length(h)
385
source
DigitalComm.chebMethod

Apply Chebyshev polynom of order L to input x

–- Syntax

y = cheb(L,x)

–- Input parameters

  • L : Chebyshev order [Int]
  • x : Input [Any]

–- Output parameters

  • y : Output

–-

v 1.0 - Robin Gerzaguet.

source
DigitalComm.dolphChebyshevMethod

Returns the Dolp Chebyshev filter of order L with desired attenation att

See Peter Lynch, "The Dolph-Chebyshev Window: A Simple Optimal Filter", Monthly Weather Review, Vol. 125, pp. 655-660, April 1997. (http://www.maths.tcd.ie/~plynch/Publications/Dolph.pdf) Dolph, "A current distribution for broadside arrays which optimizes the relationship between beam width and side-lobe level", Proc. IEEE, 34, pp. 335-348. cheb(m-1, beta * cos(pi * k/m)) W(k) = –––––––––––––––- cheb(m-1, beta)

–- Syntax

filterDC = dolphChebyshev(n,at)

–- Input parameters

  • n : Size of desired filter
  • at : Attenation in dBB

–- Output parameters

  • filterDC : Filter impulse response [Array{Float64}]

–-

v 1.0 - Robin Gerzaguet.

source
DigitalComm.getWolaWindowMethod

Returns the desired window used in transmitter or receiver weigthed overlap and add methods (WOLA). See [1] for window reference design.

–- Syntax

window = getWolaWindow(winFunc,nFFT,nCp,winlength)

–- Input parameters

  • winFunc : Window type (see supported format below) [String]
  • nFFT : FFT size [Int]
  • nCP : CP size [Int]
  • winlength : length of window [Int]

–- Output parameters

window : Window [Window]

–-

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.

–-

v 1.0 - Robin Gerzaguet.

source
DigitalComm.WindowType

Structure describing window parameters

–- Syntax

  • winFunc : Name of window
  • winLength : Size of window
  • window : Window coefficients

–-

v 1.0 - Robin Gerzaguet.

source

Waveforms

Common functions

DigitalComm.decodeSigMethod

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.

source
DigitalComm.decodeSigMethod

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.

source
DigitalComm.genSigMethod

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.

source
DigitalComm.genSigMethod

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.

source
DigitalComm.getWaveformNameMethod

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.

source
DigitalComm.initWaveformsMethod

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.

source
DigitalComm.genZCSequenceFunction

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.

source
DigitalComm.get5GNRAllocMethod

Returns the vector of allocated subcarriers associated to 5G New Radio frequency mapping. In 5G-NR, depending on FFT size, only few subcarriers are allocated (55-65%). This function takes a FFT size as input and returns an array of size nbSubcarriers. The output has more subcarriers thanj getLTEAlloc (for 4G-LTE)
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}]

source
DigitalComm.getLTEAllocMethod

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
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}]

source

BF-OFDM

DigitalComm.getBFOFDMFilterMethod

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.

source
DigitalComm.bfofdmSigGenMethod

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.

source
DigitalComm.initBFOFDMMethod

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.

source
DigitalComm.StrucBFOFDMType

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.

source
DigitalComm.bfofdmSigDecodeMethod

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.

source
DigitalComm.getBFOFDM_carrierFromSubcarriersMethod

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.

source
DigitalComm.getBFOFDM_oversampledGridSubcarriersMethod

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.

source
DigitalComm.getBFOFDM_subCarrierFromFBMCCarriersMethod

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.

source

FBMC

DigitalComm.fbmcSigGenMethod

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.

source
DigitalComm.getFBMCFilterMethod

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.

source
DigitalComm.initFBMCMethod

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.

source
DigitalComm.oqamMappingMethod

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.

source
DigitalComm.StrucFBMCType

FBMC waveform structure

–- Syntax

  • nFFT : FFT size
  • K : Overlapping factor
  • allocatedSubcarriers : Vector of allocated subcarriers [Array{Int}]

–-

v 1.0 - Robin Gerzaguet.

source
DigitalComm.fbmcSigDecodeMethod

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.

source
DigitalComm.oqamDemappingMethod

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.

source

OFDM

DigitalComm.initOFDMMethod

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.

source
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.

source
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.

source
DigitalComm.ofdmSigGenMethod

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.

source
DigitalComm.ofdmSigGenMethod

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.

source
DigitalComm.StrucOFDMType

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.

source
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.

source
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.

source
DigitalComm.ofdmSigDecodeMethod

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.

source
DigitalComm.ofdmSigDecodeMethod

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.

source

SC-FDMA

DigitalComm.convTMethod

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.

source
DigitalComm.initUFOFDMMethod

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.

source
DigitalComm.ufofdmSigGenMethod

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.

source
DigitalComm.ufofdmSigGenMethod

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.

source
DigitalComm.StrucUFOFDMType

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.

source

UF-OFDM

DigitalComm.initSCFDMAMethod

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.

source
DigitalComm.scfdmaSigGenMethod

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.

source
DigitalComm.StrucSCFDMAType

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.

source
DigitalComm.scfdmaPostProcessingMethod

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.

source
DigitalComm.scfdmaSigDecodeFunction

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.

source
DigitalComm.scfdmaSigDecodeFunction

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.

source

WOLA

DigitalComm.initWOLAMethod

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.

source
DigitalComm.wolaSigGenFunction

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.

source
DigitalComm.StrucWOLAType

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.

source
DigitalComm.wolaSigDecodeFunction

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.

source