Skip to content

CAZAC sequence is incorrect #70

@londumas

Description

@londumas

The definition of the CAZAC sequence is imprecise leading to failure modes when seq_length is an even number. Following https://en.wikipedia.org/wiki/Zadoff%E2%80%93Chu_sequence and tests to verify the value of the auto-correlation the following code

zcseq = exp((-1j * pi * u * arange(seq_length) * (arange(seq_length)+1)) / seq_length)

should be replaced by:

def zcsequence(u, seq_length, q):
    """
    Generate a Zadoff-Chu (ZC) sequence.
    Parameters
    ----------
    u : int
        Root index of the the ZC sequence.
    seq_length : int
        Length of the sequence to be generated. Usually a prime number.
    q : int
        Cyclic shift of the sequence
    Returns
    -------
    zcseq : 1D ndarray of complex floats
        ZC sequence generated.
    """
    assert u>0
    assert u<seq_length
    assert np.gcd(u,seq_length)==1
    for el in [u,seq_length,q]:
        assert float(el).is_integer()

    cf = seq_length%2
    n = arange(seq_length)
    zcseq = exp( -1j * pi * u * n * (n+cf+2.*q) / seq_length)
    return zcseq

Here is an example:

example-failure

import numpy as np

from numpy import empty, exp, pi, arange, int8, fromiter, sum

def zcsequence(u, seq_length):
    """
    Generate a Zadoff-Chu (ZC) sequence.
    Parameters
    ----------
    u : int
        Root index of the the ZC sequence.
    seq_length : int
        Length of the sequence to be generated. Usually a prime number.
    Returns
    -------
    zcseq : 1D ndarray of complex floats
        ZC sequence generated.
    """
    zcseq = exp((-1j * pi * u * arange(seq_length) * (arange(seq_length)+1)) / seq_length)

    return zcseq
def zcsequence_corrected(u, seq_length, q=0):
    """
    Generate a Zadoff-Chu (ZC) sequence.
    Parameters
    ----------
    u : int
        Root index of the the ZC sequence.
    seq_length : int
        Length of the sequence to be generated. Usually a prime nu![example-failure](https://user-images.githubusercontent.com/3166436/84265615-62527e80-ab23-11ea-829d-e37df16d2527.png)mber.
    Returns
    -------
    zcseq : 1D ndarray of complex floats
        ZC sequence generated.
    """
    assert u>0
    assert u<seq_length
    assert np.gcd(u,seq_length)==1
    for el in [u,seq_length,q]:
        assert float(el).is_integer()

    cf = seq_length%2
    n = arange(seq_length)
    zcseq = exp( -1j * pi * u * n * (n+cf+2.*q) / seq_length)

    return zcseq

if __name__ == '__main__':
    
    import matplotlib.pyplot as plt
    
    u = 3
    seq_length = 20

    seq = zcsequence(u,seq_length)
    x_F = np.fft.fft(seq) / np.sqrt(seq.size)
    h_chan_est_f = (np.fft.ifft(np.conj(x_F) * x_F)*np.sqrt(seq.size)).T
    plt.plot(np.absolute(h_chan_est_f)**2,marker='o',label='before')
    
    seq = zcsequence_corrected(u,seq_length)
    x_F = np.fft.fft(seq) / np.sqrt(seq.size)
    h_chan_est_f = (np.fft.ifft(np.conj(x_F) * x_F)*np.sqrt(seq.size)).T
    plt.plot(np.absolute(h_chan_est_f)**2,marker='o',label='after')
    
    plt.xlabel('Delta symbol')
    plt.ylabel('auto-correlation')
    plt.legend()
    plt.grid()
    plt.show()

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions