Fundamental Principle of OFDM Synchronization

Characterization of the sources of errors in OFDM-based timing-based localization systems

Background

I am trying to rework a previous endeavor in 2021, on the exact mathematical analysis of OFDM synchronization for localization as a part of the GT REU for Agile Communication Architectures. This is mainly for two reasons:

  1. Our project representing Gatech on SDR based OFDM synchronization for timing localization got selected as a finalist for the AFRL SDR University Challenge. So I thought I should write down some renewed thoughts on this subject, as a result of new findings during the research.
  2. I have been told several times that my original report on OFDM synchronization is literally unreadable, which I agree. In order to make the theory more easily understandable for people who want to study the subject, I decide that I should rewrite the content.

Disclaimers

  1. This work focus on the SOURCES of error duration OFDM synchronization, not methods to address them.
  2. This work focus on how the errors are derived mathematically, not just a result, and therefore there will be long mathematical derivations.
  3. This work is heavily based on the paper Optimum receiver design for wireless broad-band systems using OFDM
  4. If you notice any mistake, please let me know. The latex on this page is a complete mess, but I think they are at least readable.

The Problem

The fundamental idea of OFDM-based localization is to extract delay information from received signal, assuming the transmitted pilot is a priori.

Hence the signal processing is done over the pre-equalized, post timing-synchronization Schmidl\&Cox signal. Both OFDM and S\&C are important for the understanding of what follows, here is a working script demonstrating the plateau detection.

    import scipy.io
    import numpy as np
    import math
    import random
    import matplotlib.pyplot as plt
    from scipy.interpolate import interp1d

    class OFDM:
        pass
    ofdm=OFDM()
    ofdm.K = 1024                      # Number of OFDM subcarriers
    ofdm.Kon = 600                     # Number of switched-on subcarriers
    ofdm.CP = 128                      # CP length
    ofdm.ofdmSymbolsPerFrame = 5       # N, number of payload symbols in each frame
    ofdm.L = ofdm.K//2                 # Parameter L, denotes the length of one repeated part of the preamble

    def random_qam(ofdm):
        qam = np.array([1+1j, 1-1j, -1+1j, -1-1j]) / np.sqrt(2)
        return np.random.choice(qam, size=(ofdm.Kon), replace=True)

    def ofdm_modulate(ofdm, qam):
        assert (len(qam) == ofdm.Kon)
        fd_data = np.zeros(ofdm.K, dtype=complex)
        off = (ofdm.K - ofdm.Kon)//2
        fd_data[off:(off+len(qam))] = qam 
        fd_data = np.fft.fftshift(fd_data)
        symbol = np.fft.ifft(fd_data) * np.sqrt(ofdm.K)
        return np.hstack([symbol[-ofdm.CP:], symbol])

    qam_preamble = np.sqrt(2)*random_qam(ofdm)
    qam_preamble[::2] = 0   # delete every second data to make the preamble 2-periodic

    preamble = ofdm_modulate(ofdm, qam_preamble)

    plt.subplot(121)
    plt.plot(abs(preamble))

    plt.subplot(122)
    f = np.linspace(-ofdm.K/2, ofdm.K/2, 4*len(preamble), endpoint=False)
    plt.plot(f, 20*np.log10(abs(np.fft.fftshift(np.fft.fft(preamble, 4*len(preamble))/np.sqrt(len(preamble))))))

    plt.show()

    def createFrame(ofdm, qam_preamble=None):
        if qam_preamble is None:
            qam_preamble = np.sqrt(2)*random_qam(ofdm)
            qam_preamble[::2] = 0
        preamble = ofdm_modulate(ofdm, qam_preamble)
        
        payload = np.hstack([ofdm_modulate(ofdm, random_qam(ofdm)) for _ in range(ofdm.ofdmSymbolsPerFrame)])
        return np.hstack([preamble, payload])
    frame = createFrame(ofdm, qam_preamble=qam_preamble*2)
    plt.plot(abs(frame))
    plt.show()

    def addCFO(signal, cfo):  # Add carrier frequency offset (unused in this notebook)
        return signal * np.exp(2j*np.pi*cfo*np.arange(len(signal)))

    def addSTO(signal, sto):  # add some time offset
        return np.hstack([np.zeros(sto), signal])

    def addNoise(signal, sigma2):  # add AWGN
        noise = np.sqrt(sigma2/2) * (np.random.randn(len(signal)) + 1j*np.random.randn(len(signal)))
        return signal + noise

    def addChannel(signal, h):       # add some multipath impulse response (unused in this notebook)
        return scipy.signal.lfilter(h, (1,), signal)

    x = createFrame(ofdm, qam_preamble=qam_preamble*2)
    sto = ofdm.K//2     #This is adding to Time domain symbols
    r = addNoise(addSTO(x, sto), 0.5)

    #Calculate P(d)--Direct Calculation
    d_set = np.arange(0, sto + ofdm.K)
    P1 = np.zeros(len(d_set), dtype=complex)
    for i, d in enumerate(d_set):
        P1[i] = sum(r[d+m].conj()*r[d+m+ofdm.L] for m in range(ofdm.L))
    plt.plot(d_set, abs(P1))
    plt.show()

    #Calculate P(d)--Recursive method given by Schmidl&Cox
    P0 = sum(r[m].conj()*r[m+ofdm.L] for m in range(ofdm.L))  # initialize P[0] with the default method
    def calcP_method2(r, d_set, P0):
        P2 = np.zeros(len(d_set), dtype=complex)
        P2[0] = P0
        for d in d_set[:-1]:
            P2[d+1] = P2[d] + r[d+ofdm.L].conj()*r[d+2*ofdm.L] - r[d].conj()*r[d+ofdm.L]
        return P2

    #Calculate R(d)--Direct and recursive approach (Energy)
    def calcR_method1(r, d_set):
        # calculation based on the iterative method
        R = np.zeros(len(d_set))
        for i, d in enumerate(d_set):
            R[i] = sum(abs(r[d+m+ofdm.L])**2 for m in range(ofdm.L))
        return R

    def calcR_method2(r, d_set, R0):
        # calculation based on non-causal recursive expression
        R = np.zeros(len(d_set))
        R[0] = R0
        for d in d_set[:-1]:
            R[d+1] = R[d] + abs(r[d+2*ofdm.L])**2-abs(r[d+ofdm.L])**2
        return R
    R1 = calcR_method1(r, d_set)
    R2 = calcR_method2(r, d_set, R1[0])
    plt.plot(d_set, abs(R1))
    plt.show()

    #Calculate Metric M(d)
    M = abs(P1)**2/R1**2
    plt.plot(d_set,M)
    plt.show()
    plt.plot(abs(r), label='$r[n]$', color='cyan')
    plt.plot(M, label='$M(d)$')
    plt.show()

    def createFrame_withSyncInfo(ofdm):
        qam_preamble = np.sqrt(2)*random_qam(ofdm)
        qam_preamble[::2] = 0
        preamble = ofdm_modulate(ofdm, qam_preamble)

        payload = np.hstack([ofdm_modulate(ofdm, random_qam(ofdm)) for _ in range(ofdm.ofdmSymbolsPerFrame)])
        
        frame = np.hstack([preamble, payload])
        preamble_valid = np.zeros(len(frame))
        payload_valid = np.zeros(len(frame))
        preamble_valid[ofdm.CP:ofdm.CP+ofdm.K] = 1
        for f in range(ofdm.ofdmSymbolsPerFrame):
            payload_valid[(ofdm.CP+ofdm.K)*(f+1) + ofdm.CP + np.arange(ofdm.K)] = 1
        
        return frame, preamble_valid, payload_valid
    frame, preamble_valid, payload_valid = createFrame_withSyncInfo(ofdm)
    plt.plot(abs(frame), label='Signal');
    plt.plot(preamble_valid, label='Preamble valid')
    plt.plot(payload_valid, label='Payload valid')

Typically, a timing-based localization system based on OFDM is disturbed by the following effects, incorporated in channel state information (CSI):

  1. Delay: A frequency-dependent phase shift across all active OFDM subcarriers due to delay between transmitter and receiver.
  2. CFO: A frequency shift constant across subcarriers due to subcarrier frequency offset (CFO), caused by either Doppler fading or oscillator mismatch.
  3. STO: A sampling timing offset (STO) caused by timing mismatch between transmitter and receiver sampling clock, giving rise to sub-sample delay.
  4. SFO: A sampling frequency offset (SFO) caused by frequency mismatch between transmitter and receiver sampling clock, which will drift across OFDM frames.
  5. Packet detection delay: The delay between packet arriving and detecting the presence of said packet
  6. Noise

Our goal is to characterize these effects exactly.

OFDM Model

Definitions:

\(T_u=N_uT\) is the length of the time-domain message signal, where \(T\) is the length of individual OFDM time domain pulses, \(T_g\) is the length of the guard interval, which we assume to be cyclic prefix (CP) and \(T_s\) is the length of the entire time-domain OFDM symbol. Based on these definitions we have \(T_s=T_g+T_u\). Naturally \(N_gT=T_g\) and \(N_sT=T_s\), where \(N_g,N_u,N_s\) are the number of time domain OFDM symbols for guard, message and combined signal. Also note that for the rest of the, most of the equations ignore the noise term as it is independent from the signal terms.

The time domain OFDM signal can be expressed as:

\[\begin{align} s(t) & =\sum_{l=-\infty}^{+\infty} \sum_{k=0}^{N_u-1}x_{l,k} \mathrm{rect}(t-lT_s-kT-T_g) \\ & =\sum_{l=-\infty}^{+\infty}\sum_{m=-\frac{N}{2}}^{\frac{N}{2}-1}a_{l,m}\sum_{k=0}^{N-1}e^{\frac{2\pi jmk}{N}}\mathrm{rect}(t-lT_s-kT-T_g) \\ & =\sum_{l=-\infty}^{+\infty}\sum_{m=-\frac{N}{2}}^{\frac{N}{2}-1}a_{l,m}\sum_{k=0}^{N-1}e^{\frac{2\pi jmk}{N}}\mathrm{rect}_T \delta(lT_s+kT+T_g)(t) \\ & =\sum_{l=-\infty}^{+\infty}\sum_{m=-\frac{N}{2}}^{\frac{N}{2}-1}a_{l,m}\mathrm{rect}_T(\sum_{k=0}^{N-1}e^{\frac{2\pi jmk}{N}}\delta(lT_s+kT+T_g))(t) \\ & =\sum_{l=-\infty}^{+\infty}\sum_{m=-\frac{N}{2}}^{\frac{N}{2}-1}a_{l,m}\mathrm{rect}_T(\sum_{k=0}^{N-1}e^{\frac{2\pi jmkT}{NT}}\delta(lT_s+kT+T_g))(t) \\ & =\sum_{l=-\infty}^{+\infty}\sum_{m=-\frac{N}{2}}^{\frac{N}{2}-1}a_{l,m}\mathrm{rect}_T(\sum_{k=0}^{N-1}e^{\frac{2\pi jm(t-lT-T_g)}{T_u}}\delta(lT_s+kT+T_g))(t) \\ & =\sum_{l=-\infty}^{+\infty}\sum_{m=-\frac{N}{2}}^{\frac{N}{2}-1}a_{l,m}e^{\frac{2\pi jm(t-lT-T_g)}{T_u}}\sum_{k=0}^{N-1}\mathrm{rect}_T*\delta(lT_s+kT+T_g)(t) \\ & =\sum_{l=-\infty}^{+\infty}\sum_{m=-\frac{N}{2}}^{\frac{N}{2}-1}a_{l,m}e^{\frac{2\pi jm(t-lT-T_g)}{T_u}}\mathrm{rect}(t-lT_s) \end{align}\]

The physical understanding of this formula is that the time domain OFDM symbol is simply a concatenation of individual rectangular pulses, where \(x_{l,k}\) is simply the $k$ th time-domain symbol of the $l$ th OFDM block.

Expanding (1) using definition of $x_{l,k}$ as inverse discrete Fourier transform (IDFT) of its frequency domain counterpart $a_{l,m}$, where we have made the assumption that $k,m \in [0,N-1]$, we have:

\[\begin{align} s(t) & =\sum_{l=-\infty}^{+\infty}\sum_{k=0}^{N-1}\sum_{m=-\frac{N}{2}}^{\frac{N}{2}-1}a_{l,m}e^{\frac{2\pi jmk}{N}}\mathrm{rect}(t-lT_s-kT-T_g) \end{align}\]

Delay

Perhaps the most straight-forward and important quantity that causes distortion in received signal, as this is the information we want to recover, the so-called “desired information”. The conventional wisdom behind using OFDM in timing-based localization is that delay on a scale of nanosecond is difficult to capture, but since delay causes a different phase shift on each OFDM subcarrier based on subcarrier frequency, the frequency-domain information can be extracted to reflect delay. In this section we see how it’s done.

We use the principle of superposition to generalize the input and output relation of a time-variant multi-path channel with $I$ paths. Assume we have an input signal $s(t)$ with non-zero band-width:

\(\begin{equation} r(t)=\sum_i^I a_i(t)s(t-\tau_i(t)) \end{equation}\) The channel is linear and can be described by the response \(h(\tau,t)\) at time t to an impulse transmitted at time \(t-\tau\). In terms of \(h(\tau,t)\) the input/output relationship is given by: \(\begin{equation} y(t)=\int_{-\infty}^{\infty}h(\tau,t)x(t-\tau) d\tau \end{equation}\) Compare the above two equations we see the fading multi-path channel is: \(\begin{equation} h(\tau,t)=\sum_i a_i(t)\delta(\tau-\tau_i(t)) \end{equation}\) For our interest, A time-invariant delayed path is given by: \(\begin{equation} h(t)=\alpha \delta(t-\tau) + n(t) \end{equation}\) Hence \(\begin{equation} r(t)=(s*h)(t)+n(t)=\alpha s(t-\tau) + n(t) \end{equation}\) After removing the CP, the \(l\) th received OFDM symbol is represented by \(N\) samples: \(r_l = \{r_{l,0},r_{l,1},\dots,r_{l,N-2},r_{l,N-1}\}\), where

\[\begin{align} r_{l,n} & = r((N_g+l \times N_S +n)T) \\ & =r(T_u(\frac{(l+1)N_g}{N}+l)+n)\\ & =r(T_g(l+1)+T_ul+n) \end{align}\]

Using (13) and (17), we have: \(\begin{align} r_{l,n} = & r((n+N_g+lN_s)T) \\ = &\alpha s((n+N_g+lN_s)T-\tau) +n \\ = &\frac{\alpha}{\sqrt{T_u}} \sum_{l^{'}=-\infty}^{+\infty} \sum_{k=-\frac{K}{2}}^{\frac{K}{2}} a_{l,k}e^{j 2\pi(k/T_u)((n+N_g+lN_s)T-T_g-l^{'}T_s-\tau)} \\\nonumber & \mathrm{rect}_{T_s}((n+N_g+lN_s)T-l^{'}T_s-\tau) \end{align}\) for some \(l^{'}\) due to time offset. Note that the rectangular function \(\begin{align} (n+N_g+lN_s)T-l^{'}T_s-\tau & =nT+N_gT+lN_sT-l^{'}T_s-\tau \\ & =\frac{n}{N}T_u+(l-l^{'})T_s-\tau \end{align}\) equals to 1 whenever \(\frac{n}{N}T_u+(l-l^{'})T_s-\tau\) is between 0 and \(T_s\), which happens if and only if\(l=l^{'}\). Thus we can further simplify (20) into \(\begin{equation} r_{l,n}=\frac{\alpha}{\sqrt{T_u}}\sum_{k=-\frac{K}{2}}^{\frac{K}{2}} a_{l,k} e^{2\pi j\frac{k}{T_u}(nT-\tau)} \end{equation}\) which are the time-domain received symbols. Using definition of FFT, the frequency-domain received symbols become: \(\begin{align} z_{l,k} & =\frac{1}{N}\sum_{n=0}^{N-1}\frac{\alpha}{\sqrt{T_u}}\sum_{k^{'}=-\frac{K}{2}}^{\frac{K}{2}} a_{l,k^{'}} e^{2\pi j\frac{k^{'}}{T_u}(nT-\tau)}e^{-j2\pi (n/N)k} \\ & =\frac{1}{N}\frac{\alpha}{\sqrt{T_u}}\sum_{n=0}^{N-1}\sum_{k^{'}=-\frac{K}{2}}^{\frac{K}{2}}a_{l,k^{'}} e^{2 \pi j[\frac{nk^{'}}{N}-\frac{k^{'}\tau}{T_u}-\frac{kn}{N}]}\\ & =\frac{1}{N}\frac{\alpha}{\sqrt{T_u}}\sum_{k^{'}=-\frac{K}{2}}^{\frac{K}{2}}a_{l,k^{'}}e^{-2 \pi j\frac{\tau k^{'}}{T_u}}\sum_{n=0}^{N-1}(e^{2\pi j\frac{k^{'}-k}{N}} )^n \end{align}\) Note that the second summation is a geometric series that goes to N if and only if \(k=k^{'}\) and equals to 0 otherwise. So the overall result is:

\(\begin{equation} Z_{l,k}=\frac{a_{l,k}}{\sqrt{T_u}}\alpha e^{\frac{-2\pi k \tau}{T_u}} \end{equation}\) We make the observation that the exponential part and \(\alpha\) constant is simply the channel frequency response by taking the FFT of the channel impulse response. Therefore the result is simply: \(\begin{equation} Z_{l,k}=a_{l,k} H_{l,k} \end{equation}\) where the channel transfer function is obtained through FFT of channel impulse response. \(\begin{equation} H_{l,k} = \sum_i h_i(l)e^{-j2\pi k(\frac{\textcolor{red}{\tau_i}}{T_u})} \end{equation}\) The crucial observation is that the effect of a delayed channel on each OFDM subcarrier is the multiplication of channel transfer function in frequency domain, for which there is a linear dependence of phase on subcarrier k, as a function of delay \(\tau_i\).

This effect is the cornerstone of OFDM delay estimation, and can be simply captured by the OFDM code below:

    import scipy.io
    import numpy as np
    import math
    import cmath
    import random
    import matplotlib.pyplot as plt
    from scipy.interpolate import interp1d

    Num=64
    CP=Num//4
    L=3
    P=8
    pilotValue = 3+3j

    allCarriers = np.arange(Num)
    pilotCarriers = allCarriers[::Num//P]
    pilotCarriers = np.hstack([pilotCarriers, np.array([allCarriers[-1]])])
    P=P+1
    dataCarriers = np.delete(allCarriers, pilotCarriers)
    #print ("allCarriers:   %s" % allCarriers)
    #print ("pilotCarriers: %s" % pilotCarriers)
    #print ("dataCarriers:  %s" % dataCarriers)
    plt.plot(pilotCarriers, np.zeros_like(pilotCarriers), 'bo', label='pilot')
    plt.plot(dataCarriers, np.zeros_like(dataCarriers), 'ro', label='data')
    plt.show()

    M = 4
    payloadBits_per_OFDM = len(dataCarriers)*M

    mapping_table = {
        (0,0,0,0) : -3-3j,
        (0,0,0,1) : -3-1j,
        (0,0,1,0) : -3+3j,
        (0,0,1,1) : -3+1j,
        (0,1,0,0) : -1-3j,
        (0,1,0,1) : -1-1j,
        (0,1,1,0) : -1+3j,
        (0,1,1,1) : -1+1j,
        (1,0,0,0) :  3-3j,
        (1,0,0,1) :  3-1j,
        (1,0,1,0) :  3+3j,
        (1,0,1,1) :  3+1j,
        (1,1,0,0) :  1-3j,
        (1,1,0,1) :  1-1j,
        (1,1,1,0) :  1+3j,
        (1,1,1,1) :  1+1j
    }

    for b3 in [0, 1]:
        for b2 in [0, 1]:
            for b1 in [0, 1]:
                for b0 in [0, 1]:
                    B = (b3, b2, b1, b0)
                    Q = mapping_table[B]
                    plt.plot(Q.real, Q.imag, 'bo')
                    plt.text(Q.real, Q.imag+0.2, "".join(str(x) for x in B), ha='center')
    plt.show() 

    demapping_table = {v : k for k, v in mapping_table.items()}
    array=[]
    for i in range(L):
        if i == 2:
            array.append(1)
        else:
            array.append(0)

    channelResponse =array
    H_exact = np.fft.fft(channelResponse, Num)
    plt.plot(allCarriers, np.angle(H_exact/(2*math.pi)))
    plt.show()
    SNRdb = 20 

    bits = np.random.binomial(n=1, p=1, size=(payloadBits_per_OFDM, ))
    print ("Bits count: ", len(bits))
    print ("Mean: ", np.mean(bits))

    def SP(bits):
        return bits.reshape((len(dataCarriers), M))
    bits_SP = SP(bits)

    def Mapping(bits):
        return np.array([mapping_table[tuple(b)] for b in bits])
    QAM = Mapping(bits_SP)

    def OFDM_symbol(QAM_payload):
        symbol = np.zeros(Num, dtype=complex)
        symbol[pilotCarriers] = pilotValue 
        symbol[dataCarriers] = QAM_payload
        return symbol
    OFDM_data = OFDM_symbol(QAM)

    def IDFT(OFDM_data):
        return np.fft.ifft(OFDM_data)
    OFDM_time = IDFT(OFDM_data)

    def addCP(OFDM_time):
        cp = OFDM_time[-CP:]               
        return np.hstack([cp, OFDM_time]) 
    OFDM_withCP = addCP(OFDM_time)

    def channel(signal):
        convolved = np.convolve(signal, channelResponse)
        signal_power = np.mean(abs(convolved**2))
        sigma2 = signal_power * 10**(-SNRdb/10)
        noise = np.sqrt(sigma2/2) * (np.random.randn(*convolved.shape)+1j*np.random.randn(*convolved.shape))
        return convolved + noise
    OFDM_TX = OFDM_withCP
    OFDM_RX = channel(OFDM_TX)

    def removeCP(signal):
        return signal[CP:(CP+Num)]
    OFDM_RX_noCP = removeCP(OFDM_RX)

    plt.figure(figsize=(8,2))
    plt.plot(np.angle(OFDM_data), label='TX signal')
    plt.plot(np.angle(np.fft.fft(OFDM_RX_noCP)), label='RX signal')
    plt.plot(np.angle(np.fft.fft(OFDM_RX_noCP))-np.angle(OFDM_data), label='Phase')
    plt.legend(fontsize=10)
    plt.xlabel('Subcarrier'); plt.ylabel('$angle(x(t))$');
    plt.grid(True);
    plt.show()

    def DFT(OFDM_RX):
        return np.fft.fft(OFDM_RX)
    OFDM_demod = DFT(OFDM_RX_noCP)

    def channelEstimate(OFDM_demod):
        pilots = OFDM_demod[pilotCarriers]  # extract the pilot values from the RX signal
        Hest_at_pilots = pilots / pilotValue # divide by the transmitted pilot values
        # Perform interpolation between the pilot carriers to get an estimate
        # of the channel in the data carriers. Here, we interpolate absolute value and phase 
        # separately
        Hest_abs = scipy.interpolate.interp1d(pilotCarriers, abs(Hest_at_pilots), kind='linear')(allCarriers)
        Hest_phase = scipy.interpolate.interp1d(pilotCarriers, np.angle(Hest_at_pilots), kind='linear')(allCarriers)
        Hest = Hest_abs * np.exp(1j*Hest_phase)
        
        plt.plot(allCarriers, abs(H_exact), label='Correct Channel')
        plt.stem(pilotCarriers, abs(Hest_at_pilots), label='Pilot estimates')
        plt.plot(allCarriers, abs(Hest), label='Estimated channel via interpolation')
        plt.grid(True); plt.xlabel('Carrier index'); plt.ylabel('$|H(f)|$'); plt.legend(fontsize=10)
        plt.ylim(0,2)
        plt.show()
        return Hest
    Hest = channelEstimate(OFDM_demod)

    def equalize(OFDM_demod, Hest):
        return OFDM_demod / Hest
    equalized_Hest = equalize(OFDM_demod, Hest)

    def get_payload(equalized):
        return equalized[dataCarriers]
    QAM_est = get_payload(equalized_Hest)
    plt.plot(QAM_est.real, QAM_est.imag, 'bo');
    plt.show()

    def Demapping(QAM):
        constellation = np.array([x for x in demapping_table.keys()])
        dists = abs(QAM.reshape((-1,1)) - constellation.reshape((1,-1)))
        const_index = dists.argmin(axis=1)
        hardDecision = constellation[const_index]
        return np.vstack([demapping_table[C] for C in hardDecision]), hardDecision

    PS_est, hardDecision = Demapping(QAM_est)
    for qam, hard in zip(QAM_est, hardDecision):
        plt.plot([qam.real, hard.real], [qam.imag, hard.imag], 'b-o');
        plt.plot(hardDecision.real, hardDecision.imag, 'ro')
    plt.show()

    def PS(bits):
        return bits.reshape((-1,))
    bits_est = PS(PS_est)

    print ("Obtained Bit error rate: ", np.sum(abs(bits-bits_est))/len(bits))

Sampling Time Offset

In a real-world passband transmission system, what happens at the receiver is that S&C algorithm will try to locate the time-domain sample at which receiver should start sampling, through peak detection of cross-correlation function. What should be obvious is that despite that, the sampling time at receiver T’, cannot be assumed to be equal to T, due to sub-sample delay (The receiver may start sampling at a point between integer samples). Here we characterize this effect.

If there is a time offset by some samples, with corresponding time offset by \(\epsilon=n_\epsilon T\), for example, we have seen a delay by \(N_g\) indexes is equivalent to a time delay of \(T_g\) guard period. Therefore, with a STO, the receiver samples at: \(\begin{equation} r_{l,n}=r((n+n_\epsilon+N_g+lN_s)T) \end{equation}\) The received time-domain OFDM symbols now become: \(\begin{align} r_{l,n} &=\alpha s((n+n_\epsilon+N_g+lN_s)T-\tau) \\ = &\frac{\alpha}{\sqrt{T_u}} \sum_{l^{'}=-\infty}^{+\infty} \sum_{k=-\frac{K}{2}}^{\frac{K}{2}} a_{l,k}e^{j 2\pi(k/T_u)((n_\epsilon+n+N_g+lN_s)T-T_g-l^{'}T_s-\tau)} \\ & \mathrm{rect}_{T_s}((n+n_\epsilon+N_g+lN_s)T-l^{'}T_s-\tau)\nonumber \end{align}\)

Inspecting the rectangular term \(\begin{equation} \mathrm{rect}_{T_s}((n+n_\epsilon+N_g+lN_s)T-l^{'}T_s-\tau)=\mathrm{rect}_{T_s}(nT+T_g+n_\epsilon T+(l-l^{'})T_s-\tau) \end{equation}\) where we see that the rectangular function goes to 1 if and only if: \(\begin{equation} 0<nT+T_g+n_\epsilon T+(l-l^{'})T_s-\tau<T_s \end{equation}\)

where \(0<n<N\) and we assume the delay \(\tau\) has the range \(0<\tau<\tau_{max}\). The condition on which the lth OFDM symbol is influenced by lth symbol only (absence of inter-symbol-inteference) is that for \(l=l^{'}-1 and l=l^{'}+1\) the rectangular function in preceding equations evaluates to zero. We first inspect the influence of previous symbol with \(l=l^{'}-1\), where we have: \(\begin{align} nT+T_g+n_\epsilon T-T_s-\tau\leq0 \\ nT+T_g+n_\epsilon T-T_s-\tau\geq T_s \end{align}\) The extremas for two equations are taken at respectively, n=N and n=0, the solutions are: \(\begin{equation} n_\epsilon \leq \frac{\tau}{T} \end{equation}\) \(\begin{equation} n_\epsilon \geq \frac{\tau}{T}+2N_s-N_g \end{equation}\) The upper bound is given by: \(\begin{equation} n_\epsilon \leq \frac{\tau_{min}}{T} \leq 0 \end{equation}\)

We proceed to inspect the influence of next symbol with \(l=l^{'}+1\), the two conditioning equations are \(\begin{align} nT+T_g+n_\epsilon T+T_s-\tau\leq0 \\ nT+T_g+n_\epsilon T+T_s-\tau\geq T_s \end{align}\) The extremas for two equations are taken at respectively, n=N and n=0, which gives the solution \(\begin{equation} n_\epsilon \leq \frac{\tau}{T}-2N_s \end{equation}\) \(\begin{equation} \frac{\tau}{T}-N_g\leq n_\epsilon \end{equation}\) For which the proper lower bound is given by: \(\begin{equation} \frac{\tau_{max}}{T}-N_g\leq n_\epsilon \end{equation}\) The significance of this result is that we see the range of allowable timing offset is \(\frac{\tau_{max}}{T}-N_g\leq n_\epsilon \leq 0\) Next, we examine the effect when STO exceeds this range.

Assume a frame offset of \(\begin{equation} n'= n+n_\epsilon +N_g+lN_s \end{equation}\) The received time-domain OFDM symbols can be written as: \(\begin{align} r_{l,n}&=\frac{\alpha}{\sqrt{T_u}}\sum_{k=-\frac{K}{2}}^{\frac{K}{2}}a_{l,k}e^{j2\pi \frac{k}{T_u}(n^{'}T-T_g-lN_s-\tau_i)}+\frac{\alpha}{\sqrt{T_u}}\sum_{k=-\frac{K}{2}}^{\frac{K}{2}}a_{l+1,k}e^{j2\pi \frac{k}{T_u}(n^{'}T-T_g-(l+1)N_s-\tau_i)}\\ &=\frac{\alpha}{\sqrt{T_u}}\sum_{k=-\frac{K}{2}}^{\frac{K}{2}}a_{l,k}e^{j2\pi \frac{k}{T_u}(n+n_\epsilon)T}+\frac{\alpha}{\sqrt{T_u}}\sum_{k=-\frac{K}{2}}^{\frac{K}{2}}a_{l+1,k}e^{j2\pi \frac{k}{T_u}((n+n_\epsilon)T-T_s)} \end{align}\) where the lth symbol is now influenced by the l+1 th OFDM symbol. We take the FFT of the above expression to arrive at the frequency domain representation with: \(\begin{align} Z_{l,k}&=\frac{1}{N}\sum_n (\frac{\alpha}{\sqrt{T_u}}\sum_{k^{'}=-\frac{K}{2}}^{\frac{K}{2}}a_{l,k^{'}}e^{j2\pi \frac{k^{'}}{T_u}(n+n_\epsilon)T}+\frac{\alpha}{\sqrt{T_u}}\sum_{k^{'}=-\frac{K}{2}}^{\frac{K}{2}}a_{l+1,k^{'}}e^{j2\pi \frac{k^{'}}{T_u}((n+n_\epsilon)T-T_s)})e^{-j 2\pi \frac{n}{N}k}\\ &=\frac{1}{N}\sum_{n=0}^{N-1-n_\epsilon} \frac{\alpha}{\sqrt{T_u}}\sum_{k^{'}=-\frac{K}{2}}^{\frac{K}{2}}a_{l,k^{'}}e^{j2\pi \frac{k^{'}}{T_u}(n+n_\epsilon)T}e^{-j 2\pi \frac{n}{N}k}\\ &+\frac{1}{N}\sum_{n=N-n_\epsilon}^{N-1} \frac{\alpha}{\sqrt{T_u}}\sum_{k^{'}=-\frac{K}{2}}^{\frac{K}{2}}a_{l+1,k^{'}}e^{j2\pi \frac{k^{'}}{T_u}((n+n_\epsilon)T-T_s)}e^{-j 2\pi \frac{n}{N}k}\nonumber \end{align}\) We take the first term of (49) and expand it as: \(\begin{align} & \frac{1}{N}\sum_{n=0}^{N-1-n_\epsilon} \frac{\alpha}{\sqrt{T_u}}\sum_{k^{'}=-\frac{K}{2}}^{\frac{K}{2}}a_{l,k^{'}}e^{j2\pi \frac{k^{'}}{T_u}(n+n_\epsilon)T}e^{-j 2\pi \frac{n}{N}k}\\ =& \frac{1}{N}\sum_{n=0}^{N-1-n_\epsilon} \frac{\alpha}{\sqrt{T_u}}\sum_{k^{'}=-\frac{K}{2}}^{\frac{K}{2}}a_{l,k^{'}}e^{j2\pi (\frac{k^{'}}{T_u}(n+n_\epsilon)T-\frac{n}{N}k)}\\ =&\frac{\alpha}{N\sqrt{T_u}}\sum_{k^{'}=-\frac{K}{2}}^{\frac{K}{2}}a_{l,k^{'}}\sum_{n=0}^{N-1-n_\epsilon}e^{j2\pi (\frac{n}{N}(k^{'}-k)+\frac{k^{'}n_\epsilon}{N})}\\ =&\frac{\alpha a_{l,k}}{N\sqrt{T_u}}(N-n_\epsilon)e^{j2\pi \frac{kn_\epsilon}{N}}+\frac{\alpha }{N\sqrt{T_u}}\sum_{n=0}^{N-1-n_\epsilon}\sum_{k^{'}=-\frac{K}{2},k^{'} \neq k}^{\frac{K}{2}}a_{l,k^{'}}e^{j2\pi \frac{k^{'}}{T_u}(n+n_\epsilon)T}e^{-j 2\pi \frac{n}{N}k}\\ =&\frac{N-n_\epsilon}{N}a_{l,k}\frac{\alpha}{\sqrt{T_u}}e^{j2\pi \frac{kn_\epsilon}{N}}+\frac{\alpha }{N\sqrt{T_u}}\sum_{n=0}^{N-1-n_\epsilon}\sum_{k^{'}=-\frac{K}{2},k^{'} \neq k}^{\frac{K}{2}}a_{l,k^{'}}e^{j2\pi \frac{k^{'}}{T_u}(n+n_\epsilon)T}e^{-j 2\pi \frac{n}{N}k} \end{align}\) Finally, put (54) back into overall expression in (49) we have: \(\begin{equation} \begin{array}{cc} & Z_{l,k}=\underbrace{\textstyle\frac{N-n_\epsilon}{N}a_{l,k}\frac{\alpha}{\sqrt{T_u}}e^{j2\pi \frac{kn_\epsilon}{N}}}_{\textbf{Desired Signal}}+\underbrace{\textstyle\frac{\alpha }{N\sqrt{T_u}}\sum_{n=0}^{N-1-n_\epsilon}\sum_{k^{'}=-\frac{K}{2},k^{'} \neq k}^{\frac{K}{2}}a_{l,k^{'}}e^{j2\pi \frac{k^{'}}{T_u}(n+n_\epsilon)T}e^{-j 2\pi \frac{n}{N}k}}_{\textbf{ICI}} \\ & +\underbrace{\textstyle\frac{\alpha}{N\sqrt{T_u}}\sum_{n=N-n_\epsilon}^{N-1} \sum_{k^{'}=-\frac{K}{2}}^{\frac{K}{2}}a_{l+1,k^{'}}e^{j2\pi \frac{k^{'}}{N}((n+n_\epsilon)-N)}e^{-j 2\pi \frac{n}{N}k}}_{\textbf{ISI}}+n_{l,k} \end{array}\nonumber \end{equation}\)

where, once again, we use the simplification that \(N_g=0, \tau_i=0, T_s=T_u\). The four terms are desired signal, ICI, ISI and noise respectively, outlining the actual impact of uncontrolled STO.

Sampling Frequency Offset

With a sampling period of \(T^{'}\), the received time-domain OFDM is: \(\begin{align} r_{l,n} & =r((n+N_g+lN_s)T^{'}) \\ & = r((n+N_g+lN_s)(1+\zeta)T) \\ & = r(nT(1+\zeta)+T_g\zeta+T_s(l-l^{'}+l\zeta)-\tau) \end{align}\) By substituting into (13), we obtain: \(\begin{align} r_{l,n} = &r((n+N_g+lN_s)T^{'}) \\ = &\alpha s((n+N_g+lN_s)T^{'}-\tau) +n \\ = &\frac{\alpha}{\sqrt{T_u}} \sum_{l^{'}=-\infty}^{+\infty} \sum_{k=-\frac{K}{2}}^{\frac{K}{2}} a_{l,k}e^{j 2\pi(k/T_u)((n+N_g+lN_s)T^{'}-T_g-l^{'}T_s-\tau)} \\\nonumber & \mathrm{rect}_{T_s}((n+N_g+lN_s)T^{'}-l^{'}T_s-\tau) \\ = &\frac{\alpha}{\sqrt{T_u}} \sum_{l^{'}=-\infty}^{+\infty} \sum_{k=-\frac{K}{2}}^{\frac{K}{2}} a_{l,k}e^{j 2\pi(k/T_u)(\frac{n}{N}T_u(1+\zeta)+N_gT(1+\zeta)+lN_s(1+\zeta)T-T_g-l^{'}T_s-\tau)} \\\nonumber & \mathrm{rect}_{T_s}(\frac{n}{N}T_u(1+\zeta)+N_gT(1+\zeta)+lN_s(1+\zeta)T-l^{'}T_s-\tau) \\ = &\frac{\alpha}{\sqrt{T_u}} \sum_{l^{'}=-\infty}^{+\infty} \sum_{k=-\frac{K}{2}}^{\frac{K}{2}} a_{l,k}e^{j 2\pi(k/T_u)((\frac{n}{N}T_u+T_g+T_sl)\zeta+\frac{n}{N}T_u-(l-l^{'})T_s-\tau)} \\\nonumber & \mathrm{rect}_{T_s}((\frac{n}{N}T_u+T_g+T_sl)\zeta+\frac{n}{N}T_u-(l-l^{'})T_s-\tau) \end{align}\) where the rectangular function equals 1 under the following condition: \(\begin{equation} 0<(\frac{n}{N}T_u+T_g+T_sl)\zeta+\frac{n}{N}T_u+T_g-(l-l^{'})T_s-\tau<T_s \end{equation}\) We can see that as l increases through time, the ideal window drifts further and further from actual window, indicating that SFO is cumulative. We see that the condition holds only when \(l=l^{'}\). Assuming \(l=l^{'}\) and apply FFT, we have the frequency-domain received OFDM symbols as: \(\begin{align} z_{l,k} & =\frac{1}{N}\sum_{n=0}^{N-1}\frac{\alpha}{\sqrt{T_u}}\sum_{k^{'}=-\frac{K}{2}}^{\frac{K}{2}} a_{l,k^{'}} e^{2\pi j\frac{k^{'}}{T_u}((\frac{n}{N}T_u+T_g+T_sl)\zeta+\frac{n}{N}T_u-\tau)}e^{-j2\pi (n/N)k} \\ & =\frac{1}{N}\frac{\alpha}{\sqrt{T_u}}\sum_{n=0}^{N-1}\sum_{k^{'}=-\frac{K}{2}}^{\frac{K}{2}}a_{l,k^{'}} e^{2 \pi j[(\frac{nk^{'}}{N}+\frac{k^{'}T_g}{T_u}+\frac{k^{'}T_s}{T_u}l)\zeta+\frac{nk^{'}}{N}-\frac{k^{'}\tau}{T_u}-\frac{nk}{N}]}\\ & =\frac{1}{N}\frac{\alpha}{\sqrt{T_u}}\sum_{k^{'}=-\frac{K}{2}}^{\frac{K}{2}}a_{l,k^{'}}e^{2 \pi j[(\frac{k^{'}T_g}{T_u}+\frac{k^{'}T_s}{T_u}l)\zeta-\frac{k^{'}\tau}{T_u}]}\sum_{n=0}^{N-1}(e^{2\pi j\frac{k^{'}(1+\zeta)-k}{N}} )^n \end{align}\) Once again the second summation goes to zero if k is not equal to \(k^{'}\). If \(k=k^{'}\), the geometric series sums to \(\begin{equation} \sum_{n=0}^{N-1}(e^{2\pi j\frac{k\zeta}{N}} )^n=\frac{1-e^{2\pi j k\zeta}}{1-e^{\frac{2\pi j k\zeta}{N}}}=N \end{equation}\) The final equation is \(\begin{equation} z_{l,k}=\frac{\alpha}{\sqrt{T_u}}\sum_{k^{'}=-\frac{K}{2}}^{\frac{K}{2}}a_{l,k^{'}}e^{2 \pi j[(\frac{k^{'}T_g}{T_u}+\frac{k^{'}T_s}{T_u}l)\zeta-\frac{k^{'}\tau}{T_u}]} \end{equation}\) We see a rotation of symbol conditioned on both sub-carrier index and time index.

Carrier Frequency Offset

OFDM systems are much more susceptible to frequency offset than single-carrier systems, due to sinusoidal basis. In this section we study combined effect of SFO and CFO.

Assuming a frequency offset \(\Delta f\) and a SFO of \(\zeta= \frac{T^{'}-T}{T}\), the CFO is modelled as: \(\begin{equation} e^{j2\pi \Delta ft}=e^{j2\pi \Delta fnT} \end{equation}\) With additional SFO, the combined effect can be modelled as: \(\begin{equation} e^{j2\pi \Delta fnT^{'}}=e^{j2\pi \Delta fn(1+\zeta)T} \end{equation}\) Hence the phase can be modelled as: \(\begin{equation} \Theta_0 (nT^{'})=(1+\zeta)\Delta f nT \end{equation}\) Consider the phase offset caused by combined frequency offset, the received time-domain symbols are given by: \(\begin{align} r_{l,n} = &(e^{j 2\pi (n+N_g+lN_s)(1+\zeta)\Delta f}) \frac{\alpha}{\sqrt{T_u}} \sum_{l^{'}=-\infty}^{+\infty} \sum_{k=-\frac{K}{2}}^{\frac{K}{2}} a_{l,k}e^{j 2\pi(k/T_u)((n+N_g+lN_s)T^{'}-T_g-l^{'}T_s-\tau)} \\ & \mathrm{rect}_{T_s}((n+N_g+lN_s)T^{'}-l^{'}T_s-\tau) \nonumber\\ = &(e^{j 2\pi (n+N_g+lN_s)(1+\zeta)\Delta f T}) \frac{\alpha}{\sqrt{T_u}} \sum_{l^{'}=-\infty}^{+\infty} \sum_{k=-\frac{K}{2}}^{\frac{K}{2}} a_{l,k}e^{j 2\pi(k/T_u)((n+N_g+lN_s)(1+\zeta)-N_g-l^{'}N_s-\frac{\tau}{T})} \\ & \mathrm{rect}_{T_s}((n+N_g+lN_s)(1+\zeta)T-l^{'}T_s-\tau) \nonumber \end{align}\)

Let’s study the windowing function first, for the window function to be 1, we must have: \(\begin{align} &0< (n+N_g+lN_s)(1+\zeta)T-lT_s < T_s \\ &0< n^{'}(1+\zeta)T-lT_s < T_s \\ &0< n^{'}(1+\zeta)-lN_s < N_s \\ &lN_s< n^{'}(1+\zeta) <(l+1)N_s \\ &\frac{1}{1+\zeta}lN_s<n^{'}<\frac{1}{1+\zeta}(l+1)N_s \end{align}\) For some small \(\zeta\) we use the substitution \((1-\zeta)=\frac{1}{1+\zeta}\), we have: \(\begin{equation} (1-\zeta)lN_s<n^{'}<(1-\zeta)(l+1)N_s \end{equation}\) In the absence of ISI, where STO is addressed: \(\begin{equation} r_{l,n}= (e^{j 2\pi (n+N_g+lN_s)(1+\zeta)\Delta f T}) \frac{\alpha}{\sqrt{T_u}} \sum_{k=-\frac{K}{2}}^{\frac{K}{2}} a_{l,k}e^{j 2\pi(k/N)((1+\zeta)n+(N_g+lN_s)\zeta-\frac{\tau}{T})} \end{equation}\) Taking the FFT of which results in: \(\begin{align} Z_{l,k} &=\frac{1}{N}\sum_{n=0}^{N-1}e^{j2\pi n^{'}(1+\zeta)\Delta fT}\frac{\alpha}{\sqrt{T_u}}\sum_{k^{'}=-\frac{K}{2}}^{\frac{K}{2}}a_{l,k^{'}}e^{2\pi j(\frac{k^{'}}{N})((1+\zeta)n+(N_g+lN_s)\zeta-\frac{\tau}{T})}e^{-2\pi j(\frac{n}{N})k}\\ &=\frac{1}{N}\sum_{n=0}^{N-1}e^{j2\pi n^{'}(1+\zeta)\Delta fT}\frac{\alpha}{\sqrt{T_u}}\sum_{k^{'}=-\frac{K}{2}}^{\frac{K}{2}}a_{l,k^{'}}e^{2\pi j(\frac{k^{'}}{T_u})((n+N_g+lN_s)(1+\zeta)T-T_g-lT_s-\tau)}e^{-2\pi j(\frac{n}{N})k}\\ &=\frac{1}{N}\frac{\alpha}{\sqrt{T_u}}\sum_{k^{'}=-\frac{K}{2}}^{\frac{K}{2}}\sum_{n=0}^{N-1}a_{l,k^{'}}e^{2\pi j(\frac{k^{'}}{T_u})((n+N_g+lN_s)(1+\zeta)T-T_g-lT_s-\tau)}e^{-2\pi j(\frac{n}{N})k}e^{j2\pi n^{'}(1+\zeta)\Delta fT}\\ &=\frac{1}{N}\frac{\alpha}{\sqrt{T_u}}\sum_{k^{'}=-\frac{K}{2}}^{\frac{K}{2}}\sum_{n=0}^{N-1}a_{l,k^{'}}e^{2\pi j\frac{k^{'}}{N}(n+\zeta n+N_g+\zeta N_g+lN_s+\zeta lN_s-N_g-lN_s-\frac{\tau_i}{T})-\frac{n}{N}k}e^{j2\pi n^{'}(1+\zeta)\Delta fT}\\ &=\frac{1}{N}\frac{\alpha}{\sqrt{T_u}}\sum_{k^{'}=-\frac{K}{2}}^{\frac{K}{2}}\sum_{n=0}^{N-1}a_{l,k^{'}}e^{j2\pi \frac{n}{N}(k^{'}-k)+\frac{k^{'}}{N}(\zeta n+\zeta N_g+\zeta lN_s-\frac{\tau_i}{T})}e^{j 2\pi (1+\zeta)\Delta fTn}e^{j 2\pi(1+\zeta)\Delta fT(N_g+lN_s)}\\ &=\frac{1}{N}\frac{\alpha}{\sqrt{T_u}}\sum_{k^{'}=-\frac{K}{2}}^{\frac{K}{2}}a_{l,k^{'}}e^{2\pi j\frac{k^{'}}{N}(\zeta N_g+\zeta lN_s-\frac{\tau_i}{T})+(1+\zeta)\Delta fT(N_g+lN_s)}\sum_{n=0}^{N-1}e^{j2\pi \frac{n}{N}(k^{'}-k)+\frac{k^{'}}{N}(\zeta n)+(1+\zeta)\Delta f Tn} \end{align}\)

First we simplify the term: \(\begin{align} &\frac{1}{N}\sum_{n=0}^{N-1}e^{j2\pi \frac{n}{N}(k^{'}-k)+\frac{k^{'}}{N}(\zeta n)+(1+\zeta)\Delta f Tn}\\ =&\frac{1}{N}\sum_{n=0}^{N-1}e^{j2\pi n \frac{1}{N}(k^{'}-k)+\frac{k^{'}}{N}\zeta+(1+\zeta)\Delta f T} \end{align}\) When \(k^{'}=k\), the above term equals to: \(\begin{align} &\frac{1}{N}\frac{1-e^{2j\pi(\Delta fNT(\zeta+1)+k\zeta)}}{1-e^{2j\pi(\Delta fT(\zeta+1)+\frac{k\zeta}{N})}}\\ =&\frac{1}{N}\frac{e^{j\pi(\Delta fNT(\zeta+1)+k\zeta)}(e^{-j\pi(\Delta fNT(\zeta+1)+k\zeta)}-e^{j\pi(\Delta fNT(\zeta+1)+k\zeta)})}{e^{j\pi(\Delta fT(\zeta+1)+\frac{k\zeta}{N})}(e^{-j\pi(\Delta fT(\zeta+1)+\frac{k\zeta}{N})}-e^{j\pi(\Delta fT(\zeta+1)+\frac{k\zeta}{N})})}\\ =&\frac{1}{N}e^{\frac{N-1}{N}j\pi(\Delta fNT(\zeta+1)+k\zeta)}\frac{\mathrm{sin}(\pi(\Delta fNT(\zeta+1)+k\zeta))}{\mathrm{sin}(\pi(\Delta fT(\zeta+1)+\frac{k\zeta}{N}))}\\ =&e^{\frac{N-1}{N}j\pi(\Delta fNT(\zeta+1)+k\zeta)}\frac{\mathrm{sin}(\pi(\Delta fNT(\zeta+1)+k\zeta))}{N\mathrm{sin}(\pi(\Delta fT(\zeta+1)+\frac{k\zeta}{N}))} \end{align}\) When \(k^{'}\neq k\), the expression becomes: \(\begin{align} &\frac{1}{N}\frac{1-e^{2j\pi(\Delta fNT(\zeta+1)+k^{'}\zeta+k^{'}-k)}}{1-e^{2j\pi(\Delta fT(\zeta+1)+\frac{k^{'}-k}{N}+\frac{k^{'}\zeta}{N})}}\\ =&e^{\frac{N-1}{N}j\pi(\Delta fNT(\zeta+1)+k^{'}\zeta+k^{'}-k)}\frac{\mathrm{sin}(j\pi(\Delta fNT(\zeta+1)+k^{'}\zeta+k^{'}-k))}{N\mathrm{sin}(j\pi(\Delta fT(\zeta+1)+\frac{k^{'}-k}{N}+\frac{k^{'}\zeta}{N}))} \end{align}\)

Therefore the overall expression in (86) is equivalently the following: \(\begin{equation} \begin{array}{cc} & Z_{l,k}=e^{\frac{N-1}{N}j\pi(\Delta fNT(\zeta+1)+k\zeta)}\frac{\mathrm{sin}(\pi(\Delta fNT(\zeta+1)+k\zeta))}{N\mathrm{sin}(\pi(\Delta fT(\zeta+1)+\frac{k\zeta}{N}))}\\ &\frac{\alpha}{\sqrt{T_u}}a_{l,k}e^{2\pi j\frac{k}{N}(\zeta N_g+\zeta lN_s-\frac{\tau_i}{T})+(1+\zeta)\Delta fT(N_g+lN_s)}\\ &+\sum_{k^{'}=-\frac{K}{2},k^{'}\neq k}^{\frac{K}{2}}e^{\frac{N-1}{N}j\pi(\Delta fNT(\zeta+1)+k^{'}\zeta+k^{'}-k)}\frac{\mathrm{sin}(j\pi(\Delta fNT(\zeta+1)+k^{'}\zeta+k^{'}-k))}{N\mathrm{sin}(j\pi(\Delta fT(\zeta+1)+\frac{k^{'}-k}{N}+\frac{k^{'}\zeta}{N}))}\\ &\frac{\alpha}{\sqrt{T_u}}a_{l,k^{'}}e^{2\pi j\frac{k}{N}(\zeta N_g+\zeta lN_s-\frac{\tau_i}{T})+(1+\zeta)\Delta fT(N_g+lN_s)}+n_{l,k} \end{array} \end{equation}\)

To see how this can be simplified, we make the following substitutions. First remember the frequency domain channel response is (for all values of k): \(\begin{equation} H_k=ae^{-2\pi jk(\frac{\tau_i}{T_u})} \end{equation}\) and the interference term is: \(\begin{equation} H_{k^{'}}=ae^{-2\pi jk^{'}(\frac{\tau_i}{T_u})} \end{equation}\) And we let: \(\begin{align} \Phi_{k^{'},k}& =\Delta fNT(\zeta+1)+k^{'}\zeta+k^{'}-k\\ &=(1+\zeta)(k^{'}+\Delta fT_u) \end{align}\) \(\begin{align} \Phi_{k,k}=\Phi_k&=\Delta fNT(\zeta+1)+k\zeta\\ &\approx \Delta fT_u+\zeta k \end{align}\) We illustrate the simplification process on the second term of (95): \(\begin{align} &\frac{\alpha}{\sqrt{T_u}}a_{l,k}e^{2\pi j\frac{k}{N}(\zeta N_g+\zeta lN_s-\frac{\tau_i}{T})+(1+\zeta)\Delta fT(N_g+lN_s)}\\ =&\frac{a_{l,k}}{\sqrt{T_u}}H_ke^{2\pi j\frac{k}{N}(\zeta N_g+\zeta lN_s)+(1+\zeta)\Delta fT(N_g+lN_s)}\\ =&\frac{a_{l,k}}{\sqrt{T_u}}H_ke^{2\pi j(N_g+lN_s)(\zeta \frac{k}{N}+(1+\zeta)\Delta fT)}\\ =&\frac{a_{l,k}}{\sqrt{T_u}}H_ke^{2\pi j\frac{(N_g+lN_s)}{N}(\zeta k+(1+\zeta)\Delta fTN)}\\ =&\frac{a_{l,k}}{\sqrt{T_u}}H_ke^{2\pi j\frac{(N_g+lN_s)}{N}}e^{2\pi j\Phi_k} \end{align}\) Thus, based on the same logic for other summation terms, we simplify the expression for \(Z_{l,k}\) as: \(\begin{equation} \begin{array}{cc} & Z_{l,k}=e^{\frac{N-1}{N}j\pi \Phi_k}\frac{\mathrm{sin}(\pi \Phi_k)}{N\mathrm{sin}(\pi \frac{\Phi_k}{N})}\frac{a_{l,k}}{\sqrt{T_u}}H_ke^{2\pi j\frac{(N_g+lN_s)}{N}\Phi_k} \\ & +\underbrace{\textstyle\sum_{k^{'};k^{'}\neq k}e^{\frac{N-1}{N}j\pi \Phi_{k^{'},k}}\frac{\mathrm{sin}(\pi \Phi_{k^{'},k})}{N\mathrm{sin}(\pi \frac{\Phi_{k^{'},k}}{N})}\frac{a_{l,k^{'}}}{\sqrt{T_u}}H_{k^{'}}e^{2\pi j\frac{(N_g+lN_s)}{N}\Phi_{k^{'}}}}_{\textbf{ICI}}+n_{l,k} \end{array} \end{equation}\)

Finally we make the substitution: \(\begin{equation} si(x)=\frac{1}{\sqrt{T_u}}\frac{\mathrm{sin}(x)}{N\mathrm{sin}(\frac{x}{N})} \end{equation}\) The final expression is of the following (assume \(\frac{N-1}{N}\) approaches 1): \(\begin{equation} Z_{l,k}=e^{j 2\pi \Phi_k}e^{2\pi j\frac{(N_g+lN_s)}{N}\Phi_k}si(\pi \Phi_k)a_{l,k}H_k+\sum_{k^{'};k^{'}\neq k}e^{j\pi \Phi_{k^{'},k}}e^{2\pi j\frac{(N_g+lN_s)}{N}\Phi_{k^{'}}}si(\pi \Phi_{k^{'},k})a_{l,k^{'}}H_{k^{'}}+n_{l,k} \end{equation}\) Which is desired signal + ICI + Noise. We see that the effect of uncontrolled CFO and SFO is the cause of ICI on the received signal.

Conclusion

We have thus studied all predominant effects of the imperfect channel condition on the received signal that prevent us from obtaining the true delay information. Please note that hardware effects such as packet detection delay are not covered in this installment.