最大长度序列的线性自相关不收敛于 Kronecker delta
Linear autocorrelation of maximum length sequence does not converge to Kronecker delta
The linear autocorrelation of a Maximum Length Sequence approximates a Kronecker delta。这也发生在 scipy 中,对于小长度,例如n = 2**7:
import numpy as np
from scipy.signal import max_len_seq
import matplotlib.pyplot as plt
seq = max_len_seq(7)[0]* 2 - 1
acorr = np.correlate(seq, seq, 'full')
plt.plot(acorr);
但不适用于更长的长度,例如n=2**8
seq = max_len_seq(8)[0]* 2 - 1
acorr = np.correlate(seq, seq, 'full')
plt.plot(acorr);
这里发生了什么?这是一个舍入问题吗?
"Is this a rounding problem?"
有点。 seq.dtype
是 np.int8
,当 correlate
的输入数组具有相同类型时,返回的数组也具有该数据类型。所以 acorr.dtype
是 np.int8
。问题在于真实相关性计算中的值范围为 -18 到 255,而该范围不能用 np.int8
表示。秒杀值,255,"wraps around"到值-1。 (我想这是一个 wrap-arounding 问题。:)
一个解决方法是将 seq
转换为浮点数,这可以通过将 seq = max_len_seq(8)[0]* 2 - 1
中的一个系数设为浮点值来完成。例如
seq = max_len_seq(8)[0]* 2 - 1.0
然后 seq
(因此 acorr
)的数据类型为 np.float64
,绘图显示了预期的尖峰。
The linear autocorrelation of a Maximum Length Sequence approximates a Kronecker delta。这也发生在 scipy 中,对于小长度,例如n = 2**7:
import numpy as np
from scipy.signal import max_len_seq
import matplotlib.pyplot as plt
seq = max_len_seq(7)[0]* 2 - 1
acorr = np.correlate(seq, seq, 'full')
plt.plot(acorr);
但不适用于更长的长度,例如n=2**8
seq = max_len_seq(8)[0]* 2 - 1
acorr = np.correlate(seq, seq, 'full')
plt.plot(acorr);
这里发生了什么?这是一个舍入问题吗?
"Is this a rounding problem?"
有点。 seq.dtype
是 np.int8
,当 correlate
的输入数组具有相同类型时,返回的数组也具有该数据类型。所以 acorr.dtype
是 np.int8
。问题在于真实相关性计算中的值范围为 -18 到 255,而该范围不能用 np.int8
表示。秒杀值,255,"wraps around"到值-1。 (我想这是一个 wrap-arounding 问题。:)
一个解决方法是将 seq
转换为浮点数,这可以通过将 seq = max_len_seq(8)[0]* 2 - 1
中的一个系数设为浮点值来完成。例如
seq = max_len_seq(8)[0]* 2 - 1.0
然后 seq
(因此 acorr
)的数据类型为 np.float64
,绘图显示了预期的尖峰。