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);
这里发生了什么?这是一个四舍五入的问题吗?
答案 0 :(得分:1)
“这是一个舍入问题吗?”
排序。 seq.dtype
为np.int8
,当correlate
的输入数组具有相同类型时,返回的数组也具有该数据类型。因此acorr.dtype
是np.int8
。问题是真实相关计算中的值范围为-18到255,并且该范围不能用np.int8
表示。尖峰值255,“环绕”值-1。 (我想这会使它成为一个环绕问题。:)
修复是将seq
转换为浮点,这可以通过使seq = max_len_seq(8)[0]* 2 - 1
中的一个系数成为浮点值来完成。 E.g。
seq = max_len_seq(8)[0]* 2 - 1.0
然后seq
(因此acorr
)的数据类型为np.float64
,图表显示了预期的峰值。