-
Notifications
You must be signed in to change notification settings - Fork 194
Closed
Description
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
Line 92 in c7f202a
| 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:
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 number.
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
Labels
No labels
