I am working with Zadoff-Chu sequences in a Python simulation of an LTE-like communication system and need to understand the effects of carrier frequency offset (CFO) on these sequences. Specifically, I'm looking to derive an analytical expression for the cross-correlation between the original IDFT transformed Zadoff-Chu sequence and its version with applied CFO. The goal is to estimate the Peak of the correlation according to the CFO and to find out at which cfo the correlation receiver will fail. With the simulation i already figured out, that the peak is shifted when the CFO is too big. I am trying to derive mathematically an expression to find a rule how big the CFO can be without getting a shifted peak.

Does anyone has any idea how to find or derive an expression?

Here is a plot which shows the correlation with a cfo = 1/T (While T is the symbol time). It shows that the cfo caused a shifted peak. (Usually it is without cfo in the middle). Correlation output with cfo = 1/T

Here's the setup: I generate the Zadoff-Chu sequence, apply a CFO, and then transform the sequence back to the time domain using an IDFT (Inverse Discrete Fourier Transform). I need to analytically calculate the cross-correlation of the resulting sequence with the original sequence to estimate the CFO.

import numpy as np
import matplotlib.pyplot as plt

def zadoff_chu(u):
    n = np.arange(63)
    x = np.exp(-1j*np.pi*u*n*(n+1)/63)
    x[31] = 0  # This corresponds to the DC subcarrier
    return x

N = 80 # modulation similar to LTE but with N=80 instead of 2048
fs = N*15e3
carriers = slice(N//2 - 31, N//2+31+1) # OFDM carriers

symbol_time = N/fs

zc_freq = np.zeros(N, 'complex')
zc_freq[carriers] = zadoff_chu(25) # the root is one of the specified in LTE (25,29,34)
zc_time = np.fft.fftshift(np.fft.ifft(zc_freq))

cfo = 1/symbol_time #example cfo
zc_time_cfo = zc_time*np.exp(1j*2*np.pi*critical_cfo*np.arange(N)/fs)

corr = np.correlate(zc_time_cfo, zc_time, 'full')
plt.plot(np.abs(corr)) # with the current cfo the peak is shifted and not at N//2
  • $\begingroup$ did you check this paper: arxiv.org/pdf/1406.3412.pdf ? It seems the work is related to your problem. $\endgroup$
    – Piotr
    Nov 10, 2023 at 9:35
  • $\begingroup$ thank you, the final ambiguity function at equation (16) in the paper shows what i was trying to derive how to get this function. Fixing the autocorrelation at a lag of zero solves my problem to derive the desired sinc with nulls at multiples of $f_{cfo} = \frac{1}{T_s}$, where $T_s$ is the symbol time in seconds. $\endgroup$ Nov 11, 2023 at 9:36

1 Answer 1


The CFO estimation range is defined by the length of your correlation sequence, such that:

$f_{est} = +/- 1/T$, where $T$ is the length of your sequence in time. Rewritten another way:

$f_{est}= +/- F_s / N$ where $F_s$ is the sample frequency of your signal and $N$ is the number of samples used for correlation.

You can plot the correlation as a function of frequency offset. It will follow a $\sin(x)/x$ shape where the nulls are at +/- $f_{est}$

To find the $\frac{\sin(x)}{x}$ (with $x = \pi f_{est} T$) like function, it is necessary to fix the autocorrelation at a lag of zero.

The result will be the desired function of frequency offset.


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.